|
@@ -1113,6 +1113,10 @@ static void nf_ct_release_dying_list(struct net *net)
|
|
|
|
|
|
static void nf_conntrack_cleanup_init_net(void)
|
|
|
{
|
|
|
+ /* wait until all references to nf_conntrack_untracked are dropped */
|
|
|
+ while (atomic_read(&nf_conntrack_untracked.ct_general.use) > 1)
|
|
|
+ schedule();
|
|
|
+
|
|
|
nf_conntrack_helper_fini();
|
|
|
nf_conntrack_proto_fini();
|
|
|
kmem_cache_destroy(nf_conntrack_cachep);
|
|
@@ -1127,9 +1131,6 @@ static void nf_conntrack_cleanup_net(struct net *net)
|
|
|
schedule();
|
|
|
goto i_see_dead_people;
|
|
|
}
|
|
|
- /* wait until all references to nf_conntrack_untracked are dropped */
|
|
|
- while (atomic_read(&nf_conntrack_untracked.ct_general.use) > 1)
|
|
|
- schedule();
|
|
|
|
|
|
nf_ct_free_hashtable(net->ct.hash, net->ct.hash_vmalloc,
|
|
|
nf_conntrack_htable_size);
|
|
@@ -1288,6 +1289,14 @@ static int nf_conntrack_init_init_net(void)
|
|
|
if (ret < 0)
|
|
|
goto err_helper;
|
|
|
|
|
|
+ /* Set up fake conntrack: to never be deleted, not in any hashes */
|
|
|
+#ifdef CONFIG_NET_NS
|
|
|
+ nf_conntrack_untracked.ct_net = &init_net;
|
|
|
+#endif
|
|
|
+ atomic_set(&nf_conntrack_untracked.ct_general.use, 1);
|
|
|
+ /* - and look it like as a confirmed connection */
|
|
|
+ set_bit(IPS_CONFIRMED_BIT, &nf_conntrack_untracked.status);
|
|
|
+
|
|
|
return 0;
|
|
|
|
|
|
err_helper:
|
|
@@ -1333,15 +1342,6 @@ static int nf_conntrack_init_net(struct net *net)
|
|
|
if (ret < 0)
|
|
|
goto err_ecache;
|
|
|
|
|
|
- /* Set up fake conntrack:
|
|
|
- - to never be deleted, not in any hashes */
|
|
|
-#ifdef CONFIG_NET_NS
|
|
|
- nf_conntrack_untracked.ct_net = &init_net;
|
|
|
-#endif
|
|
|
- atomic_set(&nf_conntrack_untracked.ct_general.use, 1);
|
|
|
- /* - and look it like as a confirmed connection */
|
|
|
- set_bit(IPS_CONFIRMED_BIT, &nf_conntrack_untracked.status);
|
|
|
-
|
|
|
return 0;
|
|
|
|
|
|
err_ecache:
|