aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2014-06-05 08:28:44 -0400
committerPablo Neira Ayuso <pablo@netfilter.org>2014-06-16 06:51:35 -0400
commit266155b2de8fb721ae353688529b2f8bcdde2f90 (patch)
tree244e3225ef7f4e9bd59d13c2fe5eae7949f36b2b /net
parent7171511eaec5bf23fb06078f59784a3a0626b38f (diff)
netfilter: ctnetlink: fix dumping of dying/unconfirmed conntracks
The dumping prematurely stops, it seems the callback argument that indicates that all entries have been dumped is set after iterating on the first cpu list. The dumping also may stop before the entire per-cpu list content is also dumped. With this patch, conntrack -L dying now shows the dying list content again. Fixes: b7779d06 ("netfilter: conntrack: spinlock per cpu to protect special lists.") Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'net')
-rw-r--r--net/netfilter/nf_conntrack_netlink.c8
1 files changed, 3 insertions, 5 deletions
diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c
index 58579634427d..ef0eedd70541 100644
--- a/net/netfilter/nf_conntrack_netlink.c
+++ b/net/netfilter/nf_conntrack_netlink.c
@@ -1163,9 +1163,6 @@ ctnetlink_dump_list(struct sk_buff *skb, struct netlink_callback *cb, bool dying
1163 if (cb->args[2]) 1163 if (cb->args[2])
1164 return 0; 1164 return 0;
1165 1165
1166 if (cb->args[0] == nr_cpu_ids)
1167 return 0;
1168
1169 for (cpu = cb->args[0]; cpu < nr_cpu_ids; cpu++) { 1166 for (cpu = cb->args[0]; cpu < nr_cpu_ids; cpu++) {
1170 struct ct_pcpu *pcpu; 1167 struct ct_pcpu *pcpu;
1171 1168
@@ -1194,6 +1191,7 @@ restart:
1194 rcu_read_unlock(); 1191 rcu_read_unlock();
1195 if (res < 0) { 1192 if (res < 0) {
1196 nf_conntrack_get(&ct->ct_general); 1193 nf_conntrack_get(&ct->ct_general);
1194 cb->args[0] = cpu;
1197 cb->args[1] = (unsigned long)ct; 1195 cb->args[1] = (unsigned long)ct;
1198 spin_unlock_bh(&pcpu->lock); 1196 spin_unlock_bh(&pcpu->lock);
1199 goto out; 1197 goto out;
@@ -1202,10 +1200,10 @@ restart:
1202 if (cb->args[1]) { 1200 if (cb->args[1]) {
1203 cb->args[1] = 0; 1201 cb->args[1] = 0;
1204 goto restart; 1202 goto restart;
1205 } else 1203 }
1206 cb->args[2] = 1;
1207 spin_unlock_bh(&pcpu->lock); 1204 spin_unlock_bh(&pcpu->lock);
1208 } 1205 }
1206 cb->args[2] = 1;
1209out: 1207out:
1210 if (last) 1208 if (last)
1211 nf_ct_put(last); 1209 nf_ct_put(last);