summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2006-03-25 01:24:25 -0800
committerDavid S. Miller <davem@davemloft.net>2006-03-25 01:24:25 -0800
commit9f514950bb907e98f280492a091aa1889b97304e (patch)
treef25bc8dc9aacf4011588eea2dda80a9137a6becb
parent868d2c1efe9cdd259b67a80d60a7fb2fcecd3d68 (diff)
downloadlinux-3.10-9f514950bb907e98f280492a091aa1889b97304e.tar.gz
linux-3.10-9f514950bb907e98f280492a091aa1889b97304e.tar.bz2
linux-3.10-9f514950bb907e98f280492a091aa1889b97304e.zip
[NET]: Take RTNL when unregistering notifier
The netdev notifier call chain is currently unregistered without taking any locks outside the notifier system. Because the notifier system itself does not synchronise unregistration with respect to the calling of the chain, we as its user need to do our own locking. We are supposed to take the RTNL for all calls to netdev notifiers, so taking the RTNL should be sufficient to protect it. The registration path in dev.c already takes the RTNL so it's OK. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--net/core/dev.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/net/core/dev.c b/net/core/dev.c
index 08dec6eb922..e0489ca731c 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -977,7 +977,12 @@ int register_netdevice_notifier(struct notifier_block *nb)
int unregister_netdevice_notifier(struct notifier_block *nb)
{
- return notifier_chain_unregister(&netdev_chain, nb);
+ int err;
+
+ rtnl_lock();
+ err = notifier_chain_unregister(&netdev_chain, nb);
+ rtnl_unlock();
+ return err;
}
/**