Upstream commit: commit 106da663ff495e0aea3ac15b8317aa410754fcac Author: Nicolas Dichtel <nicolas.dich...@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.dich...@6wind.com> Signed-off-by: David S. Miller <da...@davemloft.net> Signed-off-by: Pravin B Shelar <pshe...@ovn.org> Acked-by: Jesse Gross <je...@kernel.org> --- datapath/linux/compat/geneve.c | 10 +++++++--- datapath/linux/compat/ip_gre.c | 14 +++++++------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/datapath/linux/compat/geneve.c b/datapath/linux/compat/geneve.c index b3bfe62..1dcc850 100644 --- a/datapath/linux/compat/geneve.c +++ b/datapath/linux/compat/geneve.c @@ -1586,6 +1586,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)); @@ -1597,8 +1598,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. @@ -1610,7 +1613,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); diff --git a/datapath/linux/compat/ip_gre.c b/datapath/linux/compat/ip_gre.c index 2c3ba28..f28fca9 100644 --- a/datapath/linux/compat/ip_gre.c +++ b/datapath/linux/compat/ip_gre.c @@ -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); -- 1.9.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev