On Wed, Mar 31, 2021 at 06:08:52PM -0700, Darrick J. Wong wrote: > + 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? > + /* 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 O_APPEND on either file, you should get a failure as well).