gfs2: preserve i_mode if __gfs2_set_acl() fails
[muen/linux.git] / fs / gfs2 / acl.c
index a6d962323790c71795b2c1c1f0a8c5660ec286c1..9d5eecb123de6d73a02fea79ebeffd959ecc82aa 100644 (file)
@@ -116,6 +116,7 @@ int gfs2_set_acl(struct inode *inode, struct posix_acl *acl, int type)
        struct gfs2_holder gh;
        bool need_unlock = false;
        int ret;
+       umode_t mode;
 
        if (acl && acl->a_count > GFS2_ACL_MAX_ENTRIES(GFS2_SB(inode)))
                return -E2BIG;
@@ -130,17 +131,19 @@ int gfs2_set_acl(struct inode *inode, struct posix_acl *acl, int type)
                        return ret;
                need_unlock = true;
        }
-       if (type == ACL_TYPE_ACCESS && acl) {
-               umode_t mode = inode->i_mode;
 
-               ret = posix_acl_update_mode(inode, &inode->i_mode, &acl);
+       mode = inode->i_mode;
+       if (type == ACL_TYPE_ACCESS && acl) {
+               ret = posix_acl_update_mode(inode, &mode, &acl);
                if (ret)
                        goto unlock;
-               if (mode != inode->i_mode)
-                       mark_inode_dirty(inode);
        }
 
        ret = __gfs2_set_acl(inode, acl, type);
+       if (!ret && mode != inode->i_mode) {
+               inode->i_mode = mode;
+               mark_inode_dirty(inode);
+       }
 unlock:
        if (need_unlock)
                gfs2_glock_dq_uninit(&gh);