diff options
Diffstat (limited to 'drivers/net/tun.c')
-rw-r--r-- | drivers/net/tun.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index 20a17938c62b..e525a6cf5587 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c | |||
@@ -109,7 +109,7 @@ struct tun_struct { | |||
109 | 109 | ||
110 | struct tap_filter txflt; | 110 | struct tap_filter txflt; |
111 | struct socket socket; | 111 | struct socket socket; |
112 | 112 | struct socket_wq wq; | |
113 | #ifdef TUN_DEBUG | 113 | #ifdef TUN_DEBUG |
114 | int debug; | 114 | int debug; |
115 | #endif | 115 | #endif |
@@ -323,7 +323,7 @@ static void tun_net_uninit(struct net_device *dev) | |||
323 | /* Inform the methods they need to stop using the dev. | 323 | /* Inform the methods they need to stop using the dev. |
324 | */ | 324 | */ |
325 | if (tfile) { | 325 | if (tfile) { |
326 | wake_up_all(&tun->socket.wait); | 326 | wake_up_all(&tun->wq.wait); |
327 | if (atomic_dec_and_test(&tfile->count)) | 327 | if (atomic_dec_and_test(&tfile->count)) |
328 | __tun_detach(tun); | 328 | __tun_detach(tun); |
329 | } | 329 | } |
@@ -398,7 +398,7 @@ static netdev_tx_t tun_net_xmit(struct sk_buff *skb, struct net_device *dev) | |||
398 | /* Notify and wake up reader process */ | 398 | /* Notify and wake up reader process */ |
399 | if (tun->flags & TUN_FASYNC) | 399 | if (tun->flags & TUN_FASYNC) |
400 | kill_fasync(&tun->fasync, SIGIO, POLL_IN); | 400 | kill_fasync(&tun->fasync, SIGIO, POLL_IN); |
401 | wake_up_interruptible_poll(&tun->socket.wait, POLLIN | | 401 | wake_up_interruptible_poll(&tun->wq.wait, POLLIN | |
402 | POLLRDNORM | POLLRDBAND); | 402 | POLLRDNORM | POLLRDBAND); |
403 | return NETDEV_TX_OK; | 403 | return NETDEV_TX_OK; |
404 | 404 | ||
@@ -498,7 +498,7 @@ static unsigned int tun_chr_poll(struct file *file, poll_table * wait) | |||
498 | 498 | ||
499 | DBG(KERN_INFO "%s: tun_chr_poll\n", tun->dev->name); | 499 | DBG(KERN_INFO "%s: tun_chr_poll\n", tun->dev->name); |
500 | 500 | ||
501 | poll_wait(file, &tun->socket.wait, wait); | 501 | poll_wait(file, &tun->wq.wait, wait); |
502 | 502 | ||
503 | if (!skb_queue_empty(&sk->sk_receive_queue)) | 503 | if (!skb_queue_empty(&sk->sk_receive_queue)) |
504 | mask |= POLLIN | POLLRDNORM; | 504 | mask |= POLLIN | POLLRDNORM; |
@@ -773,7 +773,7 @@ static ssize_t tun_do_read(struct tun_struct *tun, | |||
773 | 773 | ||
774 | DBG(KERN_INFO "%s: tun_chr_read\n", tun->dev->name); | 774 | DBG(KERN_INFO "%s: tun_chr_read\n", tun->dev->name); |
775 | 775 | ||
776 | add_wait_queue(&tun->socket.wait, &wait); | 776 | add_wait_queue(&tun->wq.wait, &wait); |
777 | while (len) { | 777 | while (len) { |
778 | current->state = TASK_INTERRUPTIBLE; | 778 | current->state = TASK_INTERRUPTIBLE; |
779 | 779 | ||
@@ -804,7 +804,7 @@ static ssize_t tun_do_read(struct tun_struct *tun, | |||
804 | } | 804 | } |
805 | 805 | ||
806 | current->state = TASK_RUNNING; | 806 | current->state = TASK_RUNNING; |
807 | remove_wait_queue(&tun->socket.wait, &wait); | 807 | remove_wait_queue(&tun->wq.wait, &wait); |
808 | 808 | ||
809 | return ret; | 809 | return ret; |
810 | } | 810 | } |
@@ -861,6 +861,7 @@ static struct rtnl_link_ops tun_link_ops __read_mostly = { | |||
861 | static void tun_sock_write_space(struct sock *sk) | 861 | static void tun_sock_write_space(struct sock *sk) |
862 | { | 862 | { |
863 | struct tun_struct *tun; | 863 | struct tun_struct *tun; |
864 | wait_queue_head_t *wqueue; | ||
864 | 865 | ||
865 | if (!sock_writeable(sk)) | 866 | if (!sock_writeable(sk)) |
866 | return; | 867 | return; |
@@ -868,8 +869,9 @@ static void tun_sock_write_space(struct sock *sk) | |||
868 | if (!test_and_clear_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags)) | 869 | if (!test_and_clear_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags)) |
869 | return; | 870 | return; |
870 | 871 | ||
871 | if (sk_sleep(sk) && waitqueue_active(sk_sleep(sk))) | 872 | wqueue = sk_sleep(sk); |
872 | wake_up_interruptible_sync_poll(sk_sleep(sk), POLLOUT | | 873 | if (wqueue && waitqueue_active(wqueue)) |
874 | wake_up_interruptible_sync_poll(wqueue, POLLOUT | | ||
873 | POLLWRNORM | POLLWRBAND); | 875 | POLLWRNORM | POLLWRBAND); |
874 | 876 | ||
875 | tun = tun_sk(sk)->tun; | 877 | tun = tun_sk(sk)->tun; |
@@ -1039,7 +1041,8 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr) | |||
1039 | if (!sk) | 1041 | if (!sk) |
1040 | goto err_free_dev; | 1042 | goto err_free_dev; |
1041 | 1043 | ||
1042 | init_waitqueue_head(&tun->socket.wait); | 1044 | tun->socket.wq = &tun->wq; |
1045 | init_waitqueue_head(&tun->wq.wait); | ||
1043 | tun->socket.ops = &tun_socket_ops; | 1046 | tun->socket.ops = &tun_socket_ops; |
1044 | sock_init_data(&tun->socket, sk); | 1047 | sock_init_data(&tun->socket, sk); |
1045 | sk->sk_write_space = tun_sock_write_space; | 1048 | sk->sk_write_space = tun_sock_write_space; |