Lines Matching refs:ds
105 static void dsl_dataset_set_remap_deadlist_object(dsl_dataset_t *ds,
107 static void dsl_dataset_unset_remap_deadlist_object(dsl_dataset_t *ds,
110 static void unload_zfeature(dsl_dataset_t *ds, spa_feature_t f);
122 parent_delta(dsl_dataset_t *ds, int64_t delta) in parent_delta() argument
127 if (ds->ds_reserved == 0) in parent_delta()
130 ds_phys = dsl_dataset_phys(ds); in parent_delta()
131 old_bytes = MAX(ds_phys->ds_unique_bytes, ds->ds_reserved); in parent_delta()
132 new_bytes = MAX(ds_phys->ds_unique_bytes + delta, ds->ds_reserved); in parent_delta()
139 dsl_dataset_block_born(dsl_dataset_t *ds, const blkptr_t *bp, dmu_tx_t *tx) in dsl_dataset_block_born() argument
148 dprintf_bp(bp, "ds=%p", ds); in dsl_dataset_block_born()
156 if (ds == NULL) { in dsl_dataset_block_born()
163 dsl_dataset_phys(ds)->ds_prev_snap_txg); in dsl_dataset_block_born()
164 dmu_buf_will_dirty(ds->ds_dbuf, tx); in dsl_dataset_block_born()
165 mutex_enter(&ds->ds_lock); in dsl_dataset_block_born()
166 delta = parent_delta(ds, used); in dsl_dataset_block_born()
167 dsl_dataset_phys(ds)->ds_referenced_bytes += used; in dsl_dataset_block_born()
168 dsl_dataset_phys(ds)->ds_compressed_bytes += compressed; in dsl_dataset_block_born()
169 dsl_dataset_phys(ds)->ds_uncompressed_bytes += uncompressed; in dsl_dataset_block_born()
170 dsl_dataset_phys(ds)->ds_unique_bytes += used; in dsl_dataset_block_born()
173 ds->ds_feature_activation[SPA_FEATURE_LARGE_BLOCKS] = in dsl_dataset_block_born()
182 ds->ds_feature_activation[f] = (void *)B_TRUE; in dsl_dataset_block_born()
189 ds->ds_feature_activation[f] = (void *)B_TRUE; in dsl_dataset_block_born()
196 if (dsl_deadlist_is_open(&ds->ds_dir->dd_livelist) && in dsl_dataset_block_born()
197 BP_GET_LOGICAL_BIRTH(bp) > ds->ds_dir->dd_origin_txg && in dsl_dataset_block_born()
199 ASSERT(dsl_dir_is_clone(ds->ds_dir)); in dsl_dataset_block_born()
202 bplist_append(&ds->ds_dir->dd_pending_allocs, bp); in dsl_dataset_block_born()
205 mutex_exit(&ds->ds_lock); in dsl_dataset_block_born()
206 dsl_dir_diduse_transfer_space(ds->ds_dir, delta, in dsl_dataset_block_born()
219 dsl_dataset_block_remapped(dsl_dataset_t *ds, uint64_t vdev, uint64_t offset, in dsl_dataset_block_remapped() argument
222 spa_t *spa = ds->ds_dir->dd_pool->dp_spa; in dsl_dataset_block_remapped()
226 ASSERT(!ds->ds_is_snapshot); in dsl_dataset_block_remapped()
228 if (birth > dsl_dataset_phys(ds)->ds_prev_snap_txg) { in dsl_dataset_block_remapped()
234 ASSERT(ds != NULL); in dsl_dataset_block_remapped()
236 mutex_enter(&ds->ds_remap_deadlist_lock); in dsl_dataset_block_remapped()
237 if (!dsl_dataset_remap_deadlist_exists(ds)) { in dsl_dataset_block_remapped()
238 dsl_dataset_create_remap_deadlist(ds, tx); in dsl_dataset_block_remapped()
240 mutex_exit(&ds->ds_remap_deadlist_lock); in dsl_dataset_block_remapped()
247 dsl_deadlist_insert(&ds->ds_remap_deadlist, &fakebp, B_FALSE, in dsl_dataset_block_remapped()
253 dsl_dataset_block_kill(dsl_dataset_t *ds, const blkptr_t *bp, dmu_tx_t *tx, in dsl_dataset_block_kill() argument
268 if (ds == NULL) { in dsl_dataset_block_kill()
274 ASSERT3P(tx->tx_pool, ==, ds->ds_dir->dd_pool); in dsl_dataset_block_kill()
276 ASSERT(!ds->ds_is_snapshot); in dsl_dataset_block_kill()
277 dmu_buf_will_dirty(ds->ds_dbuf, tx); in dsl_dataset_block_kill()
283 if (dsl_deadlist_is_open(&ds->ds_dir->dd_livelist) && in dsl_dataset_block_kill()
284 BP_GET_LOGICAL_BIRTH(bp) > ds->ds_dir->dd_origin_txg && in dsl_dataset_block_kill()
286 ASSERT(dsl_dir_is_clone(ds->ds_dir)); in dsl_dataset_block_kill()
289 bplist_append(&ds->ds_dir->dd_pending_frees, bp); in dsl_dataset_block_kill()
292 if (BP_GET_LOGICAL_BIRTH(bp) > dsl_dataset_phys(ds)->ds_prev_snap_txg) { in dsl_dataset_block_kill()
308 bpobj_enqueue(&ds->ds_dir->dd_pool->dp_free_bpobj, in dsl_dataset_block_kill()
312 (u_longlong_t)ds->ds_object); in dsl_dataset_block_kill()
316 mutex_enter(&ds->ds_lock); in dsl_dataset_block_kill()
317 ASSERT(dsl_dataset_phys(ds)->ds_unique_bytes >= used || in dsl_dataset_block_kill()
318 !DS_UNIQUE_IS_ACCURATE(ds)); in dsl_dataset_block_kill()
319 delta = parent_delta(ds, -used); in dsl_dataset_block_kill()
320 dsl_dataset_phys(ds)->ds_unique_bytes -= used; in dsl_dataset_block_kill()
321 mutex_exit(&ds->ds_lock); in dsl_dataset_block_kill()
323 dsl_dir_diduse_transfer_space(ds->ds_dir, in dsl_dataset_block_kill()
340 bplist_append(&ds->ds_pending_deadlist, bp); in dsl_dataset_block_kill()
342 dsl_deadlist_insert(&ds->ds_deadlist, bp, B_FALSE, tx); in dsl_dataset_block_kill()
344 ASSERT3U(ds->ds_prev->ds_object, ==, in dsl_dataset_block_kill()
345 dsl_dataset_phys(ds)->ds_prev_snap_obj); in dsl_dataset_block_kill()
346 ASSERT(dsl_dataset_phys(ds->ds_prev)->ds_num_children > 0); in dsl_dataset_block_kill()
348 if (dsl_dataset_phys(ds->ds_prev)->ds_next_snap_obj == in dsl_dataset_block_kill()
349 ds->ds_object && BP_GET_LOGICAL_BIRTH(bp) > in dsl_dataset_block_kill()
350 dsl_dataset_phys(ds->ds_prev)->ds_prev_snap_txg) { in dsl_dataset_block_kill()
351 dmu_buf_will_dirty(ds->ds_prev->ds_dbuf, tx); in dsl_dataset_block_kill()
352 mutex_enter(&ds->ds_prev->ds_lock); in dsl_dataset_block_kill()
353 dsl_dataset_phys(ds->ds_prev)->ds_unique_bytes += used; in dsl_dataset_block_kill()
354 mutex_exit(&ds->ds_prev->ds_lock); in dsl_dataset_block_kill()
356 if (BP_GET_LOGICAL_BIRTH(bp) > ds->ds_dir->dd_origin_txg) { in dsl_dataset_block_kill()
357 dsl_dir_transfer_space(ds->ds_dir, used, in dsl_dataset_block_kill()
362 dsl_bookmark_block_killed(ds, bp, tx); in dsl_dataset_block_kill()
364 mutex_enter(&ds->ds_lock); in dsl_dataset_block_kill()
365 ASSERT3U(dsl_dataset_phys(ds)->ds_referenced_bytes, >=, used); in dsl_dataset_block_kill()
366 dsl_dataset_phys(ds)->ds_referenced_bytes -= used; in dsl_dataset_block_kill()
367 ASSERT3U(dsl_dataset_phys(ds)->ds_compressed_bytes, >=, compressed); in dsl_dataset_block_kill()
368 dsl_dataset_phys(ds)->ds_compressed_bytes -= compressed; in dsl_dataset_block_kill()
369 ASSERT3U(dsl_dataset_phys(ds)->ds_uncompressed_bytes, >=, uncompressed); in dsl_dataset_block_kill()
370 dsl_dataset_phys(ds)->ds_uncompressed_bytes -= uncompressed; in dsl_dataset_block_kill()
371 mutex_exit(&ds->ds_lock); in dsl_dataset_block_kill()
382 unload_zfeature(dsl_dataset_t *ds, spa_feature_t f) in unload_zfeature() argument
389 struct feature_type_uint64_array_arg *ftuaa = ds->ds_feature[f]; in unload_zfeature()
400 load_zfeature(objset_t *mos, dsl_dataset_t *ds, spa_feature_t f) in load_zfeature() argument
405 err = zap_contains(mos, ds->ds_object, in load_zfeature()
408 ds->ds_feature[f] = (void *)B_TRUE; in load_zfeature()
418 err = zap_length(mos, ds->ds_object, in load_zfeature()
427 VERIFY0(zap_lookup(mos, ds->ds_object, in load_zfeature()
433 ds->ds_feature[f] = ftuaa; in load_zfeature()
451 dsl_dataset_t *ds = dbu; in dsl_dataset_evict_sync() local
453 ASSERT(ds->ds_owner == NULL); in dsl_dataset_evict_sync()
455 unique_remove(ds->ds_fsid_guid); in dsl_dataset_evict_sync()
461 dsl_dataset_t *ds = dbu; in dsl_dataset_evict_async() local
463 ASSERT(ds->ds_owner == NULL); in dsl_dataset_evict_async()
465 ds->ds_dbuf = NULL; in dsl_dataset_evict_async()
467 if (ds->ds_objset != NULL) in dsl_dataset_evict_async()
468 dmu_objset_evict(ds->ds_objset); in dsl_dataset_evict_async()
470 if (ds->ds_prev) { in dsl_dataset_evict_async()
471 dsl_dataset_rele(ds->ds_prev, ds); in dsl_dataset_evict_async()
472 ds->ds_prev = NULL; in dsl_dataset_evict_async()
475 dsl_bookmark_fini_ds(ds); in dsl_dataset_evict_async()
477 bplist_destroy(&ds->ds_pending_deadlist); in dsl_dataset_evict_async()
478 if (dsl_deadlist_is_open(&ds->ds_deadlist)) in dsl_dataset_evict_async()
479 dsl_deadlist_close(&ds->ds_deadlist); in dsl_dataset_evict_async()
480 if (dsl_deadlist_is_open(&ds->ds_remap_deadlist)) in dsl_dataset_evict_async()
481 dsl_deadlist_close(&ds->ds_remap_deadlist); in dsl_dataset_evict_async()
482 if (ds->ds_dir) in dsl_dataset_evict_async()
483 dsl_dir_async_rele(ds->ds_dir, ds); in dsl_dataset_evict_async()
485 ASSERT(!list_link_active(&ds->ds_synced_link)); in dsl_dataset_evict_async()
488 if (dsl_dataset_feature_is_active(ds, f)) in dsl_dataset_evict_async()
489 unload_zfeature(ds, f); in dsl_dataset_evict_async()
492 list_destroy(&ds->ds_prop_cbs); in dsl_dataset_evict_async()
493 mutex_destroy(&ds->ds_lock); in dsl_dataset_evict_async()
494 mutex_destroy(&ds->ds_opening_lock); in dsl_dataset_evict_async()
495 mutex_destroy(&ds->ds_sendstream_lock); in dsl_dataset_evict_async()
496 mutex_destroy(&ds->ds_remap_deadlist_lock); in dsl_dataset_evict_async()
497 zfs_refcount_destroy(&ds->ds_longholds); in dsl_dataset_evict_async()
498 rrw_destroy(&ds->ds_bp_rwlock); in dsl_dataset_evict_async()
500 kmem_free(ds, sizeof (dsl_dataset_t)); in dsl_dataset_evict_async()
504 dsl_dataset_get_snapname(dsl_dataset_t *ds) in dsl_dataset_get_snapname() argument
509 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_dataset_get_snapname()
512 if (ds->ds_snapname[0]) in dsl_dataset_get_snapname()
514 if (dsl_dataset_phys(ds)->ds_next_snap_obj == 0) in dsl_dataset_get_snapname()
517 err = dmu_bonus_hold(mos, dsl_dir_phys(ds->ds_dir)->dd_head_dataset_obj, in dsl_dataset_get_snapname()
523 headphys->ds_snapnames_zapobj, ds->ds_object, 0, ds->ds_snapname, in dsl_dataset_get_snapname()
524 sizeof (ds->ds_snapname)); in dsl_dataset_get_snapname()
527 (void) snprintf(ds->ds_snapname, sizeof (ds->ds_snapname), in dsl_dataset_get_snapname()
529 (unsigned long long)ds->ds_object, err); in dsl_dataset_get_snapname()
536 dsl_dataset_snap_lookup(dsl_dataset_t *ds, const char *name, uint64_t *value) in dsl_dataset_snap_lookup() argument
538 objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset; in dsl_dataset_snap_lookup()
539 uint64_t snapobj = dsl_dataset_phys(ds)->ds_snapnames_zapobj; in dsl_dataset_snap_lookup()
543 if (dsl_dataset_phys(ds)->ds_flags & DS_FLAG_CI_DATASET) in dsl_dataset_snap_lookup()
554 dsl_dataset_snap_remove(dsl_dataset_t *ds, const char *name, dmu_tx_t *tx, in dsl_dataset_snap_remove() argument
557 objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset; in dsl_dataset_snap_remove()
558 uint64_t snapobj = dsl_dataset_phys(ds)->ds_snapnames_zapobj; in dsl_dataset_snap_remove()
562 dsl_dir_snap_cmtime_update(ds->ds_dir, tx); in dsl_dataset_snap_remove()
564 if (dsl_dataset_phys(ds)->ds_flags & DS_FLAG_CI_DATASET) in dsl_dataset_snap_remove()
572 dsl_fs_ss_count_adjust(ds->ds_dir, -1, in dsl_dataset_snap_remove()
579 dsl_dataset_try_add_ref(dsl_pool_t *dp, dsl_dataset_t *ds, const void *tag) in dsl_dataset_try_add_ref() argument
581 dmu_buf_t *dbuf = ds->ds_dbuf; in dsl_dataset_try_add_ref()
585 ds->ds_object, DMU_BONUS_BLKID, tag)) { in dsl_dataset_try_add_ref()
587 if (ds == dmu_buf_get_user(dbuf)) in dsl_dataset_try_add_ref()
602 dsl_dataset_t *ds; in dsl_dataset_hold_obj() local
619 ds = dmu_buf_get_user(dbuf); in dsl_dataset_hold_obj()
620 if (ds == NULL) { in dsl_dataset_hold_obj()
623 ds = kmem_zalloc(sizeof (dsl_dataset_t), KM_SLEEP); in dsl_dataset_hold_obj()
624 ds->ds_dbuf = dbuf; in dsl_dataset_hold_obj()
625 ds->ds_object = dsobj; in dsl_dataset_hold_obj()
626 ds->ds_is_snapshot = dsl_dataset_phys(ds)->ds_num_children != 0; in dsl_dataset_hold_obj()
627 list_link_init(&ds->ds_synced_link); in dsl_dataset_hold_obj()
629 err = dsl_dir_hold_obj(dp, dsl_dataset_phys(ds)->ds_dir_obj, in dsl_dataset_hold_obj()
630 NULL, ds, &ds->ds_dir); in dsl_dataset_hold_obj()
632 kmem_free(ds, sizeof (dsl_dataset_t)); in dsl_dataset_hold_obj()
637 mutex_init(&ds->ds_lock, NULL, MUTEX_DEFAULT, NULL); in dsl_dataset_hold_obj()
638 mutex_init(&ds->ds_opening_lock, NULL, MUTEX_DEFAULT, NULL); in dsl_dataset_hold_obj()
639 mutex_init(&ds->ds_sendstream_lock, NULL, MUTEX_DEFAULT, NULL); in dsl_dataset_hold_obj()
640 mutex_init(&ds->ds_remap_deadlist_lock, in dsl_dataset_hold_obj()
642 rrw_init(&ds->ds_bp_rwlock, B_FALSE); in dsl_dataset_hold_obj()
643 zfs_refcount_create(&ds->ds_longholds); in dsl_dataset_hold_obj()
645 bplist_create(&ds->ds_pending_deadlist); in dsl_dataset_hold_obj()
647 list_create(&ds->ds_sendstreams, sizeof (dmu_sendstatus_t), in dsl_dataset_hold_obj()
650 list_create(&ds->ds_prop_cbs, sizeof (dsl_prop_cb_record_t), in dsl_dataset_hold_obj()
660 err = load_zfeature(mos, ds, f); in dsl_dataset_hold_obj()
664 if (!ds->ds_is_snapshot) { in dsl_dataset_hold_obj()
665 ds->ds_snapname[0] = '\0'; in dsl_dataset_hold_obj()
666 if (dsl_dataset_phys(ds)->ds_prev_snap_obj != 0) { in dsl_dataset_hold_obj()
668 dsl_dataset_phys(ds)->ds_prev_snap_obj, in dsl_dataset_hold_obj()
669 ds, &ds->ds_prev); in dsl_dataset_hold_obj()
673 err = dsl_bookmark_init_ds(ds); in dsl_dataset_hold_obj()
676 err = dsl_dataset_get_snapname(ds); in dsl_dataset_hold_obj()
678 dsl_dataset_phys(ds)->ds_userrefs_obj != 0) { in dsl_dataset_hold_obj()
680 ds->ds_dir->dd_pool->dp_meta_objset, in dsl_dataset_hold_obj()
681 dsl_dataset_phys(ds)->ds_userrefs_obj, in dsl_dataset_hold_obj()
682 &ds->ds_userrefs); in dsl_dataset_hold_obj()
686 if (err == 0 && !ds->ds_is_snapshot) { in dsl_dataset_hold_obj()
687 err = dsl_prop_get_int_ds(ds, in dsl_dataset_hold_obj()
689 &ds->ds_reserved); in dsl_dataset_hold_obj()
691 err = dsl_prop_get_int_ds(ds, in dsl_dataset_hold_obj()
693 &ds->ds_quota); in dsl_dataset_hold_obj()
696 ds->ds_reserved = ds->ds_quota = 0; in dsl_dataset_hold_obj()
699 if (err == 0 && ds->ds_dir->dd_crypto_obj != 0 && in dsl_dataset_hold_obj()
700 ds->ds_is_snapshot && in dsl_dataset_hold_obj()
707 err = dsl_deadlist_open(&ds->ds_deadlist, in dsl_dataset_hold_obj()
708 mos, dsl_dataset_phys(ds)->ds_deadlist_obj); in dsl_dataset_hold_obj()
712 dsl_dataset_get_remap_deadlist_object(ds); in dsl_dataset_hold_obj()
714 err = dsl_deadlist_open(&ds->ds_remap_deadlist, in dsl_dataset_hold_obj()
719 dmu_buf_init_user(&ds->ds_dbu, dsl_dataset_evict_sync, in dsl_dataset_hold_obj()
720 dsl_dataset_evict_async, &ds->ds_dbuf); in dsl_dataset_hold_obj()
722 winner = dmu_buf_set_user_ie(dbuf, &ds->ds_dbu); in dsl_dataset_hold_obj()
725 if (dsl_deadlist_is_open(&ds->ds_deadlist)) in dsl_dataset_hold_obj()
726 dsl_deadlist_close(&ds->ds_deadlist); in dsl_dataset_hold_obj()
727 if (dsl_deadlist_is_open(&ds->ds_remap_deadlist)) in dsl_dataset_hold_obj()
728 dsl_deadlist_close(&ds->ds_remap_deadlist); in dsl_dataset_hold_obj()
729 dsl_bookmark_fini_ds(ds); in dsl_dataset_hold_obj()
731 if (ds->ds_prev) in dsl_dataset_hold_obj()
732 dsl_dataset_rele(ds->ds_prev, ds); in dsl_dataset_hold_obj()
733 dsl_dir_rele(ds->ds_dir, ds); in dsl_dataset_hold_obj()
735 if (dsl_dataset_feature_is_active(ds, f)) in dsl_dataset_hold_obj()
736 unload_zfeature(ds, f); in dsl_dataset_hold_obj()
739 list_destroy(&ds->ds_prop_cbs); in dsl_dataset_hold_obj()
740 list_destroy(&ds->ds_sendstreams); in dsl_dataset_hold_obj()
741 bplist_destroy(&ds->ds_pending_deadlist); in dsl_dataset_hold_obj()
742 mutex_destroy(&ds->ds_lock); in dsl_dataset_hold_obj()
743 mutex_destroy(&ds->ds_opening_lock); in dsl_dataset_hold_obj()
744 mutex_destroy(&ds->ds_sendstream_lock); in dsl_dataset_hold_obj()
745 mutex_destroy(&ds->ds_remap_deadlist_lock); in dsl_dataset_hold_obj()
746 zfs_refcount_destroy(&ds->ds_longholds); in dsl_dataset_hold_obj()
747 rrw_destroy(&ds->ds_bp_rwlock); in dsl_dataset_hold_obj()
748 kmem_free(ds, sizeof (dsl_dataset_t)); in dsl_dataset_hold_obj()
753 ds = winner; in dsl_dataset_hold_obj()
755 ds->ds_fsid_guid = in dsl_dataset_hold_obj()
756 unique_insert(dsl_dataset_phys(ds)->ds_fsid_guid); in dsl_dataset_hold_obj()
757 if (ds->ds_fsid_guid != in dsl_dataset_hold_obj()
758 dsl_dataset_phys(ds)->ds_fsid_guid) { in dsl_dataset_hold_obj()
762 dsl_dataset_phys(ds)->ds_fsid_guid, in dsl_dataset_hold_obj()
763 (long long)ds->ds_fsid_guid, in dsl_dataset_hold_obj()
770 ASSERT3P(ds->ds_dbuf, ==, dbuf); in dsl_dataset_hold_obj()
771 ASSERT3P(dsl_dataset_phys(ds), ==, dbuf->db_data); in dsl_dataset_hold_obj()
772 ASSERT(dsl_dataset_phys(ds)->ds_prev_snap_obj != 0 || in dsl_dataset_hold_obj()
774 dp->dp_origin_snap == NULL || ds == dp->dp_origin_snap); in dsl_dataset_hold_obj()
775 *dsp = ds; in dsl_dataset_hold_obj()
781 dsl_dataset_create_key_mapping(dsl_dataset_t *ds) in dsl_dataset_create_key_mapping() argument
783 dsl_dir_t *dd = ds->ds_dir; in dsl_dataset_create_key_mapping()
789 ds, ds, &ds->ds_key_mapping)); in dsl_dataset_create_key_mapping()
821 dsl_dataset_t *ds; in dsl_dataset_hold_flags() local
830 err = dsl_dataset_hold_obj_flags(dp, obj, flags, tag, &ds); in dsl_dataset_hold_flags()
839 dsl_dataset_rele_flags(ds, flags, tag); in dsl_dataset_hold_flags()
845 err = dsl_dataset_snap_lookup(ds, snapname, &obj); in dsl_dataset_hold_flags()
850 dsl_dataset_rele_flags(ds, flags, tag); in dsl_dataset_hold_flags()
858 ds = snap_ds; in dsl_dataset_hold_flags()
862 *dsp = ds; in dsl_dataset_hold_flags()
942 dsl_dataset_long_hold(dsl_dataset_t *ds, const void *tag) in dsl_dataset_long_hold() argument
944 ASSERT(dsl_pool_config_held(ds->ds_dir->dd_pool)); in dsl_dataset_long_hold()
945 (void) zfs_refcount_add(&ds->ds_longholds, tag); in dsl_dataset_long_hold()
949 dsl_dataset_long_rele(dsl_dataset_t *ds, const void *tag) in dsl_dataset_long_rele() argument
951 (void) zfs_refcount_remove(&ds->ds_longholds, tag); in dsl_dataset_long_rele()
956 dsl_dataset_long_held(dsl_dataset_t *ds) in dsl_dataset_long_held() argument
958 return (!zfs_refcount_is_zero(&ds->ds_longholds)); in dsl_dataset_long_held()
962 dsl_dataset_name(dsl_dataset_t *ds, char *name) in dsl_dataset_name() argument
964 if (ds == NULL) { in dsl_dataset_name()
967 dsl_dir_name(ds->ds_dir, name); in dsl_dataset_name()
968 VERIFY0(dsl_dataset_get_snapname(ds)); in dsl_dataset_name()
969 if (ds->ds_snapname[0]) { in dsl_dataset_name()
976 if (!MUTEX_HELD(&ds->ds_lock)) { in dsl_dataset_name()
977 mutex_enter(&ds->ds_lock); in dsl_dataset_name()
978 VERIFY3U(strlcat(name, ds->ds_snapname, in dsl_dataset_name()
981 mutex_exit(&ds->ds_lock); in dsl_dataset_name()
983 VERIFY3U(strlcat(name, ds->ds_snapname, in dsl_dataset_name()
992 dsl_dataset_namelen(dsl_dataset_t *ds) in dsl_dataset_namelen() argument
994 VERIFY0(dsl_dataset_get_snapname(ds)); in dsl_dataset_namelen()
995 mutex_enter(&ds->ds_lock); in dsl_dataset_namelen()
996 int len = strlen(ds->ds_snapname); in dsl_dataset_namelen()
997 mutex_exit(&ds->ds_lock); in dsl_dataset_namelen()
1001 len += dsl_dir_namelen(ds->ds_dir); in dsl_dataset_namelen()
1006 dsl_dataset_rele(dsl_dataset_t *ds, const void *tag) in dsl_dataset_rele() argument
1008 dmu_buf_rele(ds->ds_dbuf, tag); in dsl_dataset_rele()
1012 dsl_dataset_remove_key_mapping(dsl_dataset_t *ds) in dsl_dataset_remove_key_mapping() argument
1014 dsl_dir_t *dd = ds->ds_dir; in dsl_dataset_remove_key_mapping()
1020 ds->ds_object, ds); in dsl_dataset_remove_key_mapping()
1024 dsl_dataset_rele_flags(dsl_dataset_t *ds, ds_hold_flags_t flags, in dsl_dataset_rele_flags() argument
1028 dsl_dataset_remove_key_mapping(ds); in dsl_dataset_rele_flags()
1030 dsl_dataset_rele(ds, tag); in dsl_dataset_rele_flags()
1034 dsl_dataset_disown(dsl_dataset_t *ds, ds_hold_flags_t flags, const void *tag) in dsl_dataset_disown() argument
1036 ASSERT3P(ds->ds_owner, ==, tag); in dsl_dataset_disown()
1037 ASSERT(ds->ds_dbuf != NULL); in dsl_dataset_disown()
1039 mutex_enter(&ds->ds_lock); in dsl_dataset_disown()
1040 ds->ds_owner = NULL; in dsl_dataset_disown()
1041 mutex_exit(&ds->ds_lock); in dsl_dataset_disown()
1042 dsl_dataset_long_rele(ds, tag); in dsl_dataset_disown()
1043 dsl_dataset_rele_flags(ds, flags, tag); in dsl_dataset_disown()
1047 dsl_dataset_tryown(dsl_dataset_t *ds, const void *tag, boolean_t override) in dsl_dataset_tryown() argument
1051 ASSERT(dsl_pool_config_held(ds->ds_dir->dd_pool)); in dsl_dataset_tryown()
1052 mutex_enter(&ds->ds_lock); in dsl_dataset_tryown()
1053 if (ds->ds_owner == NULL && (override || !(DS_IS_INCONSISTENT(ds) || in dsl_dataset_tryown()
1054 (dsl_dataset_feature_is_active(ds, in dsl_dataset_tryown()
1057 ds->ds_owner = tag; in dsl_dataset_tryown()
1058 dsl_dataset_long_hold(ds, tag); in dsl_dataset_tryown()
1061 mutex_exit(&ds->ds_lock); in dsl_dataset_tryown()
1066 dsl_dataset_has_owner(dsl_dataset_t *ds) in dsl_dataset_has_owner() argument
1069 mutex_enter(&ds->ds_lock); in dsl_dataset_has_owner()
1070 rv = (ds->ds_owner != NULL); in dsl_dataset_has_owner()
1071 mutex_exit(&ds->ds_lock); in dsl_dataset_has_owner()
1097 dsl_dataset_feature_is_active(dsl_dataset_t *ds, spa_feature_t f) in dsl_dataset_feature_is_active() argument
1099 return (zfeature_active(f, ds->ds_feature[f])); in dsl_dataset_feature_is_active()
1108 dsl_dataset_get_uint64_array_feature(dsl_dataset_t *ds, spa_feature_t f, in dsl_dataset_get_uint64_array_feature() argument
1112 if (!dsl_dataset_feature_is_active(ds, f)) { in dsl_dataset_get_uint64_array_feature()
1115 struct feature_type_uint64_array_arg *ftuaa = ds->ds_feature[f]; in dsl_dataset_get_uint64_array_feature()
1153 dsl_dataset_deactivate_feature_impl(dsl_dataset_t *ds, spa_feature_t f, in dsl_dataset_deactivate_feature_impl() argument
1158 uint64_t dsobj = ds->ds_object; in dsl_dataset_deactivate_feature_impl()
1164 ds->ds_feature[f] = NULL; in dsl_dataset_deactivate_feature_impl()
1168 dsl_dataset_deactivate_feature(dsl_dataset_t *ds, spa_feature_t f, dmu_tx_t *tx) in dsl_dataset_deactivate_feature() argument
1170 unload_zfeature(ds, f); in dsl_dataset_deactivate_feature()
1171 dsl_dataset_deactivate_feature_impl(ds, f, tx); in dsl_dataset_deactivate_feature()
1292 dsl_dataset_zero_zil(dsl_dataset_t *ds, dmu_tx_t *tx) in dsl_dataset_zero_zil() argument
1296 VERIFY0(dmu_objset_from_ds(ds, &os)); in dsl_dataset_zero_zil()
1298 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_dataset_zero_zil()
1306 dsl_dataset_sync(ds, zio, tx); in dsl_dataset_zero_zil()
1308 dsl_dataset_sync_done(ds, tx); in dsl_dataset_zero_zil()
1376 dsl_dataset_t *ds; in dsl_dataset_create_sync() local
1378 VERIFY0(dsl_dataset_hold_obj(dp, dsobj, FTAG, &ds)); in dsl_dataset_create_sync()
1379 dsl_dataset_zero_zil(ds, tx); in dsl_dataset_create_sync()
1380 dsl_dataset_rele(ds, FTAG); in dsl_dataset_create_sync()
1395 dsl_dataset_recalc_head_uniq(dsl_dataset_t *ds) in dsl_dataset_recalc_head_uniq() argument
1400 ASSERT(!ds->ds_is_snapshot); in dsl_dataset_recalc_head_uniq()
1402 if (dsl_dataset_phys(ds)->ds_prev_snap_obj != 0) in dsl_dataset_recalc_head_uniq()
1403 mrs_used = dsl_dataset_phys(ds->ds_prev)->ds_referenced_bytes; in dsl_dataset_recalc_head_uniq()
1407 dsl_deadlist_space(&ds->ds_deadlist, &dlused, &dlcomp, &dluncomp); in dsl_dataset_recalc_head_uniq()
1410 dsl_dataset_phys(ds)->ds_unique_bytes = in dsl_dataset_recalc_head_uniq()
1411 dsl_dataset_phys(ds)->ds_referenced_bytes - (mrs_used - dlused); in dsl_dataset_recalc_head_uniq()
1413 if (spa_version(ds->ds_dir->dd_pool->dp_spa) >= in dsl_dataset_recalc_head_uniq()
1415 dsl_dataset_phys(ds)->ds_flags |= DS_FLAG_UNIQUE_ACCURATE; in dsl_dataset_recalc_head_uniq()
1419 dsl_dataset_remove_from_next_clones(dsl_dataset_t *ds, uint64_t obj, in dsl_dataset_remove_from_next_clones() argument
1422 objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset; in dsl_dataset_remove_from_next_clones()
1426 ASSERT(dsl_dataset_phys(ds)->ds_num_children >= 2); in dsl_dataset_remove_from_next_clones()
1427 err = zap_remove_int(mos, dsl_dataset_phys(ds)->ds_next_clones_obj, in dsl_dataset_remove_from_next_clones()
1441 ASSERT0(zap_count(mos, dsl_dataset_phys(ds)->ds_next_clones_obj, in dsl_dataset_remove_from_next_clones()
1443 ASSERT3U(count, <=, dsl_dataset_phys(ds)->ds_num_children - 2); in dsl_dataset_remove_from_next_clones()
1448 dsl_dataset_get_blkptr(dsl_dataset_t *ds) in dsl_dataset_get_blkptr() argument
1450 return (&dsl_dataset_phys(ds)->ds_bp); in dsl_dataset_get_blkptr()
1454 dsl_dataset_get_spa(dsl_dataset_t *ds) in dsl_dataset_get_spa() argument
1456 return (ds->ds_dir->dd_pool->dp_spa); in dsl_dataset_get_spa()
1460 dsl_dataset_dirty(dsl_dataset_t *ds, dmu_tx_t *tx) in dsl_dataset_dirty() argument
1464 if (ds == NULL) /* this is the meta-objset */ in dsl_dataset_dirty()
1467 ASSERT(ds->ds_objset != NULL); in dsl_dataset_dirty()
1469 if (dsl_dataset_phys(ds)->ds_next_snap_obj != 0) in dsl_dataset_dirty()
1473 ASSERT3U(tx->tx_txg, >, dsl_dataset_phys(ds)->ds_prev_snap_txg); in dsl_dataset_dirty()
1475 dp = ds->ds_dir->dd_pool; in dsl_dataset_dirty()
1476 if (txg_list_add(&dp->dp_dirty_datasets, ds, tx->tx_txg)) { in dsl_dataset_dirty()
1477 objset_t *os = ds->ds_objset; in dsl_dataset_dirty()
1480 dmu_buf_add_ref(ds->ds_dbuf, ds); in dsl_dataset_dirty()
1483 if (ds->ds_dir->dd_crypto_obj != 0 && in dsl_dataset_dirty()
1486 ASSERT3P(ds->ds_key_mapping, !=, NULL); in dsl_dataset_dirty()
1487 key_mapping_add_ref(ds->ds_key_mapping, ds); in dsl_dataset_dirty()
1493 dsl_dataset_snapshot_reserve_space(dsl_dataset_t *ds, dmu_tx_t *tx) in dsl_dataset_snapshot_reserve_space() argument
1505 ASSERT(ds->ds_reserved == 0 || DS_UNIQUE_IS_ACCURATE(ds)); in dsl_dataset_snapshot_reserve_space()
1506 asize = MIN(dsl_dataset_phys(ds)->ds_unique_bytes, ds->ds_reserved); in dsl_dataset_snapshot_reserve_space()
1507 if (asize > dsl_dir_space_available(ds->ds_dir, NULL, 0, TRUE)) in dsl_dataset_snapshot_reserve_space()
1515 dsl_dir_willuse_space(ds->ds_dir, asize, tx); in dsl_dataset_snapshot_reserve_space()
1521 dsl_dataset_snapshot_check_impl(dsl_dataset_t *ds, const char *snapname, in dsl_dataset_snapshot_check_impl() argument
1527 ds->ds_trysnap_txg = tx->tx_txg; in dsl_dataset_snapshot_check_impl()
1536 if (dsl_dataset_phys(ds)->ds_prev_snap_txg >= tx->tx_txg) in dsl_dataset_snapshot_check_impl()
1542 error = dsl_dataset_snap_lookup(ds, snapname, &value); in dsl_dataset_snapshot_check_impl()
1557 if (!recv && DS_IS_INCONSISTENT(ds)) in dsl_dataset_snapshot_check_impl()
1566 error = dsl_fs_ss_limit_check(ds->ds_dir, cnt, in dsl_dataset_snapshot_check_impl()
1572 error = dsl_dataset_snapshot_reserve_space(ds, tx); in dsl_dataset_snapshot_check_impl()
1658 dsl_dataset_t *ds; in dsl_dataset_snapshot_check() local
1664 error = dsl_dataset_hold(dp, name, FTAG, &ds); in dsl_dataset_snapshot_check()
1666 error = dsl_fs_ss_limit_check(ds->ds_dir, cnt, in dsl_dataset_snapshot_check()
1669 dsl_dataset_rele(ds, FTAG); in dsl_dataset_snapshot_check()
1687 dsl_dataset_t *ds; in dsl_dataset_snapshot_check() local
1702 error = dsl_dataset_hold(dp, dsname, FTAG, &ds); in dsl_dataset_snapshot_check()
1705 error = dsl_dataset_snapshot_check_impl(ds, in dsl_dataset_snapshot_check()
1707 dsl_dataset_rele(ds, FTAG); in dsl_dataset_snapshot_check()
1723 dsl_dataset_snapshot_sync_impl(dsl_dataset_t *ds, const char *snapname, in dsl_dataset_snapshot_sync_impl() argument
1726 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_dataset_snapshot_sync_impl()
1740 dmu_objset_from_ds(ds, &os) != 0 || in dsl_dataset_snapshot_sync_impl()
1745 ASSERT(!txg_list_member(&ds->ds_dir->dd_pool->dp_dirty_datasets, in dsl_dataset_snapshot_sync_impl()
1746 ds, tx->tx_txg)); in dsl_dataset_snapshot_sync_impl()
1748 dsl_fs_ss_count_adjust(ds->ds_dir, 1, DD_FIELD_SNAPSHOT_COUNT, tx); in dsl_dataset_snapshot_sync_impl()
1764 dsphys->ds_dir_obj = ds->ds_dir->dd_object; in dsl_dataset_snapshot_sync_impl()
1768 dsphys->ds_prev_snap_obj = dsl_dataset_phys(ds)->ds_prev_snap_obj; in dsl_dataset_snapshot_sync_impl()
1769 dsphys->ds_prev_snap_txg = dsl_dataset_phys(ds)->ds_prev_snap_txg; in dsl_dataset_snapshot_sync_impl()
1770 dsphys->ds_next_snap_obj = ds->ds_object; in dsl_dataset_snapshot_sync_impl()
1774 dsphys->ds_deadlist_obj = dsl_dataset_phys(ds)->ds_deadlist_obj; in dsl_dataset_snapshot_sync_impl()
1775 dsphys->ds_referenced_bytes = dsl_dataset_phys(ds)->ds_referenced_bytes; in dsl_dataset_snapshot_sync_impl()
1776 dsphys->ds_compressed_bytes = dsl_dataset_phys(ds)->ds_compressed_bytes; in dsl_dataset_snapshot_sync_impl()
1778 dsl_dataset_phys(ds)->ds_uncompressed_bytes; in dsl_dataset_snapshot_sync_impl()
1779 dsphys->ds_flags = dsl_dataset_phys(ds)->ds_flags; in dsl_dataset_snapshot_sync_impl()
1780 rrw_enter(&ds->ds_bp_rwlock, RW_READER, FTAG); in dsl_dataset_snapshot_sync_impl()
1781 dsphys->ds_bp = dsl_dataset_phys(ds)->ds_bp; in dsl_dataset_snapshot_sync_impl()
1782 rrw_exit(&ds->ds_bp_rwlock, FTAG); in dsl_dataset_snapshot_sync_impl()
1786 if (zfeature_active(f, ds->ds_feature[f])) { in dsl_dataset_snapshot_sync_impl()
1788 ds->ds_feature[f], tx); in dsl_dataset_snapshot_sync_impl()
1792 ASSERT3U(ds->ds_prev != 0, ==, in dsl_dataset_snapshot_sync_impl()
1793 dsl_dataset_phys(ds)->ds_prev_snap_obj != 0); in dsl_dataset_snapshot_sync_impl()
1794 if (ds->ds_prev) { in dsl_dataset_snapshot_sync_impl()
1796 dsl_dataset_phys(ds->ds_prev)->ds_next_clones_obj; in dsl_dataset_snapshot_sync_impl()
1797 ASSERT(dsl_dataset_phys(ds->ds_prev)->ds_next_snap_obj == in dsl_dataset_snapshot_sync_impl()
1798 ds->ds_object || in dsl_dataset_snapshot_sync_impl()
1799 dsl_dataset_phys(ds->ds_prev)->ds_num_children > 1); in dsl_dataset_snapshot_sync_impl()
1800 if (dsl_dataset_phys(ds->ds_prev)->ds_next_snap_obj == in dsl_dataset_snapshot_sync_impl()
1801 ds->ds_object) { in dsl_dataset_snapshot_sync_impl()
1802 dmu_buf_will_dirty(ds->ds_prev->ds_dbuf, tx); in dsl_dataset_snapshot_sync_impl()
1803 ASSERT3U(dsl_dataset_phys(ds)->ds_prev_snap_txg, ==, in dsl_dataset_snapshot_sync_impl()
1804 dsl_dataset_phys(ds->ds_prev)->ds_creation_txg); in dsl_dataset_snapshot_sync_impl()
1805 dsl_dataset_phys(ds->ds_prev)->ds_next_snap_obj = dsobj; in dsl_dataset_snapshot_sync_impl()
1807 dsl_dataset_remove_from_next_clones(ds->ds_prev, in dsl_dataset_snapshot_sync_impl()
1819 if (ds->ds_reserved) { in dsl_dataset_snapshot_sync_impl()
1821 ASSERT(DS_UNIQUE_IS_ACCURATE(ds)); in dsl_dataset_snapshot_sync_impl()
1822 delta = MIN(dsl_dataset_phys(ds)->ds_unique_bytes, in dsl_dataset_snapshot_sync_impl()
1823 ds->ds_reserved); in dsl_dataset_snapshot_sync_impl()
1824 dsl_dir_diduse_space(ds->ds_dir, DD_USED_REFRSRV, in dsl_dataset_snapshot_sync_impl()
1828 dmu_buf_will_dirty(ds->ds_dbuf, tx); in dsl_dataset_snapshot_sync_impl()
1829 dsl_dataset_phys(ds)->ds_deadlist_obj = in dsl_dataset_snapshot_sync_impl()
1830 dsl_deadlist_clone(&ds->ds_deadlist, UINT64_MAX, in dsl_dataset_snapshot_sync_impl()
1831 dsl_dataset_phys(ds)->ds_prev_snap_obj, tx); in dsl_dataset_snapshot_sync_impl()
1832 dsl_deadlist_close(&ds->ds_deadlist); in dsl_dataset_snapshot_sync_impl()
1833 VERIFY0(dsl_deadlist_open(&ds->ds_deadlist, mos, in dsl_dataset_snapshot_sync_impl()
1834 dsl_dataset_phys(ds)->ds_deadlist_obj)); in dsl_dataset_snapshot_sync_impl()
1835 dsl_deadlist_add_key(&ds->ds_deadlist, in dsl_dataset_snapshot_sync_impl()
1836 dsl_dataset_phys(ds)->ds_prev_snap_txg, tx); in dsl_dataset_snapshot_sync_impl()
1837 dsl_bookmark_snapshotted(ds, tx); in dsl_dataset_snapshot_sync_impl()
1839 if (dsl_dataset_remap_deadlist_exists(ds)) { in dsl_dataset_snapshot_sync_impl()
1841 dsl_dataset_get_remap_deadlist_object(ds); in dsl_dataset_snapshot_sync_impl()
1847 dsl_dataset_unset_remap_deadlist_object(ds, tx); in dsl_dataset_snapshot_sync_impl()
1848 dsl_deadlist_close(&ds->ds_remap_deadlist); in dsl_dataset_snapshot_sync_impl()
1870 if (ds->ds_dir->dd_crypto_obj != 0 && in dsl_dataset_snapshot_sync_impl()
1879 ASSERT3U(dsl_dataset_phys(ds)->ds_prev_snap_txg, <, tx->tx_txg); in dsl_dataset_snapshot_sync_impl()
1880 dsl_dataset_phys(ds)->ds_prev_snap_obj = dsobj; in dsl_dataset_snapshot_sync_impl()
1881 dsl_dataset_phys(ds)->ds_prev_snap_txg = crtxg; in dsl_dataset_snapshot_sync_impl()
1882 dsl_dataset_phys(ds)->ds_unique_bytes = 0; in dsl_dataset_snapshot_sync_impl()
1885 dsl_dataset_phys(ds)->ds_flags |= DS_FLAG_UNIQUE_ACCURATE; in dsl_dataset_snapshot_sync_impl()
1887 VERIFY0(zap_add(mos, dsl_dataset_phys(ds)->ds_snapnames_zapobj, in dsl_dataset_snapshot_sync_impl()
1890 if (ds->ds_prev) in dsl_dataset_snapshot_sync_impl()
1891 dsl_dataset_rele(ds->ds_prev, ds); in dsl_dataset_snapshot_sync_impl()
1893 dsl_dataset_phys(ds)->ds_prev_snap_obj, ds, &ds->ds_prev)); in dsl_dataset_snapshot_sync_impl()
1895 dsl_scan_ds_snapshotted(ds, tx); in dsl_dataset_snapshot_sync_impl()
1897 dsl_dir_snap_cmtime_update(ds->ds_dir, tx); in dsl_dataset_snapshot_sync_impl()
1900 spa_history_log_internal_ds(ds->ds_prev, "snapshot", tx, " "); in dsl_dataset_snapshot_sync_impl()
1912 dsl_dataset_t *ds; in dsl_dataset_snapshot_sync() local
1919 VERIFY0(dsl_dataset_hold(dp, dsname, FTAG, &ds)); in dsl_dataset_snapshot_sync()
1921 dsl_dataset_snapshot_sync_impl(ds, atp + 1, tx); in dsl_dataset_snapshot_sync()
1923 dsl_props_set_sync_impl(ds->ds_prev, in dsl_dataset_snapshot_sync()
1926 dsl_dataset_rele(ds, FTAG); in dsl_dataset_snapshot_sync()
2027 dsl_dataset_t *ds; in dsl_dataset_snapshot_tmp_check() local
2030 error = dsl_dataset_hold(dp, ddsta->ddsta_fsname, FTAG, &ds); in dsl_dataset_snapshot_tmp_check()
2035 error = dsl_dataset_snapshot_check_impl(ds, ddsta->ddsta_snapname, in dsl_dataset_snapshot_tmp_check()
2038 dsl_dataset_rele(ds, FTAG); in dsl_dataset_snapshot_tmp_check()
2043 dsl_dataset_rele(ds, FTAG); in dsl_dataset_snapshot_tmp_check()
2049 dsl_dataset_rele(ds, FTAG); in dsl_dataset_snapshot_tmp_check()
2053 dsl_dataset_rele(ds, FTAG); in dsl_dataset_snapshot_tmp_check()
2062 dsl_dataset_t *ds = NULL; in dsl_dataset_snapshot_tmp_sync() local
2064 VERIFY0(dsl_dataset_hold(dp, ddsta->ddsta_fsname, FTAG, &ds)); in dsl_dataset_snapshot_tmp_sync()
2066 dsl_dataset_snapshot_sync_impl(ds, ddsta->ddsta_snapname, tx); in dsl_dataset_snapshot_tmp_sync()
2067 dsl_dataset_user_hold_sync_one(ds->ds_prev, ddsta->ddsta_htag, in dsl_dataset_snapshot_tmp_sync()
2069 dsl_destroy_snapshot_sync_impl(ds->ds_prev, B_TRUE, tx); in dsl_dataset_snapshot_tmp_sync()
2071 dsl_dataset_rele(ds, FTAG); in dsl_dataset_snapshot_tmp_sync()
2111 dsl_dataset_sync(dsl_dataset_t *ds, zio_t *rio, dmu_tx_t *tx) in dsl_dataset_sync() argument
2114 ASSERT(ds->ds_objset != NULL); in dsl_dataset_sync()
2115 ASSERT(dsl_dataset_phys(ds)->ds_next_snap_obj == 0); in dsl_dataset_sync()
2121 dmu_buf_will_dirty(ds->ds_dbuf, tx); in dsl_dataset_sync()
2122 dsl_dataset_phys(ds)->ds_fsid_guid = ds->ds_fsid_guid; in dsl_dataset_sync()
2124 if (ds->ds_resume_bytes[tx->tx_txg & TXG_MASK] != 0) { in dsl_dataset_sync()
2126 ds->ds_object, DS_FIELD_RESUME_OBJECT, 8, 1, in dsl_dataset_sync()
2127 &ds->ds_resume_object[tx->tx_txg & TXG_MASK], tx)); in dsl_dataset_sync()
2129 ds->ds_object, DS_FIELD_RESUME_OFFSET, 8, 1, in dsl_dataset_sync()
2130 &ds->ds_resume_offset[tx->tx_txg & TXG_MASK], tx)); in dsl_dataset_sync()
2132 ds->ds_object, DS_FIELD_RESUME_BYTES, 8, 1, in dsl_dataset_sync()
2133 &ds->ds_resume_bytes[tx->tx_txg & TXG_MASK], tx)); in dsl_dataset_sync()
2134 ds->ds_resume_object[tx->tx_txg & TXG_MASK] = 0; in dsl_dataset_sync()
2135 ds->ds_resume_offset[tx->tx_txg & TXG_MASK] = 0; in dsl_dataset_sync()
2136 ds->ds_resume_bytes[tx->tx_txg & TXG_MASK] = 0; in dsl_dataset_sync()
2139 dmu_objset_sync(ds->ds_objset, rio, tx); in dsl_dataset_sync()
2148 dsl_livelist_should_disable(dsl_dataset_t *ds) in dsl_livelist_should_disable() argument
2153 used = dsl_dir_get_usedds(ds->ds_dir); in dsl_livelist_should_disable()
2154 referenced = dsl_get_referenced(ds); in dsl_livelist_should_disable()
2186 dsl_dataset_t *ds; member
2198 dsl_dataset_t *ds = tca->ds; in dsl_livelist_try_condense() local
2199 dsl_deadlist_t *ll = &ds->ds_dir->dd_livelist; in dsl_livelist_try_condense()
2207 if (spa->spa_to_condense.ds != NULL) in dsl_livelist_try_condense()
2228 dmu_buf_add_ref(ds->ds_dbuf, spa); in dsl_livelist_try_condense()
2230 spa->spa_to_condense.ds = ds; in dsl_livelist_try_condense()
2241 dsl_flush_pending_livelist(dsl_dataset_t *ds, dmu_tx_t *tx) in dsl_flush_pending_livelist() argument
2243 dsl_dir_t *dd = ds->ds_dir; in dsl_flush_pending_livelist()
2244 spa_t *spa = ds->ds_dir->dd_pool->dp_spa; in dsl_flush_pending_livelist()
2279 .ds = ds in dsl_flush_pending_livelist()
2286 dsl_dataset_sync_done(dsl_dataset_t *ds, dmu_tx_t *tx) in dsl_dataset_sync_done() argument
2288 objset_t *os = ds->ds_objset; in dsl_dataset_sync_done()
2290 bplist_iterate(&ds->ds_pending_deadlist, in dsl_dataset_sync_done()
2291 dsl_deadlist_insert_alloc_cb, &ds->ds_deadlist, tx); in dsl_dataset_sync_done()
2293 if (dsl_deadlist_is_open(&ds->ds_dir->dd_livelist)) { in dsl_dataset_sync_done()
2294 dsl_flush_pending_livelist(ds, tx); in dsl_dataset_sync_done()
2295 if (dsl_livelist_should_disable(ds)) { in dsl_dataset_sync_done()
2296 dsl_dir_remove_livelist(ds->ds_dir, tx, B_TRUE); in dsl_dataset_sync_done()
2300 dsl_bookmark_sync_done(ds, tx); in dsl_dataset_sync_done()
2311 ds->ds_feature_activation[f])) { in dsl_dataset_sync_done()
2312 if (zfeature_active(f, ds->ds_feature[f])) in dsl_dataset_sync_done()
2314 dsl_dataset_activate_feature(ds->ds_object, f, in dsl_dataset_sync_done()
2315 ds->ds_feature_activation[f], tx); in dsl_dataset_sync_done()
2316 ds->ds_feature[f] = ds->ds_feature_activation[f]; in dsl_dataset_sync_done()
2324 get_clones_stat_impl(dsl_dataset_t *ds, nvlist_t *val) in get_clones_stat_impl() argument
2327 objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset; in get_clones_stat_impl()
2331 ASSERT(dsl_pool_config_held(ds->ds_dir->dd_pool)); in get_clones_stat_impl()
2338 if (dsl_dataset_phys(ds)->ds_next_clones_obj != 0) { in get_clones_stat_impl()
2339 VERIFY0(zap_count(mos, dsl_dataset_phys(ds)->ds_next_clones_obj, in get_clones_stat_impl()
2342 if (count != dsl_dataset_phys(ds)->ds_num_children - 1) { in get_clones_stat_impl()
2348 dsl_dataset_phys(ds)->ds_next_clones_obj); in get_clones_stat_impl()
2353 VERIFY0(dsl_dataset_hold_obj(ds->ds_dir->dd_pool, in get_clones_stat_impl()
2365 get_clones_stat(dsl_dataset_t *ds, nvlist_t *nv) in get_clones_stat() argument
2370 if (get_clones_stat_impl(ds, val) == 0) { in get_clones_stat()
2381 get_receive_resume_token_impl(dsl_dataset_t *ds) in get_receive_resume_token_impl() argument
2383 if (!dsl_dataset_has_resume_receive_state(ds)) in get_receive_resume_token_impl()
2386 dsl_pool_t *dp = ds->ds_dir->dd_pool; in get_receive_resume_token_impl()
2394 if (zap_lookup(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_token_impl()
2398 if (zap_lookup(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_token_impl()
2402 if (zap_lookup(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_token_impl()
2406 if (zap_lookup(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_token_impl()
2410 if (zap_lookup(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_token_impl()
2415 if (zap_lookup(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_token_impl()
2419 if (zap_contains(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_token_impl()
2423 if (zap_contains(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_token_impl()
2427 if (zap_contains(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_token_impl()
2431 if (zap_contains(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_token_impl()
2435 if (dsl_dataset_feature_is_active(ds, in get_receive_resume_token_impl()
2439 VERIFY3B(dsl_dataset_get_uint64_array_feature(ds, in get_receive_resume_token_impl()
2445 if (zap_contains(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_token_impl()
2449 VERIFY0(zap_length(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_token_impl()
2456 VERIFY0(zap_lookup(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_token_impl()
2502 get_receive_resume_token(dsl_dataset_t *ds) in get_receive_resume_token() argument
2508 char *token = get_receive_resume_token_impl(ds); in get_receive_resume_token()
2519 dsl_dataset_name(ds, name); in get_receive_resume_token()
2522 dsl_dataset_hold(ds->ds_dir->dd_pool, name, FTAG, &recv_ds) == 0) { in get_receive_resume_token()
2530 dsl_get_refratio(dsl_dataset_t *ds) in dsl_get_refratio() argument
2532 uint64_t ratio = dsl_dataset_phys(ds)->ds_compressed_bytes == 0 ? 100 : in dsl_get_refratio()
2533 (dsl_dataset_phys(ds)->ds_uncompressed_bytes * 100 / in dsl_get_refratio()
2534 dsl_dataset_phys(ds)->ds_compressed_bytes); in dsl_get_refratio()
2539 dsl_get_logicalreferenced(dsl_dataset_t *ds) in dsl_get_logicalreferenced() argument
2541 return (dsl_dataset_phys(ds)->ds_uncompressed_bytes); in dsl_get_logicalreferenced()
2545 dsl_get_compressratio(dsl_dataset_t *ds) in dsl_get_compressratio() argument
2547 if (ds->ds_is_snapshot) { in dsl_get_compressratio()
2548 return (dsl_get_refratio(ds)); in dsl_get_compressratio()
2550 dsl_dir_t *dd = ds->ds_dir; in dsl_get_compressratio()
2559 dsl_get_used(dsl_dataset_t *ds) in dsl_get_used() argument
2561 if (ds->ds_is_snapshot) { in dsl_get_used()
2562 return (dsl_dataset_phys(ds)->ds_unique_bytes); in dsl_get_used()
2564 dsl_dir_t *dd = ds->ds_dir; in dsl_get_used()
2573 dsl_get_creation(dsl_dataset_t *ds) in dsl_get_creation() argument
2575 return (dsl_dataset_phys(ds)->ds_creation_time); in dsl_get_creation()
2579 dsl_get_creationtxg(dsl_dataset_t *ds) in dsl_get_creationtxg() argument
2581 return (dsl_dataset_phys(ds)->ds_creation_txg); in dsl_get_creationtxg()
2585 dsl_get_refquota(dsl_dataset_t *ds) in dsl_get_refquota() argument
2587 return (ds->ds_quota); in dsl_get_refquota()
2591 dsl_get_refreservation(dsl_dataset_t *ds) in dsl_get_refreservation() argument
2593 return (ds->ds_reserved); in dsl_get_refreservation()
2597 dsl_get_guid(dsl_dataset_t *ds) in dsl_get_guid() argument
2599 return (dsl_dataset_phys(ds)->ds_guid); in dsl_get_guid()
2603 dsl_get_unique(dsl_dataset_t *ds) in dsl_get_unique() argument
2605 return (dsl_dataset_phys(ds)->ds_unique_bytes); in dsl_get_unique()
2609 dsl_get_objsetid(dsl_dataset_t *ds) in dsl_get_objsetid() argument
2611 return (ds->ds_object); in dsl_get_objsetid()
2615 dsl_get_userrefs(dsl_dataset_t *ds) in dsl_get_userrefs() argument
2617 return (ds->ds_userrefs); in dsl_get_userrefs()
2621 dsl_get_defer_destroy(dsl_dataset_t *ds) in dsl_get_defer_destroy() argument
2623 return (DS_IS_DEFER_DESTROY(ds) ? 1 : 0); in dsl_get_defer_destroy()
2627 dsl_get_referenced(dsl_dataset_t *ds) in dsl_get_referenced() argument
2629 return (dsl_dataset_phys(ds)->ds_referenced_bytes); in dsl_get_referenced()
2633 dsl_get_numclones(dsl_dataset_t *ds) in dsl_get_numclones() argument
2635 ASSERT(ds->ds_is_snapshot); in dsl_get_numclones()
2636 return (dsl_dataset_phys(ds)->ds_num_children - 1); in dsl_get_numclones()
2640 dsl_get_inconsistent(dsl_dataset_t *ds) in dsl_get_inconsistent() argument
2642 return ((dsl_dataset_phys(ds)->ds_flags & DS_FLAG_INCONSISTENT) ? in dsl_get_inconsistent()
2647 dsl_get_redacted(dsl_dataset_t *ds) in dsl_get_redacted() argument
2649 return (dsl_dataset_feature_is_active(ds, in dsl_get_redacted()
2654 dsl_get_available(dsl_dataset_t *ds) in dsl_get_available() argument
2656 uint64_t refdbytes = dsl_get_referenced(ds); in dsl_get_available()
2657 uint64_t availbytes = dsl_dir_space_available(ds->ds_dir, in dsl_get_available()
2659 if (ds->ds_reserved > dsl_dataset_phys(ds)->ds_unique_bytes) { in dsl_get_available()
2661 ds->ds_reserved - dsl_dataset_phys(ds)->ds_unique_bytes; in dsl_get_available()
2663 if (ds->ds_quota != 0) { in dsl_get_available()
2667 if (refdbytes < ds->ds_quota) { in dsl_get_available()
2669 ds->ds_quota - refdbytes); in dsl_get_available()
2678 dsl_get_written(dsl_dataset_t *ds, uint64_t *written) in dsl_get_written() argument
2680 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_get_written()
2683 dsl_dataset_phys(ds)->ds_prev_snap_obj, FTAG, &prev); in dsl_get_written()
2686 err = dsl_dataset_space_written(prev, ds, written, in dsl_get_written()
2697 dsl_get_prev_snap(dsl_dataset_t *ds, char *snap) in dsl_get_prev_snap() argument
2699 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_get_prev_snap()
2700 if (ds->ds_prev != NULL && ds->ds_prev != dp->dp_origin_snap) { in dsl_get_prev_snap()
2701 dsl_dataset_name(ds->ds_prev, snap); in dsl_get_prev_snap()
2709 dsl_get_redact_snaps(dsl_dataset_t *ds, nvlist_t *propval) in dsl_get_redact_snaps() argument
2713 if (dsl_dataset_get_uint64_array_feature(ds, in dsl_get_redact_snaps()
2727 dsl_get_mountpoint(dsl_dataset_t *ds, const char *dsname, char *value, in dsl_get_mountpoint() argument
2731 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_get_mountpoint()
2734 error = dsl_prop_get_ds(ds, zfs_prop_to_name(ZFS_PROP_MOUNTPOINT), 1, in dsl_get_mountpoint()
2803 dsl_dataset_stats(dsl_dataset_t *ds, nvlist_t *nv) in dsl_dataset_stats() argument
2805 dsl_pool_t *dp __maybe_unused = ds->ds_dir->dd_pool; in dsl_dataset_stats()
2810 dsl_get_refratio(ds)); in dsl_dataset_stats()
2812 dsl_get_logicalreferenced(ds)); in dsl_dataset_stats()
2814 dsl_get_compressratio(ds)); in dsl_dataset_stats()
2816 dsl_get_used(ds)); in dsl_dataset_stats()
2818 if (ds->ds_is_snapshot) { in dsl_dataset_stats()
2819 get_clones_stat(ds, nv); in dsl_dataset_stats()
2822 if (dsl_get_prev_snap(ds, buf) == 0) in dsl_dataset_stats()
2825 dsl_dir_stats(ds->ds_dir, nv); in dsl_dataset_stats()
2829 dsl_get_redact_snaps(ds, propval); in dsl_dataset_stats()
2835 dsl_get_available(ds)); in dsl_dataset_stats()
2837 dsl_get_referenced(ds)); in dsl_dataset_stats()
2839 dsl_get_creation(ds)); in dsl_dataset_stats()
2841 dsl_get_creationtxg(ds)); in dsl_dataset_stats()
2843 dsl_get_refquota(ds)); in dsl_dataset_stats()
2845 dsl_get_refreservation(ds)); in dsl_dataset_stats()
2847 dsl_get_guid(ds)); in dsl_dataset_stats()
2849 dsl_get_unique(ds)); in dsl_dataset_stats()
2851 dsl_get_objsetid(ds)); in dsl_dataset_stats()
2853 dsl_get_userrefs(ds)); in dsl_dataset_stats()
2855 dsl_get_defer_destroy(ds)); in dsl_dataset_stats()
2857 dsl_dir_snap_cmtime(ds->ds_dir).tv_sec); in dsl_dataset_stats()
2858 dsl_dataset_crypt_stats(ds, nv); in dsl_dataset_stats()
2860 if (dsl_dataset_phys(ds)->ds_prev_snap_obj != 0) { in dsl_dataset_stats()
2862 if (dsl_get_written(ds, &written) == 0) { in dsl_dataset_stats()
2868 if (!dsl_dataset_is_snapshot(ds)) { in dsl_dataset_stats()
2869 char *token = get_receive_resume_token(ds); in dsl_dataset_stats()
2879 dsl_dataset_fast_stat(dsl_dataset_t *ds, dmu_objset_stats_t *stat) in dsl_dataset_fast_stat() argument
2881 dsl_pool_t *dp __maybe_unused = ds->ds_dir->dd_pool; in dsl_dataset_fast_stat()
2884 stat->dds_creation_txg = dsl_get_creationtxg(ds); in dsl_dataset_fast_stat()
2885 stat->dds_inconsistent = dsl_get_inconsistent(ds); in dsl_dataset_fast_stat()
2886 stat->dds_guid = dsl_get_guid(ds); in dsl_dataset_fast_stat()
2887 stat->dds_redacted = dsl_get_redacted(ds); in dsl_dataset_fast_stat()
2890 if (ds->ds_dir->dd_crypto_obj != 0) in dsl_dataset_fast_stat()
2892 if (ds->ds_is_snapshot) { in dsl_dataset_fast_stat()
2894 stat->dds_num_clones = dsl_get_numclones(ds); in dsl_dataset_fast_stat()
2899 if (dsl_dir_is_clone(ds->ds_dir)) { in dsl_dataset_fast_stat()
2900 dsl_dir_get_origin(ds->ds_dir, stat->dds_origin); in dsl_dataset_fast_stat()
2906 dsl_dataset_fsid_guid(dsl_dataset_t *ds) in dsl_dataset_fsid_guid() argument
2908 return (ds->ds_fsid_guid); in dsl_dataset_fsid_guid()
2912 dsl_dataset_space(dsl_dataset_t *ds, in dsl_dataset_space() argument
2916 *refdbytesp = dsl_dataset_phys(ds)->ds_referenced_bytes; in dsl_dataset_space()
2917 *availbytesp = dsl_dir_space_available(ds->ds_dir, NULL, 0, TRUE); in dsl_dataset_space()
2918 if (ds->ds_reserved > dsl_dataset_phys(ds)->ds_unique_bytes) in dsl_dataset_space()
2920 ds->ds_reserved - dsl_dataset_phys(ds)->ds_unique_bytes; in dsl_dataset_space()
2921 if (ds->ds_quota != 0) { in dsl_dataset_space()
2925 if (*refdbytesp < ds->ds_quota) in dsl_dataset_space()
2927 ds->ds_quota - *refdbytesp); in dsl_dataset_space()
2931 rrw_enter(&ds->ds_bp_rwlock, RW_READER, FTAG); in dsl_dataset_space()
2932 *usedobjsp = BP_GET_FILL(&dsl_dataset_phys(ds)->ds_bp); in dsl_dataset_space()
2933 rrw_exit(&ds->ds_bp_rwlock, FTAG); in dsl_dataset_space()
2938 dsl_dataset_modified_since_snap(dsl_dataset_t *ds, dsl_dataset_t *snap) in dsl_dataset_modified_since_snap() argument
2940 dsl_pool_t *dp __maybe_unused = ds->ds_dir->dd_pool; in dsl_dataset_modified_since_snap()
2946 rrw_enter(&ds->ds_bp_rwlock, RW_READER, FTAG); in dsl_dataset_modified_since_snap()
2947 birth = BP_GET_LOGICAL_BIRTH(dsl_dataset_get_blkptr(ds)); in dsl_dataset_modified_since_snap()
2948 rrw_exit(&ds->ds_bp_rwlock, FTAG); in dsl_dataset_modified_since_snap()
2956 if (dmu_objset_from_ds(ds, &os) != 0) in dsl_dataset_modified_since_snap()
3025 dsl_dataset_t *ds; in dsl_dataset_rename_snapshot_sync_impl() local
3038 VERIFY0(dsl_dataset_hold_obj(dp, val, FTAG, &ds)); in dsl_dataset_rename_snapshot_sync_impl()
3041 spa_history_log_internal_ds(ds, "rename", tx, in dsl_dataset_rename_snapshot_sync_impl()
3046 mutex_enter(&ds->ds_lock); in dsl_dataset_rename_snapshot_sync_impl()
3047 (void) strlcpy(ds->ds_snapname, ddrsa->ddrsa_newsnapname, in dsl_dataset_rename_snapshot_sync_impl()
3048 sizeof (ds->ds_snapname)); in dsl_dataset_rename_snapshot_sync_impl()
3049 mutex_exit(&ds->ds_lock); in dsl_dataset_rename_snapshot_sync_impl()
3052 ds->ds_snapname, 8, 1, &ds->ds_object, tx)); in dsl_dataset_rename_snapshot_sync_impl()
3062 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rename_snapshot_sync_impl()
3109 dsl_dataset_handoff_check(dsl_dataset_t *ds, void *owner, dmu_tx_t *tx) in dsl_dataset_handoff_check() argument
3116 dsl_dir_t *dd = ds->ds_dir; in dsl_dataset_handoff_check()
3118 uint64_t holds = zfs_refcount_count(&ds->ds_longholds) - in dsl_dataset_handoff_check()
3143 dsl_dataset_t *ds; in dsl_dataset_rollback_check() local
3147 error = dsl_dataset_hold(dp, ddra->ddra_fsname, FTAG, &ds); in dsl_dataset_rollback_check()
3152 if (ds->ds_is_snapshot) { in dsl_dataset_rollback_check()
3153 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
3158 if (dsl_dataset_phys(ds)->ds_prev_snap_txg < TXG_INITIAL) { in dsl_dataset_rollback_check()
3159 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
3170 dsl_dataset_phys(ds)->ds_prev_snap_txg >= tx->tx_txg) { in dsl_dataset_rollback_check()
3171 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
3195 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
3201 if (snapds != ds->ds_prev) { in dsl_dataset_rollback_check()
3207 if (snapds->ds_dir == ds->ds_dir || in dsl_dataset_rollback_check()
3208 (dsl_dir_is_clone(ds->ds_dir) && in dsl_dataset_rollback_check()
3209 dsl_dir_phys(ds->ds_dir)->dd_origin_obj == in dsl_dataset_rollback_check()
3216 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
3223 if (dsl_bookmark_latest_txg(ds) > in dsl_dataset_rollback_check()
3224 dsl_dataset_phys(ds)->ds_prev_snap_txg) { in dsl_dataset_rollback_check()
3225 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
3229 error = dsl_dataset_handoff_check(ds, ddra->ddra_owner, tx); in dsl_dataset_rollback_check()
3231 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
3239 if (ds->ds_quota != 0 && in dsl_dataset_rollback_check()
3240 dsl_dataset_phys(ds->ds_prev)->ds_referenced_bytes > ds->ds_quota) { in dsl_dataset_rollback_check()
3241 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
3252 unused_refres_delta = (int64_t)MIN(ds->ds_reserved, in dsl_dataset_rollback_check()
3253 dsl_dataset_phys(ds)->ds_unique_bytes); in dsl_dataset_rollback_check()
3257 dsl_dir_space_available(ds->ds_dir, NULL, 0, TRUE)) { in dsl_dataset_rollback_check()
3258 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
3262 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
3271 dsl_dataset_t *ds, *clone; in dsl_dataset_rollback_sync() local
3275 VERIFY0(dsl_dataset_hold(dp, ddra->ddra_fsname, FTAG, &ds)); in dsl_dataset_rollback_sync()
3277 dsl_dataset_name(ds->ds_prev, namebuf); in dsl_dataset_rollback_sync()
3280 cloneobj = dsl_dataset_create_sync(ds->ds_dir, "%rollback", in dsl_dataset_rollback_sync()
3281 ds->ds_prev, DS_CREATE_FLAG_NODIRTY, kcred, NULL, tx); in dsl_dataset_rollback_sync()
3285 dsl_dataset_clone_swap_sync_impl(clone, ds, tx); in dsl_dataset_rollback_sync()
3286 dsl_dataset_zero_zil(ds, tx); in dsl_dataset_rollback_sync()
3291 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_sync()
3325 dsl_dataset_t *ds; member
3363 dsl_dataset_t *const origin_ds = snap->ds; in dsl_dataset_promote_check()
3387 ASSERT3U(dsl_dataset_phys(snap->ds)->ds_prev_snap_obj, ==, in dsl_dataset_promote_check()
3389 dsl_deadlist_space_range(&snap->ds->ds_deadlist, in dsl_dataset_promote_check()
3416 dsl_dataset_t *ds = snap->ds; in dsl_dataset_promote_check() local
3424 if (dsl_dataset_long_held(ds)) { in dsl_dataset_promote_check()
3430 VERIFY0(dsl_dataset_get_snapname(ds)); in dsl_dataset_promote_check()
3431 if (strlen(ds->ds_snapname) >= max_snap_len) { in dsl_dataset_promote_check()
3435 err = dsl_dataset_snap_lookup(hds, ds->ds_snapname, &val); in dsl_dataset_promote_check()
3438 snap->ds->ds_snapname); in dsl_dataset_promote_check()
3445 if (dsl_dataset_phys(ds)->ds_prev_snap_obj == 0) in dsl_dataset_promote_check()
3448 dsl_deadlist_space(&ds->ds_deadlist, in dsl_dataset_promote_check()
3533 snap->ds->ds_dir->dd_origin_txg, &ddpa->cloneusedsnap); in dsl_dataset_promote_check()
3538 snap->ds->ds_dir->dd_origin_txg, &space); in dsl_dataset_promote_check()
3579 origin_ds = snap->ds; in dsl_dataset_promote_sync()
3583 origin_head = snap->ds; in dsl_dataset_promote_sync()
3598 ASSERT3U(dsl_dataset_phys(snap->ds)->ds_prev_snap_obj, ==, in dsl_dataset_promote_sync()
3600 dsl_dataset_phys(origin_ds)->ds_next_snap_obj = snap->ds->ds_object; in dsl_dataset_promote_sync()
3605 snap->ds->ds_object, tx); in dsl_dataset_promote_sync()
3663 dsl_dataset_t *ds = snap->ds; in dsl_dataset_promote_sync() local
3670 if (ds->ds_objset) { in dsl_dataset_promote_sync()
3671 dmu_objset_evict(ds->ds_objset); in dsl_dataset_promote_sync()
3672 ds->ds_objset = NULL; in dsl_dataset_promote_sync()
3676 VERIFY0(dsl_dataset_get_snapname(ds)); in dsl_dataset_promote_sync()
3678 ds->ds_snapname, tx, B_TRUE)); in dsl_dataset_promote_sync()
3680 dsl_dataset_phys(hds)->ds_snapnames_zapobj, ds->ds_snapname, in dsl_dataset_promote_sync()
3681 8, 1, &ds->ds_object, tx)); in dsl_dataset_promote_sync()
3686 dmu_buf_will_dirty(ds->ds_dbuf, tx); in dsl_dataset_promote_sync()
3687 ASSERT3U(dsl_dataset_phys(ds)->ds_dir_obj, ==, odd->dd_object); in dsl_dataset_promote_sync()
3688 dsl_dataset_phys(ds)->ds_dir_obj = dd->dd_object; in dsl_dataset_promote_sync()
3689 ASSERT3P(ds->ds_dir, ==, odd); in dsl_dataset_promote_sync()
3690 dsl_dir_rele(ds->ds_dir, ds); in dsl_dataset_promote_sync()
3692 NULL, ds, &ds->ds_dir)); in dsl_dataset_promote_sync()
3695 if (dsl_dataset_phys(ds)->ds_next_clones_obj && in dsl_dataset_promote_sync()
3701 dsl_dataset_phys(ds)->ds_next_clones_obj); in dsl_dataset_promote_sync()
3730 ASSERT(!dsl_prop_hascb(ds)); in dsl_dataset_promote_sync()
3802 dsl_dataset_t *ds; in snaplist_make() local
3806 err = dsl_dataset_hold_obj(dp, obj, tag, &ds); in snaplist_make()
3812 first_obj = dsl_dir_phys(ds->ds_dir)->dd_origin_obj; in snaplist_make()
3815 snap->ds = ds; in snaplist_make()
3817 obj = dsl_dataset_phys(ds)->ds_prev_snap_obj; in snaplist_make()
3831 dsl_deadlist_space_range(&snap->ds->ds_deadlist, in snaplist_space()
3847 dsl_dataset_rele(snap->ds, tag); in snaplist_destroy()
3883 ASSERT3U(snap->ds->ds_object, ==, dsl_dir_phys(dd)->dd_origin_obj); in promote_hold()
3885 dsl_dir_phys(snap->ds->ds_dir)->dd_head_dataset_obj, in promote_hold()
3890 if (dsl_dir_phys(snap->ds->ds_dir)->dd_origin_obj != 0) { in promote_hold()
3892 dsl_dir_phys(snap->ds->ds_dir)->dd_origin_obj, in promote_hold()
4277 dsl_dataset_t *ds; in dsl_dsobj_to_dsname() local
4284 error = dsl_dataset_hold_obj(dp, obj, FTAG, &ds); in dsl_dsobj_to_dsname()
4286 dsl_dataset_name(ds, buf); in dsl_dsobj_to_dsname()
4287 dsl_dataset_rele(ds, FTAG); in dsl_dsobj_to_dsname()
4295 dsl_dataset_check_quota(dsl_dataset_t *ds, boolean_t check_quota, in dsl_dataset_check_quota() argument
4308 mutex_enter(&ds->ds_lock); in dsl_dataset_check_quota()
4312 if (ds->ds_reserved > dsl_dataset_phys(ds)->ds_unique_bytes) { in dsl_dataset_check_quota()
4314 ds->ds_reserved - dsl_dataset_phys(ds)->ds_unique_bytes); in dsl_dataset_check_quota()
4316 (ds->ds_reserved - dsl_dataset_phys(ds)->ds_unique_bytes); in dsl_dataset_check_quota()
4318 asize - MIN(asize, parent_delta(ds, asize + inflight)); in dsl_dataset_check_quota()
4321 if (!check_quota || ds->ds_quota == 0) { in dsl_dataset_check_quota()
4322 mutex_exit(&ds->ds_lock); in dsl_dataset_check_quota()
4331 if (dsl_dataset_phys(ds)->ds_referenced_bytes + inflight >= in dsl_dataset_check_quota()
4332 ds->ds_quota) { in dsl_dataset_check_quota()
4334 dsl_dataset_phys(ds)->ds_referenced_bytes < ds->ds_quota) in dsl_dataset_check_quota()
4339 mutex_exit(&ds->ds_lock); in dsl_dataset_check_quota()
4356 dsl_dataset_t *ds; in dsl_dataset_set_refquota_check() local
4363 error = dsl_dataset_hold(dp, ddsqra->ddsqra_name, FTAG, &ds); in dsl_dataset_set_refquota_check()
4367 if (ds->ds_is_snapshot) { in dsl_dataset_set_refquota_check()
4368 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refquota_check()
4372 error = dsl_prop_predict(ds->ds_dir, in dsl_dataset_set_refquota_check()
4376 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refquota_check()
4381 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refquota_check()
4385 if (newval < dsl_dataset_phys(ds)->ds_referenced_bytes || in dsl_dataset_set_refquota_check()
4386 newval < ds->ds_reserved) { in dsl_dataset_set_refquota_check()
4387 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refquota_check()
4391 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refquota_check()
4400 dsl_dataset_t *ds = NULL; in dsl_dataset_set_refquota_sync() local
4403 VERIFY0(dsl_dataset_hold(dp, ddsqra->ddsqra_name, FTAG, &ds)); in dsl_dataset_set_refquota_sync()
4405 dsl_prop_set_sync_impl(ds, in dsl_dataset_set_refquota_sync()
4410 VERIFY0(dsl_prop_get_int_ds(ds, in dsl_dataset_set_refquota_sync()
4413 if (ds->ds_quota != newval) { in dsl_dataset_set_refquota_sync()
4414 dmu_buf_will_dirty(ds->ds_dbuf, tx); in dsl_dataset_set_refquota_sync()
4415 ds->ds_quota = newval; in dsl_dataset_set_refquota_sync()
4417 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refquota_sync()
4440 dsl_dataset_t *ds; in dsl_dataset_set_refreservation_check() local
4447 error = dsl_dataset_hold(dp, ddsqra->ddsqra_name, FTAG, &ds); in dsl_dataset_set_refreservation_check()
4451 if (ds->ds_is_snapshot) { in dsl_dataset_set_refreservation_check()
4452 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refreservation_check()
4456 error = dsl_prop_predict(ds->ds_dir, in dsl_dataset_set_refreservation_check()
4460 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refreservation_check()
4469 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refreservation_check()
4473 mutex_enter(&ds->ds_lock); in dsl_dataset_set_refreservation_check()
4474 if (!DS_UNIQUE_IS_ACCURATE(ds)) in dsl_dataset_set_refreservation_check()
4475 dsl_dataset_recalc_head_uniq(ds); in dsl_dataset_set_refreservation_check()
4476 unique = dsl_dataset_phys(ds)->ds_unique_bytes; in dsl_dataset_set_refreservation_check()
4477 mutex_exit(&ds->ds_lock); in dsl_dataset_set_refreservation_check()
4479 if (MAX(unique, newval) > MAX(unique, ds->ds_reserved)) { in dsl_dataset_set_refreservation_check()
4481 MAX(unique, ds->ds_reserved); in dsl_dataset_set_refreservation_check()
4484 dsl_dir_space_available(ds->ds_dir, NULL, 0, B_TRUE) || in dsl_dataset_set_refreservation_check()
4485 (ds->ds_quota > 0 && newval > ds->ds_quota)) { in dsl_dataset_set_refreservation_check()
4486 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refreservation_check()
4491 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refreservation_check()
4496 dsl_dataset_set_refreservation_sync_impl(dsl_dataset_t *ds, in dsl_dataset_set_refreservation_sync_impl() argument
4503 dsl_prop_set_sync_impl(ds, zfs_prop_to_name(ZFS_PROP_REFRESERVATION), in dsl_dataset_set_refreservation_sync_impl()
4506 VERIFY0(dsl_prop_get_int_ds(ds, in dsl_dataset_set_refreservation_sync_impl()
4509 dmu_buf_will_dirty(ds->ds_dbuf, tx); in dsl_dataset_set_refreservation_sync_impl()
4510 mutex_enter(&ds->ds_dir->dd_lock); in dsl_dataset_set_refreservation_sync_impl()
4511 mutex_enter(&ds->ds_lock); in dsl_dataset_set_refreservation_sync_impl()
4512 ASSERT(DS_UNIQUE_IS_ACCURATE(ds)); in dsl_dataset_set_refreservation_sync_impl()
4513 unique = dsl_dataset_phys(ds)->ds_unique_bytes; in dsl_dataset_set_refreservation_sync_impl()
4515 MAX(0, (int64_t)(ds->ds_reserved - unique)); in dsl_dataset_set_refreservation_sync_impl()
4516 ds->ds_reserved = newval; in dsl_dataset_set_refreservation_sync_impl()
4517 mutex_exit(&ds->ds_lock); in dsl_dataset_set_refreservation_sync_impl()
4519 dsl_dir_diduse_space(ds->ds_dir, DD_USED_REFRSRV, delta, 0, 0, tx); in dsl_dataset_set_refreservation_sync_impl()
4520 mutex_exit(&ds->ds_dir->dd_lock); in dsl_dataset_set_refreservation_sync_impl()
4528 dsl_dataset_t *ds = NULL; in dsl_dataset_set_refreservation_sync() local
4530 VERIFY0(dsl_dataset_hold(dp, ddsqra->ddsqra_name, FTAG, &ds)); in dsl_dataset_set_refreservation_sync()
4531 dsl_dataset_set_refreservation_sync_impl(ds, in dsl_dataset_set_refreservation_sync()
4533 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refreservation_sync()
4580 dsl_dataset_t *ds = NULL; in dsl_dataset_set_compression_sync() local
4587 VERIFY0(dsl_dataset_hold(dp, ddsca->ddsca_name, FTAG, &ds)); in dsl_dataset_set_compression_sync()
4588 if (zfeature_active(f, ds->ds_feature[f]) != B_TRUE) { in dsl_dataset_set_compression_sync()
4589 ds->ds_feature_activation[f] = (void *)B_TRUE; in dsl_dataset_set_compression_sync()
4590 dsl_dataset_activate_feature(ds->ds_object, f, in dsl_dataset_set_compression_sync()
4591 ds->ds_feature_activation[f], tx); in dsl_dataset_set_compression_sync()
4592 ds->ds_feature[f] = ds->ds_feature_activation[f]; in dsl_dataset_set_compression_sync()
4594 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_compression_sync()
4799 dsl_dataset_t *ds; in dsl_dataset_space_wouldfree() local
4802 err = dsl_dataset_hold_obj(dp, snapobj, FTAG, &ds); in dsl_dataset_space_wouldfree()
4806 dsl_deadlist_space_range(&ds->ds_deadlist, in dsl_dataset_space_wouldfree()
4813 snapobj = dsl_dataset_phys(ds)->ds_prev_snap_obj; in dsl_dataset_space_wouldfree()
4815 dsl_dataset_rele(ds, FTAG); in dsl_dataset_space_wouldfree()
4875 dsl_dataset_zapify(dsl_dataset_t *ds, dmu_tx_t *tx) in dsl_dataset_zapify() argument
4877 objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset; in dsl_dataset_zapify()
4878 dmu_object_zapify(mos, ds->ds_object, DMU_OT_DSL_DATASET, tx); in dsl_dataset_zapify()
4882 dsl_dataset_is_zapified(dsl_dataset_t *ds) in dsl_dataset_is_zapified() argument
4886 dmu_object_info_from_db(ds->ds_dbuf, &doi); in dsl_dataset_is_zapified()
4891 dsl_dataset_has_resume_receive_state(dsl_dataset_t *ds) in dsl_dataset_has_resume_receive_state() argument
4893 return (dsl_dataset_is_zapified(ds) && in dsl_dataset_has_resume_receive_state()
4894 zap_contains(ds->ds_dir->dd_pool->dp_meta_objset, in dsl_dataset_has_resume_receive_state()
4895 ds->ds_object, DS_FIELD_RESUME_TOGUID) == 0); in dsl_dataset_has_resume_receive_state()
4899 dsl_dataset_get_remap_deadlist_object(dsl_dataset_t *ds) in dsl_dataset_get_remap_deadlist_object() argument
4904 if (!dsl_dataset_is_zapified(ds)) in dsl_dataset_get_remap_deadlist_object()
4907 err = zap_lookup(ds->ds_dir->dd_pool->dp_meta_objset, ds->ds_object, in dsl_dataset_get_remap_deadlist_object()
4921 dsl_dataset_remap_deadlist_exists(dsl_dataset_t *ds) in dsl_dataset_remap_deadlist_exists() argument
4923 EQUIV(dsl_deadlist_is_open(&ds->ds_remap_deadlist), in dsl_dataset_remap_deadlist_exists()
4924 dsl_dataset_get_remap_deadlist_object(ds) != 0); in dsl_dataset_remap_deadlist_exists()
4925 return (dsl_deadlist_is_open(&ds->ds_remap_deadlist)); in dsl_dataset_remap_deadlist_exists()
4929 dsl_dataset_set_remap_deadlist_object(dsl_dataset_t *ds, uint64_t obj, in dsl_dataset_set_remap_deadlist_object() argument
4933 dsl_dataset_zapify(ds, tx); in dsl_dataset_set_remap_deadlist_object()
4934 VERIFY0(zap_add(ds->ds_dir->dd_pool->dp_meta_objset, ds->ds_object, in dsl_dataset_set_remap_deadlist_object()
4939 dsl_dataset_unset_remap_deadlist_object(dsl_dataset_t *ds, dmu_tx_t *tx) in dsl_dataset_unset_remap_deadlist_object() argument
4941 VERIFY0(zap_remove(ds->ds_dir->dd_pool->dp_meta_objset, in dsl_dataset_unset_remap_deadlist_object()
4942 ds->ds_object, DS_FIELD_REMAP_DEADLIST, tx)); in dsl_dataset_unset_remap_deadlist_object()
4946 dsl_dataset_destroy_remap_deadlist(dsl_dataset_t *ds, dmu_tx_t *tx) in dsl_dataset_destroy_remap_deadlist() argument
4949 spa_t *spa = ds->ds_dir->dd_pool->dp_spa; in dsl_dataset_destroy_remap_deadlist()
4952 ASSERT(dsl_dataset_remap_deadlist_exists(ds)); in dsl_dataset_destroy_remap_deadlist()
4954 remap_deadlist_object = ds->ds_remap_deadlist.dl_object; in dsl_dataset_destroy_remap_deadlist()
4955 dsl_deadlist_close(&ds->ds_remap_deadlist); in dsl_dataset_destroy_remap_deadlist()
4957 dsl_dataset_unset_remap_deadlist_object(ds, tx); in dsl_dataset_destroy_remap_deadlist()
4962 dsl_dataset_create_remap_deadlist(dsl_dataset_t *ds, dmu_tx_t *tx) in dsl_dataset_create_remap_deadlist() argument
4965 spa_t *spa = ds->ds_dir->dd_pool->dp_spa; in dsl_dataset_create_remap_deadlist()
4968 ASSERT(MUTEX_HELD(&ds->ds_remap_deadlist_lock)); in dsl_dataset_create_remap_deadlist()
4976 &ds->ds_deadlist, UINT64_MAX, in dsl_dataset_create_remap_deadlist()
4977 dsl_dataset_phys(ds)->ds_prev_snap_obj, tx); in dsl_dataset_create_remap_deadlist()
4978 dsl_dataset_set_remap_deadlist_object(ds, in dsl_dataset_create_remap_deadlist()
4980 VERIFY0(dsl_deadlist_open(&ds->ds_remap_deadlist, spa_meta_objset(spa), in dsl_dataset_create_remap_deadlist()
4986 dsl_dataset_activate_redaction(dsl_dataset_t *ds, uint64_t *redact_snaps, in dsl_dataset_activate_redaction() argument
4989 uint64_t dsobj = ds->ds_object; in dsl_dataset_activate_redaction()
5001 ds->ds_feature[SPA_FEATURE_REDACTED_DATASETS] = ftuaa; in dsl_dataset_activate_redaction()
5012 dsl_dataset_t *ds; in dsl_dataset_oldest_snapshot() local
5015 int error = dsl_dataset_hold_obj(dp, head_ds, FTAG, &ds); in dsl_dataset_oldest_snapshot()
5019 uint64_t prev_obj = dsl_dataset_phys(ds)->ds_prev_snap_obj; in dsl_dataset_oldest_snapshot()
5020 uint64_t prev_obj_txg = dsl_dataset_phys(ds)->ds_prev_snap_txg; in dsl_dataset_oldest_snapshot()
5023 dsl_dataset_rele(ds, FTAG); in dsl_dataset_oldest_snapshot()
5025 FTAG, &ds)) != 0) in dsl_dataset_oldest_snapshot()
5027 prev_obj_txg = dsl_dataset_phys(ds)->ds_prev_snap_txg; in dsl_dataset_oldest_snapshot()
5028 prev_obj = dsl_dataset_phys(ds)->ds_prev_snap_obj; in dsl_dataset_oldest_snapshot()
5030 *oldest_dsobj = ds->ds_object; in dsl_dataset_oldest_snapshot()
5031 dsl_dataset_rele(ds, FTAG); in dsl_dataset_oldest_snapshot()