Re: [PATCH v6 4/6] fs: make vfs_fileattr_[get|set] return -EOPNOSUPP
From: Amir Goldstein <amir73il@gmail.com>
Date: 2025-07-01 06:05:59
Also in:
linux-fsdevel, linux-xfs, lkml, selinux
On Mon, Jun 30, 2025 at 6:20 PM Andrey Albershteyn [off-list ref] wrote:
quoted hunk ↗ jump to hunk
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> --- 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 493d7f194956..a55c1375127f 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c@@ -1126,7 +1126,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; }
I think the semantics should be "This patch converts return code of vfs_fileattr_[gs]et and ->fileattr_[gs]et() from ENOIOCTLCMD to EOPNOSUPP" ENOIOCTLCMD belongs only in the ioctl frontend, so above conversion is not needed.
quoted hunk ↗ jump to hunk
static int ecryptfs_fileattr_set(struct mnt_idmap *idmap,diff --git a/fs/file_attr.c b/fs/file_attr.c index be62d97cc444..4e85fa00c092 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)@@ -229,7 +229,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;@@ -271,6 +271,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;@@ -292,6 +294,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;@@ -304,6 +308,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);@@ -324,6 +330,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 6f0e15f86c21..096d44712bb1 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; }
That's the wrong way, because it hides the desired -EOPNOTSUPP
return code from ovl_fileattr_get().
The conversion to -ENOTTY was done for
5b0a414d06c3 ("ovl: fix filattr copy-up failure"),
so please do this instead:
--- a/fs/overlayfs/inode.c
+++ b/fs/overlayfs/inode.c@@ -722,7 +722,7 @@ int ovl_real_fileattr_get(const struct path*realpath, struct fileattr *fa)
err = vfs_fileattr_get(realpath->dentry, fa);
if (err == -ENOIOCTLCMD)
- err = -ENOTTY;
+ err = -EOPNOTSUPP;
return err;
}
--- a/fs/overlayfs/copy_up.c
+++ b/fs/overlayfs/copy_up.c@@ -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 == -ENOTTY || err == -EINVAL || err == -EOPNOTSUPP)
return 0;
pr_warn("failed to retrieve lower fileattr (%pd2, err=%i)\n",
old->dentry, err);
Thanks,
Amir.