|
@@ -645,25 +645,23 @@ ctnetlink_dump_table(struct sk_buff *skb, struct netlink_callback *cb)
|
|
|
struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh);
|
|
|
u_int8_t l3proto = nfmsg->nfgen_family;
|
|
|
|
|
|
- rcu_read_lock();
|
|
|
+ spin_lock_bh(&nf_conntrack_lock);
|
|
|
last = (struct nf_conn *)cb->args[1];
|
|
|
for (; cb->args[0] < net->ct.htable_size; cb->args[0]++) {
|
|
|
restart:
|
|
|
- hlist_nulls_for_each_entry_rcu(h, n, &net->ct.hash[cb->args[0]],
|
|
|
+ hlist_nulls_for_each_entry(h, n, &net->ct.hash[cb->args[0]],
|
|
|
hnnode) {
|
|
|
if (NF_CT_DIRECTION(h) != IP_CT_DIR_ORIGINAL)
|
|
|
continue;
|
|
|
ct = nf_ct_tuplehash_to_ctrack(h);
|
|
|
- if (!atomic_inc_not_zero(&ct->ct_general.use))
|
|
|
- continue;
|
|
|
/* Dump entries of a given L3 protocol number.
|
|
|
* If it is not specified, ie. l3proto == 0,
|
|
|
* then dump everything. */
|
|
|
if (l3proto && nf_ct_l3num(ct) != l3proto)
|
|
|
- goto releasect;
|
|
|
+ continue;
|
|
|
if (cb->args[1]) {
|
|
|
if (ct != last)
|
|
|
- goto releasect;
|
|
|
+ continue;
|
|
|
cb->args[1] = 0;
|
|
|
}
|
|
|
if (ctnetlink_fill_info(skb, NETLINK_CB(cb->skb).pid,
|
|
@@ -681,8 +679,6 @@ restart:
|
|
|
if (acct)
|
|
|
memset(acct, 0, sizeof(struct nf_conn_counter[IP_CT_DIR_MAX]));
|
|
|
}
|
|
|
-releasect:
|
|
|
- nf_ct_put(ct);
|
|
|
}
|
|
|
if (cb->args[1]) {
|
|
|
cb->args[1] = 0;
|
|
@@ -690,7 +686,7 @@ releasect:
|
|
|
}
|
|
|
}
|
|
|
out:
|
|
|
- rcu_read_unlock();
|
|
|
+ spin_unlock_bh(&nf_conntrack_lock);
|
|
|
if (last)
|
|
|
nf_ct_put(last);
|
|
|
|