diff options
Diffstat (limited to 'net/ipv6/route.c')
-rw-r--r-- | net/ipv6/route.c | 19 |
1 files changed, 8 insertions, 11 deletions
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index a640fbcba15d..94d6a13d47f0 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -417,14 +417,11 @@ static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev, | |||
417 | struct net_device *loopback_dev = | 417 | struct net_device *loopback_dev = |
418 | dev_net(dev)->loopback_dev; | 418 | dev_net(dev)->loopback_dev; |
419 | 419 | ||
420 | if (dev != loopback_dev) { | 420 | if (idev && idev->dev != loopback_dev) { |
421 | if (idev && idev->dev == dev) { | 421 | struct inet6_dev *loopback_idev = in6_dev_get(loopback_dev); |
422 | struct inet6_dev *loopback_idev = | 422 | if (loopback_idev) { |
423 | in6_dev_get(loopback_dev); | 423 | rt->rt6i_idev = loopback_idev; |
424 | if (loopback_idev) { | 424 | in6_dev_put(idev); |
425 | rt->rt6i_idev = loopback_idev; | ||
426 | in6_dev_put(idev); | ||
427 | } | ||
428 | } | 425 | } |
429 | } | 426 | } |
430 | } | 427 | } |
@@ -3724,10 +3721,10 @@ static int ip6_route_dev_notify(struct notifier_block *this, | |||
3724 | /* NETDEV_UNREGISTER could be fired for multiple times by | 3721 | /* NETDEV_UNREGISTER could be fired for multiple times by |
3725 | * netdev_wait_allrefs(). Make sure we only call this once. | 3722 | * netdev_wait_allrefs(). Make sure we only call this once. |
3726 | */ | 3723 | */ |
3727 | in6_dev_put(net->ipv6.ip6_null_entry->rt6i_idev); | 3724 | in6_dev_put_clear(&net->ipv6.ip6_null_entry->rt6i_idev); |
3728 | #ifdef CONFIG_IPV6_MULTIPLE_TABLES | 3725 | #ifdef CONFIG_IPV6_MULTIPLE_TABLES |
3729 | in6_dev_put(net->ipv6.ip6_prohibit_entry->rt6i_idev); | 3726 | in6_dev_put_clear(&net->ipv6.ip6_prohibit_entry->rt6i_idev); |
3730 | in6_dev_put(net->ipv6.ip6_blk_hole_entry->rt6i_idev); | 3727 | in6_dev_put_clear(&net->ipv6.ip6_blk_hole_entry->rt6i_idev); |
3731 | #endif | 3728 | #endif |
3732 | } | 3729 | } |
3733 | 3730 | ||