]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - fs/reiserfs/xattr_acl.c
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma
[linux.git] / fs / reiserfs / xattr_acl.c
index dbed42f755e01ff46518efb35e46a06036b1b52d..54415f0e3d1868601ab08a6ff49d2fb29cdfb2da 100644 (file)
@@ -23,7 +23,8 @@ reiserfs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
        struct reiserfs_transaction_handle th;
        size_t jcreate_blocks;
        int size = acl ? posix_acl_xattr_size(acl->a_count) : 0;
-
+       int update_mode = 0;
+       umode_t mode = inode->i_mode;
 
        /*
         * Pessimism: We can't assume that anything from the xattr root up
@@ -37,7 +38,16 @@ reiserfs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
        error = journal_begin(&th, inode->i_sb, jcreate_blocks);
        reiserfs_write_unlock(inode->i_sb);
        if (error == 0) {
+               if (type == ACL_TYPE_ACCESS && acl) {
+                       error = posix_acl_update_mode(inode, &mode, &acl);
+                       if (error)
+                               goto unlock;
+                       update_mode = 1;
+               }
                error = __reiserfs_set_acl(&th, inode, type, acl);
+               if (!error && update_mode)
+                       inode->i_mode = mode;
+unlock:
                reiserfs_write_lock(inode->i_sb);
                error2 = journal_end(&th);
                reiserfs_write_unlock(inode->i_sb);
@@ -241,15 +251,6 @@ __reiserfs_set_acl(struct reiserfs_transaction_handle *th, struct inode *inode,
        switch (type) {
        case ACL_TYPE_ACCESS:
                name = XATTR_NAME_POSIX_ACL_ACCESS;
-               if (acl) {
-                       error = posix_acl_equiv_mode(acl, &inode->i_mode);
-                       if (error < 0)
-                               return error;
-                       else {
-                               if (error == 0)
-                                       acl = NULL;
-                       }
-               }
                break;
        case ACL_TYPE_DEFAULT:
                name = XATTR_NAME_POSIX_ACL_DEFAULT;
@@ -277,7 +278,7 @@ __reiserfs_set_acl(struct reiserfs_transaction_handle *th, struct inode *inode,
        if (error == -ENODATA) {
                error = 0;
                if (type == ACL_TYPE_ACCESS) {
-                       inode->i_ctime = CURRENT_TIME_SEC;
+                       inode->i_ctime = current_time(inode);
                        mark_inode_dirty(inode);
                }
        }