reiserfs: preserve i_mode if __reiserfs_set_acl() fails
[sfrench/cifs-2.6.git] / fs / reiserfs / xattr_acl.c
index d92a1dc6ee70f66ea8f95838598a859365e5cf64..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
@@ -38,12 +39,14 @@ reiserfs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
        reiserfs_write_unlock(inode->i_sb);
        if (error == 0) {
                if (type == ACL_TYPE_ACCESS && acl) {
-                       error = posix_acl_update_mode(inode, &inode->i_mode,
-                                                     &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);