2357 state->idev = idev;
2358 break;
2359 }
2360 read_unlock_bh(&idev->lock);
2361 in6_dev_put(idev);
2362 }
2363 return im;
2364}
2365
2366static struct ifmcaddr6 *igmp6_mc_get_next(struct seq_file *seq, struct ifmcaddr6 *im)
2367{
2368 struct igmp6_mc_iter_state *state = igmp6_mc_seq_private(seq);
2369
2370 im = im->next;
2371 while (!im) {
2372 if (likely(state->idev != NULL)) {
2373 read_unlock_bh(&state->idev->lock);
2374 in6_dev_put(state->idev);
2375 }
2376 state->dev = next_net_device(state->dev);
2377 if (!state->dev) {
2378 state->idev = NULL;
2379 break;
2380 }
2381 state->idev = in6_dev_get(state->dev);
2382 if (!state->idev)
2383 continue;
2384 read_lock_bh(&state->idev->lock);
2385 im = state->idev->mc_list;
2386 }
2387 return im;
2388}
2389
2390static struct ifmcaddr6 *igmp6_mc_get_idx(struct seq_file *seq, loff_t pos)
2391{
2392 struct ifmcaddr6 *im = igmp6_mc_get_first(seq);
2393 if (im)
2394 while (pos && (im = igmp6_mc_get_next(seq, im)) != NULL)
2395 --pos;
2396 return pos ? NULL : im;
2397}