|
@@ -651,9 +651,12 @@ static void update_or_create_fnhe(struct fib_nh *nh, __be32 daddr, __be32 gw,
|
|
|
struct fnhe_hash_bucket *hash;
|
|
|
struct fib_nh_exception *fnhe;
|
|
|
struct rtable *rt;
|
|
|
+ u32 genid, hval;
|
|
|
unsigned int i;
|
|
|
int depth;
|
|
|
- u32 hval = fnhe_hashfun(daddr);
|
|
|
+
|
|
|
+ genid = fnhe_genid(dev_net(nh->nh_dev));
|
|
|
+ hval = fnhe_hashfun(daddr);
|
|
|
|
|
|
spin_lock_bh(&fnhe_lock);
|
|
|
|
|
@@ -676,6 +679,8 @@ static void update_or_create_fnhe(struct fib_nh *nh, __be32 daddr, __be32 gw,
|
|
|
}
|
|
|
|
|
|
if (fnhe) {
|
|
|
+ if (fnhe->fnhe_genid != genid)
|
|
|
+ fnhe->fnhe_genid = genid;
|
|
|
if (gw)
|
|
|
fnhe->fnhe_gw = gw;
|
|
|
if (pmtu)
|
|
@@ -699,7 +704,7 @@ static void update_or_create_fnhe(struct fib_nh *nh, __be32 daddr, __be32 gw,
|
|
|
fnhe->fnhe_next = hash->chain;
|
|
|
rcu_assign_pointer(hash->chain, fnhe);
|
|
|
}
|
|
|
- fnhe->fnhe_genid = fnhe_genid(dev_net(nh->nh_dev));
|
|
|
+ fnhe->fnhe_genid = genid;
|
|
|
fnhe->fnhe_daddr = daddr;
|
|
|
fnhe->fnhe_gw = gw;
|
|
|
fnhe->fnhe_pmtu = pmtu;
|