diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h index fb446f01a65d..033ed8fce35e 100644 --- a/include/net/ip_fib.h +++ b/include/net/ip_fib.h @@ -258,6 +258,7 @@ struct fib_table { struct hlist_node tb_hlist; u32 tb_id; int tb_num_default; + struct net *tb_net; struct rcu_head rcu; unsigned long *tb_data; unsigned long __data[]; @@ -593,7 +594,8 @@ void fib_nh_common_release(struct fib_nh_common *nhc); /* Exported by fib_trie.c */ void fib_alias_hw_flags_set(struct net *net, const struct fib_rt_info *fri); void fib_trie_init(void); -struct fib_table *fib_trie_table(u32 id, struct fib_table *alias); +struct fib_table *fib_trie_table(struct net *net, u32 id, + struct fib_table *alias); bool fib_lookup_good_nhc(const struct fib_nh_common *nhc, int fib_flags, const struct flowi4 *flp); diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c index c80c1b36f1fd..97acfb35fb12 100644 --- a/net/ipv4/fib_frontend.c +++ b/net/ipv4/fib_frontend.c @@ -54,11 +54,11 @@ static int __net_init fib4_rules_init(struct net *net) { struct fib_table *local_table, *main_table; - main_table = fib_trie_table(RT_TABLE_MAIN, NULL); + main_table = fib_trie_table(net, RT_TABLE_MAIN, NULL); if (!main_table) return -ENOMEM; - local_table = fib_trie_table(RT_TABLE_LOCAL, main_table); + local_table = fib_trie_table(net, RT_TABLE_LOCAL, main_table); if (!local_table) goto fail; @@ -91,7 +91,7 @@ struct fib_table *fib_new_table(struct net *net, u32 id) if (id == RT_TABLE_LOCAL && !net->ipv4.fib_has_custom_rules) alias = fib_new_table(net, RT_TABLE_MAIN); - new_tb = fib_trie_table(id, alias); + new_tb = fib_trie_table(net, id, alias); if (!new_tb) return NULL; diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index 4a800fdf1ad1..3bc8247b3d75 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c @@ -1881,7 +1881,7 @@ struct fib_table *fib_trie_unmerge(struct fib_table *oldtb) if (oldtb->tb_data == oldtb->__data) return oldtb; - local_tb = fib_trie_table(RT_TABLE_LOCAL, NULL); + local_tb = fib_trie_table(oldtb->tb_net, RT_TABLE_LOCAL, NULL); if (!local_tb) return NULL; @@ -2378,7 +2378,8 @@ void __init fib_trie_init(void) 0, SLAB_PANIC | SLAB_ACCOUNT, NULL); } -struct fib_table *fib_trie_table(u32 id, struct fib_table *alias) +struct fib_table *fib_trie_table(struct net *net, u32 id, + struct fib_table *alias) { struct fib_table *tb; struct trie *t; @@ -2391,6 +2392,7 @@ struct fib_table *fib_trie_table(u32 id, struct fib_table *alias) if (!tb) return NULL; + tb->tb_net = net; tb->tb_id = id; tb->tb_num_default = 0; tb->tb_data = (alias ? alias->__data : tb->__data);