提交 dfee55f0 编写于 作者: N NeilBrown 提交者: Linus Torvalds

[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: NJ. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: NNeil Brown <neilb@suse.de>
Signed-off-by: NAndrew Morton <akpm@osdl.org>
Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
上级 bb6e8a9f
...@@ -1122,18 +1122,20 @@ svcauth_gss_release(struct svc_rqst *rqstp) ...@@ -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];
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册