ipv6: Replace inet6_ifaddr->dead with state
[safe/jmp/linux-2.6] / net / ipv6 / addrconf.c
index 75d3b8c..4e5ad9d 100644 (file)
@@ -553,7 +553,7 @@ void inet6_ifa_finish_destroy(struct inet6_ifaddr *ifp)
        if (del_timer(&ifp->timer))
                pr_notice("Timer is still running, when freeing ifa=%p\n", ifp);
 
-       if (!ifp->dead) {
+       if (ifp->state != INET6_IFADDR_STATE_DEAD) {
                pr_warning("Freeing alive inet6 address %p\n", ifp);
                return;
        }
@@ -648,6 +648,7 @@ ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, int pfxlen,
        ipv6_addr_copy(&ifa->addr, addr);
 
        spin_lock_init(&ifa->lock);
+       spin_lock_init(&ifa->state_lock);
        init_timer(&ifa->timer);
        INIT_HLIST_NODE(&ifa->addr_lst);
        ifa->timer.data = (unsigned long) ifa;
@@ -720,7 +721,7 @@ static void ipv6_del_addr(struct inet6_ifaddr *ifp)
 
        hash = ipv6_addr_hash(&ifp->addr);
 
-       ifp->dead = 1;
+       ifp->state = INET6_IFADDR_STATE_DEAD;
 
        spin_lock_bh(&addrconf_hash_lock);
        hlist_del_init_rcu(&ifp->addr_lst);
@@ -2665,7 +2666,7 @@ static int addrconf_ifdown(struct net_device *dev, int how)
                ifa = list_first_entry(&idev->tempaddr_list,
                                       struct inet6_ifaddr, tmp_list);
                list_del(&ifa->tmp_list);
-               ifa->dead = 1;
+               ifa->state = INET6_IFADDR_STATE_DEAD;
                write_unlock_bh(&idev->lock);
                spin_lock_bh(&ifa->lock);
 
@@ -2707,7 +2708,7 @@ static int addrconf_ifdown(struct net_device *dev, int how)
                        write_unlock_bh(&idev->lock);
                } else {
                        list_del(&ifa->if_list);
-                       ifa->dead = 1;
+                       ifa->state = INET6_IFADDR_STATE_DEAD;
                        write_unlock_bh(&idev->lock);
 
                        /* clear hash table */
@@ -2717,7 +2718,7 @@ static int addrconf_ifdown(struct net_device *dev, int how)
                }
 
                __ipv6_ifa_notify(RTM_DELADDR, ifa);
-               if (ifa->dead)
+               if (ifa->state == INET6_IFADDR_STATE_DEAD)
                        atomic_notifier_call_chain(&inet6addr_chain,
                                                   NETDEV_DOWN, ifa);
                in6_ifa_put(ifa);
@@ -2815,7 +2816,7 @@ static void addrconf_dad_start(struct inet6_ifaddr *ifp, u32 flags)
        net_srandom(ifp->addr.s6_addr32[3]);
 
        read_lock_bh(&idev->lock);
-       if (ifp->dead)
+       if (ifp->state == INET6_IFADDR_STATE_DEAD)
                goto out;
 
        spin_lock(&ifp->lock);
@@ -4050,7 +4051,8 @@ static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifp)
                addrconf_leave_solict(ifp->idev, &ifp->addr);
                dst_hold(&ifp->rt->u.dst);
 
-               if (ifp->dead && ip6_del_rt(ifp->rt))
+               if (ifp->state == INET6_IFADDR_STATE_DEAD &&
+                   ip6_del_rt(ifp->rt))
                        dst_free(&ifp->rt->u.dst);
                break;
        }