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;
                        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);