Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 669f87ba authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by David S. Miller
Browse files

[RTNL]: Introduce the rtnl_kill_links helper.



This one is responsible for calling ->dellink on each net
device found in net to help with vlan net_exit hook in the
nearest future.

Signed-off-by: default avatarPavel Emelyanov <xemul@openvz.org>
Acked-by: default avatarPatrick McHardy <kaber@trash.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 3a931a80
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -74,6 +74,7 @@ struct rtnl_link_ops {


extern int	__rtnl_link_register(struct rtnl_link_ops *ops);
extern int	__rtnl_link_register(struct rtnl_link_ops *ops);
extern void	__rtnl_link_unregister(struct rtnl_link_ops *ops);
extern void	__rtnl_link_unregister(struct rtnl_link_ops *ops);
extern void	rtnl_kill_links(struct net *net, struct rtnl_link_ops *ops);


extern int	rtnl_link_register(struct rtnl_link_ops *ops);
extern int	rtnl_link_register(struct rtnl_link_ops *ops);
extern void	rtnl_link_unregister(struct rtnl_link_ops *ops);
extern void	rtnl_link_unregister(struct rtnl_link_ops *ops);
+21 −8
Original line number Original line Diff line number Diff line
@@ -269,6 +269,26 @@ int rtnl_link_register(struct rtnl_link_ops *ops)


EXPORT_SYMBOL_GPL(rtnl_link_register);
EXPORT_SYMBOL_GPL(rtnl_link_register);


static void __rtnl_kill_links(struct net *net, struct rtnl_link_ops *ops)
{
	struct net_device *dev;
restart:
	for_each_netdev(net, dev) {
		if (dev->rtnl_link_ops == ops) {
			ops->dellink(dev);
			goto restart;
		}
	}
}

void rtnl_kill_links(struct net *net, struct rtnl_link_ops *ops)
{
	rtnl_lock();
	__rtnl_kill_links(net, ops);
	rtnl_unlock();
}
EXPORT_SYMBOL_GPL(rtnl_kill_links);

/**
/**
 * __rtnl_link_unregister - Unregister rtnl_link_ops from rtnetlink.
 * __rtnl_link_unregister - Unregister rtnl_link_ops from rtnetlink.
 * @ops: struct rtnl_link_ops * to unregister
 * @ops: struct rtnl_link_ops * to unregister
@@ -277,17 +297,10 @@ EXPORT_SYMBOL_GPL(rtnl_link_register);
 */
 */
void __rtnl_link_unregister(struct rtnl_link_ops *ops)
void __rtnl_link_unregister(struct rtnl_link_ops *ops)
{
{
	struct net_device *dev;
	struct net *net;
	struct net *net;


	for_each_net(net) {
	for_each_net(net) {
restart:
		__rtnl_kill_links(net, ops);
		for_each_netdev(net, dev) {
			if (dev->rtnl_link_ops == ops) {
				ops->dellink(dev);
				goto restart;
			}
		}
	}
	}
	list_del(&ops->list);
	list_del(&ops->list);
}
}