Merge tag 'batadv-net-for-davem-20170802' of git://git.open-mesh.org/linux-merge
[sfrench/cifs-2.6.git] / fs / jfs / acl.c
index 7bc186f4ed4de6837b94ab8670cca7043122b28c..2e71b6e7e646a489e35bad17c23cc2140c5bc64b 100644 (file)
@@ -77,13 +77,6 @@ static int __jfs_set_acl(tid_t tid, struct inode *inode, int type,
        switch (type) {
        case ACL_TYPE_ACCESS:
                ea_name = XATTR_NAME_POSIX_ACL_ACCESS;
-               if (acl) {
-                       rc = posix_acl_update_mode(inode, &inode->i_mode, &acl);
-                       if (rc)
-                               return rc;
-                       inode->i_ctime = current_time(inode);
-                       mark_inode_dirty(inode);
-               }
                break;
        case ACL_TYPE_DEFAULT:
                ea_name = XATTR_NAME_POSIX_ACL_DEFAULT;
@@ -115,12 +108,27 @@ int jfs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
 {
        int rc;
        tid_t tid;
+       int update_mode = 0;
+       umode_t mode = inode->i_mode;
 
        tid = txBegin(inode->i_sb, 0);
        mutex_lock(&JFS_IP(inode)->commit_mutex);
+       if (type == ACL_TYPE_ACCESS && acl) {
+               rc = posix_acl_update_mode(inode, &mode, &acl);
+               if (rc)
+                       goto end_tx;
+               update_mode = 1;
+       }
        rc = __jfs_set_acl(tid, inode, type, acl);
-       if (!rc)
+       if (!rc) {
+               if (update_mode) {
+                       inode->i_mode = mode;
+                       inode->i_ctime = current_time(inode);
+                       mark_inode_dirty(inode);
+               }
                rc = txCommit(tid, 1, &inode, 0);
+       }
+end_tx:
        txEnd(tid);
        mutex_unlock(&JFS_IP(inode)->commit_mutex);
        return rc;