datapath: backport: ovs/gre,geneve: fix error path when creating an iface
authorPravin B Shelar <pshelar@ovn.org>
Fri, 8 Jul 2016 23:37:23 +0000 (16:37 -0700)
committerPravin B Shelar <pshelar@ovn.org>
Sat, 9 Jul 2016 02:27:50 +0000 (19:27 -0700)
Upstream commit:
    commit 106da663ff495e0aea3ac15b8317aa410754fcac
    Author: Nicolas Dichtel <nicolas.dichtel@6wind.com>

    ovs/gre,geneve: fix error path when creating an iface

    After ipgre_newlink()/geneve_configure() call, the netdev is registered.

    Fixes: 7e059158d57b ("vxlan, gre, geneve: Set a large MTU on ovs-created tunnel devices")
CC: David Wragg <david@weave.works>
Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Pravin B Shelar <pshelar@ovn.org>
Acked-by: Jesse Gross <jesse@kernel.org>
datapath/linux/compat/geneve.c
datapath/linux/compat/ip_gre.c

index 807b68c..558c26f 100644 (file)
@@ -1596,6 +1596,7 @@ struct net_device *rpl_geneve_dev_create_fb(struct net *net, const char *name,
 {
        struct nlattr *tb[IFLA_MAX + 1];
        struct net_device *dev;
+       LIST_HEAD(list_kill);
        int err;
 
        memset(tb, 0, sizeof(tb));
@@ -1607,8 +1608,10 @@ struct net_device *rpl_geneve_dev_create_fb(struct net *net, const char *name,
        err = geneve_configure(net, dev, &geneve_remote_unspec,
                               0, 0, 0, 0, htons(dst_port), true,
                               GENEVE_F_UDP_ZERO_CSUM6_RX);
-       if (err)
-               goto err;
+       if (err) {
+               free_netdev(dev);
+               return ERR_PTR(err);
+       }
 
        /* openvswitch users expect packet sizes to be unrestricted,
         * so set the largest MTU we can.
@@ -1620,7 +1623,8 @@ struct net_device *rpl_geneve_dev_create_fb(struct net *net, const char *name,
        return dev;
 
  err:
-       free_netdev(dev);
+       geneve_dellink(dev, &list_kill);
+       unregister_netdevice_many(&list_kill);
        return ERR_PTR(err);
 }
 EXPORT_SYMBOL_GPL(rpl_geneve_dev_create_fb);
index 2c3ba28..f28fca9 100644 (file)
@@ -620,6 +620,7 @@ struct net_device *rpl_gretap_fb_dev_create(struct net *net, const char *name,
 {
        struct nlattr *tb[IFLA_MAX + 1];
        struct net_device *dev;
+       LIST_HEAD(list_kill);
        struct ip_tunnel *t;
        int err;
 
@@ -633,13 +634,11 @@ struct net_device *rpl_gretap_fb_dev_create(struct net *net, const char *name,
        t = netdev_priv(dev);
        t->collect_md = true;
        /* Configure flow based GRE device. */
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,39)
        err = ipgre_newlink(net, dev, tb, NULL);
-#else
-       err = ipgre_newlink(dev, tb, NULL);
-#endif
-       if (err < 0)
-               goto out;
+       if (err < 0) {
+               free_netdev(dev);
+               return ERR_PTR(err);
+       }
 
        /* openvswitch users expect packet sizes to be unrestricted,
         * so set the largest MTU we can.
@@ -650,7 +649,8 @@ struct net_device *rpl_gretap_fb_dev_create(struct net *net, const char *name,
 
        return dev;
 out:
-       free_netdev(dev);
+       ip_tunnel_dellink(dev, &list_kill);
+       unregister_netdevice_many(&list_kill);
        return ERR_PTR(err);
 }
 EXPORT_SYMBOL_GPL(rpl_gretap_fb_dev_create);