2022-11-16 15:35:46

by Brian Foster

[permalink] [raw]
Subject: [PATCH] NFSD: pass range end to vfs_fsync_range() instead of count

_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 <[email protected]>
---

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.

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



2022-11-16 15:36:08

by Chuck Lever III

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



> On Nov 16, 2022, at 10:28 AM, Brian Foster <[email protected]> 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 <[email protected]>
> ---
>
> 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




2022-11-16 18:54:16

by Dai Ngo

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


On 11/16/22 7:34 AM, Chuck Lever III wrote:
>
>> On Nov 16, 2022, at 10:28 AM, Brian Foster <[email protected]> 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 <[email protected]>
>> ---
>>
>> 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.

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

2022-11-16 19:17:13

by Chuck Lever III

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



> On Nov 16, 2022, at 1:50 PM, Dai Ngo <[email protected]> wrote:
>
>
> On 11/16/22 7:34 AM, Chuck Lever III wrote:
>>
>>> On Nov 16, 2022, at 10:28 AM, Brian Foster <[email protected]> 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 <[email protected]>
>>> ---
>>>
>>> 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 <[email protected]> ?


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




2022-11-16 19:23:34

by Dai Ngo

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


On 11/16/22 11:01 AM, Chuck Lever III wrote:
>
>> On Nov 16, 2022, at 1:50 PM, Dai Ngo <[email protected]> wrote:
>>
>>
>> On 11/16/22 7:34 AM, Chuck Lever III wrote:
>>>> On Nov 16, 2022, at 10:28 AM, Brian Foster <[email protected]> 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 <[email protected]>
>>>> ---
>>>>
>>>> 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 <[email protected]> ?

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