Commit 63233159 authored by Vlad Yasevich's avatar Vlad Yasevich Committed by David S. Miller

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: default avatarVlad Yasevich <vyasevic@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a5e40708
...@@ -482,3 +482,10 @@ void br_mdb_init(void) ...@@ -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_NEWMDB, br_mdb_add, NULL, NULL);
rtnl_register(PF_BRIDGE, RTM_DELMDB, br_mdb_del, 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);
}
...@@ -1633,6 +1633,7 @@ void br_multicast_stop(struct net_bridge *br) ...@@ -1633,6 +1633,7 @@ void br_multicast_stop(struct net_bridge *br)
del_timer_sync(&br->multicast_querier_timer); del_timer_sync(&br->multicast_querier_timer);
del_timer_sync(&br->multicast_query_timer); del_timer_sync(&br->multicast_query_timer);
br_mdb_uninit();
spin_lock_bh(&br->multicast_lock); spin_lock_bh(&br->multicast_lock);
mdb = mlock_dereference(br->mdb, br); mdb = mlock_dereference(br->mdb, br);
if (!mdb) if (!mdb)
......
...@@ -305,5 +305,4 @@ int __init br_netlink_init(void) ...@@ -305,5 +305,4 @@ int __init br_netlink_init(void)
void __exit br_netlink_fini(void) void __exit br_netlink_fini(void)
{ {
rtnl_link_unregister(&br_link_ops); rtnl_link_unregister(&br_link_ops);
rtnl_unregister_all(PF_BRIDGE);
} }
...@@ -447,6 +447,7 @@ extern struct net_bridge_port_group *br_multicast_new_port_group( ...@@ -447,6 +447,7 @@ extern struct net_bridge_port_group *br_multicast_new_port_group(
struct net_bridge_port_group *next, struct net_bridge_port_group *next,
unsigned char state); unsigned char state);
extern void br_mdb_init(void); 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, extern void br_mdb_notify(struct net_device *dev, struct net_bridge_port *port,
struct br_ip *group, int type); struct br_ip *group, int type);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment