diff options
Diffstat (limited to 'net/atm/common.c')
| -rw-r--r-- | net/atm/common.c | 30 | 
1 files changed, 18 insertions, 12 deletions
diff --git a/net/atm/common.c b/net/atm/common.c index 97ed94aa0cb..b43feb1a399 100644 --- a/net/atm/common.c +++ b/net/atm/common.c @@ -90,10 +90,13 @@ static void vcc_sock_destruct(struct sock *sk)  static void vcc_def_wakeup(struct sock *sk)  { -	read_lock(&sk->sk_callback_lock); -	if (sk_has_sleeper(sk)) -		wake_up(sk->sk_sleep); -	read_unlock(&sk->sk_callback_lock); +	struct socket_wq *wq; + +	rcu_read_lock(); +	wq = rcu_dereference(sk->sk_wq); +	if (wq_has_sleeper(wq)) +		wake_up(&wq->wait); +	rcu_read_unlock();  }  static inline int vcc_writable(struct sock *sk) @@ -106,16 +109,19 @@ static inline int vcc_writable(struct sock *sk)  static void vcc_write_space(struct sock *sk)  { -	read_lock(&sk->sk_callback_lock); +	struct socket_wq *wq; + +	rcu_read_lock();  	if (vcc_writable(sk)) { -		if (sk_has_sleeper(sk)) -			wake_up_interruptible(sk->sk_sleep); +		wq = rcu_dereference(sk->sk_wq); +		if (wq_has_sleeper(wq)) +			wake_up_interruptible(&wq->wait);  		sk_wake_async(sk, SOCK_WAKE_SPACE, POLL_OUT);  	} -	read_unlock(&sk->sk_callback_lock); +	rcu_read_unlock();  }  static struct proto vcc_proto = { @@ -549,7 +555,7 @@ int vcc_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *m,  	}  	eff = (size+3) & ~3; /* align to word boundary */ -	prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); +	prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);  	error = 0;  	while (!(skb = alloc_tx(vcc, eff))) {  		if (m->msg_flags & MSG_DONTWAIT) { @@ -568,9 +574,9 @@ int vcc_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *m,  			send_sig(SIGPIPE, current, 0);  			break;  		} -		prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); +		prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);  	} -	finish_wait(sk->sk_sleep, &wait); +	finish_wait(sk_sleep(sk), &wait);  	if (error)  		goto out;  	skb->dev = NULL; /* for paths shared with net_device interfaces */ @@ -595,7 +601,7 @@ unsigned int vcc_poll(struct file *file, struct socket *sock, poll_table *wait)  	struct atm_vcc *vcc;  	unsigned int mask; -	sock_poll_wait(file, sk->sk_sleep, wait); +	sock_poll_wait(file, sk_sleep(sk), wait);  	mask = 0;  	vcc = ATM_SD(sock);  |