Commit dfee55f0 authored by NeilBrown's avatar NeilBrown Committed by Linus Torvalds
Browse files

[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: default avatarJ. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: default avatarNeil Brown <neilb@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent bb6e8a9f
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -1122,18 +1122,20 @@ svcauth_gss_release(struct svc_rqst *rqstp)
					integ_len))
			BUG();
		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) {
			BUG_ON(resbuf->tail[0].iov_len);
			/* Use head for everything */
			resv = &resbuf->head[0];
		} else if (resbuf->tail[0].iov_base == NULL) {
			/* copied from nfsd4_encode_read */
			svc_take_page(rqstp);
			resbuf->tail[0].iov_base = page_address(rqstp
					->rq_respages[rqstp->rq_resused-1]);
			rqstp->rq_restailpage = rqstp->rq_resused-1;
			if (resbuf->head[0].iov_len + RPC_MAX_AUTH_SIZE
					> PAGE_SIZE)
				goto out_err;
			resbuf->tail[0].iov_base =
				resbuf->head[0].iov_base
				+ resbuf->head[0].iov_len;
			resbuf->tail[0].iov_len = 0;
			rqstp->rq_restailpage = 0;
			resv = &resbuf->tail[0];
		} else {
			resv = &resbuf->tail[0];