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 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> ?


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