diff options
Diffstat (limited to 'net/sunrpc/svc.c')
| -rw-r--r-- | net/sunrpc/svc.c | 21 |
1 files changed, 7 insertions, 14 deletions
diff --git a/net/sunrpc/svc.c b/net/sunrpc/svc.c index a99e67b164c1..f4a509a925b5 100644 --- a/net/sunrpc/svc.c +++ b/net/sunrpc/svc.c | |||
| @@ -417,18 +417,15 @@ svc_init_buffer(struct svc_rqst *rqstp, unsigned int size) | |||
| 417 | if (size > RPCSVC_MAXPAYLOAD) | 417 | if (size > RPCSVC_MAXPAYLOAD) |
| 418 | size = RPCSVC_MAXPAYLOAD; | 418 | size = RPCSVC_MAXPAYLOAD; |
| 419 | pages = 2 + (size+ PAGE_SIZE -1) / PAGE_SIZE; | 419 | pages = 2 + (size+ PAGE_SIZE -1) / PAGE_SIZE; |
| 420 | rqstp->rq_argused = 0; | ||
| 421 | rqstp->rq_resused = 0; | ||
| 422 | arghi = 0; | 420 | arghi = 0; |
| 423 | BUG_ON(pages > RPCSVC_MAXPAGES); | 421 | BUG_ON(pages > RPCSVC_MAXPAGES); |
| 424 | while (pages) { | 422 | while (pages) { |
| 425 | struct page *p = alloc_page(GFP_KERNEL); | 423 | struct page *p = alloc_page(GFP_KERNEL); |
| 426 | if (!p) | 424 | if (!p) |
| 427 | break; | 425 | break; |
| 428 | rqstp->rq_argpages[arghi++] = p; | 426 | rqstp->rq_pages[arghi++] = p; |
| 429 | pages--; | 427 | pages--; |
| 430 | } | 428 | } |
| 431 | rqstp->rq_arghi = arghi; | ||
| 432 | return ! pages; | 429 | return ! pages; |
| 433 | } | 430 | } |
| 434 | 431 | ||
| @@ -438,14 +435,10 @@ svc_init_buffer(struct svc_rqst *rqstp, unsigned int size) | |||
| 438 | static void | 435 | static void |
| 439 | svc_release_buffer(struct svc_rqst *rqstp) | 436 | svc_release_buffer(struct svc_rqst *rqstp) |
| 440 | { | 437 | { |
| 441 | while (rqstp->rq_arghi) | 438 | int i; |
| 442 | put_page(rqstp->rq_argpages[--rqstp->rq_arghi]); | 439 | for (i=0; i<ARRAY_SIZE(rqstp->rq_pages); i++) |
| 443 | while (rqstp->rq_resused) { | 440 | if (rqstp->rq_pages[i]) |
| 444 | if (rqstp->rq_respages[--rqstp->rq_resused] == NULL) | 441 | put_page(rqstp->rq_pages[i]); |
| 445 | continue; | ||
| 446 | put_page(rqstp->rq_respages[rqstp->rq_resused]); | ||
| 447 | } | ||
| 448 | rqstp->rq_argused = 0; | ||
| 449 | } | 442 | } |
| 450 | 443 | ||
| 451 | /* | 444 | /* |
| @@ -707,10 +700,10 @@ svc_process(struct svc_rqst *rqstp) | |||
| 707 | /* setup response xdr_buf. | 700 | /* setup response xdr_buf. |
| 708 | * Initially it has just one page | 701 | * Initially it has just one page |
| 709 | */ | 702 | */ |
| 710 | svc_take_page(rqstp); /* must succeed */ | 703 | rqstp->rq_resused = 1; |
| 711 | resv->iov_base = page_address(rqstp->rq_respages[0]); | 704 | resv->iov_base = page_address(rqstp->rq_respages[0]); |
| 712 | resv->iov_len = 0; | 705 | resv->iov_len = 0; |
| 713 | rqstp->rq_res.pages = rqstp->rq_respages+1; | 706 | rqstp->rq_res.pages = rqstp->rq_respages + 1; |
| 714 | rqstp->rq_res.len = 0; | 707 | rqstp->rq_res.len = 0; |
| 715 | rqstp->rq_res.page_base = 0; | 708 | rqstp->rq_res.page_base = 0; |
| 716 | rqstp->rq_res.page_len = 0; | 709 | rqstp->rq_res.page_len = 0; |
