diff options
Diffstat (limited to 'net/bridge/br_if.c')
-rw-r--r-- | net/bridge/br_if.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c index 3176e2e13d9b..e73815456adf 100644 --- a/net/bridge/br_if.c +++ b/net/bridge/br_if.c | |||
@@ -231,6 +231,7 @@ static struct net_bridge_port *new_nbp(struct net_bridge *br, | |||
231 | int br_add_bridge(struct net *net, const char *name) | 231 | int br_add_bridge(struct net *net, const char *name) |
232 | { | 232 | { |
233 | struct net_device *dev; | 233 | struct net_device *dev; |
234 | int res; | ||
234 | 235 | ||
235 | dev = alloc_netdev(sizeof(struct net_bridge), name, | 236 | dev = alloc_netdev(sizeof(struct net_bridge), name, |
236 | br_dev_setup); | 237 | br_dev_setup); |
@@ -240,7 +241,10 @@ int br_add_bridge(struct net *net, const char *name) | |||
240 | 241 | ||
241 | dev_net_set(dev, net); | 242 | dev_net_set(dev, net); |
242 | 243 | ||
243 | return register_netdev(dev); | 244 | res = register_netdev(dev); |
245 | if (res) | ||
246 | free_netdev(dev); | ||
247 | return res; | ||
244 | } | 248 | } |
245 | 249 | ||
246 | int br_del_bridge(struct net *net, const char *name) | 250 | int br_del_bridge(struct net *net, const char *name) |
@@ -417,6 +421,7 @@ put_back: | |||
417 | int br_del_if(struct net_bridge *br, struct net_device *dev) | 421 | int br_del_if(struct net_bridge *br, struct net_device *dev) |
418 | { | 422 | { |
419 | struct net_bridge_port *p; | 423 | struct net_bridge_port *p; |
424 | bool changed_addr; | ||
420 | 425 | ||
421 | p = br_port_get_rtnl(dev); | 426 | p = br_port_get_rtnl(dev); |
422 | if (!p || p->br != br) | 427 | if (!p || p->br != br) |
@@ -425,9 +430,12 @@ int br_del_if(struct net_bridge *br, struct net_device *dev) | |||
425 | del_nbp(p); | 430 | del_nbp(p); |
426 | 431 | ||
427 | spin_lock_bh(&br->lock); | 432 | spin_lock_bh(&br->lock); |
428 | br_stp_recalculate_bridge_id(br); | 433 | changed_addr = br_stp_recalculate_bridge_id(br); |
429 | spin_unlock_bh(&br->lock); | 434 | spin_unlock_bh(&br->lock); |
430 | 435 | ||
436 | if (changed_addr) | ||
437 | call_netdevice_notifiers(NETDEV_CHANGEADDR, br->dev); | ||
438 | |||
431 | netdev_update_features(br->dev); | 439 | netdev_update_features(br->dev); |
432 | 440 | ||
433 | return 0; | 441 | return 0; |