]> Gentwo Git Trees - linux/.git/commitdiff
fs/ntfs3: update mode in xattr when ACL can be reduced to mode
authorKonstantin Komarov <almaz.alexandrovich@paragon-software.com>
Thu, 30 Oct 2025 20:49:27 +0000 (23:49 +0300)
committerKonstantin Komarov <almaz.alexandrovich@paragon-software.com>
Mon, 17 Nov 2025 08:09:14 +0000 (09:09 +0100)
If a file's ACL can be reduced to standard mode bits, update mode
accordingly, persist the change, and update the cached ACL. This keeps
mode and ACL consistent and avoids redundant xattrs.

Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
fs/ntfs3/xattr.c

index e519e21596a708dcc1f8b234fcabc68de6ef41e6..c93df55e98d079fc0693f996dc42a3813d1402f6 100644 (file)
@@ -654,12 +654,22 @@ static noinline int ntfs_set_acl_ex(struct mnt_idmap *idmap,
        err = ntfs_set_ea(inode, name, name_len, value, size, flags, 0, NULL);
        if (err == -ENODATA && !size)
                err = 0; /* Removing non existed xattr. */
-       if (!err) {
-               set_cached_acl(inode, type, acl);
+       if (err)
+               goto out;
+
+       if (inode->i_mode != mode) {
+               umode_t old_mode = inode->i_mode;
+               inode->i_mode = mode;
+               err = ntfs_save_wsl_perm(inode, NULL);
+               if (err) {
+                       inode->i_mode = old_mode;
+                       goto out;
+               }
                inode->i_mode = mode;
-               inode_set_ctime_current(inode);
-               mark_inode_dirty(inode);
        }
+       set_cached_acl(inode, type, acl);
+       inode_set_ctime_current(inode);
+       mark_inode_dirty(inode);
 
 out:
        kfree(value);