[RTNETLINK]: rtnl_link API simplification
All drivers need to unregister their devices in the module unload function. While doing so they must hold the rtnl and atomically unregister the rtnl_link ops as well. This makes the rtnl_link_unregister function that takes the rtnl itself completely useless. Provide default newlink/dellink functions, make __rtnl_link_unregister and rtnl_link_unregister unregister all devices with matching rtnl_link_ops and change the existing users to take advantage of that. Signed-off-by: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
8c979c26a0
commit
2d85cba2b2
@@ -270,6 +270,9 @@ static LIST_HEAD(link_ops);
|
||||
*/
|
||||
int __rtnl_link_register(struct rtnl_link_ops *ops)
|
||||
{
|
||||
if (!ops->dellink)
|
||||
ops->dellink = unregister_netdevice;
|
||||
|
||||
list_add_tail(&ops->list, &link_ops);
|
||||
return 0;
|
||||
}
|
||||
@@ -298,12 +301,16 @@ EXPORT_SYMBOL_GPL(rtnl_link_register);
|
||||
* __rtnl_link_unregister - Unregister rtnl_link_ops from rtnetlink.
|
||||
* @ops: struct rtnl_link_ops * to unregister
|
||||
*
|
||||
* The caller must hold the rtnl_mutex. This function should be used
|
||||
* by drivers that unregister devices during module unloading. It must
|
||||
* be called after unregistering the devices.
|
||||
* The caller must hold the rtnl_mutex.
|
||||
*/
|
||||
void __rtnl_link_unregister(struct rtnl_link_ops *ops)
|
||||
{
|
||||
struct net_device *dev, *n;
|
||||
|
||||
for_each_netdev_safe(dev, n) {
|
||||
if (dev->rtnl_link_ops == ops)
|
||||
ops->dellink(dev);
|
||||
}
|
||||
list_del(&ops->list);
|
||||
}
|
||||
|
||||
@@ -1067,7 +1074,10 @@ replay:
|
||||
if (tb[IFLA_LINKMODE])
|
||||
dev->link_mode = nla_get_u8(tb[IFLA_LINKMODE]);
|
||||
|
||||
err = ops->newlink(dev, tb, data);
|
||||
if (ops->newlink)
|
||||
err = ops->newlink(dev, tb, data);
|
||||
else
|
||||
err = register_netdevice(dev);
|
||||
err_free:
|
||||
if (err < 0)
|
||||
free_netdev(dev);
|
||||
|
Reference in New Issue
Block a user