--- a/datapath/linux/compat/include/net/dst_metadata.h
+++ b/datapath/linux/compat/include/net/dst_metadata.h
@@ -167,13 +167,13 @@
 
 	dst = &md_dst->dst;
 
-#if 0
+	/* Initialize as a real dst_entry so any dst_hold/dst_release path is safe. */
 	dst_init(dst, &md_dst_ops, NULL, 1, DST_OBSOLETE_NONE,
-			DST_METADATA | DST_NOCACHE | DST_NOCOUNT);
-
+		 DST_METADATA | DST_NOCACHE | DST_NOCOUNT);
+
+	/* Unused by OVS datapath, but keep them sane for debuggability. */
 	dst->input = dst_md_discard;
 	dst->output = dst_md_discard_out;
-#endif
 
 	memset(dst + 1, 0, sizeof(*md_dst) + optslen - sizeof(*dst));
 }
@@ -187,6 +187,10 @@
 		return NULL;
 
 	__metadata_dst_init(md_dst, optslen);
+	/* Mirror rpl_tun_rx_dst()/rpl__metadata_dst_init() behavior. */
+	md_dst->type = METADATA_IP_TUNNEL;
+	md_dst->u.tun_info.options_len = 0;
+	md_dst->u.tun_info.mode = 0;
 	return md_dst;
 }
 
@@ -204,6 +208,10 @@
 		return NULL;
 #endif
 	__metadata_dst_init(md_dst, optslen);
+	/* Mirror rpl_tun_rx_dst()/rpl__metadata_dst_init() behavior. */
+	md_dst->type = METADATA_IP_TUNNEL;
+	md_dst->u.tun_info.options_len = 0;
+	md_dst->u.tun_info.mode = 0;
 }
 
 static inline void ovs_ip_tun_rx_dst(struct metadata_dst *md_dst,
