On Thu, Apr 01, 2021 at 01:44:10AM +0000, Al Viro wrote:
On Wed, Mar 31, 2021 at 06:08:52PM -0700, Darrick J. Wong wrote:
quoted
+ ret = vfs_xchg_file_range(file1.file, file2, &args);
+ if (ret)
+ goto fdput;
+
+ /*
+ * The VFS will set RANGE_FSYNC on its own if the file or inode require
+ * synchronous writes. Don't leak this back to userspace.
+ */
+ args.flags &= ~FILE_XCHG_RANGE_FSYNC;
+ args.flags |= (old_flags & FILE_XCHG_RANGE_FSYNC);
+
+ if (copy_to_user(argp, &args, sizeof(args)))
+ ret = -EFAULT;
Erm... How is userland supposed to figure out whether that EFAULT
came before or after the operation? Which of the fields are outputs,
anyway?
Come to think of it, none of the fields are outputs, so this whole block
can go away. Thanks for noticing that. :)
quoted
+ /* Don't touch certain kinds of inodes */
+ if (IS_IMMUTABLE(inode1) || IS_IMMUTABLE(inode2))
+ return -EPERM;
Append-only should get the same treatment (and IMO if you have
Assuming you meant IS_APPEND, I thought we only checked that at open
time, as part of requiring O_APPEND?
O_APPEND on either file, you should get a failure as well).
generic_rw_checks (which is called by do_xchg_file_range) will send back
-EBADF if the file descriptors are O_APPEND.
--D