[PATCH] knfsd: svcrpc: gss: don't call svc_take_page unnecessarily
NeilBrown [Tue, 11 Apr 2006 05:55:34 +0000 (22:55 -0700)]
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>

net/sunrpc/auth_gss/svcauth_gss.c

index 4d7eb9e..d51e316 100644 (file)
@@ -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];