[PATCH] knfsd: svcrpc: gss: don't call svc_take_page unnecessarily
We're using svc_take_page here to get another page for the tail in case one wasn't already allocated. But there isn't always guaranteed to be another page available. Also fix a typo that made us check the tail buffer for space when we meant to be checking the head buffer. Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu> Signed-off-by: Neil Brown <neilb@suse.de> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
bb6e8a9f40
commit
dfee55f062
@@ -1122,18 +1122,20 @@ svcauth_gss_release(struct svc_rqst *rqstp)
|
|||||||
integ_len))
|
integ_len))
|
||||||
BUG();
|
BUG();
|
||||||
if (resbuf->page_len == 0
|
if (resbuf->page_len == 0
|
||||||
&& resbuf->tail[0].iov_len + RPC_MAX_AUTH_SIZE
|
&& resbuf->head[0].iov_len + RPC_MAX_AUTH_SIZE
|
||||||
< PAGE_SIZE) {
|
< PAGE_SIZE) {
|
||||||
BUG_ON(resbuf->tail[0].iov_len);
|
BUG_ON(resbuf->tail[0].iov_len);
|
||||||
/* Use head for everything */
|
/* Use head for everything */
|
||||||
resv = &resbuf->head[0];
|
resv = &resbuf->head[0];
|
||||||
} else if (resbuf->tail[0].iov_base == NULL) {
|
} else if (resbuf->tail[0].iov_base == NULL) {
|
||||||
/* copied from nfsd4_encode_read */
|
if (resbuf->head[0].iov_len + RPC_MAX_AUTH_SIZE
|
||||||
svc_take_page(rqstp);
|
> PAGE_SIZE)
|
||||||
resbuf->tail[0].iov_base = page_address(rqstp
|
goto out_err;
|
||||||
->rq_respages[rqstp->rq_resused-1]);
|
resbuf->tail[0].iov_base =
|
||||||
rqstp->rq_restailpage = rqstp->rq_resused-1;
|
resbuf->head[0].iov_base
|
||||||
|
+ resbuf->head[0].iov_len;
|
||||||
resbuf->tail[0].iov_len = 0;
|
resbuf->tail[0].iov_len = 0;
|
||||||
|
rqstp->rq_restailpage = 0;
|
||||||
resv = &resbuf->tail[0];
|
resv = &resbuf->tail[0];
|
||||||
} else {
|
} else {
|
||||||
resv = &resbuf->tail[0];
|
resv = &resbuf->tail[0];
|
||||||
|
Reference in New Issue
Block a user