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 97ed94aa0cbc..b43feb1a3995 100644 --- a/net/atm/common.c +++ b/net/atm/common.c | |||
| @@ -90,10 +90,13 @@ static void vcc_sock_destruct(struct sock *sk) | |||
| 90 | 90 | ||
| 91 | static void vcc_def_wakeup(struct sock *sk) | 91 | static void vcc_def_wakeup(struct sock *sk) |
| 92 | { | 92 | { |
| 93 | read_lock(&sk->sk_callback_lock); | 93 | struct socket_wq *wq; |
| 94 | if (sk_has_sleeper(sk)) | 94 | |
| 95 | wake_up(sk->sk_sleep); | 95 | rcu_read_lock(); |
| 96 | read_unlock(&sk->sk_callback_lock); | 96 | wq = rcu_dereference(sk->sk_wq); |
| 97 | if (wq_has_sleeper(wq)) | ||
| 98 | wake_up(&wq->wait); | ||
| 99 | rcu_read_unlock(); | ||
| 97 | } | 100 | } |
| 98 | 101 | ||
| 99 | static inline int vcc_writable(struct sock *sk) | 102 | static inline int vcc_writable(struct sock *sk) |
| @@ -106,16 +109,19 @@ static inline int vcc_writable(struct sock *sk) | |||
| 106 | 109 | ||
| 107 | static void vcc_write_space(struct sock *sk) | 110 | static void vcc_write_space(struct sock *sk) |
| 108 | { | 111 | { |
| 109 | read_lock(&sk->sk_callback_lock); | 112 | struct socket_wq *wq; |
| 113 | |||
| 114 | rcu_read_lock(); | ||
| 110 | 115 | ||
| 111 | if (vcc_writable(sk)) { | 116 | if (vcc_writable(sk)) { |
| 112 | if (sk_has_sleeper(sk)) | 117 | wq = rcu_dereference(sk->sk_wq); |
| 113 | wake_up_interruptible(sk->sk_sleep); | 118 | if (wq_has_sleeper(wq)) |
| 119 | wake_up_interruptible(&wq->wait); | ||
| 114 | 120 | ||
| 115 | sk_wake_async(sk, SOCK_WAKE_SPACE, POLL_OUT); | 121 | sk_wake_async(sk, SOCK_WAKE_SPACE, POLL_OUT); |
| 116 | } | 122 | } |
| 117 | 123 | ||
| 118 | read_unlock(&sk->sk_callback_lock); | 124 | rcu_read_unlock(); |
| 119 | } | 125 | } |
| 120 | 126 | ||
| 121 | static struct proto vcc_proto = { | 127 | static struct proto vcc_proto = { |
| @@ -549,7 +555,7 @@ int vcc_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *m, | |||
| 549 | } | 555 | } |
| 550 | 556 | ||
| 551 | eff = (size+3) & ~3; /* align to word boundary */ | 557 | eff = (size+3) & ~3; /* align to word boundary */ |
| 552 | prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); | 558 | prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); |
| 553 | error = 0; | 559 | error = 0; |
| 554 | while (!(skb = alloc_tx(vcc, eff))) { | 560 | while (!(skb = alloc_tx(vcc, eff))) { |
| 555 | if (m->msg_flags & MSG_DONTWAIT) { | 561 | if (m->msg_flags & MSG_DONTWAIT) { |
| @@ -568,9 +574,9 @@ int vcc_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *m, | |||
| 568 | send_sig(SIGPIPE, current, 0); | 574 | send_sig(SIGPIPE, current, 0); |
| 569 | break; | 575 | break; |
| 570 | } | 576 | } |
| 571 | prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); | 577 | prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); |
| 572 | } | 578 | } |
| 573 | finish_wait(sk->sk_sleep, &wait); | 579 | finish_wait(sk_sleep(sk), &wait); |
| 574 | if (error) | 580 | if (error) |
| 575 | goto out; | 581 | goto out; |
| 576 | skb->dev = NULL; /* for paths shared with net_device interfaces */ | 582 | 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) | |||
| 595 | struct atm_vcc *vcc; | 601 | struct atm_vcc *vcc; |
| 596 | unsigned int mask; | 602 | unsigned int mask; |
| 597 | 603 | ||
| 598 | sock_poll_wait(file, sk->sk_sleep, wait); | 604 | sock_poll_wait(file, sk_sleep(sk), wait); |
| 599 | mask = 0; | 605 | mask = 0; |
| 600 | 606 | ||
| 601 | vcc = ATM_SD(sock); | 607 | vcc = ATM_SD(sock); |
