Lines Matching defs:abd

18  * See abd.c for a general overview of the arc buffered data (ABD).
123 abd_scatter_chunkcnt(abd_t *abd)
125 ASSERT(!abd_is_linear(abd));
127 ABD_SCATTER(abd).abd_offset + abd->abd_size));
137 abd_update_scatter_stats(abd_t *abd, abd_stats_op_t op)
141 n = abd_scatter_chunkcnt(abd);
143 int waste = (n << PAGE_SHIFT) - abd->abd_size;
146 ABDSTAT_INCR(abdstat_scatter_data_size, abd->abd_size);
151 ABDSTAT_INCR(abdstat_scatter_data_size, -(int)abd->abd_size);
158 abd_update_linear_stats(abd_t *abd, abd_stats_op_t op)
163 ABDSTAT_INCR(abdstat_linear_data_size, abd->abd_size);
166 ABDSTAT_INCR(abdstat_linear_data_size, -(int)abd->abd_size);
171 abd_verify_scatter(abd_t *abd)
179 ASSERT(!abd_is_linear_page(abd));
180 ASSERT3U(ABD_SCATTER(abd).abd_offset, <, PAGE_SIZE);
181 n = abd_scatter_chunkcnt(abd);
183 ASSERT3P(ABD_SCATTER(abd).abd_chunks[i], !=, NULL);
188 abd_alloc_chunks(abd_t *abd, size_t size)
194 ABD_SCATTER(abd).abd_chunks[i] =
200 abd_free_chunks(abd_t *abd)
208 if (!abd_is_from_pages(abd)) {
209 n = abd_scatter_chunkcnt(abd);
212 ABD_SCATTER(abd).abd_chunks[i]);
230 abd_t *abd = kmem_alloc(abd_size, KM_PUSHPAGE);
231 ASSERT3P(abd, !=, NULL);
234 return (abd);
238 abd_free_struct_impl(abd_t *abd)
240 uint_t chunkcnt = abd_is_linear(abd) || abd_is_gang(abd) ? 0 :
241 abd_scatter_chunkcnt(abd);
244 kmem_free(abd, size);
352 abd_free_linear_page(abd_t *abd)
354 ASSERT3P(abd->abd_u.abd_linear.sf, !=, NULL);
355 zfs_unmap_page(abd->abd_u.abd_linear.sf);
375 abd_get_offset_from_pages(abd_t *abd, abd_t *sabd, size_t chunkcnt,
387 ABD_SCATTER(abd).abd_chunks[i] =
390 abd->abd_flags |= ABD_FLAG_FROM_PAGES;
391 return (abd);
395 abd_get_offset_scatter(abd_t *abd, abd_t *sabd, size_t off,
408 * If an abd struct is provided, it is only the minimum size. If we
411 if (abd != NULL &&
414 abd = NULL;
417 if (abd == NULL)
418 abd = abd_alloc_struct(chunkcnt << PAGE_SHIFT);
426 ABD_SCATTER(abd).abd_offset = new_offset & PAGE_MASK;
429 return (abd_get_offset_from_pages(abd, sabd, chunkcnt,
434 (void) memcpy(&ABD_SCATTER(abd).abd_chunks,
438 return (abd);
451 abd_t *abd = abd_alloc_struct(size);
452 abd->abd_flags |= ABD_FLAG_OWNER | ABD_FLAG_FROM_PAGES;
453 abd->abd_size = size;
462 abd->abd_flags |= ABD_FLAG_LINEAR | ABD_FLAG_LINEAR_PAGE;
463 ABD_LINEAR_BUF(abd) = (char *)zfs_map_page(pages[0],
464 &abd->abd_u.abd_linear.sf) + offset;
466 ABD_SCATTER(abd).abd_offset = offset;
467 ASSERT0(ABD_SCATTER(abd).abd_offset);
473 ABD_SCATTER(abd).abd_chunks[i] = pages[i];
476 return (abd);
483 abd_iter_init(struct abd_iter *aiter, abd_t *abd)
485 ASSERT(!abd_is_gang(abd));
486 abd_verify(abd);
488 aiter->iter_abd = abd;
535 abd_t *abd = aiter->iter_abd;
537 if (abd_is_linear(abd)) {
538 aiter->iter_mapsize = abd->abd_size - offset;
539 paddr = ABD_LINEAR_BUF(abd);
540 } else if (abd_is_from_pages(abd)) {
542 offset += ABD_SCATTER(abd).abd_offset;
546 abd->abd_size - aiter->iter_pos);
551 offset += ABD_SCATTER(abd).abd_offset;
552 paddr = ABD_SCATTER(abd).abd_chunks[offset >> PAGE_SHIFT];
555 abd->abd_size - aiter->iter_pos);
595 abd_borrow_buf(abd_t *abd, size_t n)
598 abd_verify(abd);
599 ASSERT3U(abd->abd_size, >=, 0);
600 if (abd_is_linear(abd)) {
601 buf = abd_to_buf(abd);
606 (void) zfs_refcount_add_many(&abd->abd_children, n, buf);
612 abd_borrow_buf_copy(abd_t *abd, size_t n)
614 void *buf = abd_borrow_buf(abd, n);
615 if (!abd_is_linear(abd)) {
616 abd_copy_to_buf(buf, abd, n);
624 * buf to be copied back to abd, use abd_return_buf_copy() instead. If the
635 abd_return_buf(abd_t *abd, void *buf, size_t n)
637 abd_verify(abd);
638 ASSERT3U(abd->abd_size, >=, n);
640 (void) zfs_refcount_remove_many(&abd->abd_children, n, buf);
642 if (abd_is_from_pages(abd)) {
643 if (!abd_is_linear_page(abd))
645 } else if (abd_is_linear(abd)) {
646 ASSERT3P(buf, ==, abd_to_buf(abd));
647 } else if (abd_is_gang(abd)) {
659 for (abd_t *cabd = list_head(&ABD_GANG(abd).abd_gang_chain);
661 cabd = list_next(&ABD_GANG(abd).abd_gang_chain, cabd)) {
671 ASSERT0(abd_cmp_buf(abd, buf, n));
677 abd_return_buf_copy(abd_t *abd, void *buf, size_t n)
679 if (!abd_is_linear(abd)) {
680 abd_copy_from_buf(abd, buf, n);
682 abd_return_buf(abd, buf, n);