diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/ipv6/addrconf.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index a9913d23f7c7..9d78c1229497 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -2704,17 +2704,18 @@ static int addrconf_ifdown(struct net_device *dev, int how) | |||
2704 | /* Flag it for later restoration when link comes up */ | 2704 | /* Flag it for later restoration when link comes up */ |
2705 | ifa->flags |= IFA_F_TENTATIVE; | 2705 | ifa->flags |= IFA_F_TENTATIVE; |
2706 | in6_ifa_hold(ifa); | 2706 | in6_ifa_hold(ifa); |
2707 | write_unlock_bh(&idev->lock); | ||
2707 | } else { | 2708 | } else { |
2708 | list_del(&ifa->if_list); | 2709 | list_del(&ifa->if_list); |
2709 | ifa->dead = 1; | 2710 | ifa->dead = 1; |
2710 | } | 2711 | write_unlock_bh(&idev->lock); |
2711 | write_unlock_bh(&idev->lock); | ||
2712 | 2712 | ||
2713 | /* clear hash table */ | 2713 | /* clear hash table */ |
2714 | spin_lock_bh(&addrconf_hash_lock); | 2714 | spin_lock_bh(&addrconf_hash_lock); |
2715 | hlist_del_init_rcu(&ifa->addr_lst); | 2715 | hlist_del_init_rcu(&ifa->addr_lst); |
2716 | __in6_ifa_put(ifa); | 2716 | __in6_ifa_put(ifa); |
2717 | spin_unlock_bh(&addrconf_hash_lock); | 2717 | spin_unlock_bh(&addrconf_hash_lock); |
2718 | } | ||
2718 | 2719 | ||
2719 | __ipv6_ifa_notify(RTM_DELADDR, ifa); | 2720 | __ipv6_ifa_notify(RTM_DELADDR, ifa); |
2720 | atomic_notifier_call_chain(&inet6addr_chain, NETDEV_DOWN, ifa); | 2721 | atomic_notifier_call_chain(&inet6addr_chain, NETDEV_DOWN, ifa); |