1672 cache->mfc_flags |= MFC_NOTIFY;
1673 err = ipmr_fill_mroute(skb, cache, rtm);
1674 read_unlock(&mrt_lock);
1675 return err;
1676}
1677
1678#ifdef CONFIG_PROC_FS
1679
1680
1681
1682struct ipmr_vif_iter {
1683 int ct;
1684};
1685
1686static struct vif_device *ipmr_vif_seq_idx(struct ipmr_vif_iter *iter,
1687 loff_t pos)
1688{
1689 for (iter->ct = 0; iter->ct < maxvif; ++iter->ct) {
1690 if (!VIF_EXISTS(iter->ct))
1691 continue;
1692 if (pos-- == 0)
1693 return &vif_table[iter->ct];
1694 }
1695 return NULL;
1696}
1697
1698static void *ipmr_vif_seq_start(struct seq_file *seq, loff_t *pos)
1699 __acquires(mrt_lock)
1700{
1701 read_lock(&mrt_lock);
1702 return *pos ? ipmr_vif_seq_idx(seq->private, *pos - 1)
1703 : SEQ_START_TOKEN;
1704}
1705
1706static void *ipmr_vif_seq_next(struct seq_file *seq, void *v, loff_t *pos)
1707{
1708 struct ipmr_vif_iter *iter = seq->private;
1709
1710 ++*pos;
1711 if (v == SEQ_START_TOKEN)
1712 return ipmr_vif_seq_idx(iter, 0);