diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/sunrpc/clnt.c | 62 | ||||
-rw-r--r-- | net/sunrpc/pmap_clnt.c | 9 | ||||
-rw-r--r-- | net/sunrpc/xprt.c | 1 |
3 files changed, 44 insertions, 28 deletions
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 396cdbe249d1..12487aafaab5 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c | |||
@@ -36,8 +36,6 @@ | |||
36 | #include <linux/sunrpc/metrics.h> | 36 | #include <linux/sunrpc/metrics.h> |
37 | 37 | ||
38 | 38 | ||
39 | #define RPC_SLACK_SPACE (1024) /* total overkill */ | ||
40 | |||
41 | #ifdef RPC_DEBUG | 39 | #ifdef RPC_DEBUG |
42 | # define RPCDBG_FACILITY RPCDBG_CALL | 40 | # define RPCDBG_FACILITY RPCDBG_CALL |
43 | #endif | 41 | #endif |
@@ -747,21 +745,37 @@ call_reserveresult(struct rpc_task *task) | |||
747 | static void | 745 | static void |
748 | call_allocate(struct rpc_task *task) | 746 | call_allocate(struct rpc_task *task) |
749 | { | 747 | { |
748 | unsigned int slack = task->tk_auth->au_cslack; | ||
750 | struct rpc_rqst *req = task->tk_rqstp; | 749 | struct rpc_rqst *req = task->tk_rqstp; |
751 | struct rpc_xprt *xprt = task->tk_xprt; | 750 | struct rpc_xprt *xprt = task->tk_xprt; |
752 | unsigned int bufsiz; | 751 | struct rpc_procinfo *proc = task->tk_msg.rpc_proc; |
753 | 752 | ||
754 | dprint_status(task); | 753 | dprint_status(task); |
755 | 754 | ||
755 | task->tk_status = 0; | ||
756 | task->tk_action = call_bind; | 756 | task->tk_action = call_bind; |
757 | |||
757 | if (req->rq_buffer) | 758 | if (req->rq_buffer) |
758 | return; | 759 | return; |
759 | 760 | ||
760 | /* FIXME: compute buffer requirements more exactly using | 761 | if (proc->p_proc != 0) { |
761 | * auth->au_wslack */ | 762 | BUG_ON(proc->p_arglen == 0); |
762 | bufsiz = task->tk_msg.rpc_proc->p_bufsiz + RPC_SLACK_SPACE; | 763 | if (proc->p_decode != NULL) |
764 | BUG_ON(proc->p_replen == 0); | ||
765 | } | ||
763 | 766 | ||
764 | if (xprt->ops->buf_alloc(task, bufsiz << 1) != NULL) | 767 | /* |
768 | * Calculate the size (in quads) of the RPC call | ||
769 | * and reply headers, and convert both values | ||
770 | * to byte sizes. | ||
771 | */ | ||
772 | req->rq_callsize = RPC_CALLHDRSIZE + (slack << 1) + proc->p_arglen; | ||
773 | req->rq_callsize <<= 2; | ||
774 | req->rq_rcvsize = RPC_REPHDRSIZE + slack + proc->p_replen; | ||
775 | req->rq_rcvsize <<= 2; | ||
776 | |||
777 | xprt->ops->buf_alloc(task, req->rq_callsize + req->rq_rcvsize); | ||
778 | if (req->rq_buffer != NULL) | ||
765 | return; | 779 | return; |
766 | 780 | ||
767 | dprintk("RPC: %5u rpc_buffer allocation failed\n", task->tk_pid); | 781 | dprintk("RPC: %5u rpc_buffer allocation failed\n", task->tk_pid); |
@@ -788,6 +802,17 @@ rpc_task_force_reencode(struct rpc_task *task) | |||
788 | task->tk_rqstp->rq_snd_buf.len = 0; | 802 | task->tk_rqstp->rq_snd_buf.len = 0; |
789 | } | 803 | } |
790 | 804 | ||
805 | static inline void | ||
806 | rpc_xdr_buf_init(struct xdr_buf *buf, void *start, size_t len) | ||
807 | { | ||
808 | buf->head[0].iov_base = start; | ||
809 | buf->head[0].iov_len = len; | ||
810 | buf->tail[0].iov_len = 0; | ||
811 | buf->page_len = 0; | ||
812 | buf->len = 0; | ||
813 | buf->buflen = len; | ||
814 | } | ||
815 | |||
791 | /* | 816 | /* |
792 | * 3. Encode arguments of an RPC call | 817 | * 3. Encode arguments of an RPC call |
793 | */ | 818 | */ |
@@ -795,28 +820,17 @@ static void | |||
795 | call_encode(struct rpc_task *task) | 820 | call_encode(struct rpc_task *task) |
796 | { | 821 | { |
797 | struct rpc_rqst *req = task->tk_rqstp; | 822 | struct rpc_rqst *req = task->tk_rqstp; |
798 | struct xdr_buf *sndbuf = &req->rq_snd_buf; | ||
799 | struct xdr_buf *rcvbuf = &req->rq_rcv_buf; | ||
800 | unsigned int bufsiz; | ||
801 | kxdrproc_t encode; | 823 | kxdrproc_t encode; |
802 | __be32 *p; | 824 | __be32 *p; |
803 | 825 | ||
804 | dprint_status(task); | 826 | dprint_status(task); |
805 | 827 | ||
806 | /* Default buffer setup */ | 828 | rpc_xdr_buf_init(&req->rq_snd_buf, |
807 | bufsiz = req->rq_bufsize >> 1; | 829 | req->rq_buffer, |
808 | sndbuf->head[0].iov_base = (void *)req->rq_buffer; | 830 | req->rq_callsize); |
809 | sndbuf->head[0].iov_len = bufsiz; | 831 | rpc_xdr_buf_init(&req->rq_rcv_buf, |
810 | sndbuf->tail[0].iov_len = 0; | 832 | (char *)req->rq_buffer + req->rq_callsize, |
811 | sndbuf->page_len = 0; | 833 | req->rq_rcvsize); |
812 | sndbuf->len = 0; | ||
813 | sndbuf->buflen = bufsiz; | ||
814 | rcvbuf->head[0].iov_base = (void *)((char *)req->rq_buffer + bufsiz); | ||
815 | rcvbuf->head[0].iov_len = bufsiz; | ||
816 | rcvbuf->tail[0].iov_len = 0; | ||
817 | rcvbuf->page_len = 0; | ||
818 | rcvbuf->len = 0; | ||
819 | rcvbuf->buflen = bufsiz; | ||
820 | 834 | ||
821 | /* Encode header and provided arguments */ | 835 | /* Encode header and provided arguments */ |
822 | encode = task->tk_msg.rpc_proc->p_encode; | 836 | encode = task->tk_msg.rpc_proc->p_encode; |
diff --git a/net/sunrpc/pmap_clnt.c b/net/sunrpc/pmap_clnt.c index d9f765344589..c45fc4c99513 100644 --- a/net/sunrpc/pmap_clnt.c +++ b/net/sunrpc/pmap_clnt.c | |||
@@ -335,7 +335,8 @@ static struct rpc_procinfo pmap_procedures[] = { | |||
335 | .p_proc = PMAP_SET, | 335 | .p_proc = PMAP_SET, |
336 | .p_encode = (kxdrproc_t) xdr_encode_mapping, | 336 | .p_encode = (kxdrproc_t) xdr_encode_mapping, |
337 | .p_decode = (kxdrproc_t) xdr_decode_bool, | 337 | .p_decode = (kxdrproc_t) xdr_decode_bool, |
338 | .p_bufsiz = 4, | 338 | .p_arglen = 4, |
339 | .p_replen = 1, | ||
339 | .p_count = 1, | 340 | .p_count = 1, |
340 | .p_statidx = PMAP_SET, | 341 | .p_statidx = PMAP_SET, |
341 | .p_name = "SET", | 342 | .p_name = "SET", |
@@ -344,7 +345,8 @@ static struct rpc_procinfo pmap_procedures[] = { | |||
344 | .p_proc = PMAP_UNSET, | 345 | .p_proc = PMAP_UNSET, |
345 | .p_encode = (kxdrproc_t) xdr_encode_mapping, | 346 | .p_encode = (kxdrproc_t) xdr_encode_mapping, |
346 | .p_decode = (kxdrproc_t) xdr_decode_bool, | 347 | .p_decode = (kxdrproc_t) xdr_decode_bool, |
347 | .p_bufsiz = 4, | 348 | .p_arglen = 4, |
349 | .p_replen = 1, | ||
348 | .p_count = 1, | 350 | .p_count = 1, |
349 | .p_statidx = PMAP_UNSET, | 351 | .p_statidx = PMAP_UNSET, |
350 | .p_name = "UNSET", | 352 | .p_name = "UNSET", |
@@ -353,7 +355,8 @@ static struct rpc_procinfo pmap_procedures[] = { | |||
353 | .p_proc = PMAP_GETPORT, | 355 | .p_proc = PMAP_GETPORT, |
354 | .p_encode = (kxdrproc_t) xdr_encode_mapping, | 356 | .p_encode = (kxdrproc_t) xdr_encode_mapping, |
355 | .p_decode = (kxdrproc_t) xdr_decode_port, | 357 | .p_decode = (kxdrproc_t) xdr_decode_port, |
356 | .p_bufsiz = 4, | 358 | .p_arglen = 4, |
359 | .p_replen = 1, | ||
357 | .p_count = 1, | 360 | .p_count = 1, |
358 | .p_statidx = PMAP_GETPORT, | 361 | .p_statidx = PMAP_GETPORT, |
359 | .p_name = "GETPORT", | 362 | .p_name = "GETPORT", |
diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index 456a14510308..432ee92cf262 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c | |||
@@ -823,7 +823,6 @@ static void xprt_request_init(struct rpc_task *task, struct rpc_xprt *xprt) | |||
823 | req->rq_task = task; | 823 | req->rq_task = task; |
824 | req->rq_xprt = xprt; | 824 | req->rq_xprt = xprt; |
825 | req->rq_buffer = NULL; | 825 | req->rq_buffer = NULL; |
826 | req->rq_bufsize = 0; | ||
827 | req->rq_xid = xprt_alloc_xid(xprt); | 826 | req->rq_xid = xprt_alloc_xid(xprt); |
828 | req->rq_release_snd_buf = NULL; | 827 | req->rq_release_snd_buf = NULL; |
829 | xprt_reset_majortimeo(req); | 828 | xprt_reset_majortimeo(req); |