aboutsummaryrefslogtreecommitdiffstats
path: root/net/bridge
diff options
context:
space:
mode:
authorVlad Yasevich <vyasevic@redhat.com>2012-12-19 04:13:48 -0500
committerDavid S. Miller <davem@davemloft.net>2012-12-19 15:50:06 -0500
commit63233159fd4e596568f5f168ecb0879b61631d47 (patch)
tree4cfde7141cb81f573a575f6c870b1af2b7f41181 /net/bridge
parenta5e40708c495e387a2351d5e89b0cf7f19175a57 (diff)
bridge: Do not unregister all PF_BRIDGE rtnl operations
Bridge fdb and link rtnl operations are registered in core/rtnetlink. Bridge mdb operations are registred in bridge/mdb. When removing bridge module, do not unregister ALL PF_BRIDGE ops since that would remove the ops from rtnetlink as well. Do remove mdb ops when bridge is destroyed. Signed-off-by: Vlad Yasevich <vyasevic@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/bridge')
-rw-r--r--net/bridge/br_mdb.c7
-rw-r--r--net/bridge/br_multicast.c1
-rw-r--r--net/bridge/br_netlink.c1
-rw-r--r--net/bridge/br_private.h1
4 files changed, 9 insertions, 1 deletions
diff --git a/net/bridge/br_mdb.c b/net/bridge/br_mdb.c
index 9cf5d2b28c76..3e05cc32da50 100644
--- a/net/bridge/br_mdb.c
+++ b/net/bridge/br_mdb.c
@@ -482,3 +482,10 @@ void br_mdb_init(void)
482 rtnl_register(PF_BRIDGE, RTM_NEWMDB, br_mdb_add, NULL, NULL); 482 rtnl_register(PF_BRIDGE, RTM_NEWMDB, br_mdb_add, NULL, NULL);
483 rtnl_register(PF_BRIDGE, RTM_DELMDB, br_mdb_del, NULL, NULL); 483 rtnl_register(PF_BRIDGE, RTM_DELMDB, br_mdb_del, NULL, NULL);
484} 484}
485
486void br_mdb_uninit(void)
487{
488 rtnl_unregister(PF_BRIDGE, RTM_GETMDB);
489 rtnl_unregister(PF_BRIDGE, RTM_NEWMDB);
490 rtnl_unregister(PF_BRIDGE, RTM_DELMDB);
491}
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
index dce9defae3c6..5391ca43336a 100644
--- a/net/bridge/br_multicast.c
+++ b/net/bridge/br_multicast.c
@@ -1633,6 +1633,7 @@ void br_multicast_stop(struct net_bridge *br)
1633 del_timer_sync(&br->multicast_querier_timer); 1633 del_timer_sync(&br->multicast_querier_timer);
1634 del_timer_sync(&br->multicast_query_timer); 1634 del_timer_sync(&br->multicast_query_timer);
1635 1635
1636 br_mdb_uninit();
1636 spin_lock_bh(&br->multicast_lock); 1637 spin_lock_bh(&br->multicast_lock);
1637 mdb = mlock_dereference(br->mdb, br); 1638 mdb = mlock_dereference(br->mdb, br);
1638 if (!mdb) 1639 if (!mdb)
diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c
index dead9dfe865b..97ba0189c6f7 100644
--- a/net/bridge/br_netlink.c
+++ b/net/bridge/br_netlink.c
@@ -305,5 +305,4 @@ int __init br_netlink_init(void)
305void __exit br_netlink_fini(void) 305void __exit br_netlink_fini(void)
306{ 306{
307 rtnl_link_unregister(&br_link_ops); 307 rtnl_link_unregister(&br_link_ops);
308 rtnl_unregister_all(PF_BRIDGE);
309} 308}
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
index 49b85af44016..8d83be5ffedc 100644
--- a/net/bridge/br_private.h
+++ b/net/bridge/br_private.h
@@ -447,6 +447,7 @@ extern struct net_bridge_port_group *br_multicast_new_port_group(
447 struct net_bridge_port_group *next, 447 struct net_bridge_port_group *next,
448 unsigned char state); 448 unsigned char state);
449extern void br_mdb_init(void); 449extern void br_mdb_init(void);
450extern void br_mdb_uninit(void);
450extern void br_mdb_notify(struct net_device *dev, struct net_bridge_port *port, 451extern void br_mdb_notify(struct net_device *dev, struct net_bridge_port *port,
451 struct br_ip *group, int type); 452 struct br_ip *group, int type);
452 453