diff options
Diffstat (limited to 'net/ipv4/route.c')
| -rw-r--r-- | net/ipv4/route.c | 6 | 
1 files changed, 4 insertions, 2 deletions
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index fd9ecb52c66..82cf2a722b2 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -934,12 +934,14 @@ static u32 __ip_rt_update_pmtu(struct rtable *rt, struct flowi4 *fl4, u32 mtu)  	if (mtu < ip_rt_min_pmtu)  		mtu = ip_rt_min_pmtu; +	rcu_read_lock();  	if (fib_lookup(dev_net(rt->dst.dev), fl4, &res) == 0) {  		struct fib_nh *nh = &FIB_RES_NH(res);  		update_or_create_fnhe(nh, fl4->daddr, 0, mtu,  				      jiffies + ip_rt_mtu_expires);  	} +	rcu_read_unlock();  	return mtu;  } @@ -956,7 +958,7 @@ static void ip_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,  		dst->obsolete = DST_OBSOLETE_KILL;  	} else {  		rt->rt_pmtu = mtu; -		dst_set_expires(&rt->dst, ip_rt_mtu_expires); +		rt->dst.expires = max(1UL, jiffies + ip_rt_mtu_expires);  	}  } @@ -1263,7 +1265,7 @@ static void ipv4_dst_destroy(struct dst_entry *dst)  {  	struct rtable *rt = (struct rtable *) dst; -	if (dst->flags & DST_NOCACHE) { +	if (!list_empty(&rt->rt_uncached)) {  		spin_lock_bh(&rt_uncached_lock);  		list_del(&rt->rt_uncached);  		spin_unlock_bh(&rt_uncached_lock);  |