{
        struct in_ifaddr *promote = NULL;
        struct in_ifaddr *ifa, *ifa1;
-       struct in_ifaddr *last_prim;
+       struct in_ifaddr __rcu **last_prim;
        struct in_ifaddr *prev_prom = NULL;
        int do_promote = IN_DEV_PROMOTE_SECONDARIES(in_dev);
 
        ASSERT_RTNL();
 
        ifa1 = rtnl_dereference(*ifap);
-       last_prim = rtnl_dereference(in_dev->ifa_list);
+       last_prim = ifap;
        if (in_dev->dead)
                goto no_promotions;
 
                while ((ifa = rtnl_dereference(*ifap1)) != NULL) {
                        if (!(ifa->ifa_flags & IFA_F_SECONDARY) &&
                            ifa1->ifa_scope <= ifa->ifa_scope)
-                               last_prim = ifa;
+                               last_prim = &ifa->ifa_next;
 
                        if (!(ifa->ifa_flags & IFA_F_SECONDARY) ||
                            ifa1->ifa_mask != ifa->ifa_mask ||
 
                        rcu_assign_pointer(prev_prom->ifa_next, next_sec);
 
-                       last_sec = rtnl_dereference(last_prim->ifa_next);
+                       last_sec = rtnl_dereference(*last_prim);
                        rcu_assign_pointer(promote->ifa_next, last_sec);
-                       rcu_assign_pointer(last_prim->ifa_next, promote);
+                       rcu_assign_pointer(*last_prim, promote);
                }
 
                promote->ifa_flags &= ~IFA_F_SECONDARY;