aboutsummaryrefslogtreecommitdiff
path: root/net/core/dev.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2012-04-26 20:00:35 -0700
committerDavid S. Miller <davem@davemloft.net>2012-04-26 20:00:35 -0700
commit8fe5f56c8a203a7a83d1b621c369655d914f3752 (patch)
treeec865efb2d577d1e536720a28ae18b10bdbfd973 /net/core/dev.c
parentdf2e7f525d88da992021b589d8a412afc15de36c (diff)
parent82b769063598d01a8b24abf250a53f8b437e09f1 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux
Conflicts: arch/sparc/kernel/leon_smp.c Merge mainline to get the nobootmem.c bug fix, for the sake of the sparc64 NO_BOOTMEM conversion. Resolve a small include line conflict in leon_smp.c Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core/dev.c')
-rw-r--r--net/core/dev.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/net/core/dev.c b/net/core/dev.c
index c25d453b2803..9bb8f87c4cda 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -1409,14 +1409,34 @@ EXPORT_SYMBOL(register_netdevice_notifier);
* register_netdevice_notifier(). The notifier is unlinked into the
* kernel structures and may then be reused. A negative errno code
* is returned on a failure.
+ *
+ * After unregistering unregister and down device events are synthesized
+ * for all devices on the device list to the removed notifier to remove
+ * the need for special case cleanup code.
*/
int unregister_netdevice_notifier(struct notifier_block *nb)
{
+ struct net_device *dev;
+ struct net *net;
int err;
rtnl_lock();
err = raw_notifier_chain_unregister(&netdev_chain, nb);
+ if (err)
+ goto unlock;
+
+ for_each_net(net) {
+ for_each_netdev(net, dev) {
+ if (dev->flags & IFF_UP) {
+ nb->notifier_call(nb, NETDEV_GOING_DOWN, dev);
+ nb->notifier_call(nb, NETDEV_DOWN, dev);
+ }
+ nb->notifier_call(nb, NETDEV_UNREGISTER, dev);
+ nb->notifier_call(nb, NETDEV_UNREGISTER_BATCH, dev);
+ }
+ }
+unlock:
rtnl_unlock();
return err;
}