|
@@ -361,23 +361,6 @@ static void evict_oldest_expect(struct nf_conn *master,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static inline int refresh_timer(struct nf_conntrack_expect *i)
|
|
|
-{
|
|
|
- struct nf_conn_help *master_help = nfct_help(i->master);
|
|
|
- const struct nf_conntrack_expect_policy *p;
|
|
|
-
|
|
|
- if (!del_timer(&i->timeout))
|
|
|
- return 0;
|
|
|
-
|
|
|
- p = &rcu_dereference_protected(
|
|
|
- master_help->helper,
|
|
|
- lockdep_is_held(&nf_conntrack_lock)
|
|
|
- )->expect_policy[i->class];
|
|
|
- i->timeout.expires = jiffies + p->timeout * HZ;
|
|
|
- add_timer(&i->timeout);
|
|
|
- return 1;
|
|
|
-}
|
|
|
-
|
|
|
static inline int __nf_ct_expect_check(struct nf_conntrack_expect *expect)
|
|
|
{
|
|
|
const struct nf_conntrack_expect_policy *p;
|
|
@@ -386,7 +369,7 @@ static inline int __nf_ct_expect_check(struct nf_conntrack_expect *expect)
|
|
|
struct nf_conn_help *master_help = nfct_help(master);
|
|
|
struct nf_conntrack_helper *helper;
|
|
|
struct net *net = nf_ct_exp_net(expect);
|
|
|
- struct hlist_node *n;
|
|
|
+ struct hlist_node *n, *next;
|
|
|
unsigned int h;
|
|
|
int ret = 1;
|
|
|
|
|
@@ -395,12 +378,12 @@ static inline int __nf_ct_expect_check(struct nf_conntrack_expect *expect)
|
|
|
goto out;
|
|
|
}
|
|
|
h = nf_ct_expect_dst_hash(&expect->tuple);
|
|
|
- hlist_for_each_entry(i, n, &net->ct.expect_hash[h], hnode) {
|
|
|
+ hlist_for_each_entry_safe(i, n, next, &net->ct.expect_hash[h], hnode) {
|
|
|
if (expect_matches(i, expect)) {
|
|
|
- /* Refresh timer: if it's dying, ignore.. */
|
|
|
- if (refresh_timer(i)) {
|
|
|
- ret = 0;
|
|
|
- goto out;
|
|
|
+ if (del_timer(&i->timeout)) {
|
|
|
+ nf_ct_unlink_expect(i);
|
|
|
+ nf_ct_expect_put(i);
|
|
|
+ break;
|
|
|
}
|
|
|
} else if (expect_clash(i, expect)) {
|
|
|
ret = -EBUSY;
|