[RTNL]: Introduce the rtnl_kill_links helper.
authorPavel Emelyanov <xemul@openvz.org>
Wed, 16 Apr 2008 07:46:52 +0000 (00:46 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 16 Apr 2008 07:46:52 +0000 (00:46 -0700)
This one is responsible for calling ->dellink on each net
device found in net to help with vlan net_exit hook in the
nearest future.

Signed-off-by: Pavel Emelyanov <xemul@openvz.org>
Acked-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/rtnetlink.h
net/core/rtnetlink.c

index 793863e09c69c8e35ea6a1f729f67763ce40b717..3c1895e54b7f91a672cd43c61262b6485184ea52 100644 (file)
@@ -74,6 +74,7 @@ struct rtnl_link_ops {
 
 extern int     __rtnl_link_register(struct rtnl_link_ops *ops);
 extern void    __rtnl_link_unregister(struct rtnl_link_ops *ops);
+extern void    rtnl_kill_links(struct net *net, struct rtnl_link_ops *ops);
 
 extern int     rtnl_link_register(struct rtnl_link_ops *ops);
 extern void    rtnl_link_unregister(struct rtnl_link_ops *ops);
index edc6dbfe48f28ae798e0382c6bf655aa8dd2fcc9..bc39e417694a4dab95e9a463de3a1daef78558a0 100644 (file)
@@ -269,6 +269,26 @@ int rtnl_link_register(struct rtnl_link_ops *ops)
 
 EXPORT_SYMBOL_GPL(rtnl_link_register);
 
+static void __rtnl_kill_links(struct net *net, struct rtnl_link_ops *ops)
+{
+       struct net_device *dev;
+restart:
+       for_each_netdev(net, dev) {
+               if (dev->rtnl_link_ops == ops) {
+                       ops->dellink(dev);
+                       goto restart;
+               }
+       }
+}
+
+void rtnl_kill_links(struct net *net, struct rtnl_link_ops *ops)
+{
+       rtnl_lock();
+       __rtnl_kill_links(net, ops);
+       rtnl_unlock();
+}
+EXPORT_SYMBOL_GPL(rtnl_kill_links);
+
 /**
  * __rtnl_link_unregister - Unregister rtnl_link_ops from rtnetlink.
  * @ops: struct rtnl_link_ops * to unregister
@@ -277,17 +297,10 @@ EXPORT_SYMBOL_GPL(rtnl_link_register);
  */
 void __rtnl_link_unregister(struct rtnl_link_ops *ops)
 {
-       struct net_device *dev;
        struct net *net;
 
        for_each_net(net) {
-restart:
-               for_each_netdev(net, dev) {
-                       if (dev->rtnl_link_ops == ops) {
-                               ops->dellink(dev);
-                               goto restart;
-                       }
-               }
+               __rtnl_kill_links(net, ops);
        }
        list_del(&ops->list);
 }