diff --git a/fs/ext4/acl.c b/fs/ext4/acl.c index 09441ae07a5be9de1f18cdc01d896808ba1e02be..2985cd0a640d9ecd65208e96383bc9ad5d7305c1 100644 --- a/fs/ext4/acl.c +++ b/fs/ext4/acl.c @@ -189,16 +189,17 @@ __ext4_set_acl(handle_t *handle, struct inode *inode, int type, void *value = NULL; size_t size = 0; int error; + int update_mode = 0; + umode_t mode = inode->i_mode; switch (type) { case ACL_TYPE_ACCESS: name_index = EXT4_XATTR_INDEX_POSIX_ACL_ACCESS; if (acl) { - error = posix_acl_update_mode(inode, &inode->i_mode, &acl); + error = posix_acl_update_mode(inode, &mode, &acl); if (error) return error; - inode->i_ctime = current_time(inode); - ext4_mark_inode_dirty(handle, inode); + update_mode = 1; } break; @@ -221,8 +222,14 @@ __ext4_set_acl(handle_t *handle, struct inode *inode, int type, value, size, xattr_flags); kfree(value); - if (!error) + if (!error) { set_cached_acl(inode, type, acl); + if (update_mode) { + inode->i_mode = mode; + inode->i_ctime = current_time(inode); + ext4_mark_inode_dirty(handle, inode); + } + } return error; }