Re: [PATCH] NFSD: pass range end to vfs_fsync_range() instead of count

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 11/16/22 11:01 AM, Chuck Lever III wrote:

On Nov 16, 2022, at 1:50 PM, Dai Ngo <dai.ngo@xxxxxxxxxx> wrote:


On 11/16/22 7:34 AM, Chuck Lever III wrote:
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?
LGTM, tested ok.
May I add Tested-by: Dai Ngo <dai.ngo@xxxxxxxxxx> ?

Yes,

Thanks,
-Dai



-Dai


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
--
Chuck Lever






[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux