--- net/sunrpc/xprt.c.orig Sat Aug 28 11:25:21 1999 +++ net/sunrpc/xprt.c Sat Aug 28 21:45:19 1999 @@ -441,7 +441,6 @@ /* Now connect it asynchronously. */ dprintk("RPC: %4d connecting new socket\n", task->tk_pid); - status = sock->ops->connect(sock, (struct sockaddr *) &xprt->addr, sizeof(xprt->addr), O_NONBLOCK); @@ -616,13 +615,9 @@ xprt_complete_rqst(xprt, rovr, copied); dropit: - if (xprt->old_data_ready) - xprt->old_data_ready(sk, len); skb_free_datagram(sk, skb); return; out_err: - if (xprt->old_data_ready) - xprt->old_data_ready(sk, len); return; } @@ -854,9 +849,6 @@ dprintk("RPC: xprt queued already %p\n", xprt); tcp_rpciod_queue(); - - if (xprt->old_data_ready) - xprt->old_data_ready(sk, len); } @@ -872,9 +864,6 @@ sk->state, xprt->connected, sk->dead, sk->zapped); - if (xprt->connecting) - goto out; - switch(sk->state) { case TCP_ESTABLISHED: xprt->connected = 1; @@ -883,6 +872,8 @@ tcp_rpciod_queue(); break; case TCP_CLOSE: + if (xprt->connecting) + break; xprt_disconnect(xprt); rpc_wake_up_status(&xprt->reconn, -ENOTCONN); break; @@ -890,9 +881,6 @@ break; } - out: - if (xprt->old_state_change) - xprt->old_state_change(sk); } /* @@ -907,9 +895,6 @@ if (!(xprt = xprt_from_sock(sk))) return; - if (xprt->old_write_space) - xprt->old_write_space(sk); - if(xprt->snd_task) dprintk("RPC: write space\n"); @@ -932,9 +917,6 @@ if (!(xprt = xprt_from_sock(sk))) return; - if (xprt->old_write_space) - xprt->old_write_space(sk); - if (xprt->write_space) return; @@ -984,7 +966,7 @@ task->tk_pid, xprt->snd_task->tk_pid); task->tk_timeout = req->rq_timeout.to_current; rpc_sleep_on(&xprt->sending, task, xprt_transmit, NULL); - } else { + } else if (!xprt->snd_task) { xprt->snd_task = task; #ifdef RPC_PROFILE req->rq_xtime = jiffies; @@ -1091,13 +1073,16 @@ xprt->write_space = 0; status = xprt_sendmsg(xprt, req); - if (status > 0 && xprt->stream) + if (status < 0) + break; + + if (xprt->stream) req->rq_bytes_sent += status; - if (status >= 0 && status < req->rq_slen) + if (status < req->rq_slen) status = -EAGAIN; - if (status >= 0) { + if (status >= 0 || !xprt->stream) { dprintk("RPC: %4d xmit complete\n", task->tk_pid); goto out_release; } @@ -1106,9 +1091,6 @@ task->tk_pid, req->rq_slen - req->rq_bytes_sent, req->rq_slen); - if (status != -EAGAIN && status != -ENOMEM) - break; - if (retry++ > 50) break; } @@ -1122,12 +1104,11 @@ /* Protect against (udp|tcp)_write_space */ start_bh_atomic(); - if (status == -ENOMEM && !xprt->write_space) { - if (!xprt->stream) - xprt_down_transmit(task); + if (status == -ENOMEM || status == -EAGAIN) { task->tk_timeout = req->rq_timeout.to_current; - rpc_sleep_on(&xprt->sending, task, xprt_transmit_status, - xprt_transmit_timeout); + if (!xprt->write_space) + rpc_sleep_on(&xprt->sending, task, xprt_transmit_status, + xprt_transmit_timeout); end_bh_atomic(); return; } @@ -1147,12 +1128,10 @@ struct rpc_xprt *xprt = task->tk_client->cl_xprt; dprintk("RPC: %4d transmit_status %d\n", task->tk_pid, task->tk_status); - if (task->tk_status == -EAGAIN) { - if (xprt->stream && xprt->snd_task == task) { - task->tk_status = 0; - do_xprt_transmit(task); - return; - } + if (xprt->snd_task == task) { + task->tk_status = 0; + do_xprt_transmit(task); + return; } }