Skip to content

Commit 61e0979

Browse files
committed
Merge branch 'ovs-notifications'
Nicolas Dichtel says: ==================== ovs: fix rtnl notifications on interface deletion There was no rtnl notifications for interfaces (gre, vxlan, geneve) created by ovs. This problem is fixed by adjusting the creation path. v1 -> v2: - add patch rib#1 and rib#4 - rework error handling in patch rib#2 ==================== Acked-by: Pravin B Shelar <[email protected]> Signed-off-by: David S. Miller <[email protected]>
2 parents d1e3728 + 4100948 commit 61e0979

File tree

3 files changed

+56
-30
lines changed

3 files changed

+56
-30
lines changed

drivers/net/geneve.c

+11-3
Original file line numberDiff line numberDiff line change
@@ -1508,6 +1508,7 @@ struct net_device *geneve_dev_create_fb(struct net *net, const char *name,
15081508
{
15091509
struct nlattr *tb[IFLA_MAX + 1];
15101510
struct net_device *dev;
1511+
LIST_HEAD(list_kill);
15111512
int err;
15121513

15131514
memset(tb, 0, sizeof(tb));
@@ -1519,8 +1520,10 @@ struct net_device *geneve_dev_create_fb(struct net *net, const char *name,
15191520
err = geneve_configure(net, dev, &geneve_remote_unspec,
15201521
0, 0, 0, 0, htons(dst_port), true,
15211522
GENEVE_F_UDP_ZERO_CSUM6_RX);
1522-
if (err)
1523-
goto err;
1523+
if (err) {
1524+
free_netdev(dev);
1525+
return ERR_PTR(err);
1526+
}
15241527

15251528
/* openvswitch users expect packet sizes to be unrestricted,
15261529
* so set the largest MTU we can.
@@ -1529,10 +1532,15 @@ struct net_device *geneve_dev_create_fb(struct net *net, const char *name,
15291532
if (err)
15301533
goto err;
15311534

1535+
err = rtnl_configure_link(dev, NULL);
1536+
if (err < 0)
1537+
goto err;
1538+
15321539
return dev;
15331540

15341541
err:
1535-
free_netdev(dev);
1542+
geneve_dellink(dev, &list_kill);
1543+
unregister_netdevice_many(&list_kill);
15361544
return ERR_PTR(err);
15371545
}
15381546
EXPORT_SYMBOL_GPL(geneve_dev_create_fb);

drivers/net/vxlan.c

+34-24
Original file line numberDiff line numberDiff line change
@@ -2952,30 +2952,6 @@ static int vxlan_dev_configure(struct net *src_net, struct net_device *dev,
29522952
return 0;
29532953
}
29542954

2955-
struct net_device *vxlan_dev_create(struct net *net, const char *name,
2956-
u8 name_assign_type, struct vxlan_config *conf)
2957-
{
2958-
struct nlattr *tb[IFLA_MAX+1];
2959-
struct net_device *dev;
2960-
int err;
2961-
2962-
memset(&tb, 0, sizeof(tb));
2963-
2964-
dev = rtnl_create_link(net, name, name_assign_type,
2965-
&vxlan_link_ops, tb);
2966-
if (IS_ERR(dev))
2967-
return dev;
2968-
2969-
err = vxlan_dev_configure(net, dev, conf);
2970-
if (err < 0) {
2971-
free_netdev(dev);
2972-
return ERR_PTR(err);
2973-
}
2974-
2975-
return dev;
2976-
}
2977-
EXPORT_SYMBOL_GPL(vxlan_dev_create);
2978-
29792955
static int vxlan_newlink(struct net *src_net, struct net_device *dev,
29802956
struct nlattr *tb[], struct nlattr *data[])
29812957
{
@@ -3268,6 +3244,40 @@ static struct rtnl_link_ops vxlan_link_ops __read_mostly = {
32683244
.get_link_net = vxlan_get_link_net,
32693245
};
32703246

3247+
struct net_device *vxlan_dev_create(struct net *net, const char *name,
3248+
u8 name_assign_type,
3249+
struct vxlan_config *conf)
3250+
{
3251+
struct nlattr *tb[IFLA_MAX + 1];
3252+
struct net_device *dev;
3253+
int err;
3254+
3255+
memset(&tb, 0, sizeof(tb));
3256+
3257+
dev = rtnl_create_link(net, name, name_assign_type,
3258+
&vxlan_link_ops, tb);
3259+
if (IS_ERR(dev))
3260+
return dev;
3261+
3262+
err = vxlan_dev_configure(net, dev, conf);
3263+
if (err < 0) {
3264+
free_netdev(dev);
3265+
return ERR_PTR(err);
3266+
}
3267+
3268+
err = rtnl_configure_link(dev, NULL);
3269+
if (err < 0) {
3270+
LIST_HEAD(list_kill);
3271+
3272+
vxlan_dellink(dev, &list_kill);
3273+
unregister_netdevice_many(&list_kill);
3274+
return ERR_PTR(err);
3275+
}
3276+
3277+
return dev;
3278+
}
3279+
EXPORT_SYMBOL_GPL(vxlan_dev_create);
3280+
32713281
static void vxlan_handle_lowerdev_unregister(struct vxlan_net *vn,
32723282
struct net_device *dev)
32733283
{

net/ipv4/ip_gre.c

+11-3
Original file line numberDiff line numberDiff line change
@@ -1121,6 +1121,7 @@ struct net_device *gretap_fb_dev_create(struct net *net, const char *name,
11211121
{
11221122
struct nlattr *tb[IFLA_MAX + 1];
11231123
struct net_device *dev;
1124+
LIST_HEAD(list_kill);
11241125
struct ip_tunnel *t;
11251126
int err;
11261127

@@ -1136,8 +1137,10 @@ struct net_device *gretap_fb_dev_create(struct net *net, const char *name,
11361137
t->collect_md = true;
11371138

11381139
err = ipgre_newlink(net, dev, tb, NULL);
1139-
if (err < 0)
1140-
goto out;
1140+
if (err < 0) {
1141+
free_netdev(dev);
1142+
return ERR_PTR(err);
1143+
}
11411144

11421145
/* openvswitch users expect packet sizes to be unrestricted,
11431146
* so set the largest MTU we can.
@@ -1146,9 +1149,14 @@ struct net_device *gretap_fb_dev_create(struct net *net, const char *name,
11461149
if (err)
11471150
goto out;
11481151

1152+
err = rtnl_configure_link(dev, NULL);
1153+
if (err < 0)
1154+
goto out;
1155+
11491156
return dev;
11501157
out:
1151-
free_netdev(dev);
1158+
ip_tunnel_dellink(dev, &list_kill);
1159+
unregister_netdevice_many(&list_kill);
11521160
return ERR_PTR(err);
11531161
}
11541162
EXPORT_SYMBOL_GPL(gretap_fb_dev_create);

0 commit comments

Comments
 (0)