|
@@ -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);
|
|
|
}
|