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

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

Fixes: 7e059158d5 ("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>
This commit is contained in:
Nicolas Dichtel 2016-06-13 10:31:04 +02:00 committed by David S. Miller
parent d1e37288c9
commit 106da663ff
2 changed files with 14 additions and 6 deletions

View File

@ -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,
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,
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);

View File

@ -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,
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,
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);