On Fri, 2021-06-11 at 11:55 -0400, Jeff Layton wrote:
> It's not sufficient to skip reading when the pos is beyond the EOF.
> There may be data at the head of the page that we need to fill in
> before the write. Only elide the read if the pos is beyond the last page
> in the file.
> 
> Reported-by: Andrew W Elble <awe...@rit.edu>
> Signed-off-by: Jeff Layton <jlay...@kernel.org>
> ---
>  fs/ceph/addr.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> I've not tested this at all yet, but I think this is probably what we'll
> want for stable series v5.10.z - v5.12.z.
> 
> diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
> index 35c83f65475b..9f60f541b423 100644
> --- a/fs/ceph/addr.c
> +++ b/fs/ceph/addr.c
> @@ -1353,11 +1353,11 @@ static int ceph_write_begin(struct file *file, struct 
> address_space *mapping,
>               /*
>                * In some cases we don't need to read at all:
>                * - full page write
> -              * - write that lies completely beyond EOF
> +              * - write that lies in a page that is completely beyond EOF
>                * - write that covers the the page from start to EOF or beyond 
> it
>                */
>               if ((pos_in_page == 0 && len == PAGE_SIZE) ||
> -                 (pos >= i_size_read(inode)) ||
> +                 (index >= (i_size_read(inode) << PAGE_SHIFT)) ||

...and this should be:

                (index > (i_size_read(inode) << PAGE_SHIFT)) ||
                        
We only get to skip the read if the write pos is _beyond_ the last page.

>                   (pos_in_page == 0 && (pos + len) >= i_size_read(inode))) {
>                       zero_user_segments(page, 0, pos_in_page,
>                                          pos_in_page + len, PAGE_SIZE);

-- 
Jeff Layton <jlay...@kernel.org>

--
Linux-cachefs mailing list
Linux-cachefs@redhat.com
https://listman.redhat.com/mailman/listinfo/linux-cachefs

Reply via email to