Message ID | 161214078155.1093.2334504504623797564.stgit@klimt.1015granger.net (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v1] SUNRPC: Fix NFS READs that start at non-page-aligned offsets | expand |
I tried this patch on 5.10.12 (which would normally produce streaming errors). So far it works well. Have tried it in the three situations that would previously cause issues - Kodi on Windows, Kodi on Mac, and the Windows 10 NFS client with VLC. All check out fine. > On 1 Feb 2021, at 11:53 am, Chuck Lever <chuck.lever@oracle.com> wrote: > > Anj Duvnjak reports that the Kodi.tv NFS client is not able to read > video files from a v5.10.11 Linux NFS server. > > The new sendpage-based TCP sendto logic was not attentive to non- > zero page_base values. nfsd_splice_read() sets that field when a > READ payload starts in the middle of a page. > > The Linux NFS client rarely emits an NFS READ that is not page- > aligned. All of my testing so far has been with Linux clients, so I > missed this one. > > Reported-by: A. Duvnjak <avian@extremenerds.net> > BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=211471 > Fixes: 4a85a6a3320b ("SUNRPC: Handle TCP socket sends with kernel_sendpage() again") > Signed-off-by: Chuck Lever <chuck.lever@oracle.com> > --- > net/sunrpc/svcsock.c | 7 ++++--- > 1 file changed, 4 insertions(+), 3 deletions(-) > > diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c > index c9766d07eb81..5a809c64dc7b 100644 > --- a/net/sunrpc/svcsock.c > +++ b/net/sunrpc/svcsock.c > @@ -1113,14 +1113,15 @@ static int svc_tcp_sendmsg(struct socket *sock, struct msghdr *msg, > unsigned int offset, len, remaining; > struct bio_vec *bvec; > > - bvec = xdr->bvec; > - offset = xdr->page_base; > + bvec = xdr->bvec + (xdr->page_base >> PAGE_SHIFT); > + offset = offset_in_page(xdr->page_base); > remaining = xdr->page_len; > flags = MSG_MORE | MSG_SENDPAGE_NOTLAST; > while (remaining > 0) { > if (remaining <= PAGE_SIZE && tail->iov_len == 0) > flags = 0; > - len = min(remaining, bvec->bv_len); > + > + len = min(remaining, bvec->bv_len - offset); > ret = kernel_sendpage(sock, bvec->bv_page, > bvec->bv_offset + offset, > len, flags); > >
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c index c9766d07eb81..5a809c64dc7b 100644 --- a/net/sunrpc/svcsock.c +++ b/net/sunrpc/svcsock.c @@ -1113,14 +1113,15 @@ static int svc_tcp_sendmsg(struct socket *sock, struct msghdr *msg, unsigned int offset, len, remaining; struct bio_vec *bvec; - bvec = xdr->bvec; - offset = xdr->page_base; + bvec = xdr->bvec + (xdr->page_base >> PAGE_SHIFT); + offset = offset_in_page(xdr->page_base); remaining = xdr->page_len; flags = MSG_MORE | MSG_SENDPAGE_NOTLAST; while (remaining > 0) { if (remaining <= PAGE_SIZE && tail->iov_len == 0) flags = 0; - len = min(remaining, bvec->bv_len); + + len = min(remaining, bvec->bv_len - offset); ret = kernel_sendpage(sock, bvec->bv_page, bvec->bv_offset + offset, len, flags);
Anj Duvnjak reports that the Kodi.tv NFS client is not able to read video files from a v5.10.11 Linux NFS server. The new sendpage-based TCP sendto logic was not attentive to non- zero page_base values. nfsd_splice_read() sets that field when a READ payload starts in the middle of a page. The Linux NFS client rarely emits an NFS READ that is not page- aligned. All of my testing so far has been with Linux clients, so I missed this one. Reported-by: A. Duvnjak <avian@extremenerds.net> BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=211471 Fixes: 4a85a6a3320b ("SUNRPC: Handle TCP socket sends with kernel_sendpage() again") Signed-off-by: Chuck Lever <chuck.lever@oracle.com> --- net/sunrpc/svcsock.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)