diff options
Diffstat (limited to 'fs/nfsd/nfs3xdr.c')
| -rw-r--r-- | fs/nfsd/nfs3xdr.c | 33 | 
1 files changed, 16 insertions, 17 deletions
diff --git a/fs/nfsd/nfs3xdr.c b/fs/nfsd/nfs3xdr.c index 2b8618de6c2..324c0baf7cd 100644 --- a/fs/nfsd/nfs3xdr.c +++ b/fs/nfsd/nfs3xdr.c @@ -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);  |