Unverified Commit b2796286 authored by Christian Brauner's avatar Christian Brauner
Browse files

Merge patch series "Fix to EOPNOTSUPP double conversion in ioctl_setflags()"

Andrey Albershteyn <aalbersh@redhat.com> says:

Revert original double conversion patch from ENOIOCTLCMD to EOPNOSUPP for
vfs_fileattr_get and vfs_fileattr_set. Instead, convert ENOIOCTLCMD only
where necessary.

To: linux-api@vger.kernel.org
To: linux-fsdevel@vger.kernel.org
To: linux-kernel@vger.kernel.org
To: linux-xfs@vger.kernel.org,
Cc: "Jan Kara" <jack@suse.cz>
Cc: "Jiri Slaby" <jirislaby@kernel.org>
Cc: "Christian Brauner" <brauner@kernel.org>
Cc: "Arnd Bergmann" <arnd@arndb.de>

* patches from https://lore.kernel.org/20251008-eopnosupp-fix-v1-0-5990de009c9f@kernel.org

:
  fs: return EOPNOTSUPP from file_setattr/file_getattr syscalls
  Revert "fs: make vfs_fileattr_[get|set] return -EOPNOTSUPP"

Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parents a779e27f d90ad28e
Loading
Loading
Loading
Loading
+6 −10
Original line number Diff line number Diff line
@@ -84,7 +84,7 @@ int vfs_fileattr_get(struct dentry *dentry, struct file_kattr *fa)
	int error;

	if (!inode->i_op->fileattr_get)
		return -EOPNOTSUPP;
		return -ENOIOCTLCMD;

	error = security_inode_file_getattr(dentry, fa);
	if (error)
@@ -270,7 +270,7 @@ int vfs_fileattr_set(struct mnt_idmap *idmap, struct dentry *dentry,
	int err;

	if (!inode->i_op->fileattr_set)
		return -EOPNOTSUPP;
		return -ENOIOCTLCMD;

	if (!inode_owner_or_capable(idmap, inode))
		return -EPERM;
@@ -312,8 +312,6 @@ 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;
@@ -335,8 +333,6 @@ 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;
@@ -349,8 +345,6 @@ 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);

@@ -371,8 +365,6 @@ 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;
@@ -424,6 +416,8 @@ SYSCALL_DEFINE5(file_getattr, int, dfd, const char __user *, filename,
	}

	error = vfs_fileattr_get(filepath.dentry, &fa);
	if (error == -ENOIOCTLCMD || error == -ENOTTY)
		error = -EOPNOTSUPP;
	if (error)
		return error;

@@ -491,6 +485,8 @@ SYSCALL_DEFINE5(file_setattr, int, dfd, const char __user *, filename,
	if (!error) {
		error = vfs_fileattr_set(mnt_idmap(filepath.mnt),
					 filepath.dentry, &fa);
		if (error == -ENOIOCTLCMD || error == -ENOTTY)
			error = -EOPNOTSUPP;
		mnt_drop_write(filepath.mnt);
	}

+0 −4
Original line number Diff line number Diff line
@@ -536,8 +536,6 @@ int fuse_fileattr_get(struct dentry *dentry, struct file_kattr *fa)
cleanup:
	fuse_priv_ioctl_cleanup(inode, ff);

	if (err == -ENOTTY)
		err = -EOPNOTSUPP;
	return err;
}

@@ -574,7 +572,5 @@ 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 == -EOPNOTSUPP || err == -EINVAL)
		if (err == -ENOTTY || err == -EINVAL)
			return 0;
		pr_warn("failed to retrieve lower fileattr (%pd2, err=%i)\n",
			old->dentry, err);
+4 −1
Original line number Diff line number Diff line
@@ -720,7 +720,10 @@ int ovl_real_fileattr_get(const struct path *realpath, struct file_kattr *fa)
	if (err)
		return err;

	return vfs_fileattr_get(realpath->dentry, fa);
	err = vfs_fileattr_get(realpath->dentry, fa);
	if (err == -ENOIOCTLCMD)
		err = -ENOTTY;
	return err;
}

int ovl_fileattr_get(struct dentry *dentry, struct file_kattr *fa)