diff options
author | Gao feng <gaofeng@cn.fujitsu.com> | 2013-01-21 17:10:30 -0500 |
---|---|---|
committer | Pablo Neira Ayuso <pablo@netfilter.org> | 2013-01-23 06:56:13 -0500 |
commit | 5e615b220087c5551f486c967831cecdfd338dbe (patch) | |
tree | 190987e18bed5a1a5a2ca105ac28cbe71164c6cf /net | |
parent | 8684094cf17d8ce96e0a8c63003f331aa017e22d (diff) |
netfilter: nf_ct_helper: 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.c | 15 | ||||
-rw-r--r-- | net/netfilter/nf_conntrack_helper.c | 53 |
2 files changed, 36 insertions, 32 deletions
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index 4f4d1075644e..06b8cdb5e620 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_helper_fini(); | ||
1351 | nf_conntrack_timeout_fini(); | 1352 | nf_conntrack_timeout_fini(); |
1352 | nf_conntrack_ecache_fini(); | 1353 | nf_conntrack_ecache_fini(); |
1353 | nf_conntrack_tstamp_fini(); | 1354 | nf_conntrack_tstamp_fini(); |
@@ -1378,7 +1379,7 @@ void nf_conntrack_cleanup_net(struct net *net) | |||
1378 | nf_ct_free_hashtable(net->ct.hash, net->ct.htable_size); | 1379 | nf_ct_free_hashtable(net->ct.hash, net->ct.htable_size); |
1379 | nf_conntrack_proto_fini(net); | 1380 | nf_conntrack_proto_fini(net); |
1380 | nf_conntrack_labels_fini(net); | 1381 | nf_conntrack_labels_fini(net); |
1381 | nf_conntrack_helper_fini(net); | 1382 | nf_conntrack_helper_pernet_fini(net); |
1382 | nf_conntrack_ecache_pernet_fini(net); | 1383 | nf_conntrack_ecache_pernet_fini(net); |
1383 | nf_conntrack_tstamp_pernet_fini(net); | 1384 | nf_conntrack_tstamp_pernet_fini(net); |
1384 | nf_conntrack_acct_pernet_fini(net); | 1385 | nf_conntrack_acct_pernet_fini(net); |
@@ -1526,6 +1527,10 @@ int nf_conntrack_init_start(void) | |||
1526 | if (ret < 0) | 1527 | if (ret < 0) |
1527 | goto err_timeout; | 1528 | goto err_timeout; |
1528 | 1529 | ||
1530 | ret = nf_conntrack_helper_init(); | ||
1531 | if (ret < 0) | ||
1532 | goto err_helper; | ||
1533 | |||
1529 | #ifdef CONFIG_NF_CONNTRACK_ZONES | 1534 | #ifdef CONFIG_NF_CONNTRACK_ZONES |
1530 | ret = nf_ct_extend_register(&nf_ct_zone_extend); | 1535 | ret = nf_ct_extend_register(&nf_ct_zone_extend); |
1531 | if (ret < 0) | 1536 | if (ret < 0) |
@@ -1543,8 +1548,10 @@ int nf_conntrack_init_start(void) | |||
1543 | 1548 | ||
1544 | #ifdef CONFIG_NF_CONNTRACK_ZONES | 1549 | #ifdef CONFIG_NF_CONNTRACK_ZONES |
1545 | err_extend: | 1550 | err_extend: |
1546 | nf_conntrack_timeout_fini(); | 1551 | nf_conntrack_helper_fini(); |
1547 | #endif | 1552 | #endif |
1553 | err_helper: | ||
1554 | nf_conntrack_timeout_fini(); | ||
1548 | err_timeout: | 1555 | err_timeout: |
1549 | nf_conntrack_ecache_fini(); | 1556 | nf_conntrack_ecache_fini(); |
1550 | err_ecache: | 1557 | err_ecache: |
@@ -1622,7 +1629,7 @@ int nf_conntrack_init_net(struct net *net) | |||
1622 | ret = nf_conntrack_ecache_pernet_init(net); | 1629 | ret = nf_conntrack_ecache_pernet_init(net); |
1623 | if (ret < 0) | 1630 | if (ret < 0) |
1624 | goto err_ecache; | 1631 | goto err_ecache; |
1625 | ret = nf_conntrack_helper_init(net); | 1632 | ret = nf_conntrack_helper_pernet_init(net); |
1626 | if (ret < 0) | 1633 | if (ret < 0) |
1627 | goto err_helper; | 1634 | goto err_helper; |
1628 | 1635 | ||
@@ -1638,7 +1645,7 @@ int nf_conntrack_init_net(struct net *net) | |||
1638 | err_proto: | 1645 | err_proto: |
1639 | nf_conntrack_labels_fini(net); | 1646 | nf_conntrack_labels_fini(net); |
1640 | err_labels: | 1647 | err_labels: |
1641 | nf_conntrack_helper_fini(net); | 1648 | nf_conntrack_helper_pernet_fini(net); |
1642 | err_helper: | 1649 | err_helper: |
1643 | nf_conntrack_ecache_pernet_fini(net); | 1650 | nf_conntrack_ecache_pernet_fini(net); |
1644 | err_ecache: | 1651 | err_ecache: |
diff --git a/net/netfilter/nf_conntrack_helper.c b/net/netfilter/nf_conntrack_helper.c index 884f2b39319a..2f380f73c4c0 100644 --- a/net/netfilter/nf_conntrack_helper.c +++ b/net/netfilter/nf_conntrack_helper.c | |||
@@ -423,44 +423,41 @@ static struct nf_ct_ext_type helper_extend __read_mostly = { | |||
423 | .id = NF_CT_EXT_HELPER, | 423 | .id = NF_CT_EXT_HELPER, |
424 | }; | 424 | }; |
425 | 425 | ||
426 | int nf_conntrack_helper_init(struct net *net) | 426 | int nf_conntrack_helper_pernet_init(struct net *net) |
427 | { | 427 | { |
428 | int err; | ||
429 | |||
430 | net->ct.auto_assign_helper_warned = false; | 428 | net->ct.auto_assign_helper_warned = false; |
431 | net->ct.sysctl_auto_assign_helper = nf_ct_auto_assign_helper; | 429 | net->ct.sysctl_auto_assign_helper = nf_ct_auto_assign_helper; |
430 | return nf_conntrack_helper_init_sysctl(net); | ||
431 | } | ||
432 | 432 | ||
433 | if (net_eq(net, &init_net)) { | 433 | void nf_conntrack_helper_pernet_fini(struct net *net) |
434 | nf_ct_helper_hsize = 1; /* gets rounded up to use one page */ | 434 | { |
435 | nf_ct_helper_hash = | 435 | nf_conntrack_helper_fini_sysctl(net); |
436 | nf_ct_alloc_hashtable(&nf_ct_helper_hsize, 0); | 436 | } |
437 | if (!nf_ct_helper_hash) | ||
438 | return -ENOMEM; | ||
439 | 437 | ||
440 | err = nf_ct_extend_register(&helper_extend); | 438 | int nf_conntrack_helper_init(void) |
441 | if (err < 0) | 439 | { |
442 | goto err1; | 440 | int ret; |
441 | nf_ct_helper_hsize = 1; /* gets rounded up to use one page */ | ||
442 | nf_ct_helper_hash = | ||
443 | nf_ct_alloc_hashtable(&nf_ct_helper_hsize, 0); | ||
444 | if (!nf_ct_helper_hash) | ||
445 | return -ENOMEM; | ||
446 | |||
447 | ret = nf_ct_extend_register(&helper_extend); | ||
448 | if (ret < 0) { | ||
449 | pr_err("nf_ct_helper: Unable to register helper extension.\n"); | ||
450 | goto out_extend; | ||
443 | } | 451 | } |
444 | 452 | ||
445 | err = nf_conntrack_helper_init_sysctl(net); | ||
446 | if (err < 0) | ||
447 | goto out_sysctl; | ||
448 | |||
449 | return 0; | 453 | return 0; |
450 | 454 | out_extend: | |
451 | out_sysctl: | ||
452 | if (net_eq(net, &init_net)) | ||
453 | nf_ct_extend_unregister(&helper_extend); | ||
454 | err1: | ||
455 | nf_ct_free_hashtable(nf_ct_helper_hash, nf_ct_helper_hsize); | 455 | nf_ct_free_hashtable(nf_ct_helper_hash, nf_ct_helper_hsize); |
456 | return err; | 456 | return ret; |
457 | } | 457 | } |
458 | 458 | ||
459 | void nf_conntrack_helper_fini(struct net *net) | 459 | void nf_conntrack_helper_fini(void) |
460 | { | 460 | { |
461 | nf_conntrack_helper_fini_sysctl(net); | 461 | nf_ct_extend_unregister(&helper_extend); |
462 | if (net_eq(net, &init_net)) { | 462 | nf_ct_free_hashtable(nf_ct_helper_hash, nf_ct_helper_hsize); |
463 | nf_ct_extend_unregister(&helper_extend); | ||
464 | nf_ct_free_hashtable(nf_ct_helper_hash, nf_ct_helper_hsize); | ||
465 | } | ||
466 | } | 463 | } |