|
|
@@ -3626,14 +3626,19 @@ restart:
|
|
|
INIT_LIST_HEAD(&del_list);
|
|
|
list_for_each_entry_safe(ifa, tmp, &idev->addr_list, if_list) {
|
|
|
struct rt6_info *rt = NULL;
|
|
|
+ bool keep;
|
|
|
|
|
|
addrconf_del_dad_work(ifa);
|
|
|
|
|
|
+ keep = keep_addr && (ifa->flags & IFA_F_PERMANENT) &&
|
|
|
+ !addr_is_local(&ifa->addr);
|
|
|
+ if (!keep)
|
|
|
+ list_move(&ifa->if_list, &del_list);
|
|
|
+
|
|
|
write_unlock_bh(&idev->lock);
|
|
|
spin_lock_bh(&ifa->lock);
|
|
|
|
|
|
- if (keep_addr && (ifa->flags & IFA_F_PERMANENT) &&
|
|
|
- !addr_is_local(&ifa->addr)) {
|
|
|
+ if (keep) {
|
|
|
/* set state to skip the notifier below */
|
|
|
state = INET6_IFADDR_STATE_DEAD;
|
|
|
ifa->state = 0;
|
|
|
@@ -3645,8 +3650,6 @@ restart:
|
|
|
} else {
|
|
|
state = ifa->state;
|
|
|
ifa->state = INET6_IFADDR_STATE_DEAD;
|
|
|
-
|
|
|
- list_move(&ifa->if_list, &del_list);
|
|
|
}
|
|
|
|
|
|
spin_unlock_bh(&ifa->lock);
|