[RTNETLINK]: rtnl_link API simplification
[deliverable/linux.git] / net / core / rtnetlink.c
index 54c17e4cd28fa7e091e021f894a76bf3989dc015..7b6b16396745d729489c6046295337cb05480f4b 100644 (file)
@@ -270,6 +270,9 @@ static LIST_HEAD(link_ops);
  */
 int __rtnl_link_register(struct rtnl_link_ops *ops)
 {
+       if (!ops->dellink)
+               ops->dellink = unregister_netdevice;
+
        list_add_tail(&ops->list, &link_ops);
        return 0;
 }
@@ -298,12 +301,16 @@ EXPORT_SYMBOL_GPL(rtnl_link_register);
  * __rtnl_link_unregister - Unregister rtnl_link_ops from rtnetlink.
  * @ops: struct rtnl_link_ops * to unregister
  *
- * The caller must hold the rtnl_mutex. This function should be used
- * by drivers that unregister devices during module unloading. It must
- * be called after unregistering the devices.
+ * The caller must hold the rtnl_mutex.
  */
 void __rtnl_link_unregister(struct rtnl_link_ops *ops)
 {
+       struct net_device *dev, *n;
+
+       for_each_netdev_safe(dev, n) {
+               if (dev->rtnl_link_ops == ops)
+                       ops->dellink(dev);
+       }
        list_del(&ops->list);
 }
 
@@ -1067,7 +1074,10 @@ replay:
                if (tb[IFLA_LINKMODE])
                        dev->link_mode = nla_get_u8(tb[IFLA_LINKMODE]);
 
-               err = ops->newlink(dev, tb, data);
+               if (ops->newlink)
+                       err = ops->newlink(dev, tb, data);
+               else
+                       err = register_netdevice(dev);
 err_free:
                if (err < 0)
                        free_netdev(dev);
This page took 0.029716 seconds and 5 git commands to generate.