--- zzzz-none-000/linux-2.6.19.2/net/netfilter/nf_conntrack_core.c 2007-01-10 19:10:37.000000000 +0000 +++ davinci-8020-5505/linux-2.6.19.2/net/netfilter/nf_conntrack_core.c 2007-01-11 07:38:19.000000000 +0000 @@ -469,8 +469,10 @@ struct nf_conntrack_expect *i; list_for_each_entry(i, &nf_conntrack_expect_list, list) { - if (nf_ct_tuple_mask_cmp(tuple, &i->tuple, &i->mask)) + if (nf_ct_tuple_mask_cmp(tuple, &i->tuple, &i->mask)) { + atomic_inc(&i->use); return i; + } } return NULL; } @@ -483,8 +485,6 @@ read_lock_bh(&nf_conntrack_lock); i = __nf_conntrack_expect_find(tuple); - if (i) - atomic_inc(&i->use); read_unlock_bh(&nf_conntrack_lock); return i; @@ -893,6 +893,12 @@ memset(conntrack, 0, nf_ct_cache[features].size); conntrack->features = features; + if (helper) { + struct nf_conn_help *help = nfct_help(conntrack); + NF_CT_ASSERT(help); + help->helper = helper; + } + atomic_set(&conntrack->ct_general.use, 1); conntrack->ct_general.destroy = destroy_conntrack; conntrack->tuplehash[IP_CT_DIR_ORIGINAL].tuple = *orig; @@ -976,13 +982,8 @@ #endif nf_conntrack_get(&conntrack->master->ct_general); NF_CT_STAT_INC(expect_new); - } else { - struct nf_conn_help *help = nfct_help(conntrack); - - if (help) - help->helper = __nf_ct_helper_find(&repl_tuple); + } else NF_CT_STAT_INC(new); - } /* Overload tuple linked list to put us in unconfirmed list. */ list_add(&conntrack->tuplehash[IP_CT_DIR_ORIGINAL].list, &unconfirmed); @@ -1519,10 +1520,9 @@ if (iter(ct, data)) goto found; } - write_unlock_bh(&nf_conntrack_lock); return NULL; found: - atomic_inc(&ct->ct_general.use); + atomic_inc(&nf_ct_tuplehash_to_ctrack(h)->ct_general.use); write_unlock_bh(&nf_conntrack_lock); return ct; }