Patch "NFSD: Fix zero NFSv4 READ results when RQ_SPLICE_OK is not set" has been added to the 6.5-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    NFSD: Fix zero NFSv4 READ results when RQ_SPLICE_OK is not set

to the 6.5-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     nfsd-fix-zero-nfsv4-read-results-when-rq_splice_ok-i.patch
and it can be found in the queue-6.5 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit b955bdb23060b2b19008f57526783d60aed3837e
Author: Chuck Lever <chuck.lever@xxxxxxxxxx>
Date:   Wed Sep 27 13:16:48 2023 -0400

    NFSD: Fix zero NFSv4 READ results when RQ_SPLICE_OK is not set
    
    [ Upstream commit 0d32a6bbb8e7bf503855f2990f1ccce0922db87b ]
    
    nfsd4_encode_readv() uses xdr->buf->page_len as a starting point for
    the nfsd_iter_read() sink buffer -- page_len is going to be offset
    by the parts of the COMPOUND that have already been encoded into
    xdr->buf->pages.
    
    However, that value must be captured /before/
    xdr_reserve_space_vec() advances page_len by the expected size of
    the read payload. Otherwise, the whole front part of the first
    page of the payload in the reply will be uninitialized.
    
    Mantas hit this because sec=krb5i forces RQ_SPLICE_OK off, which
    invokes the readv part of the nfsd4_encode_read() path. Also,
    older Linux NFS clients appear to send shorter READ requests
    for files smaller than a page, whereas newer clients just send
    page-sized requests and let the server send as many bytes as
    are in the file.
    
    Reported-by: Mantas Mikulėnas <grawity@xxxxxxxxx>
    Closes: https://lore.kernel.org/linux-nfs/f1d0b234-e650-0f6e-0f5d-126b3d51d1eb@xxxxxxxxx/
    Fixes: 703d75215555 ("NFSD: Hoist rq_vec preparation into nfsd_read() [step two]")
    Signed-off-by: Chuck Lever <chuck.lever@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
index be72628b13376..d2588f4ac42be 100644
--- a/fs/nfsd/nfs4xdr.c
+++ b/fs/nfsd/nfs4xdr.c
@@ -4105,6 +4105,7 @@ static __be32 nfsd4_encode_readv(struct nfsd4_compoundres *resp,
 				 struct file *file, unsigned long maxcount)
 {
 	struct xdr_stream *xdr = resp->xdr;
+	unsigned int base = xdr->buf->page_len & ~PAGE_MASK;
 	unsigned int starting_len = xdr->buf->len;
 	__be32 zero = xdr_zero;
 	__be32 nfserr;
@@ -4113,8 +4114,7 @@ static __be32 nfsd4_encode_readv(struct nfsd4_compoundres *resp,
 		return nfserr_resource;
 
 	nfserr = nfsd_iter_read(resp->rqstp, read->rd_fhp, file,
-				read->rd_offset, &maxcount,
-				xdr->buf->page_len & ~PAGE_MASK,
+				read->rd_offset, &maxcount, base,
 				&read->rd_eof);
 	read->rd_length = maxcount;
 	if (nfserr)



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux