UPSTREAM: net: push code from net notifier reg/unreg into helpers

Push the code which is done under rtnl lock in net notifier register and
unregister function into separate helpers.

Change-Id: I38da98b676fff80aadf2cd6aca1a8e9c4d634523
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Jiri Pirko 2020-01-25 12:17:07 +01:00 • committed by basamaryan
commit 07ac2f7c7d
No known key found for this signature in database
GPG key ID: 210D5384FB2A5885

View file

@ -1687,6 +1687,42 @@ unlock:
}
EXPORT_SYMBOL(unregister_netdevice_notifier);
static int __register_netdevice_notifier_net(struct net *net,
struct notifier_block *nb,
bool ignore_call_fail)
{
int err;
err = raw_notifier_chain_register(&net->netdev_chain, nb);
if (err)
return err;
if (dev_boot_phase)
return 0;
err = call_netdevice_register_net_notifiers(nb, net);
if (err && !ignore_call_fail)
goto chain_unregister;
return 0;
chain_unregister:
raw_notifier_chain_unregister(&net->netdev_chain, nb);
return err;
}
static int __unregister_netdevice_notifier_net(struct net *net,
struct notifier_block *nb)
{
int err;
err = raw_notifier_chain_unregister(&net->netdev_chain, nb);
if (err)
return err;
call_netdevice_unregister_net_notifiers(nb, net);
return 0;
}
/**
* register_netdevice_notifier_net - register a per-netns network notifier block
* @net: network namespace
@ -1707,23 +1743,9 @@ int register_netdevice_notifier_net(struct net *net, struct notifier_block *nb)
int err;
rtnl_lock();
err = raw_notifier_chain_register(&net->netdev_chain, nb);
if (err)
goto unlock;
if (dev_boot_phase)
goto unlock;
err = call_netdevice_register_net_notifiers(nb, net);
if (err)
goto chain_unregister;
unlock:
err = __register_netdevice_notifier_net(net, nb, false);
rtnl_unlock();
return err;
chain_unregister:
raw_notifier_chain_unregister(&netdev_chain, nb);
goto unlock;
}
EXPORT_SYMBOL(register_netdevice_notifier_net);
@ -1749,13 +1771,7 @@ int unregister_netdevice_notifier_net(struct net *net,
int err;
rtnl_lock();
err = raw_notifier_chain_unregister(&net->netdev_chain, nb);
if (err)
goto unlock;
call_netdevice_unregister_net_notifiers(nb, net);
unlock:
err = __unregister_netdevice_notifier_net(net, nb);
rtnl_unlock();
return err;
}