static void    call_transmit_status(struct rpc_task *task);
 static void    call_refresh(struct rpc_task *task);
 static void    call_refreshresult(struct rpc_task *task);
-static void    call_timeout(struct rpc_task *task);
 static void    call_connect(struct rpc_task *task);
 static void    call_connect_status(struct rpc_task *task);
 
 
 retry_timeout:
        task->tk_status = 0;
-       task->tk_action = call_timeout;
+       task->tk_action = call_encode;
+       rpc_check_timeout(task);
 }
 
 /*
        case -EHOSTUNREACH:
        case -ENETUNREACH:
        case -EPERM:
-               if (RPC_IS_SOFTCONN(task)) {
-                       rpc_exit(task, status);
-                       break;
-               }
+               if (RPC_IS_SOFTCONN(task))
+                       goto out_exit;
                /*
                 * Delay any retries for 3 seconds, then handle as if it
                 * were a timeout.
                rpc_delay(task, 3*HZ);
                /* fall through */
        case -ETIMEDOUT:
-               task->tk_action = call_timeout;
                break;
        case -ECONNREFUSED:
        case -ECONNRESET:
        case -EPIPE:
        case -ENOTCONN:
        case -EAGAIN:
-               task->tk_action = call_timeout;
                break;
        case -EIO:
                /* shutdown or soft timeout */
-               rpc_exit(task, status);
-               break;
+               goto out_exit;
        default:
                if (clnt->cl_chatty)
                        printk("%s: RPC call returned error %d\n",
                               clnt->cl_program->name, -status);
-               rpc_exit(task, status);
+               goto out_exit;
        }
+       task->tk_action = call_encode;
+       rpc_check_timeout(task);
+       return;
+out_exit:
+       rpc_exit(task, status);
 }
 
 static void
        rpcauth_invalcred(task);
 }
 
-/*
- * 6a. Handle RPC timeout
- *     We do not release the request slot, so we keep using the
- *     same XID for all retransmits.
- */
-static void
-call_timeout(struct rpc_task *task)
-{
-       task->tk_action = call_encode;
-       task->tk_status = 0;
-       rpc_check_timeout(task);
-}
-
 /*
  * 7.  Decode the RPC reply
  */
        WARN_ON(memcmp(&req->rq_rcv_buf, &req->rq_private_buf,
                                sizeof(req->rq_rcv_buf)) != 0);
 
-       if (req->rq_rcv_buf.len < 12) {
-               if (!RPC_IS_SOFT(task)) {
-                       task->tk_action = call_encode;
-                       goto out_retry;
-               }
-               dprintk("RPC:       %s: too small RPC reply size (%d bytes)\n",
-                               clnt->cl_program->name, task->tk_status);
-               task->tk_action = call_timeout;
+       if (req->rq_rcv_buf.len < 12)
                goto out_retry;
-       }
 
        xdr_init_decode(&xdr, &req->rq_rcv_buf,
                        req->rq_rcv_buf.head[0].iov_base, req);
                                xprt_conditional_disconnect(req->rq_xprt,
                                                            req->rq_connect_cookie);
                }
+               task->tk_action = call_encode;
+               rpc_check_timeout(task);
        }
 }