patch-2.4.0-test12 linux/net/sunrpc/xprt.c
Next file: linux/net/x25/af_x25.c
Previous file: linux/net/sunrpc/sched.c
Back to the patch index
Back to the overall index
- Lines: 185
- Date:
Tue Nov 28 22:34:01 2000
- Orig file:
v2.4.0-test11/linux/net/sunrpc/xprt.c
- Orig date:
Sun Oct 8 10:50:39 2000
diff -u --recursive --new-file v2.4.0-test11/linux/net/sunrpc/xprt.c linux/net/sunrpc/xprt.c
@@ -392,10 +392,7 @@
xprt_disconnect(struct rpc_xprt *xprt)
{
dprintk("RPC: disconnected transport %p\n", xprt);
- xprt->connected = 0;
- xprt->tcp_offset = 0;
- xprt->tcp_copied = 0;
- xprt->tcp_more = 0;
+ xprt_clear_connected(xprt);
xprt_remove_pending(xprt);
rpc_wake_up_status(&xprt->pending, -ENOTCONN);
}
@@ -412,7 +409,7 @@
int status;
dprintk("RPC: %4d xprt_reconnect %p connected %d\n",
- task->tk_pid, xprt, xprt->connected);
+ task->tk_pid, xprt, xprt_connected(xprt));
if (xprt->shutdown)
return;
@@ -445,6 +442,11 @@
xprt_disconnect(xprt);
+ /* Reset TCP record info */
+ xprt->tcp_offset = 0;
+ xprt->tcp_copied = 0;
+ xprt->tcp_more = 0;
+
/* Now connect it asynchronously. */
dprintk("RPC: %4d connecting new socket\n", task->tk_pid);
status = sock->ops->connect(sock, (struct sockaddr *) &xprt->addr,
@@ -468,10 +470,10 @@
}
dprintk("RPC: %4d connect status %d connected %d\n",
- task->tk_pid, status, xprt->connected);
+ task->tk_pid, status, xprt_connected(xprt));
spin_lock_bh(&xprt_sock_lock);
- if (!xprt->connected) {
+ if (!xprt_connected(xprt)) {
task->tk_timeout = xprt->timeout.to_maxval;
rpc_sleep_on(&xprt->reconn, task, xprt_reconn_status, NULL);
spin_unlock_bh(&xprt_sock_lock);
@@ -841,7 +843,7 @@
if (xprt->shutdown)
return -EIO;
- if (!xprt->connected)
+ if (!xprt_connected(xprt))
return -ENOTCONN;
/* Read in a new fragment marker if necessary */
@@ -982,7 +984,7 @@
dprintk("RPC: tcp_data_ready client %p\n", xprt);
dprintk("RPC: state %x conn %d dead %d zapped %d\n",
- sk->state, xprt->connected,
+ sk->state, xprt_connected(xprt),
sk->dead, sk->zapped);
out:
if (sk->sleep && waitqueue_active(sk->sleep))
@@ -999,23 +1001,26 @@
goto out;
dprintk("RPC: tcp_state_change client %p...\n", xprt);
dprintk("RPC: state %x conn %d dead %d zapped %d\n",
- sk->state, xprt->connected,
+ sk->state, xprt_connected(xprt),
sk->dead, sk->zapped);
- spin_lock_bh(&xprt_sock_lock);
switch (sk->state) {
case TCP_ESTABLISHED:
- xprt->connected = 1;
+ if (xprt_test_and_set_connected(xprt))
+ break;
+ spin_lock_bh(&xprt_sock_lock);
if (xprt->snd_task && xprt->snd_task->tk_rpcwait == &xprt->sending)
rpc_wake_up_task(xprt->snd_task);
rpc_wake_up(&xprt->reconn);
+ spin_unlock_bh(&xprt_sock_lock);
+ break;
+ case TCP_SYN_SENT:
+ case TCP_SYN_RECV:
break;
default:
- xprt->connected = 0;
- rpc_wake_up_status(&xprt->pending, -ENOTCONN);
+ xprt_disconnect(xprt);
break;
}
- spin_unlock_bh(&xprt_sock_lock);
out:
if (sk->sleep && waitqueue_active(sk->sleep))
wake_up_interruptible_all(sk->sleep);
@@ -1040,16 +1045,13 @@
if (!sock_writeable(sk))
return;
- spin_lock_bh(&xprt_sock_lock);
- if (xprt->write_space)
- goto out_unlock;
-
- xprt->write_space = 1;
+ if (!xprt_test_and_set_wspace(xprt)) {
+ spin_lock_bh(&xprt_sock_lock);
+ if (xprt->snd_task && xprt->snd_task->tk_rpcwait == &xprt->sending)
+ rpc_wake_up_task(xprt->snd_task);
+ spin_unlock_bh(&xprt_sock_lock);
+ }
- if (xprt->snd_task && xprt->snd_task->tk_rpcwait == &xprt->sending)
- rpc_wake_up_task(xprt->snd_task);
- out_unlock:
- spin_unlock_bh(&xprt_sock_lock);
if (test_bit(SOCK_NOSPACE, &sock->flags)) {
if (sk->sleep && waitqueue_active(sk->sleep)) {
clear_bit(SOCK_NOSPACE, &sock->flags);
@@ -1073,16 +1075,13 @@
if (sock_wspace(sk) < min(sk->sndbuf,XPRT_MIN_WRITE_SPACE))
return;
- spin_lock_bh(&xprt_sock_lock);
- if (xprt->write_space)
- goto out_unlock;
-
- xprt->write_space = 1;
+ if (!xprt_test_and_set_wspace(xprt)) {
+ spin_lock_bh(&xprt_sock_lock);
+ if (xprt->snd_task && xprt->snd_task->tk_rpcwait == &xprt->sending)
+ rpc_wake_up_task(xprt->snd_task);
+ spin_unlock_bh(&xprt_sock_lock);
+ }
- if (xprt->snd_task && xprt->snd_task->tk_rpcwait == &xprt->sending)
- rpc_wake_up_task(xprt->snd_task);
- out_unlock:
- spin_unlock_bh(&xprt_sock_lock);
if (sk->sleep && waitqueue_active(sk->sleep))
wake_up_interruptible(sk->sleep);
}
@@ -1167,7 +1166,7 @@
if (xprt->shutdown)
task->tk_status = -EIO;
- if (!xprt->connected)
+ if (!xprt_connected(xprt))
task->tk_status = -ENOTCONN;
if (task->tk_status < 0)
@@ -1211,7 +1210,7 @@
* called xprt_sendmsg().
*/
while (1) {
- xprt->write_space = 0;
+ xprt_clear_wspace(xprt);
status = xprt_sendmsg(xprt, req);
if (status < 0)
@@ -1255,7 +1254,7 @@
case -ENOMEM:
/* Protect against (udp|tcp)_write_space */
spin_lock_bh(&xprt_sock_lock);
- if (!xprt->write_space) {
+ if (!xprt_wspace(xprt)) {
task->tk_timeout = req->rq_timeout.to_current;
rpc_sleep_on(&xprt->sending, task, NULL, NULL);
}
@@ -1547,12 +1546,12 @@
sk->data_ready = udp_data_ready;
sk->write_space = udp_write_space;
sk->no_check = UDP_CSUM_NORCV;
- xprt->connected = 1;
+ xprt_set_connected(xprt);
} else {
sk->data_ready = tcp_data_ready;
sk->state_change = tcp_state_change;
sk->write_space = tcp_write_space;
- xprt->connected = 0;
+ xprt_clear_connected(xprt);
}
/* Reset to new socket */
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)