patch-2.6.6-vs1.9.0
[linux-2.6.git] / fs / attr.c
index d63350c..5bb63a8 100644 (file)
--- a/fs/attr.c
+++ b/fs/attr.c
@@ -62,6 +62,24 @@ error:
 
 EXPORT_SYMBOL(inode_change_ok);
 
+int inode_setattr_flags(struct inode *inode, unsigned int flags)
+{
+       unsigned int oldflags, newflags;
+
+       oldflags = inode->i_flags;
+       newflags = oldflags & ~(S_IMMUTABLE | S_IUNLINK | S_BARRIER);
+       if (flags & ATTR_FLAG_IMMUTABLE)
+               newflags |= S_IMMUTABLE;
+       if (flags & ATTR_FLAG_IUNLINK)
+               newflags |= S_IUNLINK;
+       if (flags & ATTR_FLAG_BARRIER)
+               newflags |= S_BARRIER;
+
+       if (oldflags ^ newflags)
+               inode->i_flags = newflags;
+       return 0;
+}
+
 int inode_setattr(struct inode * inode, struct iattr * attr)
 {
        unsigned int ia_valid = attr->ia_valid;
@@ -98,6 +116,8 @@ int inode_setattr(struct inode * inode, struct iattr * attr)
                        mode &= ~S_ISGID;
                inode->i_mode = mode;
        }
+       if (ia_valid & ATTR_ATTR_FLAG)
+               inode_setattr_flags(inode, attr->ia_attr_flags);
        mark_inode_dirty(inode);
 out:
        return error;