]> git.hungrycats.org Git - linux/commitdiff
ipv6: fib: fix fib dump restart
authorKumar Sundararajan <kumar@fb.com>
Thu, 24 Apr 2014 13:48:53 +0000 (09:48 -0400)
committerJiri Slaby <jslaby@suse.cz>
Thu, 29 May 2014 09:49:19 +0000 (11:49 +0200)
[ 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: Jiri Slaby <jslaby@suse.cz>
net/ipv6/ip6_fib.c

index 5bec666aba61d464fab4e77684eedd4265143cf9..5e30677953d72c81a63ef065377318f7f0806a53 100644 (file)
@@ -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)