diff options
author | David S. Miller <davem@davemloft.net> | 2010-11-14 11:57:05 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-11-14 11:57:05 -0800 |
commit | c25ecd0a21d5e08160cb5cc984f9e2b8ee347443 (patch) | |
tree | 0e4dcacf1bf603f259b8d27445a10e60fa8d00d7 /net/ipv6/addrconf.c | |
parent | 190683a9d5457e6d962c232ffbecac3ab158dddd (diff) | |
parent | 9457b24a0955bbdd2e89220a75de69fe09501bba (diff) | |
download | linux-c25ecd0a21d5e08160cb5cc984f9e2b8ee347443.tar.gz linux-c25ecd0a21d5e08160cb5cc984f9e2b8ee347443.tar.bz2 linux-c25ecd0a21d5e08160cb5cc984f9e2b8ee347443.zip |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Diffstat (limited to 'net/ipv6/addrconf.c')
-rw-r--r-- | net/ipv6/addrconf.c | 24 |
1 files changed, 8 insertions, 16 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index e048ec62d109..b41ce0f0d514 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -2740,10 +2740,6 @@ static int addrconf_ifdown(struct net_device *dev, int how) /* Flag it for later restoration when link comes up */ ifa->flags |= IFA_F_TENTATIVE; ifa->state = INET6_IFADDR_STATE_DAD; - - write_unlock_bh(&idev->lock); - - in6_ifa_hold(ifa); } else { list_del(&ifa->if_list); @@ -2758,19 +2754,15 @@ static int addrconf_ifdown(struct net_device *dev, int how) ifa->state = INET6_IFADDR_STATE_DEAD; spin_unlock_bh(&ifa->state_lock); - if (state == INET6_IFADDR_STATE_DEAD) - goto put_ifa; + if (state == INET6_IFADDR_STATE_DEAD) { + in6_ifa_put(ifa); + } else { + __ipv6_ifa_notify(RTM_DELADDR, ifa); + atomic_notifier_call_chain(&inet6addr_chain, + NETDEV_DOWN, ifa); + } + write_lock_bh(&idev->lock); } - - __ipv6_ifa_notify(RTM_DELADDR, ifa); - if (ifa->state == INET6_IFADDR_STATE_DEAD) - atomic_notifier_call_chain(&inet6addr_chain, - NETDEV_DOWN, ifa); - -put_ifa: - in6_ifa_put(ifa); - - write_lock_bh(&idev->lock); } list_splice(&keep_list, &idev->addr_list); |