{
struct inode *in = de->d_inode;
int error = 0, is_proc = 0, has_xid = 0;
+ struct iattr attr = { 0 };
if (!in || !in->i_sb)
return -ESRCH;
return -EINVAL;
down(&in->i_sem);
- if (*mask & IATTR_XID)
- in->i_xid = *xid;
+ if (*mask & IATTR_XID) {
+ attr.ia_xid = *xid;
+ attr.ia_valid |= ATTR_XID;
+ }
if (*mask & IATTR_FLAGS) {
struct proc_dir_entry *entry = PROC_I(in)->pde;
}
if (*mask & (IATTR_BARRIER | IATTR_IUNLINK | IATTR_IMMUTABLE)) {
- struct iattr attr;
- attr.ia_valid = ATTR_ATTR_FLAG;
+ attr.ia_valid |= ATTR_ATTR_FLAG;
attr.ia_attr_flags =
(IS_IMMUTABLE(in) ? ATTR_FLAG_IMMUTABLE : 0) |
(IS_IUNLINK(in) ? ATTR_FLAG_IUNLINK : 0) |
else
attr.ia_attr_flags &= ~ATTR_FLAG_BARRIER;
}
+ }
+
+ if (attr.ia_valid) {
if (in->i_op && in->i_op->setattr)
error = in->i_op->setattr(de, &attr);
else {
}
}
- mark_inode_dirty(in);
up(&in->i_sem);
return 0;
}