Lines Matching refs:aiter

697 abd_iter_scatter_chunk_offset(struct abd_iter *aiter)  in abd_iter_scatter_chunk_offset()  argument
699 ASSERT(!abd_is_linear(aiter->iter_abd)); in abd_iter_scatter_chunk_offset()
700 return ((aiter->iter_abd->abd_u.abd_scatter.abd_offset + in abd_iter_scatter_chunk_offset()
701 aiter->iter_pos) % zfs_abd_chunk_size); in abd_iter_scatter_chunk_offset()
705 abd_iter_scatter_chunk_index(struct abd_iter *aiter) in abd_iter_scatter_chunk_index() argument
707 ASSERT(!abd_is_linear(aiter->iter_abd)); in abd_iter_scatter_chunk_index()
708 return ((aiter->iter_abd->abd_u.abd_scatter.abd_offset + in abd_iter_scatter_chunk_index()
709 aiter->iter_pos) / zfs_abd_chunk_size); in abd_iter_scatter_chunk_index()
716 abd_iter_init(struct abd_iter *aiter, abd_t *abd) in abd_iter_init() argument
719 aiter->iter_abd = abd; in abd_iter_init()
720 aiter->iter_pos = 0; in abd_iter_init()
721 aiter->iter_mapaddr = NULL; in abd_iter_init()
722 aiter->iter_mapsize = 0; in abd_iter_init()
731 abd_iter_advance(struct abd_iter *aiter, size_t amount) in abd_iter_advance() argument
733 ASSERT3P(aiter->iter_mapaddr, ==, NULL); in abd_iter_advance()
734 ASSERT0(aiter->iter_mapsize); in abd_iter_advance()
737 if (aiter->iter_pos == aiter->iter_abd->abd_size) in abd_iter_advance()
740 aiter->iter_pos += amount; in abd_iter_advance()
748 abd_iter_map(struct abd_iter *aiter) in abd_iter_map() argument
753 ASSERT3P(aiter->iter_mapaddr, ==, NULL); in abd_iter_map()
754 ASSERT0(aiter->iter_mapsize); in abd_iter_map()
757 IMPLY(!abd_is_linear(aiter->iter_abd), zfs_abd_chunk_size == in abd_iter_map()
758 aiter->iter_abd->abd_u.abd_scatter.abd_chunk_size); in abd_iter_map()
761 if (aiter->iter_pos == aiter->iter_abd->abd_size) in abd_iter_map()
764 if (abd_is_linear(aiter->iter_abd)) { in abd_iter_map()
765 offset = aiter->iter_pos; in abd_iter_map()
766 aiter->iter_mapsize = aiter->iter_abd->abd_size - offset; in abd_iter_map()
767 paddr = aiter->iter_abd->abd_u.abd_linear.abd_buf; in abd_iter_map()
769 size_t index = abd_iter_scatter_chunk_index(aiter); in abd_iter_map()
770 offset = abd_iter_scatter_chunk_offset(aiter); in abd_iter_map()
771 aiter->iter_mapsize = MIN(zfs_abd_chunk_size - offset, in abd_iter_map()
772 aiter->iter_abd->abd_size - aiter->iter_pos); in abd_iter_map()
773 paddr = aiter->iter_abd->abd_u.abd_scatter.abd_chunks[index]; in abd_iter_map()
775 aiter->iter_mapaddr = (char *)paddr + offset; in abd_iter_map()
783 abd_iter_unmap(struct abd_iter *aiter) in abd_iter_unmap() argument
786 if (aiter->iter_pos == aiter->iter_abd->abd_size) in abd_iter_unmap()
789 ASSERT3P(aiter->iter_mapaddr, !=, NULL); in abd_iter_unmap()
790 ASSERT3U(aiter->iter_mapsize, >, 0); in abd_iter_unmap()
792 aiter->iter_mapaddr = NULL; in abd_iter_unmap()
793 aiter->iter_mapsize = 0; in abd_iter_unmap()
801 struct abd_iter aiter; in abd_iterate_func() local
806 abd_iter_init(&aiter, abd); in abd_iterate_func()
807 abd_iter_advance(&aiter, off); in abd_iterate_func()
810 abd_iter_map(&aiter); in abd_iterate_func()
812 size_t len = MIN(aiter.iter_mapsize, size); in abd_iterate_func()
815 ret = func(aiter.iter_mapaddr, len, private); in abd_iterate_func()
817 abd_iter_unmap(&aiter); in abd_iterate_func()
823 abd_iter_advance(&aiter, len); in abd_iterate_func()