|
@@ -822,7 +822,18 @@ static void tun_net_uninit(struct net_device *dev)
|
|
/* Net device open. */
|
|
/* Net device open. */
|
|
static int tun_net_open(struct net_device *dev)
|
|
static int tun_net_open(struct net_device *dev)
|
|
{
|
|
{
|
|
|
|
+ struct tun_struct *tun = netdev_priv(dev);
|
|
|
|
+ int i;
|
|
|
|
+
|
|
netif_tx_start_all_queues(dev);
|
|
netif_tx_start_all_queues(dev);
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < tun->numqueues; i++) {
|
|
|
|
+ struct tun_file *tfile;
|
|
|
|
+
|
|
|
|
+ tfile = rtnl_dereference(tun->tfiles[i]);
|
|
|
|
+ tfile->socket.sk->sk_write_space(tfile->socket.sk);
|
|
|
|
+ }
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1103,9 +1114,10 @@ static unsigned int tun_chr_poll(struct file *file, poll_table *wait)
|
|
if (!skb_array_empty(&tfile->tx_array))
|
|
if (!skb_array_empty(&tfile->tx_array))
|
|
mask |= POLLIN | POLLRDNORM;
|
|
mask |= POLLIN | POLLRDNORM;
|
|
|
|
|
|
- if (sock_writeable(sk) ||
|
|
|
|
- (!test_and_set_bit(SOCKWQ_ASYNC_NOSPACE, &sk->sk_socket->flags) &&
|
|
|
|
- sock_writeable(sk)))
|
|
|
|
|
|
+ if (tun->dev->flags & IFF_UP &&
|
|
|
|
+ (sock_writeable(sk) ||
|
|
|
|
+ (!test_and_set_bit(SOCKWQ_ASYNC_NOSPACE, &sk->sk_socket->flags) &&
|
|
|
|
+ sock_writeable(sk))))
|
|
mask |= POLLOUT | POLLWRNORM;
|
|
mask |= POLLOUT | POLLWRNORM;
|
|
|
|
|
|
if (tun->dev->reg_state != NETREG_REGISTERED)
|
|
if (tun->dev->reg_state != NETREG_REGISTERED)
|