diff options
author | Pablo Neira Ayuso <pablo@netfilter.org> | 2009-06-13 06:28:22 -0400 |
---|---|---|
committer | Patrick McHardy <kaber@trash.net> | 2009-06-13 06:28:22 -0400 |
commit | 9858a3ae1d4b390fbaa9c30b83cb66d861b76294 (patch) | |
tree | 897127b38a48de3c8c404431303614218ba2bc0f | |
parent | a0891aa6a635f658f29bb061a00d6d3486941519 (diff) |
netfilter: conntrack: move helper destruction to nf_ct_helper_destroy()
This patch moves the helper destruction to a function that lives
in nf_conntrack_helper.c. This new function is used in the patch
to add ctnetlink reliable event delivery.
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: Patrick McHardy <kaber@trash.net>
-rw-r--r-- | include/net/netfilter/nf_conntrack_helper.h | 2 | ||||
-rw-r--r-- | net/netfilter/nf_conntrack_core.c | 11 | ||||
-rw-r--r-- | net/netfilter/nf_conntrack_helper.c | 14 |
3 files changed, 17 insertions, 10 deletions
diff --git a/include/net/netfilter/nf_conntrack_helper.h b/include/net/netfilter/nf_conntrack_helper.h index ee2a4b369a04..1b7068000927 100644 --- a/include/net/netfilter/nf_conntrack_helper.h +++ b/include/net/netfilter/nf_conntrack_helper.h | |||
@@ -50,6 +50,8 @@ extern struct nf_conn_help *nf_ct_helper_ext_add(struct nf_conn *ct, gfp_t gfp); | |||
50 | 50 | ||
51 | extern int __nf_ct_try_assign_helper(struct nf_conn *ct, gfp_t flags); | 51 | extern int __nf_ct_try_assign_helper(struct nf_conn *ct, gfp_t flags); |
52 | 52 | ||
53 | extern void nf_ct_helper_destroy(struct nf_conn *ct); | ||
54 | |||
53 | static inline struct nf_conn_help *nfct_help(const struct nf_conn *ct) | 55 | static inline struct nf_conn_help *nfct_help(const struct nf_conn *ct) |
54 | { | 56 | { |
55 | return nf_ct_ext_find(ct, NF_CT_EXT_HELPER); | 57 | return nf_ct_ext_find(ct, NF_CT_EXT_HELPER); |
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index bcacbb5373c3..14235b144cb5 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c | |||
@@ -224,17 +224,8 @@ static void death_by_timeout(unsigned long ul_conntrack) | |||
224 | { | 224 | { |
225 | struct nf_conn *ct = (void *)ul_conntrack; | 225 | struct nf_conn *ct = (void *)ul_conntrack; |
226 | struct net *net = nf_ct_net(ct); | 226 | struct net *net = nf_ct_net(ct); |
227 | struct nf_conn_help *help = nfct_help(ct); | ||
228 | struct nf_conntrack_helper *helper; | ||
229 | |||
230 | if (help) { | ||
231 | rcu_read_lock(); | ||
232 | helper = rcu_dereference(help->helper); | ||
233 | if (helper && helper->destroy) | ||
234 | helper->destroy(ct); | ||
235 | rcu_read_unlock(); | ||
236 | } | ||
237 | 227 | ||
228 | nf_ct_helper_destroy(ct); | ||
238 | spin_lock_bh(&nf_conntrack_lock); | 229 | spin_lock_bh(&nf_conntrack_lock); |
239 | /* Inside lock so preempt is disabled on module removal path. | 230 | /* Inside lock so preempt is disabled on module removal path. |
240 | * Otherwise we can get spurious warnings. */ | 231 | * Otherwise we can get spurious warnings. */ |
diff --git a/net/netfilter/nf_conntrack_helper.c b/net/netfilter/nf_conntrack_helper.c index 0fa5a422959f..65c2a7bc3afc 100644 --- a/net/netfilter/nf_conntrack_helper.c +++ b/net/netfilter/nf_conntrack_helper.c | |||
@@ -136,6 +136,20 @@ static inline int unhelp(struct nf_conntrack_tuple_hash *i, | |||
136 | return 0; | 136 | return 0; |
137 | } | 137 | } |
138 | 138 | ||
139 | void nf_ct_helper_destroy(struct nf_conn *ct) | ||
140 | { | ||
141 | struct nf_conn_help *help = nfct_help(ct); | ||
142 | struct nf_conntrack_helper *helper; | ||
143 | |||
144 | if (help) { | ||
145 | rcu_read_lock(); | ||
146 | helper = rcu_dereference(help->helper); | ||
147 | if (helper && helper->destroy) | ||
148 | helper->destroy(ct); | ||
149 | rcu_read_unlock(); | ||
150 | } | ||
151 | } | ||
152 | |||
139 | int nf_conntrack_helper_register(struct nf_conntrack_helper *me) | 153 | int nf_conntrack_helper_register(struct nf_conntrack_helper *me) |
140 | { | 154 | { |
141 | unsigned int h = helper_hash(&me->tuple); | 155 | unsigned int h = helper_hash(&me->tuple); |