diff options
-rw-r--r-- | net/ipv6/addrconf.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 363172527e43..80ce478c4851 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -3626,14 +3626,19 @@ restart: | |||
3626 | INIT_LIST_HEAD(&del_list); | 3626 | INIT_LIST_HEAD(&del_list); |
3627 | list_for_each_entry_safe(ifa, tmp, &idev->addr_list, if_list) { | 3627 | list_for_each_entry_safe(ifa, tmp, &idev->addr_list, if_list) { |
3628 | struct rt6_info *rt = NULL; | 3628 | struct rt6_info *rt = NULL; |
3629 | bool keep; | ||
3629 | 3630 | ||
3630 | addrconf_del_dad_work(ifa); | 3631 | addrconf_del_dad_work(ifa); |
3631 | 3632 | ||
3633 | keep = keep_addr && (ifa->flags & IFA_F_PERMANENT) && | ||
3634 | !addr_is_local(&ifa->addr); | ||
3635 | if (!keep) | ||
3636 | list_move(&ifa->if_list, &del_list); | ||
3637 | |||
3632 | write_unlock_bh(&idev->lock); | 3638 | write_unlock_bh(&idev->lock); |
3633 | spin_lock_bh(&ifa->lock); | 3639 | spin_lock_bh(&ifa->lock); |
3634 | 3640 | ||
3635 | if (keep_addr && (ifa->flags & IFA_F_PERMANENT) && | 3641 | if (keep) { |
3636 | !addr_is_local(&ifa->addr)) { | ||
3637 | /* set state to skip the notifier below */ | 3642 | /* set state to skip the notifier below */ |
3638 | state = INET6_IFADDR_STATE_DEAD; | 3643 | state = INET6_IFADDR_STATE_DEAD; |
3639 | ifa->state = 0; | 3644 | ifa->state = 0; |
@@ -3645,8 +3650,6 @@ restart: | |||
3645 | } else { | 3650 | } else { |
3646 | state = ifa->state; | 3651 | state = ifa->state; |
3647 | ifa->state = INET6_IFADDR_STATE_DEAD; | 3652 | ifa->state = INET6_IFADDR_STATE_DEAD; |
3648 | |||
3649 | list_move(&ifa->if_list, &del_list); | ||
3650 | } | 3653 | } |
3651 | 3654 | ||
3652 | spin_unlock_bh(&ifa->lock); | 3655 | spin_unlock_bh(&ifa->lock); |