Commit 106da663 authored by Nicolas Dichtel's avatar Nicolas Dichtel Committed by David S. Miller

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

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

Fixes: 7e059158 ("vxlan, gre, geneve: Set a large MTU on ovs-created tunnel devices")
CC: David Wragg <david@weave.works>
Signed-off-by: default avatarNicolas Dichtel <nicolas.dichtel@6wind.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d1e37288
...@@ -1508,6 +1508,7 @@ struct net_device *geneve_dev_create_fb(struct net *net, const char *name, ...@@ -1508,6 +1508,7 @@ struct net_device *geneve_dev_create_fb(struct net *net, const char *name,
{ {
struct nlattr *tb[IFLA_MAX + 1]; struct nlattr *tb[IFLA_MAX + 1];
struct net_device *dev; struct net_device *dev;
LIST_HEAD(list_kill);
int err; int err;
memset(tb, 0, sizeof(tb)); memset(tb, 0, sizeof(tb));
...@@ -1519,8 +1520,10 @@ struct net_device *geneve_dev_create_fb(struct net *net, const char *name, ...@@ -1519,8 +1520,10 @@ struct net_device *geneve_dev_create_fb(struct net *net, const char *name,
err = geneve_configure(net, dev, &geneve_remote_unspec, err = geneve_configure(net, dev, &geneve_remote_unspec,
0, 0, 0, 0, htons(dst_port), true, 0, 0, 0, 0, htons(dst_port), true,
GENEVE_F_UDP_ZERO_CSUM6_RX); GENEVE_F_UDP_ZERO_CSUM6_RX);
if (err) if (err) {
goto err; free_netdev(dev);
return ERR_PTR(err);
}
/* openvswitch users expect packet sizes to be unrestricted, /* openvswitch users expect packet sizes to be unrestricted,
* so set the largest MTU we can. * so set the largest MTU we can.
...@@ -1532,7 +1535,8 @@ struct net_device *geneve_dev_create_fb(struct net *net, const char *name, ...@@ -1532,7 +1535,8 @@ struct net_device *geneve_dev_create_fb(struct net *net, const char *name,
return dev; return dev;
err: err:
free_netdev(dev); geneve_dellink(dev, &list_kill);
unregister_netdevice_many(&list_kill);
return ERR_PTR(err); return ERR_PTR(err);
} }
EXPORT_SYMBOL_GPL(geneve_dev_create_fb); EXPORT_SYMBOL_GPL(geneve_dev_create_fb);
......
...@@ -1121,6 +1121,7 @@ struct net_device *gretap_fb_dev_create(struct net *net, const char *name, ...@@ -1121,6 +1121,7 @@ struct net_device *gretap_fb_dev_create(struct net *net, const char *name,
{ {
struct nlattr *tb[IFLA_MAX + 1]; struct nlattr *tb[IFLA_MAX + 1];
struct net_device *dev; struct net_device *dev;
LIST_HEAD(list_kill);
struct ip_tunnel *t; struct ip_tunnel *t;
int err; int err;
...@@ -1136,8 +1137,10 @@ struct net_device *gretap_fb_dev_create(struct net *net, const char *name, ...@@ -1136,8 +1137,10 @@ struct net_device *gretap_fb_dev_create(struct net *net, const char *name,
t->collect_md = true; t->collect_md = true;
err = ipgre_newlink(net, dev, tb, NULL); err = ipgre_newlink(net, dev, tb, NULL);
if (err < 0) if (err < 0) {
goto out; free_netdev(dev);
return ERR_PTR(err);
}
/* openvswitch users expect packet sizes to be unrestricted, /* openvswitch users expect packet sizes to be unrestricted,
* so set the largest MTU we can. * so set the largest MTU we can.
...@@ -1148,7 +1151,8 @@ struct net_device *gretap_fb_dev_create(struct net *net, const char *name, ...@@ -1148,7 +1151,8 @@ struct net_device *gretap_fb_dev_create(struct net *net, const char *name,
return dev; return dev;
out: out:
free_netdev(dev); ip_tunnel_dellink(dev, &list_kill);
unregister_netdevice_many(&list_kill);
return ERR_PTR(err); return ERR_PTR(err);
} }
EXPORT_SYMBOL_GPL(gretap_fb_dev_create); EXPORT_SYMBOL_GPL(gretap_fb_dev_create);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment