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/nfsproc.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/fs/nfsd/nfsproc.c b/fs/nfsd/nfsproc.c > index ddb1902c0a18..4b19cc727ea5 100644 > --- a/fs/nfsd/nfsproc.c > +++ b/fs/nfsd/nfsproc.c > @@ -185,6 +185,7 @@ nfsd_proc_read(struct svc_rqst *rqstp) > argp->count, argp->offset); > > argp->count = min_t(u32, argp->count, NFSSVC_MAXBLKSIZE_V2); > + argp->count = min_t(u32, argp->count, rqstp->rq_res.buflen); > > v = 0; > len = argp->count; > > Reviewed-by: Jeff Layton <jlayton@xxxxxxxxxx>