[IPV6] IP6TUNNEL: Delete all tunnel device when unloading module.
authorYasuyuki Kozakai <yasuyuki.kozakai@toshiba.co.jp>
Mon, 6 Nov 2006 18:06:22 +0000 (10:06 -0800)
committerDavid S. Miller <davem@sunset.davemloft.net>
Wed, 22 Nov 2006 00:16:26 +0000 (16:16 -0800)
Signed-off-by: Yasuyuki Kozakai <yasuyuki.kozakai@toshiba.co.jp>
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
net/ipv6/ip6_tunnel.c

index 84d7ebdb9d211103c678579009d6c24dc905379f..c8d4160385f6bac7221e161ab1698f77bbbf9732 100644 (file)
@@ -1149,6 +1149,20 @@ fail:
        return err;
 }
 
+static void __exit ip6ip6_destroy_tunnels(void)
+{
+       int h;
+       struct ip6_tnl *t;
+
+       for (h = 0; h < HASH_SIZE; h++) {
+               while ((t = tnls_r_l[h]) != NULL)
+                       unregister_netdevice(t->dev);
+       }
+
+       t = tnls_wc[0];
+       unregister_netdevice(t->dev);
+}
+
 /**
  * ip6_tunnel_cleanup - free resources and unregister protocol
  **/
@@ -1158,7 +1172,9 @@ static void __exit ip6_tunnel_cleanup(void)
        if (xfrm6_tunnel_deregister(&ip6ip6_handler))
                printk(KERN_INFO "ip6ip6 close: can't deregister tunnel\n");
 
-       unregister_netdev(ip6ip6_fb_tnl_dev);
+       rtnl_lock();
+       ip6ip6_destroy_tunnels();
+       rtnl_unlock();
 }
 
 module_init(ip6_tunnel_init);