summaryrefslogtreecommitdiffstats
path: root/net/sunrpc/svcsock.c
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>2000-07-09 02:54:55 +0000
committerRalf Baechle <ralf@linux-mips.org>2000-07-09 02:54:55 +0000
commit493c987f7a352ca64fdb4dc03a21e24cbaf46f55 (patch)
tree184cddc0925e082c0500afd042f92e9f340fe890 /net/sunrpc/svcsock.c
parent2d25612a92c62b5708d6d43f38d28c6141173328 (diff)
Merge with Linux 2.4.0-pre3-test6.
Diffstat (limited to 'net/sunrpc/svcsock.c')
-rw-r--r--net/sunrpc/svcsock.c31
1 files changed, 19 insertions, 12 deletions
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
index f0f714ff0..a036faef9 100644
--- a/net/sunrpc/svcsock.c
+++ b/net/sunrpc/svcsock.c
@@ -250,7 +250,8 @@ static int
svc_sendto(struct svc_rqst *rqstp, struct iovec *iov, int nr)
{
mm_segment_t oldfs;
- struct socket *sock = rqstp->rq_sock->sk_sock;
+ struct svc_sock *svsk = rqstp->rq_sock;
+ struct socket *sock = svsk->sk_sock;
struct msghdr msg;
int i, buflen, len;
@@ -342,13 +343,16 @@ svc_udp_data_ready(struct sock *sk, int count)
struct svc_sock *svsk = (struct svc_sock *)(sk->user_data);
if (!svsk)
- return;
+ goto out;
dprintk("svc: socket %p(inet %p), count=%d, busy=%d\n",
svsk, sk, count, svsk->sk_busy);
spin_lock_bh(&svsk->sk_lock);
svsk->sk_data = 1;
svc_sock_enqueue(svsk);
spin_unlock_bh(&svsk->sk_lock);
+ out:
+ if (sk->sleep && waitqueue_active(sk->sleep))
+ wake_up_interruptible(sk->sleep);
}
/*
@@ -459,16 +463,19 @@ svc_tcp_state_change1(struct sock *sk)
if (sk->state != TCP_ESTABLISHED) {
/* Aborted connection, SYN_RECV or whatever... */
- return;
+ goto out;
}
if (!(svsk = (struct svc_sock *) sk->user_data)) {
printk("svc: socket %p: no user data\n", sk);
- return;
+ goto out;
}
spin_lock_bh(&svsk->sk_lock);
svsk->sk_conn++;
svc_sock_enqueue(svsk);
spin_unlock_bh(&svsk->sk_lock);
+ out:
+ if (sk->sleep && waitqueue_active(sk->sleep))
+ wake_up_interruptible_all(sk->sleep);
}
/*
@@ -484,12 +491,15 @@ svc_tcp_state_change2(struct sock *sk)
if (!(svsk = (struct svc_sock *) sk->user_data)) {
printk("svc: socket %p: no user data\n", sk);
- return;
+ goto out;
}
spin_lock_bh(&svsk->sk_lock);
svsk->sk_close = 1;
svc_sock_enqueue(svsk);
spin_unlock_bh(&svsk->sk_lock);
+ out:
+ if (sk->sleep && waitqueue_active(sk->sleep))
+ wake_up_interruptible_all(sk->sleep);
}
static void
@@ -497,20 +507,17 @@ svc_tcp_data_ready(struct sock *sk, int count)
{
struct svc_sock * svsk;
- /* Disconnect signalled through data_ready?!? */
- if (sk->state != TCP_ESTABLISHED) {
- svc_tcp_state_change2(sk);
- return;
- }
-
dprintk("svc: socket %p TCP data ready (svsk %p)\n",
sk, sk->user_data);
if (!(svsk = (struct svc_sock *)(sk->user_data)))
- return;
+ goto out;
spin_lock_bh(&svsk->sk_lock);
svsk->sk_data++;
svc_sock_enqueue(svsk);
spin_unlock_bh(&svsk->sk_lock);
+ out:
+ if (sk->sleep && waitqueue_active(sk->sleep))
+ wake_up_interruptible(sk->sleep);
}
/*