diff options
Diffstat (limited to 'net/ipv4/route.c')
-rw-r--r-- | net/ipv4/route.c | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 194f5cca3121..eab8d75e5222 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -276,15 +276,16 @@ struct rt_cache_iter_state { | |||
276 | int genid; | 276 | int genid; |
277 | }; | 277 | }; |
278 | 278 | ||
279 | static struct rtable *rt_cache_get_first(struct rt_cache_iter_state *st) | 279 | static struct rtable *rt_cache_get_first(struct seq_file *seq) |
280 | { | 280 | { |
281 | struct rt_cache_iter_state *st = seq->private; | ||
281 | struct rtable *r = NULL; | 282 | struct rtable *r = NULL; |
282 | 283 | ||
283 | for (st->bucket = rt_hash_mask; st->bucket >= 0; --st->bucket) { | 284 | for (st->bucket = rt_hash_mask; st->bucket >= 0; --st->bucket) { |
284 | rcu_read_lock_bh(); | 285 | rcu_read_lock_bh(); |
285 | r = rcu_dereference(rt_hash_table[st->bucket].chain); | 286 | r = rcu_dereference(rt_hash_table[st->bucket].chain); |
286 | while (r) { | 287 | while (r) { |
287 | if (dev_net(r->u.dst.dev) == st->p.net && | 288 | if (dev_net(r->u.dst.dev) == seq_file_net(seq) && |
288 | r->rt_genid == st->genid) | 289 | r->rt_genid == st->genid) |
289 | return r; | 290 | return r; |
290 | r = rcu_dereference(r->u.dst.rt_next); | 291 | r = rcu_dereference(r->u.dst.rt_next); |
@@ -294,9 +295,10 @@ static struct rtable *rt_cache_get_first(struct rt_cache_iter_state *st) | |||
294 | return r; | 295 | return r; |
295 | } | 296 | } |
296 | 297 | ||
297 | static struct rtable *__rt_cache_get_next(struct rt_cache_iter_state *st, | 298 | static struct rtable *__rt_cache_get_next(struct seq_file *seq, |
298 | struct rtable *r) | 299 | struct rtable *r) |
299 | { | 300 | { |
301 | struct rt_cache_iter_state *st = seq->private; | ||
300 | r = r->u.dst.rt_next; | 302 | r = r->u.dst.rt_next; |
301 | while (!r) { | 303 | while (!r) { |
302 | rcu_read_unlock_bh(); | 304 | rcu_read_unlock_bh(); |
@@ -308,11 +310,12 @@ static struct rtable *__rt_cache_get_next(struct rt_cache_iter_state *st, | |||
308 | return rcu_dereference(r); | 310 | return rcu_dereference(r); |
309 | } | 311 | } |
310 | 312 | ||
311 | static struct rtable *rt_cache_get_next(struct rt_cache_iter_state *st, | 313 | static struct rtable *rt_cache_get_next(struct seq_file *seq, |
312 | struct rtable *r) | 314 | struct rtable *r) |
313 | { | 315 | { |
314 | while ((r = __rt_cache_get_next(st, r)) != NULL) { | 316 | struct rt_cache_iter_state *st = seq->private; |
315 | if (dev_net(r->u.dst.dev) != st->p.net) | 317 | while ((r = __rt_cache_get_next(seq, r)) != NULL) { |
318 | if (dev_net(r->u.dst.dev) != seq_file_net(seq)) | ||
316 | continue; | 319 | continue; |
317 | if (r->rt_genid == st->genid) | 320 | if (r->rt_genid == st->genid) |
318 | break; | 321 | break; |
@@ -320,12 +323,12 @@ static struct rtable *rt_cache_get_next(struct rt_cache_iter_state *st, | |||
320 | return r; | 323 | return r; |
321 | } | 324 | } |
322 | 325 | ||
323 | static struct rtable *rt_cache_get_idx(struct rt_cache_iter_state *st, loff_t pos) | 326 | static struct rtable *rt_cache_get_idx(struct seq_file *seq, loff_t pos) |
324 | { | 327 | { |
325 | struct rtable *r = rt_cache_get_first(st); | 328 | struct rtable *r = rt_cache_get_first(seq); |
326 | 329 | ||
327 | if (r) | 330 | if (r) |
328 | while (pos && (r = rt_cache_get_next(st, r))) | 331 | while (pos && (r = rt_cache_get_next(seq, r))) |
329 | --pos; | 332 | --pos; |
330 | return pos ? NULL : r; | 333 | return pos ? NULL : r; |
331 | } | 334 | } |
@@ -333,9 +336,8 @@ static struct rtable *rt_cache_get_idx(struct rt_cache_iter_state *st, loff_t po | |||
333 | static void *rt_cache_seq_start(struct seq_file *seq, loff_t *pos) | 336 | static void *rt_cache_seq_start(struct seq_file *seq, loff_t *pos) |
334 | { | 337 | { |
335 | struct rt_cache_iter_state *st = seq->private; | 338 | struct rt_cache_iter_state *st = seq->private; |
336 | |||
337 | if (*pos) | 339 | if (*pos) |
338 | return rt_cache_get_idx(st, *pos - 1); | 340 | return rt_cache_get_idx(seq, *pos - 1); |
339 | st->genid = atomic_read(&rt_genid); | 341 | st->genid = atomic_read(&rt_genid); |
340 | return SEQ_START_TOKEN; | 342 | return SEQ_START_TOKEN; |
341 | } | 343 | } |
@@ -343,12 +345,11 @@ static void *rt_cache_seq_start(struct seq_file *seq, loff_t *pos) | |||
343 | static void *rt_cache_seq_next(struct seq_file *seq, void *v, loff_t *pos) | 345 | static void *rt_cache_seq_next(struct seq_file *seq, void *v, loff_t *pos) |
344 | { | 346 | { |
345 | struct rtable *r; | 347 | struct rtable *r; |
346 | struct rt_cache_iter_state *st = seq->private; | ||
347 | 348 | ||
348 | if (v == SEQ_START_TOKEN) | 349 | if (v == SEQ_START_TOKEN) |
349 | r = rt_cache_get_first(st); | 350 | r = rt_cache_get_first(seq); |
350 | else | 351 | else |
351 | r = rt_cache_get_next(st, v); | 352 | r = rt_cache_get_next(seq, v); |
352 | ++*pos; | 353 | ++*pos; |
353 | return r; | 354 | return r; |
354 | } | 355 | } |