- /*
- * On success, ensure that we call xprt_end_transmit() before sleeping
- * in order to allow access to the socket to other RPC requests.
- */
- call_transmit_status(task);
- if (task->tk_msg.rpc_proc->p_decode != NULL)
- return;
- task->tk_action = rpc_exit_task;
- rpc_wake_up_task(task);
-}
-
-/*
- * 5a. Handle cleanup after a transmission
- */
-static void
-call_transmit_status(struct rpc_task *task)
-{
- task->tk_action = call_status;
- /*
- * Special case: if we've been waiting on the socket's write_space()
- * callback, then don't call xprt_end_transmit().
- */
- if (task->tk_status == -EAGAIN)
- return;
- xprt_end_transmit(task);
+ if (!task->tk_msg.rpc_proc->p_decode) {
+ task->tk_action = rpc_exit_task;
+ rpc_wake_up_task(task);
+ }
+ return;
+out_nosend:
+ /* release socket write lock before attempting to handle error */
+ xprt_abort_transmit(task);