On Thu, 2022-09-01 at 15:10 -0400, Chuck Lever wrote: > Since before the git era, NFSD has conserved the number of pages > held by each nfsd thread by combining the RPC receive and send > buffers into a single array of pages. This works because there are > no cases where an operation needs a large RPC Call message and a > large RPC Reply at the same time. > > Once an RPC Call has been received, svc_process() updates > svc_rqst::rq_res to describe the part of rq_pages that can be > used for constructing the Reply. This means that the send buffer > (rq_res) shrinks when the received RPC record containing the RPC > Call is large. > > A client can force this shrinkage on TCP by sending a correctly- > formed RPC Call header contained in an RPC record that is > excessively large. The full maximum payload size cannot be > constructed in that case. > > Cc: <stable@xxxxxxxxxxxxxxx> > Signed-off-by: Chuck Lever <chuck.lever@xxxxxxxxxx> > --- > fs/nfsd/nfs3proc.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/fs/nfsd/nfs3proc.c b/fs/nfsd/nfs3proc.c > index 7a159785499a..5b1e771238b3 100644 > --- a/fs/nfsd/nfs3proc.c > +++ b/fs/nfsd/nfs3proc.c > @@ -150,7 +150,6 @@ nfsd3_proc_read(struct svc_rqst *rqstp) > { > struct nfsd3_readargs *argp = rqstp->rq_argp; > struct nfsd3_readres *resp = rqstp->rq_resp; > - u32 max_blocksize = svc_max_payload(rqstp); > unsigned int len; > int v; > > @@ -159,7 +158,8 @@ nfsd3_proc_read(struct svc_rqst *rqstp) > (unsigned long) argp->count, > (unsigned long long) argp->offset); > > - argp->count = min_t(u32, argp->count, max_blocksize); > + argp->count = min_t(u32, argp->count, svc_max_payload(rqstp)); > + argp->count = min_t(u32, argp->count, rqstp->rq_res.buflen); > if (argp->offset > (u64)OFFSET_MAX) > argp->offset = (u64)OFFSET_MAX; > if (argp->offset + argp->count > (u64)OFFSET_MAX) > > Reviewed-by: Jeff Layton <jlayton@xxxxxxxxxx>