summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKumar Sundararajan <kumar@fb.com>2014-04-24 09:48:53 -0400
committerBen Hutchings <ben@decadent.org.uk>2015-03-06 00:39:20 +0000
commit4c5bc740767e3dc3e07da9bbe1738222158ff87f (patch)
treec3fe0e509fc7bb785432d5e9e4a051fe03c40a39
parentee558c90853a71c318a2d15ba2e747623fa0af86 (diff)
ipv6: fib: fix fib dump restart
commit 1c2658545816088477e91860c3a645053719cb54 upstream. 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> Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
-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 45e01da104e3..ad62afcafa7c 100644
--- a/net/ipv6/ip6_fib.c
+++ b/net/ipv6/ip6_fib.c
@@ -1278,7 +1278,7 @@ static int fib6_walk_continue(struct fib6_walker_t *w)
if (w->skip) {
w->skip--;
- continue;
+ goto skip;
}
err = w->func(w);
@@ -1288,6 +1288,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)