diff --git a/net/ipv4/route.c b/net/ipv4/route.c index d337706..3b7562f 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c @@ -278,7 +278,7 @@ static struct rtable *rt_cache_get_first(struct seq_file *seq) for (st->bucket = rt_hash_mask; st->bucket >= 0; --st->bucket) { rcu_read_lock_bh(); - r = rt_hash_table[st->bucket].chain; + r = rcu_dereference(rt_hash_table[st->bucket].chain); if (r) break; rcu_read_unlock_bh(); @@ -288,15 +288,15 @@ static struct rtable *rt_cache_get_first(struct seq_file *seq) static struct rtable *rt_cache_get_next(struct seq_file *seq, struct rtable *r) { - struct rt_cache_iter_state *st = rcu_dereference(seq->private); + struct rt_cache_iter_state *st = seq->private; - r = r->u.dst.rt_next; + r = rcu_dereference(r->u.dst.rt_next); while (!r) { rcu_read_unlock_bh(); if (--st->bucket < 0) break; rcu_read_lock_bh(); - r = rt_hash_table[st->bucket].chain; + r = rcu_dereference(rt_hash_table[st->bucket].chain); } return r; }