|
@@ -2925,11 +2925,16 @@ nfsd4_encode_read(struct nfsd4_compoundres *resp, __be32 nfserr,
|
|
|
len = maxcount;
|
|
|
v = 0;
|
|
|
while (len > 0) {
|
|
|
- pn = resp->rqstp->rq_resused++;
|
|
|
+ pn = resp->rqstp->rq_resused;
|
|
|
+ if (!resp->rqstp->rq_respages[pn]) { /* ran out of pages */
|
|
|
+ maxcount -= len;
|
|
|
+ break;
|
|
|
+ }
|
|
|
resp->rqstp->rq_vec[v].iov_base =
|
|
|
page_address(resp->rqstp->rq_respages[pn]);
|
|
|
resp->rqstp->rq_vec[v].iov_len =
|
|
|
len < PAGE_SIZE ? len : PAGE_SIZE;
|
|
|
+ resp->rqstp->rq_resused++;
|
|
|
v++;
|
|
|
len -= PAGE_SIZE;
|
|
|
}
|
|
@@ -2975,6 +2980,8 @@ nfsd4_encode_readlink(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd
|
|
|
return nfserr;
|
|
|
if (resp->xbuf->page_len)
|
|
|
return nfserr_resource;
|
|
|
+ if (!resp->rqstp->rq_respages[resp->rqstp->rq_resused])
|
|
|
+ return nfserr_resource;
|
|
|
|
|
|
page = page_address(resp->rqstp->rq_respages[resp->rqstp->rq_resused++]);
|
|
|
|
|
@@ -3024,6 +3031,8 @@ nfsd4_encode_readdir(struct nfsd4_compoundres *resp, __be32 nfserr, struct nfsd4
|
|
|
return nfserr;
|
|
|
if (resp->xbuf->page_len)
|
|
|
return nfserr_resource;
|
|
|
+ if (!resp->rqstp->rq_respages[resp->rqstp->rq_resused])
|
|
|
+ return nfserr_resource;
|
|
|
|
|
|
RESERVE_SPACE(NFS4_VERIFIER_SIZE);
|
|
|
savep = p;
|