From 58b3a98eaafde2b63aca9049f7ad2fa769555560 Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Wed, 10 Sep 2008 17:27:15 -0700 Subject: [PATCH] --- yaml --- r: 111597 b: refs/heads/master c: 1e493d1946a0b26b79001c18d7312d536156ff5a h: refs/heads/master i: 111595: 69a0e98244a9589bc8af3a1df97b13daf40704f4 v: v3 --- [refs] | 2 +- trunk/net/ipv6/route.c | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index dcaf16c12435..6d3a27173582 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 08569908fffec3625e29eec7cf7577eaa512e719 +refs/heads/master: 1e493d1946a0b26b79001c18d7312d536156ff5a diff --git a/trunk/net/ipv6/route.c b/trunk/net/ipv6/route.c index 9af6115f0f50..776871ee2288 100644 --- a/trunk/net/ipv6/route.c +++ b/trunk/net/ipv6/route.c @@ -1003,6 +1003,25 @@ int icmp6_dst_gc(void) return more; } +static void icmp6_clean_all(int (*func)(struct rt6_info *rt, void *arg), + void *arg) +{ + struct dst_entry *dst, **pprev; + + spin_lock_bh(&icmp6_dst_lock); + pprev = &icmp6_dst_gc_list; + while ((dst = *pprev) != NULL) { + struct rt6_info *rt = (struct rt6_info *) dst; + if (func(rt, arg)) { + *pprev = dst->next; + dst_free(dst); + } else { + pprev = &dst->next; + } + } + spin_unlock_bh(&icmp6_dst_lock); +} + static int ip6_dst_gc(struct dst_ops *ops) { unsigned long now = jiffies; @@ -1930,6 +1949,7 @@ void rt6_ifdown(struct net *net, struct net_device *dev) }; fib6_clean_all(net, fib6_ifdown, 0, &adn); + icmp6_clean_all(fib6_ifdown, &adn); } struct rt6_mtu_change_arg