Commit af5cd2a8 authored by Kuniyuki Iwashima's avatar Kuniyuki Iwashima Committed by Jakub Kicinski
Browse files

ipv4: fib: Hold rtnl_net_lock() for ip_fib_net_exit().



ip_fib_net_exit() requires RTNL and is called from fib_net_init()
and fib_net_exit_batch().

Let's hold rtnl_net_lock() before ip_fib_net_exit().

Signed-off-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
Reviewed-by: default avatarDavid Ahern <dsahern@kernel.org>
Link: https://patch.msgid.link/20250228042328.96624-10-kuniyu@amazon.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 9f7f3ebe
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -1575,7 +1575,7 @@ static void ip_fib_net_exit(struct net *net)
{
	int i;

	ASSERT_RTNL();
	ASSERT_RTNL_NET(net);
#ifdef CONFIG_IP_MULTIPLE_TABLES
	RCU_INIT_POINTER(net->ipv4.fib_main, NULL);
	RCU_INIT_POINTER(net->ipv4.fib_default, NULL);
@@ -1635,9 +1635,9 @@ static int __net_init fib_net_init(struct net *net)
out_nlfl:
	fib4_semantics_exit(net);
out_semantics:
	rtnl_lock();
	rtnl_net_lock(net);
	ip_fib_net_exit(net);
	rtnl_unlock();
	rtnl_net_unlock(net);
	goto out;
}

@@ -1652,9 +1652,11 @@ static void __net_exit fib_net_exit_batch(struct list_head *net_list)
	struct net *net;

	rtnl_lock();
	list_for_each_entry(net, net_list, exit_list)
	list_for_each_entry(net, net_list, exit_list) {
		__rtnl_net_lock(net);
		ip_fib_net_exit(net);

		__rtnl_net_unlock(net);
	}
	rtnl_unlock();

	list_for_each_entry(net, net_list, exit_list)