]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/core/rtnetlink.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/kyle/parisc-2.6
[karo-tx-linux.git] / net / core / rtnetlink.c
index edc6dbfe48f28ae798e0382c6bf655aa8dd2fcc9..cf857c4dc7b12ab6e0ca2d79d17a036844a8eb53 100644 (file)
@@ -82,6 +82,11 @@ int rtnl_trylock(void)
        return mutex_trylock(&rtnl_mutex);
 }
 
+int rtnl_is_locked(void)
+{
+       return mutex_is_locked(&rtnl_mutex);
+}
+
 static struct rtnl_link *rtnl_msg_handlers[NPROTO];
 
 static inline int rtm_msgindex(int msgtype)
@@ -269,6 +274,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 +302,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);
 }
@@ -1389,6 +1407,7 @@ EXPORT_SYMBOL(rtnetlink_put_metrics);
 EXPORT_SYMBOL(rtnl_lock);
 EXPORT_SYMBOL(rtnl_trylock);
 EXPORT_SYMBOL(rtnl_unlock);
+EXPORT_SYMBOL(rtnl_is_locked);
 EXPORT_SYMBOL(rtnl_unicast);
 EXPORT_SYMBOL(rtnl_notify);
 EXPORT_SYMBOL(rtnl_set_sk_err);