goto relookup_failed;
                }
                /* Ugh! */
-               orefdst = skb_in->_skb_refdst; /* save old refdst */
-               skb_dst_set(skb_in, NULL);
+               orefdst = skb_dstref_steal(skb_in);
                err = ip_route_input(skb_in, fl4_dec.daddr, fl4_dec.saddr,
                                     dscp, rt2->dst.dev) ? -EINVAL : 0;
 
                dst_release(&rt2->dst);
                rt2 = skb_rtable(skb_in);
-               skb_in->_skb_refdst = orefdst; /* restore old refdst */
+               /* steal dst entry from skb_in, don't drop refcnt */
+               skb_dstref_steal(skb_in);
+               skb_dstref_restore(skb_in, orefdst);
        }
 
        if (err)
 
                }
                memcpy(&nexthop, &optptr[srrptr-1], 4);
 
-               orefdst = skb->_skb_refdst;
-               skb_dst_set(skb, NULL);
+               orefdst = skb_dstref_steal(skb);
                err = ip_route_input(skb, nexthop, iph->saddr, ip4h_dscp(iph),
                                     dev) ? -EINVAL : 0;
                rt2 = skb_rtable(skb);
                if (err || (rt2->rt_type != RTN_UNICAST && rt2->rt_type != RTN_LOCAL)) {
                        skb_dst_drop(skb);
-                       skb->_skb_refdst = orefdst;
+                       skb_dstref_restore(skb, orefdst);
                        return -EINVAL;
                }
                refdst_drop(orefdst);