]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
fs: make vfs_fileattr_[get|set] return -EOPNOTSUPP
authorAndrey Albershteyn <aalbersh@redhat.com>
Mon, 30 Jun 2025 16:20:14 +0000 (18:20 +0200)
committerChristian Brauner <brauner@kernel.org>
Wed, 2 Jul 2025 12:29:10 +0000 (14:29 +0200)
Future patches will add new syscalls which use these functions. As
this interface won't be used for ioctls only, the EOPNOSUPP is more
appropriate return code.

This patch converts return code from ENOIOCTLCMD to EOPNOSUPP for
vfs_fileattr_get and vfs_fileattr_set. To save old behavior translate
EOPNOSUPP back for current users - overlayfs, encryptfs and fs/ioctl.c.

Signed-off-by: Andrey Albershteyn <aalbersh@kernel.org>
Link: https://lore.kernel.org/20250630-xattrat-syscall-v6-4-c4e3bc35227b@kernel.org
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/file_attr.c
fs/fuse/ioctl.c
fs/overlayfs/copy_up.c
fs/overlayfs/inode.c

index 0aee402acde43b3bafd3045c573e6f5fa616eef4..5c98cf8d5519eaad006b21e727e84de720621c62 100644 (file)
@@ -80,7 +80,7 @@ int vfs_fileattr_get(struct dentry *dentry, struct fileattr *fa)
        int error;
 
        if (!inode->i_op->fileattr_get)
-               return -ENOIOCTLCMD;
+               return -EOPNOTSUPP;
 
        error = security_inode_file_getattr(dentry, fa);
        if (error)
@@ -230,7 +230,7 @@ int vfs_fileattr_set(struct mnt_idmap *idmap, struct dentry *dentry,
        int err;
 
        if (!inode->i_op->fileattr_set)
-               return -ENOIOCTLCMD;
+               return -EOPNOTSUPP;
 
        if (!inode_owner_or_capable(idmap, inode))
                return -EPERM;
@@ -272,6 +272,8 @@ int ioctl_getflags(struct file *file, unsigned int __user *argp)
        int err;
 
        err = vfs_fileattr_get(file->f_path.dentry, &fa);
+       if (err == -EOPNOTSUPP)
+               err = -ENOIOCTLCMD;
        if (!err)
                err = put_user(fa.flags, argp);
        return err;
@@ -293,6 +295,8 @@ int ioctl_setflags(struct file *file, unsigned int __user *argp)
                        fileattr_fill_flags(&fa, flags);
                        err = vfs_fileattr_set(idmap, dentry, &fa);
                        mnt_drop_write_file(file);
+                       if (err == -EOPNOTSUPP)
+                               err = -ENOIOCTLCMD;
                }
        }
        return err;
@@ -305,6 +309,8 @@ int ioctl_fsgetxattr(struct file *file, void __user *argp)
        int err;
 
        err = vfs_fileattr_get(file->f_path.dentry, &fa);
+       if (err == -EOPNOTSUPP)
+               err = -ENOIOCTLCMD;
        if (!err)
                err = copy_fsxattr_to_user(&fa, argp);
 
@@ -325,6 +331,8 @@ int ioctl_fssetxattr(struct file *file, void __user *argp)
                if (!err) {
                        err = vfs_fileattr_set(idmap, dentry, &fa);
                        mnt_drop_write_file(file);
+                       if (err == -EOPNOTSUPP)
+                               err = -ENOIOCTLCMD;
                }
        }
        return err;
index 2d9abf48828f9439f31cc16fcc8ab407a7df9d46..f2692f7d5932fa5f3b659cbffc69d2c9e59b2948 100644 (file)
@@ -536,6 +536,8 @@ int fuse_fileattr_get(struct dentry *dentry, struct fileattr *fa)
 cleanup:
        fuse_priv_ioctl_cleanup(inode, ff);
 
+       if (err == -ENOTTY)
+               err = -EOPNOTSUPP;
        return err;
 }
 
@@ -572,5 +574,7 @@ int fuse_fileattr_set(struct mnt_idmap *idmap,
 cleanup:
        fuse_priv_ioctl_cleanup(inode, ff);
 
+       if (err == -ENOTTY)
+               err = -EOPNOTSUPP;
        return err;
 }
index d7310fcf38881e42de1151ca95b12d271eff06d2..2c646b7076d0dd0f157f68abbf0781367cd28ad6 100644 (file)
@@ -178,7 +178,7 @@ static int ovl_copy_fileattr(struct inode *inode, const struct path *old,
        err = ovl_real_fileattr_get(old, &oldfa);
        if (err) {
                /* Ntfs-3g returns -EINVAL for "no fileattr support" */
-               if (err == -ENOTTY || err == -EINVAL)
+               if (err == -EOPNOTSUPP || err == -EINVAL)
                        return 0;
                pr_warn("failed to retrieve lower fileattr (%pd2, err=%i)\n",
                        old->dentry, err);
index 6f0e15f86c21fc576fe1679e977597bd9f817e36..cf3581dc103430400ddfbcd51d99ff18268aef7d 100644 (file)
@@ -720,10 +720,7 @@ int ovl_real_fileattr_get(const struct path *realpath, struct fileattr *fa)
        if (err)
                return err;
 
-       err = vfs_fileattr_get(realpath->dentry, fa);
-       if (err == -ENOIOCTLCMD)
-               err = -ENOTTY;
-       return err;
+       return vfs_fileattr_get(realpath->dentry, fa);
 }
 
 int ovl_fileattr_get(struct dentry *dentry, struct fileattr *fa)