mirror of https://gitee.com/openkylin/linux.git
net: In unregister_netdevice_notifier unregister the netdevices.
We already synthesize events in register_netdevice_notifier and synthesizing events in unregister_netdevice_notifier allows to us remove the need for special case cleanup code. This change should be safe as it adds no new cases for existing callers of unregiser_netdevice_notifier to handle. Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ecca5c3acc
commit
7d3d43dab4
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue