Unverified Commit 474b155a authored by Andrey Albershteyn's avatar Andrey Albershteyn Committed by Christian Brauner
Browse files

fs: make vfs_fileattr_[get|set] return -EOPNOTSUPP



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: default avatarAndrey Albershteyn <aalbersh@kernel.org>
Link: https://lore.kernel.org/20250630-xattrat-syscall-v6-4-c4e3bc35227b@kernel.org


Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent bd14e462
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -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;
+4 −0
Original line number Diff line number Diff line
@@ -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;
}
+1 −1
Original line number Diff line number Diff line
@@ -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);
+1 −4
Original line number Diff line number Diff line
@@ -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)