2477 state->idev = NULL;
2478 goto out;
2479 }
2480 state->idev = in_dev_get(state->dev);
2481 if (!state->idev)
2482 continue;
2483 read_lock(&state->idev->mc_list_lock);
2484 state->im = state->idev->mc_list;
2485 }
2486 if (!state->im)
2487 break;
2488 spin_lock_bh(&state->im->lock);
2489 psf = state->im->sources;
2490 }
2491out:
2492 return psf;
2493}
2494
2495static struct ip_sf_list *igmp_mcf_get_idx(struct seq_file *seq, loff_t pos)
2496{
2497 struct ip_sf_list *psf = igmp_mcf_get_first(seq);
2498 if (psf)
2499 while (pos && (psf = igmp_mcf_get_next(seq, psf)) != NULL)
2500 --pos;
2501 return pos ? NULL : psf;
2502}
2503
2504static void *igmp_mcf_seq_start(struct seq_file *seq, loff_t *pos)
2505{
2506 read_lock(&dev_base_lock);
2507 return *pos ? igmp_mcf_get_idx(seq, *pos - 1) : SEQ_START_TOKEN;
2508}
2509
2510static void *igmp_mcf_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2511{
2512 struct ip_sf_list *psf;
2513 if (v == SEQ_START_TOKEN)
2514 psf = igmp_mcf_get_first(seq);
2515 else
2516 psf = igmp_mcf_get_next(seq, v);
2517 ++*pos;