|
@@ -287,49 +287,20 @@ static int cttimeout_get_timeout(struct net *net, struct sock *ctnl,
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
-static void untimeout(struct nf_conntrack_tuple_hash *i,
|
|
|
|
- struct ctnl_timeout *timeout)
|
|
|
|
|
|
+static int untimeout(struct nf_conn *ct, void *timeout)
|
|
{
|
|
{
|
|
- struct nf_conn *ct = nf_ct_tuplehash_to_ctrack(i);
|
|
|
|
struct nf_conn_timeout *timeout_ext = nf_ct_timeout_find(ct);
|
|
struct nf_conn_timeout *timeout_ext = nf_ct_timeout_find(ct);
|
|
|
|
|
|
if (timeout_ext && (!timeout || timeout_ext->timeout == timeout))
|
|
if (timeout_ext && (!timeout || timeout_ext->timeout == timeout))
|
|
RCU_INIT_POINTER(timeout_ext->timeout, NULL);
|
|
RCU_INIT_POINTER(timeout_ext->timeout, NULL);
|
|
|
|
+
|
|
|
|
+ /* We are not intended to delete this conntrack. */
|
|
|
|
+ return 0;
|
|
}
|
|
}
|
|
|
|
|
|
static void ctnl_untimeout(struct net *net, struct ctnl_timeout *timeout)
|
|
static void ctnl_untimeout(struct net *net, struct ctnl_timeout *timeout)
|
|
{
|
|
{
|
|
- struct nf_conntrack_tuple_hash *h;
|
|
|
|
- const struct hlist_nulls_node *nn;
|
|
|
|
- unsigned int last_hsize;
|
|
|
|
- spinlock_t *lock;
|
|
|
|
- int i, cpu;
|
|
|
|
-
|
|
|
|
- for_each_possible_cpu(cpu) {
|
|
|
|
- struct ct_pcpu *pcpu = per_cpu_ptr(net->ct.pcpu_lists, cpu);
|
|
|
|
-
|
|
|
|
- spin_lock_bh(&pcpu->lock);
|
|
|
|
- hlist_nulls_for_each_entry(h, nn, &pcpu->unconfirmed, hnnode)
|
|
|
|
- untimeout(h, timeout);
|
|
|
|
- spin_unlock_bh(&pcpu->lock);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- local_bh_disable();
|
|
|
|
-restart:
|
|
|
|
- last_hsize = nf_conntrack_htable_size;
|
|
|
|
- for (i = 0; i < last_hsize; i++) {
|
|
|
|
- lock = &nf_conntrack_locks[i % CONNTRACK_LOCKS];
|
|
|
|
- nf_conntrack_lock(lock);
|
|
|
|
- if (last_hsize != nf_conntrack_htable_size) {
|
|
|
|
- spin_unlock(lock);
|
|
|
|
- goto restart;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- hlist_nulls_for_each_entry(h, nn, &nf_conntrack_hash[i], hnnode)
|
|
|
|
- untimeout(h, timeout);
|
|
|
|
- spin_unlock(lock);
|
|
|
|
- }
|
|
|
|
- local_bh_enable();
|
|
|
|
|
|
+ nf_ct_iterate_cleanup_net(net, untimeout, timeout, 0, 0);
|
|
}
|
|
}
|
|
|
|
|
|
/* try to delete object, fail if it is still in use. */
|
|
/* try to delete object, fail if it is still in use. */
|