> On Nov 16, 2022, at 10:28 AM, Brian Foster <bfoster@xxxxxxxxxx> wrote: > > _nfsd_copy_file_range() calls vfs_fsync_range() with an offset and > count (bytes written), but the former wants the start and end bytes > of the range to sync. Fix it up. > > Fixes: eac0b17a77fb ("NFSD add vfs_fsync after async copy is done") > Signed-off-by: Brian Foster <bfoster@xxxxxxxxxx> > --- > > Hi all, > > This is just a quick drive-by patch from scanning through various flush > callers for something unrelated. It looked like this instance passes a > count instead of the end offset and it was easy enough to throw up a > patch. Compile tested only, feel free to toss it if I've just missed > something, etc. etc. Dai, Olga, can you review this, and one of you test it? > Brian > > fs/nfsd/nfs4proc.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > > diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c > index 8beb2bc4c328..3c67d4cb1eba 100644 > --- a/fs/nfsd/nfs4proc.c > +++ b/fs/nfsd/nfs4proc.c > @@ -1644,6 +1644,7 @@ static ssize_t _nfsd_copy_file_range(struct nfsd4_copy *copy, > u64 src_pos = copy->cp_src_pos; > u64 dst_pos = copy->cp_dst_pos; > int status; > + loff_t end; > > /* See RFC 7862 p.67: */ > if (bytes_total == 0) > @@ -1663,8 +1664,8 @@ static ssize_t _nfsd_copy_file_range(struct nfsd4_copy *copy, > /* for a non-zero asynchronous copy do a commit of data */ > if (nfsd4_copy_is_async(copy) && copy->cp_res.wr_bytes_written > 0) { > since = READ_ONCE(dst->f_wb_err); > - status = vfs_fsync_range(dst, copy->cp_dst_pos, > - copy->cp_res.wr_bytes_written, 0); > + end = copy->cp_dst_pos + copy->cp_res.wr_bytes_written - 1; > + status = vfs_fsync_range(dst, copy->cp_dst_pos, end, 0); > if (!status) > status = filemap_check_wb_err(dst->f_mapping, since); > if (!status) > -- > 2.37.3 > -- Chuck Lever