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 <aweits@xxxxxxx> > Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx> > --- > 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 <jlayton@xxxxxxxxxx> -- Linux-cachefs mailing list Linux-cachefs@xxxxxxxxxx https://listman.redhat.com/mailman/listinfo/linux-cachefs