IPv6: keep tentative addresses in hash table
authorstephen hemminger <shemminger@vyatta.com>
Mon, 12 Apr 2010 05:41:32 +0000 (05:41 +0000)
committerDavid S. Miller <davem@davemloft.net>
Tue, 13 Apr 2010 09:29:27 +0000 (02:29 -0700)
When link goes down, want address to be preserved but in a tentative
state, therefore it has to stay in hash list.

Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv6/addrconf.c

index a9913d2..9d78c12 100644 (file)
@@ -2704,17 +2704,18 @@ static int addrconf_ifdown(struct net_device *dev, int how)
                        /* Flag it for later restoration when link comes up */
                        ifa->flags |= IFA_F_TENTATIVE;
                        in6_ifa_hold(ifa);
+                       write_unlock_bh(&idev->lock);
                } else {
                        list_del(&ifa->if_list);
                        ifa->dead = 1;
-               }
-               write_unlock_bh(&idev->lock);
+                       write_unlock_bh(&idev->lock);
 
-               /* clear hash table */
-               spin_lock_bh(&addrconf_hash_lock);
-               hlist_del_init_rcu(&ifa->addr_lst);
-               __in6_ifa_put(ifa);
-               spin_unlock_bh(&addrconf_hash_lock);
+                       /* clear hash table */
+                       spin_lock_bh(&addrconf_hash_lock);
+                       hlist_del_init_rcu(&ifa->addr_lst);
+                       __in6_ifa_put(ifa);
+                       spin_unlock_bh(&addrconf_hash_lock);
+               }
 
                __ipv6_ifa_notify(RTM_DELADDR, ifa);
                atomic_notifier_call_chain(&inet6addr_chain, NETDEV_DOWN, ifa);