diff options
Diffstat (limited to 'fs/nfsd/nfs3xdr.c')
| -rw-r--r-- | fs/nfsd/nfs3xdr.c | 11 | 
1 files changed, 9 insertions, 2 deletions
| diff --git a/fs/nfsd/nfs3xdr.c b/fs/nfsd/nfs3xdr.c index 93fea246f676..8d789124ed3c 100644 --- a/fs/nfsd/nfs3xdr.c +++ b/fs/nfsd/nfs3xdr.c @@ -573,6 +573,7 @@ int  nfs3svc_decode_readdirargs(struct svc_rqst *rqstp, __be32 *p)  {  	struct nfsd3_readdirargs *args = rqstp->rq_argp; +	int len;  	u32 max_blocksize = svc_max_payload(rqstp);  	p = decode_fh(p, &args->fh); @@ -582,8 +583,14 @@ nfs3svc_decode_readdirargs(struct svc_rqst *rqstp, __be32 *p)  	args->verf   = p; p += 2;  	args->dircount = ~0;  	args->count  = ntohl(*p++); -	args->count  = min_t(u32, args->count, max_blocksize); -	args->buffer = page_address(*(rqstp->rq_next_page++)); +	len = args->count  = min_t(u32, args->count, max_blocksize); + +	while (len > 0) { +		struct page *p = *(rqstp->rq_next_page++); +		if (!args->buffer) +			args->buffer = page_address(p); +		len -= PAGE_SIZE; +	}  	return xdr_argsize_check(rqstp, p);  } |