531 SET_BOOKMARK(&czb, td.td_objset,
532 ZB_ROOT_OBJECT, ZB_ROOT_LEVEL, ZB_ROOT_BLKID);
533 (void) traverse_visitbp(&td, NULL, td.td_rootbp, &czb);
534
535 mutex_enter(&td_main->td_pfd->pd_mtx);
536 td_main->td_pfd->pd_exited = B_TRUE;
537 cv_broadcast(&td_main->td_pfd->pd_cv);
538 mutex_exit(&td_main->td_pfd->pd_mtx);
539 }
540
541 /*
542 * NB: dataset must not be changing on-disk (eg, is a snapshot or we are
543 * in syncing context).
544 */
545 static int
546 traverse_impl(spa_t *spa, dsl_dataset_t *ds, uint64_t objset, blkptr_t *rootbp,
547 uint64_t txg_start, zbookmark_phys_t *resume, int flags,
548 blkptr_cb_t func, void *arg)
549 {
550 traverse_data_t td;
551 prefetch_data_t pd = { 0 };
552 zbookmark_phys_t czb;
553 int err;
554
555 ASSERT(ds == NULL || objset == ds->ds_object);
556 ASSERT(!(flags & TRAVERSE_PRE) || !(flags & TRAVERSE_POST));
557
558 td.td_spa = spa;
559 td.td_objset = objset;
560 td.td_rootbp = rootbp;
561 td.td_min_txg = txg_start;
562 td.td_resume = resume;
563 td.td_func = func;
564 td.td_arg = arg;
565 td.td_pfd = &pd;
566 td.td_flags = flags;
567 td.td_paused = B_FALSE;
568 td.td_realloc_possible = (txg_start == 0 ? B_FALSE : B_TRUE);
569
570 if (spa_feature_is_active(spa, SPA_FEATURE_HOLE_BIRTH)) {
571 VERIFY(spa_feature_enabled_txg(spa,
|
531 SET_BOOKMARK(&czb, td.td_objset,
532 ZB_ROOT_OBJECT, ZB_ROOT_LEVEL, ZB_ROOT_BLKID);
533 (void) traverse_visitbp(&td, NULL, td.td_rootbp, &czb);
534
535 mutex_enter(&td_main->td_pfd->pd_mtx);
536 td_main->td_pfd->pd_exited = B_TRUE;
537 cv_broadcast(&td_main->td_pfd->pd_cv);
538 mutex_exit(&td_main->td_pfd->pd_mtx);
539 }
540
541 /*
542 * NB: dataset must not be changing on-disk (eg, is a snapshot or we are
543 * in syncing context).
544 */
545 static int
546 traverse_impl(spa_t *spa, dsl_dataset_t *ds, uint64_t objset, blkptr_t *rootbp,
547 uint64_t txg_start, zbookmark_phys_t *resume, int flags,
548 blkptr_cb_t func, void *arg)
549 {
550 traverse_data_t td;
551 prefetch_data_t pd = { .pd_flags = 0 };
552 zbookmark_phys_t czb;
553 int err;
554
555 ASSERT(ds == NULL || objset == ds->ds_object);
556 ASSERT(!(flags & TRAVERSE_PRE) || !(flags & TRAVERSE_POST));
557
558 td.td_spa = spa;
559 td.td_objset = objset;
560 td.td_rootbp = rootbp;
561 td.td_min_txg = txg_start;
562 td.td_resume = resume;
563 td.td_func = func;
564 td.td_arg = arg;
565 td.td_pfd = &pd;
566 td.td_flags = flags;
567 td.td_paused = B_FALSE;
568 td.td_realloc_possible = (txg_start == 0 ? B_FALSE : B_TRUE);
569
570 if (spa_feature_is_active(spa, SPA_FEATURE_HOLE_BIRTH)) {
571 VERIFY(spa_feature_enabled_txg(spa,
|