diff options
| author | John W. Linville <linville@tuxdriver.com> | 2006-08-14 15:33:54 -0400 |
|---|---|---|
| committer | John W. Linville <linville@tuxdriver.com> | 2006-08-14 15:33:54 -0400 |
| commit | e9ffb3d7ec94083a44a8721681391beca2ffd68c (patch) | |
| tree | 6768ab487b3f44c2a4995ee61307e47760ca9b88 /net/sunrpc/clnt.c | |
| parent | 8b9411014e6f18a883c18b38f41338dbd53fddea (diff) | |
| parent | e9fa4f7bd291c29a785666e2fa5a9cf3241ee6c3 (diff) | |
Merge branch 'from-linus' into upstream
Diffstat (limited to 'net/sunrpc/clnt.c')
| -rw-r--r-- | net/sunrpc/clnt.c | 52 |
1 files changed, 29 insertions, 23 deletions
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 4ba271f892c8..d6409e757219 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c | |||
| @@ -921,26 +921,43 @@ call_transmit(struct rpc_task *task) | |||
| 921 | task->tk_status = xprt_prepare_transmit(task); | 921 | task->tk_status = xprt_prepare_transmit(task); |
| 922 | if (task->tk_status != 0) | 922 | if (task->tk_status != 0) |
| 923 | return; | 923 | return; |
| 924 | task->tk_action = call_transmit_status; | ||
| 924 | /* Encode here so that rpcsec_gss can use correct sequence number. */ | 925 | /* Encode here so that rpcsec_gss can use correct sequence number. */ |
| 925 | if (rpc_task_need_encode(task)) { | 926 | if (rpc_task_need_encode(task)) { |
| 926 | task->tk_rqstp->rq_bytes_sent = 0; | 927 | BUG_ON(task->tk_rqstp->rq_bytes_sent != 0); |
| 927 | call_encode(task); | 928 | call_encode(task); |
| 928 | /* Did the encode result in an error condition? */ | 929 | /* Did the encode result in an error condition? */ |
| 929 | if (task->tk_status != 0) | 930 | if (task->tk_status != 0) |
| 930 | goto out_nosend; | 931 | return; |
| 931 | } | 932 | } |
| 932 | task->tk_action = call_transmit_status; | ||
| 933 | xprt_transmit(task); | 933 | xprt_transmit(task); |
| 934 | if (task->tk_status < 0) | 934 | if (task->tk_status < 0) |
| 935 | return; | 935 | return; |
| 936 | if (!task->tk_msg.rpc_proc->p_decode) { | 936 | /* |
| 937 | task->tk_action = rpc_exit_task; | 937 | * On success, ensure that we call xprt_end_transmit() before sleeping |
| 938 | rpc_wake_up_task(task); | 938 | * in order to allow access to the socket to other RPC requests. |
| 939 | } | 939 | */ |
| 940 | return; | 940 | call_transmit_status(task); |
| 941 | out_nosend: | 941 | if (task->tk_msg.rpc_proc->p_decode != NULL) |
| 942 | /* release socket write lock before attempting to handle error */ | 942 | return; |
| 943 | xprt_abort_transmit(task); | 943 | task->tk_action = rpc_exit_task; |
| 944 | rpc_wake_up_task(task); | ||
| 945 | } | ||
| 946 | |||
| 947 | /* | ||
| 948 | * 5a. Handle cleanup after a transmission | ||
| 949 | */ | ||
| 950 | static void | ||
| 951 | call_transmit_status(struct rpc_task *task) | ||
| 952 | { | ||
| 953 | task->tk_action = call_status; | ||
| 954 | /* | ||
| 955 | * Special case: if we've been waiting on the socket's write_space() | ||
| 956 | * callback, then don't call xprt_end_transmit(). | ||
| 957 | */ | ||
| 958 | if (task->tk_status == -EAGAIN) | ||
| 959 | return; | ||
| 960 | xprt_end_transmit(task); | ||
| 944 | rpc_task_force_reencode(task); | 961 | rpc_task_force_reencode(task); |
| 945 | } | 962 | } |
| 946 | 963 | ||
| @@ -992,18 +1009,7 @@ call_status(struct rpc_task *task) | |||
| 992 | } | 1009 | } |
| 993 | 1010 | ||
| 994 | /* | 1011 | /* |
| 995 | * 6a. Handle transmission errors. | 1012 | * 6a. Handle RPC timeout |
| 996 | */ | ||
| 997 | static void | ||
| 998 | call_transmit_status(struct rpc_task *task) | ||
| 999 | { | ||
| 1000 | if (task->tk_status != -EAGAIN) | ||
| 1001 | rpc_task_force_reencode(task); | ||
| 1002 | call_status(task); | ||
| 1003 | } | ||
| 1004 | |||
| 1005 | /* | ||
| 1006 | * 6b. Handle RPC timeout | ||
| 1007 | * We do not release the request slot, so we keep using the | 1013 | * We do not release the request slot, so we keep using the |
| 1008 | * same XID for all retransmits. | 1014 | * same XID for all retransmits. |
| 1009 | */ | 1015 | */ |
