summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorKumar Sundararajan <kumar@fb.com>2014-04-24 13:48:53 (GMT)
committerDavid S. Miller <davem@davemloft.net>2014-04-24 21:19:25 (GMT)
commit1c2658545816088477e91860c3a645053719cb54 (patch)
tree0d98ceae56a31fc28389ccd73a00cc0d38648438 /net
parentfc5e88354de53024f61d50c7fe9b5b182fc5800d (diff)
downloadlinux-1c2658545816088477e91860c3a645053719cb54.tar.xz
ipv6: fib: fix fib dump restart
When the ipv6 fib changes during a table dump, the walk is restarted and the number of nodes dumped are skipped. But the existing code doesn't advance to the next node after a node is skipped. This can cause the dump to loop or produce lots of duplicates when the fib is modified during the dump. This change advances the walk to the next node if the current node is skipped after a restart. Signed-off-by: Kumar Sundararajan <kumar@fb.com> Signed-off-by: Chris Mason <clm@fb.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r--net/ipv6/ip6_fib.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c
index 34e0ded..87891f5 100644
--- a/net/ipv6/ip6_fib.c
+++ b/net/ipv6/ip6_fib.c
@@ -1459,7 +1459,7 @@ static int fib6_walk_continue(struct fib6_walker_t *w)
if (w->skip) {
w->skip--;
- continue;
+ goto skip;
}
err = w->func(w);
@@ -1469,6 +1469,7 @@ static int fib6_walk_continue(struct fib6_walker_t *w)
w->count++;
continue;
}
+skip:
w->state = FWS_U;
case FWS_U:
if (fn == w->root)