aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorGao feng <gaofeng@cn.fujitsu.com>2013-01-21 17:10:25 -0500
committerPablo Neira Ayuso <pablo@netfilter.org>2013-01-23 06:55:00 -0500
commit83b4dbe19844b5472a8f44b6cf1d88693c080ef7 (patch)
treed02bf69fd9692f9ba62abb9f3d311b59f9318ad8 /net
parentf94161c1bbdf7af11729cf106b4452f2432448e0 (diff)
netfilter: nf_ct_expect: move initialization out of pernet_operations
Move the global initial codes to the module_init/exit context. Signed-off-by: Gao feng <gaofeng@cn.fujitsu.com> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'net')
-rw-r--r--net/netfilter/nf_conntrack_core.c14
-rw-r--r--net/netfilter/nf_conntrack_expect.c53
2 files changed, 36 insertions, 31 deletions
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c
index fb3e514c461e..a3cca572412c 100644
--- a/net/netfilter/nf_conntrack_core.c
+++ b/net/netfilter/nf_conntrack_core.c
@@ -1348,6 +1348,7 @@ void nf_conntrack_cleanup_end(void)
1348#ifdef CONFIG_NF_CONNTRACK_ZONES 1348#ifdef CONFIG_NF_CONNTRACK_ZONES
1349 nf_ct_extend_unregister(&nf_ct_zone_extend); 1349 nf_ct_extend_unregister(&nf_ct_zone_extend);
1350#endif 1350#endif
1351 nf_conntrack_expect_fini();
1351} 1352}
1352 1353
1353/* 1354/*
@@ -1378,7 +1379,7 @@ void nf_conntrack_cleanup_net(struct net *net)
1378 nf_conntrack_ecache_fini(net); 1379 nf_conntrack_ecache_fini(net);
1379 nf_conntrack_tstamp_fini(net); 1380 nf_conntrack_tstamp_fini(net);
1380 nf_conntrack_acct_fini(net); 1381 nf_conntrack_acct_fini(net);
1381 nf_conntrack_expect_fini(net); 1382 nf_conntrack_expect_pernet_fini(net);
1382 kmem_cache_destroy(net->ct.nf_conntrack_cachep); 1383 kmem_cache_destroy(net->ct.nf_conntrack_cachep);
1383 kfree(net->ct.slabname); 1384 kfree(net->ct.slabname);
1384 free_percpu(net->ct.stat); 1385 free_percpu(net->ct.stat);
@@ -1501,6 +1502,11 @@ int nf_conntrack_init_start(void)
1501 printk(KERN_INFO "nf_conntrack version %s (%u buckets, %d max)\n", 1502 printk(KERN_INFO "nf_conntrack version %s (%u buckets, %d max)\n",
1502 NF_CONNTRACK_VERSION, nf_conntrack_htable_size, 1503 NF_CONNTRACK_VERSION, nf_conntrack_htable_size,
1503 nf_conntrack_max); 1504 nf_conntrack_max);
1505
1506 ret = nf_conntrack_expect_init();
1507 if (ret < 0)
1508 goto err_expect;
1509
1504#ifdef CONFIG_NF_CONNTRACK_ZONES 1510#ifdef CONFIG_NF_CONNTRACK_ZONES
1505 ret = nf_ct_extend_register(&nf_ct_zone_extend); 1511 ret = nf_ct_extend_register(&nf_ct_zone_extend);
1506 if (ret < 0) 1512 if (ret < 0)
@@ -1518,7 +1524,9 @@ int nf_conntrack_init_start(void)
1518 1524
1519#ifdef CONFIG_NF_CONNTRACK_ZONES 1525#ifdef CONFIG_NF_CONNTRACK_ZONES
1520err_extend: 1526err_extend:
1527 nf_conntrack_expect_fini();
1521#endif 1528#endif
1529err_expect:
1522 return ret; 1530 return ret;
1523} 1531}
1524 1532
@@ -1575,7 +1583,7 @@ int nf_conntrack_init_net(struct net *net)
1575 printk(KERN_ERR "Unable to create nf_conntrack_hash\n"); 1583 printk(KERN_ERR "Unable to create nf_conntrack_hash\n");
1576 goto err_hash; 1584 goto err_hash;
1577 } 1585 }
1578 ret = nf_conntrack_expect_init(net); 1586 ret = nf_conntrack_expect_pernet_init(net);
1579 if (ret < 0) 1587 if (ret < 0)
1580 goto err_expect; 1588 goto err_expect;
1581 ret = nf_conntrack_acct_init(net); 1589 ret = nf_conntrack_acct_init(net);
@@ -1616,7 +1624,7 @@ err_ecache:
1616err_tstamp: 1624err_tstamp:
1617 nf_conntrack_acct_fini(net); 1625 nf_conntrack_acct_fini(net);
1618err_acct: 1626err_acct:
1619 nf_conntrack_expect_fini(net); 1627 nf_conntrack_expect_pernet_fini(net);
1620err_expect: 1628err_expect:
1621 nf_ct_free_hashtable(net->ct.hash, net->ct.htable_size); 1629 nf_ct_free_hashtable(net->ct.hash, net->ct.htable_size);
1622err_hash: 1630err_hash:
diff --git a/net/netfilter/nf_conntrack_expect.c b/net/netfilter/nf_conntrack_expect.c
index 527651a53a45..bdd341899ed3 100644
--- a/net/netfilter/nf_conntrack_expect.c
+++ b/net/netfilter/nf_conntrack_expect.c
@@ -587,53 +587,50 @@ static void exp_proc_remove(struct net *net)
587 587
588module_param_named(expect_hashsize, nf_ct_expect_hsize, uint, 0400); 588module_param_named(expect_hashsize, nf_ct_expect_hsize, uint, 0400);
589 589
590int nf_conntrack_expect_init(struct net *net) 590int nf_conntrack_expect_pernet_init(struct net *net)
591{ 591{
592 int err = -ENOMEM; 592 int err = -ENOMEM;
593 593
594 if (net_eq(net, &init_net)) {
595 if (!nf_ct_expect_hsize) {
596 nf_ct_expect_hsize = net->ct.htable_size / 256;
597 if (!nf_ct_expect_hsize)
598 nf_ct_expect_hsize = 1;
599 }
600 nf_ct_expect_max = nf_ct_expect_hsize * 4;
601 }
602
603 net->ct.expect_count = 0; 594 net->ct.expect_count = 0;
604 net->ct.expect_hash = nf_ct_alloc_hashtable(&nf_ct_expect_hsize, 0); 595 net->ct.expect_hash = nf_ct_alloc_hashtable(&nf_ct_expect_hsize, 0);
605 if (net->ct.expect_hash == NULL) 596 if (net->ct.expect_hash == NULL)
606 goto err1; 597 goto err1;
607 598
608 if (net_eq(net, &init_net)) {
609 nf_ct_expect_cachep = kmem_cache_create("nf_conntrack_expect",
610 sizeof(struct nf_conntrack_expect),
611 0, 0, NULL);
612 if (!nf_ct_expect_cachep)
613 goto err2;
614 }
615
616 err = exp_proc_init(net); 599 err = exp_proc_init(net);
617 if (err < 0) 600 if (err < 0)
618 goto err3; 601 goto err2;
619 602
620 return 0; 603 return 0;
621
622err3:
623 if (net_eq(net, &init_net))
624 kmem_cache_destroy(nf_ct_expect_cachep);
625err2: 604err2:
626 nf_ct_free_hashtable(net->ct.expect_hash, nf_ct_expect_hsize); 605 nf_ct_free_hashtable(net->ct.expect_hash, nf_ct_expect_hsize);
627err1: 606err1:
628 return err; 607 return err;
629} 608}
630 609
631void nf_conntrack_expect_fini(struct net *net) 610void nf_conntrack_expect_pernet_fini(struct net *net)
632{ 611{
633 exp_proc_remove(net); 612 exp_proc_remove(net);
634 if (net_eq(net, &init_net)) {
635 rcu_barrier(); /* Wait for call_rcu() before destroy */
636 kmem_cache_destroy(nf_ct_expect_cachep);
637 }
638 nf_ct_free_hashtable(net->ct.expect_hash, nf_ct_expect_hsize); 613 nf_ct_free_hashtable(net->ct.expect_hash, nf_ct_expect_hsize);
639} 614}
615
616int nf_conntrack_expect_init(void)
617{
618 if (!nf_ct_expect_hsize) {
619 nf_ct_expect_hsize = nf_conntrack_htable_size / 256;
620 if (!nf_ct_expect_hsize)
621 nf_ct_expect_hsize = 1;
622 }
623 nf_ct_expect_max = nf_ct_expect_hsize * 4;
624 nf_ct_expect_cachep = kmem_cache_create("nf_conntrack_expect",
625 sizeof(struct nf_conntrack_expect),
626 0, 0, NULL);
627 if (!nf_ct_expect_cachep)
628 return -ENOMEM;
629 return 0;
630}
631
632void nf_conntrack_expect_fini(void)
633{
634 rcu_barrier(); /* Wait for call_rcu() before destroy */
635 kmem_cache_destroy(nf_ct_expect_cachep);
636}