From 922300ba2c41b4c7dac73237b33dddd223f33d16 Mon Sep 17 00:00:00 2001 From: Patrick McHardy Date: Sun, 20 Jan 2008 17:25:14 -0800 Subject: [PATCH] --- yaml --- r: 75620 b: refs/heads/master c: 68365458a4252fa993b91a00f7a0b18fed399f0d h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/net/veth.c | 14 +------------- trunk/net/core/rtnetlink.c | 5 ++++- 3 files changed, 6 insertions(+), 15 deletions(-) diff --git a/[refs] b/[refs] index 90a0ad9e1b2f..50915528c337 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: d4782c323d10d3698b71b6a6b3c7bdad33824658 +refs/heads/master: 68365458a4252fa993b91a00f7a0b18fed399f0d diff --git a/trunk/drivers/net/veth.c b/trunk/drivers/net/veth.c index 43af9e9b2652..3f67a29593bc 100644 --- a/trunk/drivers/net/veth.c +++ b/trunk/drivers/net/veth.c @@ -459,19 +459,7 @@ static __init int veth_init(void) static __exit void veth_exit(void) { - struct veth_priv *priv, *next; - - rtnl_lock(); - /* - * cannot trust __rtnl_link_unregister() to unregister all - * devices, as each ->dellink call will remove two devices - * from the list at once. - */ - list_for_each_entry_safe(priv, next, &veth_list, list) - veth_dellink(priv->dev); - - __rtnl_link_unregister(&veth_link_ops); - rtnl_unlock(); + rtnl_link_unregister(&veth_link_ops); } module_init(veth_init); diff --git a/trunk/net/core/rtnetlink.c b/trunk/net/core/rtnetlink.c index e1ba26fb4bf2..fed95a323b28 100644 --- a/trunk/net/core/rtnetlink.c +++ b/trunk/net/core/rtnetlink.c @@ -308,9 +308,12 @@ void __rtnl_link_unregister(struct rtnl_link_ops *ops) struct net *net; for_each_net(net) { +restart: for_each_netdev_safe(net, dev, n) { - if (dev->rtnl_link_ops == ops) + if (dev->rtnl_link_ops == ops) { ops->dellink(dev); + goto restart; + } } } list_del(&ops->list);