Merge tag 'mmc-updates-for-3.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel...
[cascardo/linux.git] / drivers / net / tun.c
index bfa9bb4..7eab5fc 100644 (file)
@@ -841,7 +841,7 @@ static const struct net_device_ops tap_netdev_ops = {
 #endif
 };
 
-static int tun_flow_init(struct tun_struct *tun)
+static void tun_flow_init(struct tun_struct *tun)
 {
        int i;
 
@@ -852,8 +852,6 @@ static int tun_flow_init(struct tun_struct *tun)
        setup_timer(&tun->flow_gc_timer, tun_flow_cleanup, (unsigned long)tun);
        mod_timer(&tun->flow_gc_timer,
                  round_jiffies_up(jiffies + tun->ageing_time));
-
-       return 0;
 }
 
 static void tun_flow_uninit(struct tun_struct *tun)
@@ -1010,8 +1008,10 @@ static int zerocopy_sg_from_iovec(struct sk_buff *skb, const struct iovec *from,
                        return -EMSGSIZE;
                num_pages = get_user_pages_fast(base, size, 0, &page[i]);
                if (num_pages != size) {
-                       for (i = 0; i < num_pages; i++)
-                               put_page(page[i]);
+                       int j;
+
+                       for (j = 0; j < num_pages; j++)
+                               put_page(page[i + j]);
                        return -EFAULT;
                }
                truesize = size * PAGE_SIZE;
@@ -1530,6 +1530,9 @@ static int tun_flags(struct tun_struct *tun)
        if (tun->flags & TUN_TAP_MQ)
                flags |= IFF_MULTI_QUEUE;
 
+       if (tun->flags & TUN_PERSIST)
+               flags |= IFF_PERSIST;
+
        return flags;
 }
 
@@ -1659,10 +1662,7 @@ static int tun_set_iff(struct net *net, struct file *file, struct ifreq *ifr)
                        goto err_free_dev;
 
                tun_net_init(dev);
-
-               err = tun_flow_init(tun);
-               if (err < 0)
-                       goto err_free_dev;
+               tun_flow_init(tun);
 
                dev->hw_features = NETIF_F_SG | NETIF_F_FRAGLIST |
                        TUN_USER_FEATURES;