]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - net/ipv6/ip6mr.c
lguest: Use GSO/IFF_VNET_HDR extensions on tun/tap
[linux-2.6-omap-h63xx.git] / net / ipv6 / ip6mr.c
index cfac26d674ede45d76fb199ce154297c7cf59609..095bc453ff4c29e0f8ae7b19a2017b8d4fa0c731 100644 (file)
@@ -443,6 +443,7 @@ static struct net_device *ip6mr_reg_vif(void)
        if (dev_open(dev))
                goto failure;
 
+       dev_hold(dev);
        return dev;
 
 failure:
@@ -595,6 +596,7 @@ static int mif6_add(struct mif6ctl *vifc, int mrtsock)
        int vifi = vifc->mif6c_mifi;
        struct mif_device *v = &vif6_table[vifi];
        struct net_device *dev;
+       int err;
 
        /* Is vif busy ? */
        if (MIF_EXISTS(vifi))
@@ -612,20 +614,28 @@ static int mif6_add(struct mif6ctl *vifc, int mrtsock)
                dev = ip6mr_reg_vif();
                if (!dev)
                        return -ENOBUFS;
+               err = dev_set_allmulti(dev, 1);
+               if (err) {
+                       unregister_netdevice(dev);
+                       dev_put(dev);
+                       return err;
+               }
                break;
 #endif
        case 0:
                dev = dev_get_by_index(&init_net, vifc->mif6c_pifi);
                if (!dev)
                        return -EADDRNOTAVAIL;
-               dev_put(dev);
+               err = dev_set_allmulti(dev, 1);
+               if (err) {
+                       dev_put(dev);
+                       return err;
+               }
                break;
        default:
                return -EINVAL;
        }
 
-       dev_set_allmulti(dev, 1);
-
        /*
         *      Fill in the VIF structures
         */
@@ -644,7 +654,6 @@ static int mif6_add(struct mif6ctl *vifc, int mrtsock)
 
        /* And finish update writing critical data */
        write_lock_bh(&mrt_lock);
-       dev_hold(dev);
        v->dev = dev;
 #ifdef CONFIG_IPV6_PIMSM_V2
        if (v->flags & MIFF_REGISTER)
@@ -926,7 +935,7 @@ static int ip6mr_device_event(struct notifier_block *this,
        struct mif_device *v;
        int ct;
 
-       if (dev_net(dev) != &init_net)
+       if (!net_eq(dev_net(dev), &init_net))
                return NOTIFY_DONE;
 
        if (event != NETDEV_UNREGISTER)