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@xxxxxxxxxx> 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@xxxxxxxxxxxxxxxx> > 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@xxxxxxxxxx> > --- > 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); > >