diff options
| -rw-r--r-- | drivers/net/tun.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/drivers/net/tun.c b/drivers/net/tun.c index f58b7d850114..34cc3c590aa5 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c | |||
| @@ -822,7 +822,18 @@ static void tun_net_uninit(struct net_device *dev) | |||
| 822 | /* Net device open. */ | 822 | /* Net device open. */ |
| 823 | static int tun_net_open(struct net_device *dev) | 823 | static int tun_net_open(struct net_device *dev) |
| 824 | { | 824 | { |
| 825 | struct tun_struct *tun = netdev_priv(dev); | ||
| 826 | int i; | ||
| 827 | |||
| 825 | netif_tx_start_all_queues(dev); | 828 | netif_tx_start_all_queues(dev); |
| 829 | |||
| 830 | for (i = 0; i < tun->numqueues; i++) { | ||
| 831 | struct tun_file *tfile; | ||
| 832 | |||
| 833 | tfile = rtnl_dereference(tun->tfiles[i]); | ||
| 834 | tfile->socket.sk->sk_write_space(tfile->socket.sk); | ||
| 835 | } | ||
| 836 | |||
| 826 | return 0; | 837 | return 0; |
| 827 | } | 838 | } |
| 828 | 839 | ||
| @@ -1103,9 +1114,10 @@ static unsigned int tun_chr_poll(struct file *file, poll_table *wait) | |||
| 1103 | if (!skb_array_empty(&tfile->tx_array)) | 1114 | if (!skb_array_empty(&tfile->tx_array)) |
| 1104 | mask |= POLLIN | POLLRDNORM; | 1115 | mask |= POLLIN | POLLRDNORM; |
| 1105 | 1116 | ||
| 1106 | if (sock_writeable(sk) || | 1117 | if (tun->dev->flags & IFF_UP && |
| 1107 | (!test_and_set_bit(SOCKWQ_ASYNC_NOSPACE, &sk->sk_socket->flags) && | 1118 | (sock_writeable(sk) || |
| 1108 | sock_writeable(sk))) | 1119 | (!test_and_set_bit(SOCKWQ_ASYNC_NOSPACE, &sk->sk_socket->flags) && |
| 1120 | sock_writeable(sk)))) | ||
| 1109 | mask |= POLLOUT | POLLWRNORM; | 1121 | mask |= POLLOUT | POLLWRNORM; |
| 1110 | 1122 | ||
| 1111 | if (tun->dev->reg_state != NETREG_REGISTERED) | 1123 | if (tun->dev->reg_state != NETREG_REGISTERED) |
