diff options
| -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); |
