NFSD: pass range end to vfs_fsync_range() instead of count
authorBrian Foster <bfoster@redhat.com>
Wed, 16 Nov 2022 15:28:36 +0000 (10:28 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 31 Dec 2022 12:32:00 +0000 (13:32 +0100)
[ Upstream commit 79a1d88a36f77374c77fd41a4386d8c2736b8704 ]

_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@redhat.com>
Tested-by: Dai Ngo <dai.ngo@oracle.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/nfsd/nfs4proc.c

index e91d091..32fe7cb 100644 (file)
@@ -1646,6 +1646,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)
@@ -1665,8 +1666,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)