diff options
Diffstat (limited to 'net/ipv4/fib_frontend.c')
| -rw-r--r-- | net/ipv4/fib_frontend.c | 9 | 
1 files changed, 7 insertions, 2 deletions
diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c index f52d27a422c3..08259d078b1c 100644 --- a/net/ipv4/fib_frontend.c +++ b/net/ipv4/fib_frontend.c @@ -1298,14 +1298,19 @@ err_table_hash_alloc:  static void ip_fib_net_exit(struct net *net)  { -	unsigned int i; +	int i;  	rtnl_lock();  #ifdef CONFIG_IP_MULTIPLE_TABLES  	RCU_INIT_POINTER(net->ipv4.fib_main, NULL);  	RCU_INIT_POINTER(net->ipv4.fib_default, NULL);  #endif -	for (i = 0; i < FIB_TABLE_HASHSZ; i++) { +	/* Destroy the tables in reverse order to guarantee that the +	 * local table, ID 255, is destroyed before the main table, ID +	 * 254. This is necessary as the local table may contain +	 * references to data contained in the main table. +	 */ +	for (i = FIB_TABLE_HASHSZ - 1; i >= 0; i--) {  		struct hlist_head *head = &net->ipv4.fib_table_hash[i];  		struct hlist_node *tmp;  		struct fib_table *tb;  |