Merge tag 'wberr-v4.14-1' of git://git.kernel.org/pub/scm/linux/kernel/git/jlayton...
[sfrench/cifs-2.6.git] / fs / gfs2 / acl.c
index 2524807ee0703643867e7e04c803d10b1aab9182..9d5eecb123de6d73a02fea79ebeffd959ecc82aa 100644 (file)
@@ -86,19 +86,6 @@ int __gfs2_set_acl(struct inode *inode, struct posix_acl *acl, int type)
        char *data;
        const char *name = gfs2_acl_name(type);
 
-       if (acl && acl->a_count > GFS2_ACL_MAX_ENTRIES(GFS2_SB(inode)))
-               return -E2BIG;
-
-       if (type == ACL_TYPE_ACCESS) {
-               umode_t mode = inode->i_mode;
-
-               error = posix_acl_update_mode(inode, &inode->i_mode, &acl);
-               if (error)
-                       return error;
-               if (mode != inode->i_mode)
-                       mark_inode_dirty(inode);
-       }
-
        if (acl) {
                len = posix_acl_to_xattr(&init_user_ns, acl, NULL, 0);
                if (len == 0)
@@ -129,6 +116,10 @@ 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;
 
        ret = gfs2_rsqa_alloc(ip);
        if (ret)
@@ -140,7 +131,20 @@ int gfs2_set_acl(struct inode *inode, struct posix_acl *acl, int type)
                        return ret;
                need_unlock = true;
        }
+
+       mode = inode->i_mode;
+       if (type == ACL_TYPE_ACCESS && acl) {
+               ret = posix_acl_update_mode(inode, &mode, &acl);
+               if (ret)
+                       goto unlock;
+       }
+
        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);
        return ret;