aboutsummaryrefslogtreecommitdiffstats
path: root/net/8021q/vlan.c
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2009-12-02 08:19:08 -0500
committerDavid S. Miller <davem@davemloft.net>2009-12-03 01:10:24 -0500
commit91e2ff3528ac90b9dbcb04b76488e8ad74e3d3d9 (patch)
tree33b346ebaab318dab8beb1f433453ceae65bced1 /net/8021q/vlan.c
parent650de8de16aa7c168c34d1b6a3191e4a5e2648c8 (diff)
net: Teach vlans to cleanup as a pernet subsystem
Take advantage of the fact that an explicit rtnl_kill_links is unnecessary (and skipping it improves batching), as network namespace exit calls dellink on all remaining virtual devices, and rtnl_link_unregister calls dellink on all outstanding devices in that network namespace. To do this we need to leave the vlan proc directories in place until after network device exit time, which is done by using register_pernet_subsys instead of register_pernet_device. Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/8021q/vlan.c')
-rw-r--r--net/8021q/vlan.c8
1 files changed, 3 insertions, 5 deletions
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c
index 91e9073e1995..ec3769295dac 100644
--- a/net/8021q/vlan.c
+++ b/net/8021q/vlan.c
@@ -698,8 +698,6 @@ static int vlan_init_net(struct net *net)
698 698
699static void vlan_exit_net(struct net *net) 699static void vlan_exit_net(struct net *net)
700{ 700{
701 rtnl_kill_links(net, &vlan_link_ops);
702
703 vlan_proc_cleanup(net); 701 vlan_proc_cleanup(net);
704} 702}
705 703
@@ -717,7 +715,7 @@ static int __init vlan_proto_init(void)
717 pr_info("%s v%s %s\n", vlan_fullname, vlan_version, vlan_copyright); 715 pr_info("%s v%s %s\n", vlan_fullname, vlan_version, vlan_copyright);
718 pr_info("All bugs added by %s\n", vlan_buggyright); 716 pr_info("All bugs added by %s\n", vlan_buggyright);
719 717
720 err = register_pernet_device(&vlan_net_ops); 718 err = register_pernet_subsys(&vlan_net_ops);
721 if (err < 0) 719 if (err < 0)
722 goto err0; 720 goto err0;
723 721
@@ -742,7 +740,7 @@ err4:
742err3: 740err3:
743 unregister_netdevice_notifier(&vlan_notifier_block); 741 unregister_netdevice_notifier(&vlan_notifier_block);
744err2: 742err2:
745 unregister_pernet_device(&vlan_net_ops); 743 unregister_pernet_subsys(&vlan_net_ops);
746err0: 744err0:
747 return err; 745 return err;
748} 746}
@@ -762,7 +760,7 @@ static void __exit vlan_cleanup_module(void)
762 for (i = 0; i < VLAN_GRP_HASH_SIZE; i++) 760 for (i = 0; i < VLAN_GRP_HASH_SIZE; i++)
763 BUG_ON(!hlist_empty(&vlan_group_hash[i])); 761 BUG_ON(!hlist_empty(&vlan_group_hash[i]));
764 762
765 unregister_pernet_device(&vlan_net_ops); 763 unregister_pernet_subsys(&vlan_net_ops);
766 rcu_barrier(); /* Wait for completion of call_rcu()'s */ 764 rcu_barrier(); /* Wait for completion of call_rcu()'s */
767 765
768 vlan_gvrp_uninit(); 766 vlan_gvrp_uninit();