#ifndef CONFIG_IPV6_SUBTREES
 #define FIB6_SUBTREE(fn)       NULL
+
+static inline bool fib6_routes_require_src(const struct net *net)
+{
+       return false;
+}
+
+static inline void fib6_routes_require_src_inc(struct net *net) {}
+static inline void fib6_routes_require_src_dec(struct net *net) {}
+
 #else
+
+static inline bool fib6_routes_require_src(const struct net *net)
+{
+       return net->ipv6.fib6_routes_require_src > 0;
+}
+
+static inline void fib6_routes_require_src_inc(struct net *net)
+{
+       net->ipv6.fib6_routes_require_src++;
+}
+
+static inline void fib6_routes_require_src_dec(struct net *net)
+{
+       net->ipv6.fib6_routes_require_src--;
+}
+
 #define FIB6_SUBTREE(fn)       (rcu_dereference_protected((fn)->subtree, 1))
 #endif
 
        return ((struct rt6_info *)dst)->rt6i_idev;
 }
 
+static inline bool fib6_requires_src(const struct fib6_info *rt)
+{
+       return rt->fib6_src.plen > 0;
+}
+
 static inline void fib6_clean_expires(struct fib6_info *f6i)
 {
        f6i->fib6_flags &= ~RTF_EXPIRES;
 
 #ifdef CONFIG_IPV6_MULTIPLE_TABLES
        unsigned int            fib6_rules_require_fldissect;
        bool                    fib6_has_custom_rules;
+#ifdef CONFIG_IPV6_SUBTREES
+       unsigned int            fib6_routes_require_src;
+#endif
        struct rt6_info         *ip6_prohibit_entry;
        struct rt6_info         *ip6_blk_hole_entry;
        struct fib6_table       *fib6_local_tbl;
 
                }
 #endif
                goto failure;
+       } else if (fib6_requires_src(rt)) {
+               fib6_routes_require_src_inc(info->nl_net);
        }
        return err;
 
                struct fib6_info *cur = rcu_dereference_protected(*rtp,
                                        lockdep_is_held(&table->tb6_lock));
                if (rt == cur) {
+                       if (fib6_requires_src(cur))
+                               fib6_routes_require_src_dec(info->nl_net);
                        fib6_del_route(table, fn, rtp, info);
                        return 0;
                }
 
        dst_init_metrics(&net->ipv6.ip6_blk_hole_entry->dst,
                         ip6_template_metrics, true);
        INIT_LIST_HEAD(&net->ipv6.ip6_blk_hole_entry->rt6i_uncached);
+#ifdef CONFIG_IPV6_SUBTREES
+       net->ipv6.fib6_routes_require_src = 0;
+#endif
 #endif
 
        net->ipv6.sysctl.flush_delay = 0;