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 coverts 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 <aalbe...@kernel.org>
---
 fs/ecryptfs/inode.c  |  8 +++++++-
 fs/file_attr.c       | 12 ++++++++++--
 fs/overlayfs/inode.c |  2 +-
 3 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c
index 
51a5c54eb74026d8b2deec6e0608f3d2b3e9c092..6bf08ff4d7f71c5223b90f4cde57e380b68260fd
 100644
--- a/fs/ecryptfs/inode.c
+++ b/fs/ecryptfs/inode.c
@@ -1124,7 +1124,13 @@ static int ecryptfs_removexattr(struct dentry *dentry, 
struct inode *inode,
 
 static int ecryptfs_fileattr_get(struct dentry *dentry, struct fileattr *fa)
 {
-       return vfs_fileattr_get(ecryptfs_dentry_to_lower(dentry), fa);
+       int rc;
+
+       rc = vfs_fileattr_get(ecryptfs_dentry_to_lower(dentry), fa);
+       if (rc == -EOPNOTSUPP)
+               rc = -ENOIOCTLCMD;
+
+       return rc;
 }
 
 static int ecryptfs_fileattr_set(struct mnt_idmap *idmap,
diff --git a/fs/file_attr.c b/fs/file_attr.c
index 
d9eab553dc250f84075ac74c1c7d8d6fd6588374..d696f440fa4ffcba8985cc4bfe22a1c0e612ac7c
 100644
--- a/fs/file_attr.c
+++ b/fs/file_attr.c
@@ -79,7 +79,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)
@@ -239,7 +239,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;
@@ -281,6 +281,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;
@@ -302,6 +304,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;
@@ -314,6 +318,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);
 
@@ -334,6 +340,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;
diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c
index 
6f0e15f86c21fc576fe1679e977597bd9f817e36..096d44712bb1130fd3e9673a61747b0fbf877d25
 100644
--- a/fs/overlayfs/inode.c
+++ b/fs/overlayfs/inode.c
@@ -721,7 +721,7 @@ int ovl_real_fileattr_get(const struct path *realpath, 
struct fileattr *fa)
                return err;
 
        err = vfs_fileattr_get(realpath->dentry, fa);
-       if (err == -ENOIOCTLCMD)
+       if (err == -EOPNOTSUPP)
                err = -ENOTTY;
        return err;
 }

-- 
2.47.2


Reply via email to