|
@@ -325,7 +325,7 @@ nfs3svc_decode_readargs(struct svc_rqst *rqstp, __be32 *p,
|
|
|
struct nfsd3_readargs *args)
|
|
|
{
|
|
|
unsigned int len;
|
|
|
- int v,pn;
|
|
|
+ int v;
|
|
|
u32 max_blocksize = svc_max_payload(rqstp);
|
|
|
|
|
|
if (!(p = decode_fh(p, &args->fh)))
|
|
@@ -340,8 +340,9 @@ nfs3svc_decode_readargs(struct svc_rqst *rqstp, __be32 *p,
|
|
|
/* set up the kvec */
|
|
|
v=0;
|
|
|
while (len > 0) {
|
|
|
- pn = rqstp->rq_resused++;
|
|
|
- rqstp->rq_vec[v].iov_base = page_address(rqstp->rq_respages[pn]);
|
|
|
+ struct page *p = *(rqstp->rq_next_page++);
|
|
|
+
|
|
|
+ rqstp->rq_vec[v].iov_base = page_address(p);
|
|
|
rqstp->rq_vec[v].iov_len = len < PAGE_SIZE? len : PAGE_SIZE;
|
|
|
len -= rqstp->rq_vec[v].iov_len;
|
|
|
v++;
|
|
@@ -463,8 +464,7 @@ nfs3svc_decode_symlinkargs(struct svc_rqst *rqstp, __be32 *p,
|
|
|
len = ntohl(*p++);
|
|
|
if (len == 0 || len > NFS3_MAXPATHLEN || len >= PAGE_SIZE)
|
|
|
return 0;
|
|
|
- args->tname = new =
|
|
|
- page_address(rqstp->rq_respages[rqstp->rq_resused++]);
|
|
|
+ args->tname = new = page_address(*(rqstp->rq_next_page++));
|
|
|
args->tlen = len;
|
|
|
/* first copy and check from the first page */
|
|
|
old = (char*)p;
|
|
@@ -535,8 +535,7 @@ nfs3svc_decode_readlinkargs(struct svc_rqst *rqstp, __be32 *p,
|
|
|
{
|
|
|
if (!(p = decode_fh(p, &args->fh)))
|
|
|
return 0;
|
|
|
- args->buffer =
|
|
|
- page_address(rqstp->rq_respages[rqstp->rq_resused++]);
|
|
|
+ args->buffer = page_address(*(rqstp->rq_next_page++));
|
|
|
|
|
|
return xdr_argsize_check(rqstp, p);
|
|
|
}
|
|
@@ -567,8 +566,7 @@ nfs3svc_decode_readdirargs(struct svc_rqst *rqstp, __be32 *p,
|
|
|
if (args->count > PAGE_SIZE)
|
|
|
args->count = PAGE_SIZE;
|
|
|
|
|
|
- args->buffer =
|
|
|
- page_address(rqstp->rq_respages[rqstp->rq_resused++]);
|
|
|
+ args->buffer = page_address(*(rqstp->rq_next_page++));
|
|
|
|
|
|
return xdr_argsize_check(rqstp, p);
|
|
|
}
|
|
@@ -577,7 +575,7 @@ int
|
|
|
nfs3svc_decode_readdirplusargs(struct svc_rqst *rqstp, __be32 *p,
|
|
|
struct nfsd3_readdirargs *args)
|
|
|
{
|
|
|
- int len, pn;
|
|
|
+ int len;
|
|
|
u32 max_blocksize = svc_max_payload(rqstp);
|
|
|
|
|
|
if (!(p = decode_fh(p, &args->fh)))
|
|
@@ -592,9 +590,9 @@ nfs3svc_decode_readdirplusargs(struct svc_rqst *rqstp, __be32 *p,
|
|
|
args->count = len;
|
|
|
|
|
|
while (len > 0) {
|
|
|
- pn = rqstp->rq_resused++;
|
|
|
+ struct page *p = *(rqstp->rq_next_page++);
|
|
|
if (!args->buffer)
|
|
|
- args->buffer = page_address(rqstp->rq_respages[pn]);
|
|
|
+ args->buffer = page_address(p);
|
|
|
len -= PAGE_SIZE;
|
|
|
}
|
|
|
|
|
@@ -880,7 +878,7 @@ encode_entry(struct readdir_cd *ccd, const char *name, int namlen,
|
|
|
common);
|
|
|
__be32 *p = cd->buffer;
|
|
|
caddr_t curr_page_addr = NULL;
|
|
|
- int pn; /* current page number */
|
|
|
+ struct page ** page;
|
|
|
int slen; /* string (name) length */
|
|
|
int elen; /* estimated entry length in words */
|
|
|
int num_entry_words = 0; /* actual number of words */
|
|
@@ -917,8 +915,9 @@ encode_entry(struct readdir_cd *ccd, const char *name, int namlen,
|
|
|
}
|
|
|
|
|
|
/* determine which page in rq_respages[] we are currently filling */
|
|
|
- for (pn=1; pn < cd->rqstp->rq_resused; pn++) {
|
|
|
- curr_page_addr = page_address(cd->rqstp->rq_respages[pn]);
|
|
|
+ for (page = cd->rqstp->rq_respages + 1;
|
|
|
+ page < cd->rqstp->rq_next_page; page++) {
|
|
|
+ curr_page_addr = page_address(*page);
|
|
|
|
|
|
if (((caddr_t)cd->buffer >= curr_page_addr) &&
|
|
|
((caddr_t)cd->buffer < curr_page_addr + PAGE_SIZE))
|
|
@@ -933,14 +932,14 @@ encode_entry(struct readdir_cd *ccd, const char *name, int namlen,
|
|
|
if (plus)
|
|
|
p = encode_entryplus_baggage(cd, p, name, namlen);
|
|
|
num_entry_words = p - cd->buffer;
|
|
|
- } else if (cd->rqstp->rq_respages[pn+1] != NULL) {
|
|
|
+ } else if (*(page+1) != NULL) {
|
|
|
/* temporarily encode entry into next page, then move back to
|
|
|
* current and next page in rq_respages[] */
|
|
|
__be32 *p1, *tmp;
|
|
|
int len1, len2;
|
|
|
|
|
|
/* grab next page for temporary storage of entry */
|
|
|
- p1 = tmp = page_address(cd->rqstp->rq_respages[pn+1]);
|
|
|
+ p1 = tmp = page_address(*(page+1));
|
|
|
|
|
|
p1 = encode_entry_baggage(cd, p1, name, namlen, ino);
|
|
|
|