diff options
author | Vlad Yasevich <vyasevic@redhat.com> | 2012-12-19 09:13:48 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-12-19 12:50:06 -0800 |
commit | 63233159fd4e596568f5f168ecb0879b61631d47 (patch) | |
tree | 4cfde7141cb81f573a575f6c870b1af2b7f41181 | |
parent | a5e40708c495e387a2351d5e89b0cf7f19175a57 (diff) | |
download | op-kernel-dev-63233159fd4e596568f5f168ecb0879b61631d47.zip op-kernel-dev-63233159fd4e596568f5f168ecb0879b61631d47.tar.gz |
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>
-rw-r--r-- | net/bridge/br_mdb.c | 7 | ||||
-rw-r--r-- | net/bridge/br_multicast.c | 1 | ||||
-rw-r--r-- | net/bridge/br_netlink.c | 1 | ||||
-rw-r--r-- | net/bridge/br_private.h | 1 |
4 files changed, 9 insertions, 1 deletions
diff --git a/net/bridge/br_mdb.c b/net/bridge/br_mdb.c index 9cf5d2b..3e05cc3 100644 --- a/net/bridge/br_mdb.c +++ b/net/bridge/br_mdb.c @@ -482,3 +482,10 @@ void br_mdb_init(void) rtnl_register(PF_BRIDGE, RTM_NEWMDB, br_mdb_add, NULL, NULL); rtnl_register(PF_BRIDGE, RTM_DELMDB, br_mdb_del, NULL, NULL); } + +void br_mdb_uninit(void) +{ + rtnl_unregister(PF_BRIDGE, RTM_GETMDB); + rtnl_unregister(PF_BRIDGE, RTM_NEWMDB); + rtnl_unregister(PF_BRIDGE, RTM_DELMDB); +} diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c index dce9def..5391ca4 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) del_timer_sync(&br->multicast_querier_timer); del_timer_sync(&br->multicast_query_timer); + br_mdb_uninit(); spin_lock_bh(&br->multicast_lock); mdb = mlock_dereference(br->mdb, br); if (!mdb) diff --git a/net/bridge/br_netlink.c b/net/bridge/br_netlink.c index dead9df..97ba018 100644 --- a/net/bridge/br_netlink.c +++ b/net/bridge/br_netlink.c @@ -305,5 +305,4 @@ int __init br_netlink_init(void) void __exit br_netlink_fini(void) { rtnl_link_unregister(&br_link_ops); - rtnl_unregister_all(PF_BRIDGE); } diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h index 49b85af4..8d83be5 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( struct net_bridge_port_group *next, unsigned char state); extern void br_mdb_init(void); +extern void br_mdb_uninit(void); extern void br_mdb_notify(struct net_device *dev, struct net_bridge_port *port, struct br_ip *group, int type); |