summaryrefslogtreecommitdiff
path: root/net/ipv6
diff options
context:
space:
mode:
authorKumar Sundararajan <kumar@fb.com>2014-04-24 09:48:53 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-05-30 21:52:15 -0700
commit83445f0d5cd735169879d9e1179d1d35d559ea07 (patch)
treee19d8c60e43e9c4cf337f11dffbe0a86bff8e4b7 /net/ipv6
parentfd9fcd8adba8d772582b13a4cf56896721f740af (diff)
downloadlinux-3.10-83445f0d5cd735169879d9e1179d1d35d559ea07.tar.gz
linux-3.10-83445f0d5cd735169879d9e1179d1d35d559ea07.tar.bz2
linux-3.10-83445f0d5cd735169879d9e1179d1d35d559ea07.zip
ipv6: fib: fix fib dump restart
[ Upstream commit 1c2658545816088477e91860c3a645053719cb54 ] 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: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'net/ipv6')
-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 9c06ecb6556..009c9620f44 100644
--- a/net/ipv6/ip6_fib.c
+++ b/net/ipv6/ip6_fib.c
@@ -1418,7 +1418,7 @@ static int fib6_walk_continue(struct fib6_walker_t *w)
if (w->skip) {
w->skip--;
- continue;
+ goto skip;
}
err = w->func(w);
@@ -1428,6 +1428,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)