| From foo@baz Wed May 28 21:03:54 PDT 2014 |
| From: Kumar Sundararajan <kumar@fb.com> |
| Date: Thu, 24 Apr 2014 09:48:53 -0400 |
| Subject: ipv6: fib: fix fib dump restart |
| |
| From: Kumar Sundararajan <kumar@fb.com> |
| |
| [ 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> |
| --- |
| net/ipv6/ip6_fib.c | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/net/ipv6/ip6_fib.c |
| +++ b/net/ipv6/ip6_fib.c |
| @@ -1418,7 +1418,7 @@ static int fib6_walk_continue(struct fib |
| |
| if (w->skip) { |
| w->skip--; |
| - continue; |
| + goto skip; |
| } |
| |
| err = w->func(w); |
| @@ -1428,6 +1428,7 @@ static int fib6_walk_continue(struct fib |
| w->count++; |
| continue; |
| } |
| +skip: |
| w->state = FWS_U; |
| case FWS_U: |
| if (fn == w->root) |