Lines Matching +full:pre +full:- +full:dcp
1 // SPDX-License-Identifier: CDDL-1.0
10 * or https://opensource.org/licenses/CDDL-1.0.
127 if (ds->ds_reserved == 0) 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()
134 ASSERT3U(ABS((int64_t)(new_bytes - old_bytes)), <=, ABS(delta)); in parent_delta()
135 return (new_bytes - old_bytes); in parent_delta()
141 spa_t *spa = dmu_tx_pool(tx)->dp_spa; in dsl_dataset_block_born()
157 dsl_pool_mos_diduse_space(tx->tx_pool, 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()
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_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()
222 spa_t *spa = ds->ds_dir->dd_pool->dp_spa; in dsl_dataset_block_remapped()
225 ASSERT(birth <= tx->tx_txg); 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()
236 mutex_enter(&ds->ds_remap_deadlist_lock); 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()
256 spa_t *spa = dmu_tx_pool(tx)->dp_spa; in dsl_dataset_block_kill()
266 ASSERT(BP_GET_BIRTH(bp) <= tx->tx_txg); in dsl_dataset_block_kill()
269 dsl_free(tx->tx_pool, tx->tx_txg, bp); in dsl_dataset_block_kill()
270 dsl_pool_mos_diduse_space(tx->tx_pool, in dsl_dataset_block_kill()
271 -used, -compressed, -uncompressed); 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_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_BIRTH(bp) > dsl_dataset_phys(ds)->ds_prev_snap_txg) { in dsl_dataset_block_kill()
299 * are very heavy and can lead to out-of-memory conditions if 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()
313 dsl_free(tx->tx_pool, tx->tx_txg, bp); 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()
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()
324 delta, -compressed, -uncompressed, -used, in dsl_dataset_block_kill()
328 dsl_dir_diduse_space(tx->tx_pool->dp_free_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_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_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()
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()
389 struct feature_type_uint64_array_arg *ftuaa = ds->ds_feature[f]; in unload_zfeature()
390 kmem_free(ftuaa->array, ftuaa->length * sizeof (uint64_t)); in unload_zfeature()
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()
431 ftuaa->length = num_int; in load_zfeature()
432 ftuaa->array = data; in load_zfeature()
433 ds->ds_feature[f] = ftuaa; in load_zfeature()
453 ASSERT0P(ds->ds_owner); in dsl_dataset_evict_sync()
455 unique_remove(ds->ds_fsid_guid); in dsl_dataset_evict_sync()
463 ASSERT0P(ds->ds_owner); 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()
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()
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()
509 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_dataset_get_snapname()
510 objset_t *mos = dp->dp_meta_objset; 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()
521 headphys = headdbuf->db_data; in dsl_dataset_get_snapname()
522 err = zap_value_search(dp->dp_meta_objset, 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()
528 "SNAPOBJ=%llu-ERR=%d", in dsl_dataset_get_snapname()
529 (unsigned long long)ds->ds_object, err); in dsl_dataset_get_snapname()
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()
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()
581 dmu_buf_t *dbuf = ds->ds_dbuf; in dsl_dataset_try_add_ref()
584 if (dbuf != NULL && dmu_buf_try_add_ref(dbuf, dp->dp_meta_objset, in dsl_dataset_try_add_ref()
585 ds->ds_object, DMU_BONUS_BLKID, tag)) { in dsl_dataset_try_add_ref()
600 objset_t *mos = dp->dp_meta_objset; 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()
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()
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()
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()
689 &ds->ds_reserved); 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()
702 dp->dp_spa->spa_errata = 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()
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()
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()
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()
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()
764 spa_name(dp->dp_spa), 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()
773 spa_version(dp->dp_spa) < SPA_VERSION_ORIGIN || in dsl_dataset_hold_obj()
774 dp->dp_origin_snap == NULL || ds == dp->dp_origin_snap); in dsl_dataset_hold_obj()
783 dsl_dir_t *dd = ds->ds_dir; in dsl_dataset_create_key_mapping()
785 if (dd->dd_crypto_obj == 0) in dsl_dataset_create_key_mapping()
788 return (spa_keystore_create_mapping(dd->dd_pool->dp_spa, in dsl_dataset_create_key_mapping()
789 ds, ds, &ds->ds_key_mapping)); in dsl_dataset_create_key_mapping()
828 obj = dsl_dir_phys(dd)->dd_head_dataset_obj; in dsl_dataset_hold_flags()
853 mutex_enter(&snap_ds->ds_lock); in dsl_dataset_hold_flags()
854 if (snap_ds->ds_snapname[0] == 0) in dsl_dataset_hold_flags()
855 (void) strlcpy(snap_ds->ds_snapname, snapname, in dsl_dataset_hold_flags()
856 sizeof (snap_ds->ds_snapname)); in dsl_dataset_hold_flags()
857 mutex_exit(&snap_ds->ds_lock); in dsl_dataset_hold_flags()
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()
951 (void) zfs_refcount_remove(&ds->ds_longholds, tag); in dsl_dataset_long_rele()
958 return (!zfs_refcount_is_zero(&ds->ds_longholds)); in dsl_dataset_long_held()
967 dsl_dir_name(ds->ds_dir, name); 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()
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()
1008 dmu_buf_rele(ds->ds_dbuf, tag); in dsl_dataset_rele()
1014 dsl_dir_t *dd = ds->ds_dir; in dsl_dataset_remove_key_mapping()
1016 if (dd == NULL || dd->dd_crypto_obj == 0) in dsl_dataset_remove_key_mapping()
1019 (void) spa_keystore_remove_mapping(dd->dd_pool->dp_spa, in dsl_dataset_remove_key_mapping()
1020 ds->ds_object, ds); in dsl_dataset_remove_key_mapping()
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()
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()
1057 ds->ds_owner = tag; in dsl_dataset_tryown()
1061 mutex_exit(&ds->ds_lock); in dsl_dataset_tryown()
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()
1087 * if the array is non-null. in zfeature_active()
1099 return (zfeature_active(f, ds->ds_feature[f])); in dsl_dataset_feature_is_active()
1115 struct feature_type_uint64_array_arg *ftuaa = ds->ds_feature[f]; in dsl_dataset_get_uint64_array_feature()
1116 *outp = ftuaa->array; in dsl_dataset_get_uint64_array_feature()
1117 *outlength = ftuaa->length; in dsl_dataset_get_uint64_array_feature()
1125 spa_t *spa = dmu_tx_pool(tx)->dp_spa; in dsl_dataset_activate_feature()
1126 objset_t *mos = dmu_tx_pool(tx)->dp_meta_objset; in dsl_dataset_activate_feature()
1144 sizeof (uint64_t), ftuaa->length, ftuaa->array, tx)); in dsl_dataset_activate_feature()
1156 spa_t *spa = dmu_tx_pool(tx)->dp_spa; in dsl_dataset_deactivate_feature_impl()
1157 objset_t *mos = dmu_tx_pool(tx)->dp_meta_objset; in dsl_dataset_deactivate_feature_impl()
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()
1176 dsl_crypto_params_t *dcp, uint64_t flags, dmu_tx_t *tx) in dsl_dataset_create_sync_dd() argument
1178 dsl_pool_t *dp = dd->dd_pool; in dsl_dataset_create_sync_dd()
1182 objset_t *mos = dp->dp_meta_objset; in dsl_dataset_create_sync_dd()
1185 origin = dp->dp_origin_snap; in dsl_dataset_create_sync_dd()
1187 ASSERT(origin == NULL || origin->ds_dir->dd_pool == dp); in dsl_dataset_create_sync_dd()
1188 ASSERT(origin == NULL || dsl_dataset_phys(origin)->ds_num_children > 0); in dsl_dataset_create_sync_dd()
1190 ASSERT0(dsl_dir_phys(dd)->dd_head_dataset_obj); in dsl_dataset_create_sync_dd()
1196 dsphys = dbuf->db_data; in dsl_dataset_create_sync_dd()
1198 dsphys->ds_dir_obj = dd->dd_object; in dsl_dataset_create_sync_dd()
1199 dsphys->ds_flags = flags; in dsl_dataset_create_sync_dd()
1200 dsphys->ds_fsid_guid = unique_create(); in dsl_dataset_create_sync_dd()
1201 (void) random_get_pseudo_bytes((void*)&dsphys->ds_guid, in dsl_dataset_create_sync_dd()
1202 sizeof (dsphys->ds_guid)); in dsl_dataset_create_sync_dd()
1203 dsphys->ds_snapnames_zapobj = in dsl_dataset_create_sync_dd()
1206 dsphys->ds_creation_time = gethrestime_sec(); in dsl_dataset_create_sync_dd()
1207 dsphys->ds_creation_txg = tx->tx_txg == TXG_INITIAL ? 1 : tx->tx_txg; in dsl_dataset_create_sync_dd()
1210 dsphys->ds_deadlist_obj = dsl_deadlist_alloc(mos, tx); in dsl_dataset_create_sync_dd()
1214 dsphys->ds_prev_snap_obj = origin->ds_object; in dsl_dataset_create_sync_dd()
1215 dsphys->ds_prev_snap_txg = in dsl_dataset_create_sync_dd()
1216 dsl_dataset_phys(origin)->ds_creation_txg; in dsl_dataset_create_sync_dd()
1217 dsphys->ds_referenced_bytes = in dsl_dataset_create_sync_dd()
1218 dsl_dataset_phys(origin)->ds_referenced_bytes; in dsl_dataset_create_sync_dd()
1219 dsphys->ds_compressed_bytes = in dsl_dataset_create_sync_dd()
1220 dsl_dataset_phys(origin)->ds_compressed_bytes; in dsl_dataset_create_sync_dd()
1221 dsphys->ds_uncompressed_bytes = in dsl_dataset_create_sync_dd()
1222 dsl_dataset_phys(origin)->ds_uncompressed_bytes; in dsl_dataset_create_sync_dd()
1223 rrw_enter(&origin->ds_bp_rwlock, RW_READER, FTAG); in dsl_dataset_create_sync_dd()
1224 dsphys->ds_bp = dsl_dataset_phys(origin)->ds_bp; in dsl_dataset_create_sync_dd()
1225 rrw_exit(&origin->ds_bp_rwlock, FTAG); in dsl_dataset_create_sync_dd()
1231 dsphys->ds_flags |= dsl_dataset_phys(origin)->ds_flags & in dsl_dataset_create_sync_dd()
1235 if (zfeature_active(f, origin->ds_feature[f])) { in dsl_dataset_create_sync_dd()
1237 origin->ds_feature[f], tx); in dsl_dataset_create_sync_dd()
1241 dmu_buf_will_dirty(origin->ds_dbuf, tx); in dsl_dataset_create_sync_dd()
1242 dsl_dataset_phys(origin)->ds_num_children++; in dsl_dataset_create_sync_dd()
1245 dsl_dir_phys(origin->ds_dir)->dd_head_dataset_obj, in dsl_dataset_create_sync_dd()
1247 dsphys->ds_deadlist_obj = dsl_deadlist_clone(&ohds->ds_deadlist, in dsl_dataset_create_sync_dd()
1248 dsphys->ds_prev_snap_txg, dsphys->ds_prev_snap_obj, tx); in dsl_dataset_create_sync_dd()
1251 if (spa_version(dp->dp_spa) >= SPA_VERSION_NEXT_CLONES) { in dsl_dataset_create_sync_dd()
1252 if (dsl_dataset_phys(origin)->ds_next_clones_obj == 0) { in dsl_dataset_create_sync_dd()
1253 dsl_dataset_phys(origin)->ds_next_clones_obj = in dsl_dataset_create_sync_dd()
1258 dsl_dataset_phys(origin)->ds_next_clones_obj, in dsl_dataset_create_sync_dd()
1262 dmu_buf_will_dirty(dd->dd_dbuf, tx); in dsl_dataset_create_sync_dd()
1263 dsl_dir_phys(dd)->dd_origin_obj = origin->ds_object; in dsl_dataset_create_sync_dd()
1264 if (spa_version(dp->dp_spa) >= SPA_VERSION_DIR_CLONES) { in dsl_dataset_create_sync_dd()
1265 if (dsl_dir_phys(origin->ds_dir)->dd_clones == 0) { in dsl_dataset_create_sync_dd()
1266 dmu_buf_will_dirty(origin->ds_dir->dd_dbuf, tx); in dsl_dataset_create_sync_dd()
1267 dsl_dir_phys(origin->ds_dir)->dd_clones = in dsl_dataset_create_sync_dd()
1272 dsl_dir_phys(origin->ds_dir)->dd_clones, in dsl_dataset_create_sync_dd()
1278 dsl_dataset_create_crypt_sync(dsobj, dd, origin, dcp, tx); in dsl_dataset_create_sync_dd()
1280 if (spa_version(dp->dp_spa) >= SPA_VERSION_UNIQUE_ACCURATE) in dsl_dataset_create_sync_dd()
1281 dsphys->ds_flags |= DS_FLAG_UNIQUE_ACCURATE; in dsl_dataset_create_sync_dd()
1285 dmu_buf_will_dirty(dd->dd_dbuf, tx); in dsl_dataset_create_sync_dd()
1286 dsl_dir_phys(dd)->dd_head_dataset_obj = dsobj; in dsl_dataset_create_sync_dd()
1297 if (memcmp(&os->os_zil_header, &zero_zil, sizeof (zero_zil)) != 0) { in dsl_dataset_zero_zil()
1298 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_dataset_zero_zil()
1301 memset(&os->os_zil_header, 0, sizeof (os->os_zil_header)); in dsl_dataset_zero_zil()
1302 if (os->os_encrypted) in dsl_dataset_zero_zil()
1303 os->os_next_write_raw[tx->tx_txg & TXG_MASK] = B_TRUE; in dsl_dataset_zero_zil()
1305 zio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED); in dsl_dataset_zero_zil()
1315 dsl_crypto_params_t *dcp, dmu_tx_t *tx) in dsl_dataset_create_sync() argument
1317 dsl_pool_t *dp = pdd->dd_pool; in dsl_dataset_create_sync()
1330 ASSERT3P(origin, !=, dp->dp_origin_snap); in dsl_dataset_create_sync()
1335 dsobj = dsl_dataset_create_sync_dd(dd, origin, dcp, in dsl_dataset_create_sync()
1345 spa_feature_is_enabled(dp->dp_spa, SPA_FEATURE_LIVELIST)) { in dsl_dataset_create_sync()
1346 objset_t *mos = dd->dd_pool->dp_meta_objset; in dsl_dataset_create_sync()
1349 VERIFY0(zap_add(mos, dd->dd_object, DD_FIELD_LIVELIST, in dsl_dataset_create_sync()
1351 spa_feature_incr(dp->dp_spa, SPA_FEATURE_LIVELIST, tx); in dsl_dataset_create_sync()
1358 if (spa_feature_is_active(dp->dp_spa, SPA_FEATURE_FS_SS_LIMIT)) { in dsl_dataset_create_sync()
1360 objset_t *os = dd->dd_pool->dp_meta_objset; in dsl_dataset_create_sync()
1363 VERIFY0(zap_add(os, dd->dd_object, DD_FIELD_FILESYSTEM_COUNT, in dsl_dataset_create_sync()
1365 VERIFY0(zap_add(os, dd->dd_object, DD_FIELD_SNAPSHOT_COUNT, in dsl_dataset_create_sync()
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()
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()
1450 return (&dsl_dataset_phys(ds)->ds_bp); in dsl_dataset_get_blkptr()
1456 return (ds->ds_dir->dd_pool->dp_spa); in dsl_dataset_get_spa()
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()
1484 !os->os_raw_receive && in dsl_dataset_dirty()
1485 !os->os_next_write_raw[tx->tx_txg & TXG_MASK]) { 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()
1501 * If there's an fs-only reservation, any blocks that might become in dsl_dataset_snapshot_reserve_space()
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()
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()
1566 error = dsl_fs_ss_limit_check(ds->ds_dir, cnt, in dsl_dataset_snapshot_check_impl()
1588 * Pre-compute how many total new snapshots will be created for each in dsl_dataset_snapshot_check()
1621 for (pair = nvlist_next_nvpair(ddsa->ddsa_snaps, NULL); in dsl_dataset_snapshot_check()
1623 pair = nvlist_next_nvpair(ddsa->ddsa_snaps, pair)) { in dsl_dataset_snapshot_check()
1666 error = dsl_fs_ss_limit_check(ds->ds_dir, cnt, in dsl_dataset_snapshot_check()
1668 ddsa->ddsa_cr); in dsl_dataset_snapshot_check()
1673 if (ddsa->ddsa_errors != NULL) in dsl_dataset_snapshot_check()
1674 fnvlist_add_int32(ddsa->ddsa_errors, in dsl_dataset_snapshot_check()
1684 for (pair = nvlist_next_nvpair(ddsa->ddsa_snaps, NULL); in dsl_dataset_snapshot_check()
1685 pair != NULL; pair = nvlist_next_nvpair(ddsa->ddsa_snaps, pair)) { in dsl_dataset_snapshot_check()
1699 (void) strlcpy(dsname, name, atp - name + 1); in dsl_dataset_snapshot_check()
1711 if (ddsa->ddsa_errors != NULL) { in dsl_dataset_snapshot_check()
1712 fnvlist_add_int32(ddsa->ddsa_errors, in dsl_dataset_snapshot_check()
1726 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_dataset_snapshot_sync_impl()
1730 objset_t *mos = dp->dp_meta_objset; in dsl_dataset_snapshot_sync_impl()
1733 ASSERT(RRW_WRITE_HELD(&dp->dp_config_rwlock)); in dsl_dataset_snapshot_sync_impl()
1739 ASSERT(spa_version(dmu_tx_pool(tx)->dp_spa) >= SPA_VERSION_FAST_SNAP || in dsl_dataset_snapshot_sync_impl()
1741 memcmp(&os->os_phys->os_zil_header, &zero_zil, 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()
1756 crtxg = tx->tx_txg; in dsl_dataset_snapshot_sync_impl()
1762 dsphys = dbuf->db_data; in dsl_dataset_snapshot_sync_impl()
1764 dsphys->ds_dir_obj = ds->ds_dir->dd_object; in dsl_dataset_snapshot_sync_impl()
1765 dsphys->ds_fsid_guid = unique_create(); in dsl_dataset_snapshot_sync_impl()
1766 (void) random_get_pseudo_bytes((void*)&dsphys->ds_guid, in dsl_dataset_snapshot_sync_impl()
1767 sizeof (dsphys->ds_guid)); 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()
1771 dsphys->ds_num_children = 1; in dsl_dataset_snapshot_sync_impl()
1772 dsphys->ds_creation_time = gethrestime_sec(); in dsl_dataset_snapshot_sync_impl()
1773 dsphys->ds_creation_txg = crtxg; 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()
1777 dsphys->ds_uncompressed_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()
1808 dsphys->ds_next_snap_obj, tx); in dsl_dataset_snapshot_sync_impl()
1815 * If we have a reference-reservation on this dataset, we will in dsl_dataset_snapshot_sync_impl()
1819 if (ds->ds_reserved) { 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()
1848 dsl_deadlist_close(&ds->ds_remap_deadlist); in dsl_dataset_snapshot_sync_impl()
1859 * field as part of the on-disk format for ZFS encryption in dsl_dataset_snapshot_sync_impl()
1870 if (ds->ds_dir->dd_crypto_obj != 0 && in dsl_dataset_snapshot_sync_impl()
1871 spa_feature_is_enabled(dp->dp_spa, SPA_FEATURE_BOOKMARK_V2)) { 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()
1884 if (spa_version(dp->dp_spa) >= SPA_VERSION_UNIQUE_ACCURATE) 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()
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()
1910 for (pair = nvlist_next_nvpair(ddsa->ddsa_snaps, NULL); in dsl_dataset_snapshot_sync()
1911 pair != NULL; pair = nvlist_next_nvpair(ddsa->ddsa_snaps, pair)) { in dsl_dataset_snapshot_sync()
1918 (void) strlcpy(dsname, name, atp - name + 1); in dsl_dataset_snapshot_sync()
1922 if (ddsa->ddsa_props != NULL) { in dsl_dataset_snapshot_sync()
1923 dsl_props_set_sync_impl(ds->ds_prev, in dsl_dataset_snapshot_sync()
1924 ZPROP_SRC_LOCAL, ddsa->ddsa_props, tx); in dsl_dataset_snapshot_sync()
1932 * All-or-nothing: if there are any failures, nothing will be modified.
1970 (void) strlcpy(fsname, snapname, atp - snapname + 1); in dsl_dataset_snapshot()
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()
2042 if (spa_version(dp->dp_spa) < SPA_VERSION_USERREFS) { in dsl_dataset_snapshot_tmp_check()
2046 error = dsl_dataset_user_hold_check_one(NULL, ddsta->ddsta_htag, in dsl_dataset_snapshot_tmp_check()
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()
2068 ddsta->ddsta_cleanup_minor, gethrestime_sec(), tx); in dsl_dataset_snapshot_tmp_sync()
2069 dsl_destroy_snapshot_sync_impl(ds->ds_prev, B_TRUE, tx); in dsl_dataset_snapshot_tmp_sync()
2114 ASSERT(ds->ds_objset != NULL); in dsl_dataset_sync()
2115 ASSERT0(dsl_dataset_phys(ds)->ds_next_snap_obj); 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()
2125 VERIFY0(zap_update(tx->tx_pool->dp_meta_objset, 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()
2128 VERIFY0(zap_update(tx->tx_pool->dp_meta_objset, 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()
2131 VERIFY0(zap_update(tx->tx_pool->dp_meta_objset, 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()
2153 used = dsl_dir_get_usedds(ds->ds_dir); in dsl_livelist_should_disable()
2157 percent_shared = (100 * (referenced - used)) / referenced; in dsl_livelist_should_disable()
2175 uint64_t total_free = first->dle_bpobj.bpo_phys->bpo_num_freed + in dsl_livelist_should_condense()
2176 next->dle_bpobj.bpo_phys->bpo_num_freed; in dsl_livelist_should_condense()
2177 uint64_t total_entries = first->dle_bpobj.bpo_phys->bpo_num_blkptrs + in dsl_livelist_should_condense()
2178 next->dle_bpobj.bpo_phys->bpo_num_blkptrs; in dsl_livelist_should_condense()
2179 if ((total_entries - (2 * total_free)) < zfs_livelist_max_entries) in dsl_livelist_should_condense()
2197 spa_t *spa = tca->spa; in dsl_livelist_try_condense()
2198 dsl_dataset_t *ds = tca->ds; in dsl_livelist_try_condense()
2199 dsl_deadlist_t *ll = &ds->ds_dir->dd_livelist; in dsl_livelist_try_condense()
2203 if (spa->spa_livelist_condense_zthr == NULL) in dsl_livelist_try_condense()
2207 if (spa->spa_to_condense.ds != NULL) in dsl_livelist_try_condense()
2210 next = AVL_NEXT(&ll->dl_tree, &first->dle_node); in dsl_livelist_try_condense()
2211 /* The livelist has only one entry - don't condense it */ in dsl_livelist_try_condense()
2215 /* Next is the newest entry - don't condense it */ in dsl_livelist_try_condense()
2216 if (AVL_NEXT(&ll->dl_tree, &next->dle_node) == 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()
2231 spa->spa_to_condense.first = first; in dsl_livelist_try_condense()
2232 spa->spa_to_condense.next = next; in dsl_livelist_try_condense()
2233 spa->spa_to_condense.syncing = B_FALSE; in dsl_livelist_try_condense()
2234 spa->spa_to_condense.cancelled = B_FALSE; in dsl_livelist_try_condense()
2236 zthr_wakeup(spa->spa_livelist_condense_zthr); in dsl_livelist_try_condense()
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()
2245 dsl_deadlist_entry_t *last = dsl_deadlist_last(&dd->dd_livelist); in dsl_flush_pending_livelist()
2247 /* Check if we need to add a new sub-livelist */ in dsl_flush_pending_livelist()
2250 dsl_deadlist_add_key(&dd->dd_livelist, in dsl_flush_pending_livelist()
2251 tx->tx_txg - 1, tx); in dsl_flush_pending_livelist()
2260 bpobj_t bpobj = last->dle_bpobj; in dsl_flush_pending_livelist()
2261 uint64_t all = bpobj.bpo_phys->bpo_num_blkptrs; in dsl_flush_pending_livelist()
2262 uint64_t free = bpobj.bpo_phys->bpo_num_freed; in dsl_flush_pending_livelist()
2263 uint64_t alloc = all - free; in dsl_flush_pending_livelist()
2265 dsl_deadlist_add_key(&dd->dd_livelist, in dsl_flush_pending_livelist()
2266 tx->tx_txg - 1, tx); in dsl_flush_pending_livelist()
2270 /* Insert each entry into the on-disk livelist */ in dsl_flush_pending_livelist()
2271 bplist_iterate(&dd->dd_pending_allocs, in dsl_flush_pending_livelist()
2272 dsl_deadlist_insert_alloc_cb, &dd->dd_livelist, tx); in dsl_flush_pending_livelist()
2273 bplist_iterate(&dd->dd_pending_frees, in dsl_flush_pending_livelist()
2274 dsl_deadlist_insert_free_cb, &dd->dd_livelist, tx); in dsl_flush_pending_livelist()
2281 dsl_deadlist_iterate(&dd->dd_livelist, dsl_livelist_try_condense, in dsl_flush_pending_livelist()
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()
2296 dsl_dir_remove_livelist(ds->ds_dir, tx, B_TRUE); in dsl_dataset_sync_done()
2302 multilist_destroy(&os->os_synced_dnodes); in dsl_dataset_sync_done()
2304 if (os->os_encrypted) in dsl_dataset_sync_done()
2305 os->os_next_write_raw[tx->tx_txg & TXG_MASK] = B_FALSE; in dsl_dataset_sync_done()
2307 ASSERT0(os->os_next_write_raw[tx->tx_txg & TXG_MASK]); 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()
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()
2354 za->za_first_integer, FTAG, &clone)); in get_clones_stat_impl()
2355 dsl_dir_name(clone->ds_dir, buf); in get_clones_stat_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()
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()
2483 (void) snprintf(str + offset, alloc_size - offset, in get_receive_resume_token_impl()
2487 char *propval = kmem_asprintf("%u-%llx-%llx-%s", in get_receive_resume_token_impl()
2522 dsl_dataset_hold(ds->ds_dir->dd_pool, name, FTAG, &recv_ds) == 0) { in get_receive_resume_token()
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()
2541 return (dsl_dataset_phys(ds)->ds_uncompressed_bytes); in dsl_get_logicalreferenced()
2547 if (ds->ds_is_snapshot) { in dsl_get_compressratio()
2550 dsl_dir_t *dd = ds->ds_dir; in dsl_get_compressratio()
2551 mutex_enter(&dd->dd_lock); in dsl_get_compressratio()
2553 mutex_exit(&dd->dd_lock); in dsl_get_compressratio()
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()
2565 mutex_enter(&dd->dd_lock); in dsl_get_used()
2567 mutex_exit(&dd->dd_lock); in dsl_get_used()
2575 return (dsl_dataset_phys(ds)->ds_creation_time); in dsl_get_creation()
2581 return (dsl_dataset_phys(ds)->ds_creation_txg); in dsl_get_creationtxg()
2587 return (ds->ds_quota); in dsl_get_refquota()
2593 return (ds->ds_reserved); in dsl_get_refreservation()
2599 return (dsl_dataset_phys(ds)->ds_guid); in dsl_get_guid()
2605 return (dsl_dataset_phys(ds)->ds_unique_bytes); in dsl_get_unique()
2611 return (ds->ds_object); in dsl_get_objsetid()
2617 return (ds->ds_userrefs); in dsl_get_userrefs()
2629 return (dsl_dataset_phys(ds)->ds_referenced_bytes); in dsl_get_referenced()
2635 ASSERT(ds->ds_is_snapshot); in dsl_get_numclones()
2636 return (dsl_dataset_phys(ds)->ds_num_children - 1); in dsl_get_numclones()
2642 return ((dsl_dataset_phys(ds)->ds_flags & DS_FLAG_INCONSISTENT) ? in dsl_get_inconsistent()
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()
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()
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()
2731 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_get_mountpoint()
2765 spa_altroot(dp->dp_spa, root, ZAP_MAXVALUELEN); in dsl_get_mountpoint()
2805 dsl_pool_t *dp __maybe_unused = ds->ds_dir->dd_pool; in dsl_dataset_stats()
2818 if (ds->ds_is_snapshot) { in dsl_dataset_stats()
2825 dsl_dir_stats(ds->ds_dir, nv); in dsl_dataset_stats()
2857 dsl_dir_snap_cmtime(ds->ds_dir).tv_sec); in dsl_dataset_stats()
2860 if (dsl_dataset_phys(ds)->ds_prev_snap_obj != 0) { in dsl_dataset_stats()
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()
2888 stat->dds_origin[0] = '\0'; in dsl_dataset_fast_stat()
2889 stat->dds_flags = DDS_FLAG_HAS_ENCRYPTED; in dsl_dataset_fast_stat()
2890 if (ds->ds_dir->dd_crypto_obj != 0) in dsl_dataset_fast_stat()
2891 stat->dds_flags |= DDS_FLAG_ENCRYPTED; in dsl_dataset_fast_stat()
2892 if (ds->ds_is_snapshot) { in dsl_dataset_fast_stat()
2893 stat->dds_is_snapshot = B_TRUE; in dsl_dataset_fast_stat()
2894 stat->dds_num_clones = dsl_get_numclones(ds); in dsl_dataset_fast_stat()
2896 stat->dds_is_snapshot = B_FALSE; in dsl_dataset_fast_stat()
2897 stat->dds_num_clones = 0; 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()
2908 return (ds->ds_fsid_guid); in dsl_dataset_fsid_guid()
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()
2934 *availobjsp = DN_MAX_OBJECT - *usedobjsp; in dsl_dataset_space()
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()
2948 rrw_exit(&ds->ds_bp_rwlock, FTAG); in dsl_dataset_modified_since_snap()
2949 if (birth > dsl_dataset_phys(snap)->ds_creation_txg) { in dsl_dataset_modified_since_snap()
2960 return (memcmp(&os->os_phys->os_meta_dnode, in dsl_dataset_modified_since_snap()
2961 &os_snap->os_phys->os_meta_dnode, in dsl_dataset_modified_since_snap()
2962 sizeof (os->os_phys->os_meta_dnode)) != 0); in dsl_dataset_modified_since_snap()
2976 error = dsl_dataset_snap_lookup(hds, ddrsa->ddrsa_oldsnapname, &val); in dsl_dataset_rename_snapshot_check_impl()
2983 error = dsl_dataset_snap_lookup(hds, ddrsa->ddrsa_newsnapname, &val); in dsl_dataset_rename_snapshot_check_impl()
2990 if (dsl_dir_namelen(hds->ds_dir) + 1 + in dsl_dataset_rename_snapshot_check_impl()
2991 strlen(ddrsa->ddrsa_newsnapname) >= ZFS_MAX_DATASET_NAME_LEN) in dsl_dataset_rename_snapshot_check_impl()
3005 error = dsl_dataset_hold(dp, ddrsa->ddrsa_fsname, FTAG, &hds); in dsl_dataset_rename_snapshot_check()
3009 if (ddrsa->ddrsa_recursive) { in dsl_dataset_rename_snapshot_check()
3010 error = dmu_objset_find_dp(dp, hds->ds_dir->dd_object, in dsl_dataset_rename_snapshot_check()
3027 dmu_tx_t *tx = ddrsa->ddrsa_tx; in dsl_dataset_rename_snapshot_sync_impl()
3031 error = dsl_dataset_snap_lookup(hds, ddrsa->ddrsa_oldsnapname, &val); in dsl_dataset_rename_snapshot_sync_impl()
3042 "-> @%s", ddrsa->ddrsa_newsnapname); in dsl_dataset_rename_snapshot_sync_impl()
3044 VERIFY0(dsl_dataset_snap_remove(hds, ddrsa->ddrsa_oldsnapname, 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()
3050 VERIFY0(zap_add(dp->dp_meta_objset, in dsl_dataset_rename_snapshot_sync_impl()
3051 dsl_dataset_phys(hds)->ds_snapnames_zapobj, in dsl_dataset_rename_snapshot_sync_impl()
3052 ds->ds_snapname, 8, 1, &ds->ds_object, tx)); in dsl_dataset_rename_snapshot_sync_impl()
3054 oldname = kmem_asprintf("%s@%s", ddrsa->ddrsa_fsname, in dsl_dataset_rename_snapshot_sync_impl()
3055 ddrsa->ddrsa_oldsnapname); in dsl_dataset_rename_snapshot_sync_impl()
3056 newname = kmem_asprintf("%s@%s", ddrsa->ddrsa_fsname, in dsl_dataset_rename_snapshot_sync_impl()
3057 ddrsa->ddrsa_newsnapname); in dsl_dataset_rename_snapshot_sync_impl()
3058 zvol_rename_minors(dp->dp_spa, oldname, newname, B_TRUE); in dsl_dataset_rename_snapshot_sync_impl()
3073 VERIFY0(dsl_dataset_hold(dp, ddrsa->ddrsa_fsname, FTAG, &hds)); in dsl_dataset_rename_snapshot_sync()
3074 ddrsa->ddrsa_tx = tx; in dsl_dataset_rename_snapshot_sync()
3075 if (ddrsa->ddrsa_recursive) { in dsl_dataset_rename_snapshot_sync()
3076 VERIFY0(dmu_objset_find_dp(dp, hds->ds_dir->dd_object, in dsl_dataset_rename_snapshot_sync()
3116 dsl_dir_t *dd = ds->ds_dir; in dsl_dataset_handoff_check()
3117 mutex_enter(&dd->dd_activity_lock); in dsl_dataset_handoff_check()
3118 uint64_t holds = zfs_refcount_count(&ds->ds_longholds) - in dsl_dataset_handoff_check()
3125 * non-waiters have long-holds, and all new long-holds will be in dsl_dataset_handoff_check()
3128 if (holds != dd->dd_activity_waiters) in dsl_dataset_handoff_check()
3130 mutex_exit(&dd->dd_activity_lock); in dsl_dataset_handoff_check()
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()
3158 if (dsl_dataset_phys(ds)->ds_prev_snap_txg < TXG_INITIAL) { in dsl_dataset_rollback_check()
3170 dsl_dataset_phys(ds)->ds_prev_snap_txg >= tx->tx_txg) { in dsl_dataset_rollback_check()
3179 if (ddra->ddra_tosnap != NULL) { in dsl_dataset_rollback_check()
3183 error = dsl_dataset_hold(dp, ddra->ddra_tosnap, FTAG, &snapds); in dsl_dataset_rollback_check()
3198 ASSERT(snapds->ds_is_snapshot); 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()
3210 snapds->ds_object)) { in dsl_dataset_rollback_check()
3224 dsl_dataset_phys(ds)->ds_prev_snap_txg) { in dsl_dataset_rollback_check()
3229 error = dsl_dataset_handoff_check(ds, ddra->ddra_owner, tx); 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()
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()
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()
3278 fnvlist_add_string(ddra->ddra_result, "target", 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()
3300 * - The existing dataset MUST be owned by the specified owner at entry
3301 * - Upon return, dataset will still be held by the same owner, whether we
3333 if (strchr(ddca->ddca_clone, '@') != NULL) in dsl_dataset_clone_check()
3336 if (strlen(ddca->ddca_clone) >= ZFS_MAX_DATASET_NAME_LEN) in dsl_dataset_clone_check()
3339 error = dsl_dir_hold(dp, ddca->ddca_clone, FTAG, &pdd, &tail); in dsl_dataset_clone_check()
3348 ddca->ddca_cred); in dsl_dataset_clone_check()
3354 error = dsl_dataset_hold(dp, ddca->ddca_origin, FTAG, &origin); in dsl_dataset_clone_check()
3361 if (!origin->ds_is_snapshot) { in dsl_dataset_clone_check()
3384 VERIFY0(dsl_dir_hold(dp, ddca->ddca_clone, FTAG, &pdd, &tail)); in dsl_dataset_clone_sync()
3385 VERIFY0(dsl_dataset_hold(dp, ddca->ddca_origin, FTAG, &origin)); in dsl_dataset_clone_sync()
3388 ddca->ddca_cred, NULL, tx); in dsl_dataset_clone_sync()
3390 VERIFY0(dsl_dataset_hold_obj(pdd->dd_pool, obj, FTAG, &ds)); in dsl_dataset_clone_sync()
3393 "origin=%s (%llu)", namebuf, (u_longlong_t)origin->ds_object); in dsl_dataset_clone_sync()
3450 hds = ddpa->ddpa_clone; in dsl_dataset_promote_check()
3451 max_snap_len = MAXNAMELEN - strlen(ddpa->ddpa_clonename) - 1; in dsl_dataset_promote_check()
3453 if (dsl_dataset_phys(hds)->ds_flags & DS_FLAG_NOPROMOTE) { in dsl_dataset_promote_check()
3458 snap = list_head(&ddpa->shared_snaps); in dsl_dataset_promote_check()
3463 dsl_dataset_t *const origin_ds = snap->ds; in dsl_dataset_promote_check()
3471 err = dsl_dataset_promote_crypt_check(hds->ds_dir, origin_ds->ds_dir); in dsl_dataset_promote_check()
3485 snap = list_tail(&ddpa->clone_snaps); in dsl_dataset_promote_check()
3487 ASSERT3U(dsl_dataset_phys(snap->ds)->ds_prev_snap_obj, ==, in dsl_dataset_promote_check()
3488 origin_ds->ds_object); in dsl_dataset_promote_check()
3489 dsl_deadlist_space_range(&snap->ds->ds_deadlist, in dsl_dataset_promote_check()
3490 dsl_dataset_phys(origin_ds)->ds_prev_snap_txg, UINT64_MAX, in dsl_dataset_promote_check()
3491 &ddpa->unique, &unused, &unused); in dsl_dataset_promote_check()
3498 * (my used) = (prev's used) + (blocks born) - (blocks killed) in dsl_dataset_promote_check()
3500 * (blocks born) = (my used) - (prev's used) + (blocks killed) in dsl_dataset_promote_check()
3502 * (uN - u(N-1) + kN) + ... + (u1 - u0 + k1) + (u0 - 0 + k0) in dsl_dataset_promote_check()
3504 * uN + kN + kN-1 + ... + k1 + k0 in dsl_dataset_promote_check()
3506 * uN + kN + kN-1 + ... + kM - uM-1 in dsl_dataset_promote_check()
3510 ddpa->used = dsl_dataset_phys(origin_ds)->ds_referenced_bytes; in dsl_dataset_promote_check()
3511 ddpa->comp = dsl_dataset_phys(origin_ds)->ds_compressed_bytes; in dsl_dataset_promote_check()
3512 ddpa->uncomp = dsl_dataset_phys(origin_ds)->ds_uncompressed_bytes; in dsl_dataset_promote_check()
3513 for (snap = list_head(&ddpa->shared_snaps); snap; in dsl_dataset_promote_check()
3514 snap = list_next(&ddpa->shared_snaps, snap)) { in dsl_dataset_promote_check()
3516 dsl_dataset_t *ds = snap->ds; in dsl_dataset_promote_check()
3531 if (strlen(ds->ds_snapname) >= max_snap_len) { in dsl_dataset_promote_check()
3535 err = dsl_dataset_snap_lookup(hds, ds->ds_snapname, &val); in dsl_dataset_promote_check()
3537 fnvlist_add_boolean(ddpa->err_ds, in dsl_dataset_promote_check()
3538 snap->ds->ds_snapname); in dsl_dataset_promote_check()
3545 if (dsl_dataset_phys(ds)->ds_prev_snap_obj == 0) in dsl_dataset_promote_check()
3548 dsl_deadlist_space(&ds->ds_deadlist, in dsl_dataset_promote_check()
3550 ddpa->used += dlused; in dsl_dataset_promote_check()
3551 ddpa->comp += dlcomp; in dsl_dataset_promote_check()
3552 ddpa->uncomp += dluncomp; in dsl_dataset_promote_check()
3559 for (dsl_bookmark_node_t *dbn = avl_first(&origin_ds->ds_bookmarks); in dsl_dataset_promote_check()
3560 dbn != NULL && dbn->dbn_phys.zbm_creation_txg <= in dsl_dataset_promote_check()
3561 dsl_dataset_phys(origin_ds)->ds_creation_txg; in dsl_dataset_promote_check()
3562 dbn = AVL_NEXT(&origin_ds->ds_bookmarks, dbn)) { in dsl_dataset_promote_check()
3563 if (strlen(dbn->dbn_name) >= max_snap_len) { in dsl_dataset_promote_check()
3568 err = dsl_bookmark_lookup_impl(ddpa->ddpa_clone, in dsl_dataset_promote_check()
3569 dbn->dbn_name, &bm); in dsl_dataset_promote_check()
3572 fnvlist_add_boolean(ddpa->err_ds, dbn->dbn_name); in dsl_dataset_promote_check()
3595 if (ddpa->origin_origin) { in dsl_dataset_promote_check()
3596 ddpa->used -= in dsl_dataset_promote_check()
3597 dsl_dataset_phys(ddpa->origin_origin)->ds_referenced_bytes; in dsl_dataset_promote_check()
3598 ddpa->comp -= in dsl_dataset_promote_check()
3599 dsl_dataset_phys(ddpa->origin_origin)->ds_compressed_bytes; in dsl_dataset_promote_check()
3600 ddpa->uncomp -= in dsl_dataset_promote_check()
3601 dsl_dataset_phys(ddpa->origin_origin)-> in dsl_dataset_promote_check()
3606 err = dsl_dir_transfer_possible(origin_ds->ds_dir, hds->ds_dir, in dsl_dataset_promote_check()
3607 0, ss_mv_cnt, ddpa->used, ddpa->cr); in dsl_dataset_promote_check()
3617 if (dsl_dir_phys(hds->ds_dir)->dd_flags & DD_FLAG_USED_BREAKDOWN) { in dsl_dataset_promote_check()
3623 * these snaplist_space() -> dsl_deadlist_space_range() in dsl_dataset_promote_check()
3627 snap = list_head(&ddpa->origin_snaps); in dsl_dataset_promote_check()
3632 err = snaplist_space(&ddpa->shared_snaps, in dsl_dataset_promote_check()
3633 snap->ds->ds_dir->dd_origin_txg, &ddpa->cloneusedsnap); in dsl_dataset_promote_check()
3637 err = snaplist_space(&ddpa->clone_snaps, in dsl_dataset_promote_check()
3638 snap->ds->ds_dir->dd_origin_txg, &space); in dsl_dataset_promote_check()
3641 ddpa->cloneusedsnap += space; in dsl_dataset_promote_check()
3643 if (dsl_dir_phys(origin_ds->ds_dir)->dd_flags & in dsl_dataset_promote_check()
3645 err = snaplist_space(&ddpa->origin_snaps, in dsl_dataset_promote_check()
3646 dsl_dataset_phys(origin_ds)->ds_creation_txg, in dsl_dataset_promote_check()
3647 &ddpa->originusedsnap); in dsl_dataset_promote_check()
3671 ASSERT(nvlist_empty(ddpa->err_ds)); in dsl_dataset_promote_sync()
3674 hds = ddpa->ddpa_clone; in dsl_dataset_promote_sync()
3676 ASSERT0(dsl_dataset_phys(hds)->ds_flags & DS_FLAG_NOPROMOTE); in dsl_dataset_promote_sync()
3678 snap = list_head(&ddpa->shared_snaps); in dsl_dataset_promote_sync()
3679 origin_ds = snap->ds; in dsl_dataset_promote_sync()
3680 dd = hds->ds_dir; in dsl_dataset_promote_sync()
3682 snap = list_head(&ddpa->origin_snaps); in dsl_dataset_promote_sync()
3683 origin_head = snap->ds; in dsl_dataset_promote_sync()
3689 VERIFY0(dsl_dir_hold_obj(dp, origin_ds->ds_dir->dd_object, in dsl_dataset_promote_sync()
3692 dsl_dataset_promote_crypt_sync(hds->ds_dir, odd, tx); in dsl_dataset_promote_sync()
3695 dmu_buf_will_dirty(origin_ds->ds_dbuf, tx); in dsl_dataset_promote_sync()
3696 oldnext_obj = dsl_dataset_phys(origin_ds)->ds_next_snap_obj; in dsl_dataset_promote_sync()
3697 snap = list_tail(&ddpa->clone_snaps); in dsl_dataset_promote_sync()
3698 ASSERT3U(dsl_dataset_phys(snap->ds)->ds_prev_snap_obj, ==, in dsl_dataset_promote_sync()
3699 origin_ds->ds_object); in dsl_dataset_promote_sync()
3700 dsl_dataset_phys(origin_ds)->ds_next_snap_obj = snap->ds->ds_object; in dsl_dataset_promote_sync()
3703 if (dsl_dataset_phys(origin_ds)->ds_next_clones_obj) { in dsl_dataset_promote_sync()
3705 snap->ds->ds_object, tx); in dsl_dataset_promote_sync()
3706 VERIFY0(zap_add_int(dp->dp_meta_objset, in dsl_dataset_promote_sync()
3707 dsl_dataset_phys(origin_ds)->ds_next_clones_obj, in dsl_dataset_promote_sync()
3712 dmu_buf_will_dirty(dd->dd_dbuf, tx); in dsl_dataset_promote_sync()
3713 ASSERT3U(dsl_dir_phys(dd)->dd_origin_obj, ==, origin_ds->ds_object); in dsl_dataset_promote_sync()
3714 dsl_dir_phys(dd)->dd_origin_obj = dsl_dir_phys(odd)->dd_origin_obj; in dsl_dataset_promote_sync()
3715 dd->dd_origin_txg = origin_head->ds_dir->dd_origin_txg; in dsl_dataset_promote_sync()
3716 dmu_buf_will_dirty(odd->dd_dbuf, tx); in dsl_dataset_promote_sync()
3717 dsl_dir_phys(odd)->dd_origin_obj = origin_ds->ds_object; in dsl_dataset_promote_sync()
3718 origin_head->ds_dir->dd_origin_txg = in dsl_dataset_promote_sync()
3719 dsl_dataset_phys(origin_ds)->ds_creation_txg; in dsl_dataset_promote_sync()
3722 if (spa_version(dp->dp_spa) >= SPA_VERSION_DIR_CLONES) { in dsl_dataset_promote_sync()
3723 VERIFY0(zap_remove_int(dp->dp_meta_objset, in dsl_dataset_promote_sync()
3724 dsl_dir_phys(odd)->dd_clones, hds->ds_object, tx)); in dsl_dataset_promote_sync()
3725 VERIFY0(zap_add_int(dp->dp_meta_objset, in dsl_dataset_promote_sync()
3726 dsl_dir_phys(ddpa->origin_origin->ds_dir)->dd_clones, in dsl_dataset_promote_sync()
3727 hds->ds_object, tx)); in dsl_dataset_promote_sync()
3729 VERIFY0(zap_remove_int(dp->dp_meta_objset, in dsl_dataset_promote_sync()
3730 dsl_dir_phys(ddpa->origin_origin->ds_dir)->dd_clones, in dsl_dataset_promote_sync()
3731 origin_head->ds_object, tx)); in dsl_dataset_promote_sync()
3732 if (dsl_dir_phys(dd)->dd_clones == 0) { in dsl_dataset_promote_sync()
3733 dsl_dir_phys(dd)->dd_clones = in dsl_dataset_promote_sync()
3734 zap_create(dp->dp_meta_objset, DMU_OT_DSL_CLONES, in dsl_dataset_promote_sync()
3737 VERIFY0(zap_add_int(dp->dp_meta_objset, in dsl_dataset_promote_sync()
3738 dsl_dir_phys(dd)->dd_clones, origin_head->ds_object, tx)); in dsl_dataset_promote_sync()
3745 for (dsl_bookmark_node_t *dbn = avl_first(&origin_head->ds_bookmarks); in dsl_dataset_promote_sync()
3746 dbn != NULL && dbn->dbn_phys.zbm_creation_txg <= in dsl_dataset_promote_sync()
3747 dsl_dataset_phys(origin_ds)->ds_creation_txg; in dsl_dataset_promote_sync()
3749 dbn_next = AVL_NEXT(&origin_head->ds_bookmarks, dbn); in dsl_dataset_promote_sync()
3751 avl_remove(&origin_head->ds_bookmarks, dbn); in dsl_dataset_promote_sync()
3752 VERIFY0(zap_remove(dp->dp_meta_objset, in dsl_dataset_promote_sync()
3753 origin_head->ds_bookmarks_obj, dbn->dbn_name, tx)); in dsl_dataset_promote_sync()
3761 for (snap = list_head(&ddpa->shared_snaps); snap; in dsl_dataset_promote_sync()
3762 snap = list_next(&ddpa->shared_snaps, snap)) { in dsl_dataset_promote_sync()
3763 dsl_dataset_t *ds = snap->ds; in dsl_dataset_promote_sync()
3770 if (ds->ds_objset) { in dsl_dataset_promote_sync()
3771 dmu_objset_evict(ds->ds_objset); in dsl_dataset_promote_sync()
3772 ds->ds_objset = NULL; in dsl_dataset_promote_sync()
3778 ds->ds_snapname, tx, B_TRUE)); in dsl_dataset_promote_sync()
3779 VERIFY0(zap_add(dp->dp_meta_objset, in dsl_dataset_promote_sync()
3780 dsl_dataset_phys(hds)->ds_snapnames_zapobj, ds->ds_snapname, in dsl_dataset_promote_sync()
3781 8, 1, &ds->ds_object, tx)); in dsl_dataset_promote_sync()
3782 dsl_fs_ss_count_adjust(hds->ds_dir, 1, in dsl_dataset_promote_sync()
3786 dmu_buf_will_dirty(ds->ds_dbuf, tx); in dsl_dataset_promote_sync()
3787 ASSERT3U(dsl_dataset_phys(ds)->ds_dir_obj, ==, odd->dd_object); in dsl_dataset_promote_sync()
3788 dsl_dataset_phys(ds)->ds_dir_obj = dd->dd_object; in dsl_dataset_promote_sync()
3789 ASSERT3P(ds->ds_dir, ==, odd); in dsl_dataset_promote_sync()
3790 dsl_dir_rele(ds->ds_dir, ds); in dsl_dataset_promote_sync()
3791 VERIFY0(dsl_dir_hold_obj(dp, dd->dd_object, in dsl_dataset_promote_sync()
3792 NULL, ds, &ds->ds_dir)); in dsl_dataset_promote_sync()
3795 if (dsl_dataset_phys(ds)->ds_next_clones_obj && in dsl_dataset_promote_sync()
3796 spa_version(dp->dp_spa) >= SPA_VERSION_DIR_CLONES) { in dsl_dataset_promote_sync()
3800 for (zap_cursor_init(&zc, dp->dp_meta_objset, in dsl_dataset_promote_sync()
3801 dsl_dataset_phys(ds)->ds_next_clones_obj); in dsl_dataset_promote_sync()
3807 if (za->za_first_integer == oldnext_obj) { in dsl_dataset_promote_sync()
3816 za->za_first_integer, FTAG, &cnds)); in dsl_dataset_promote_sync()
3817 o = dsl_dir_phys(cnds->ds_dir)-> in dsl_dataset_promote_sync()
3820 VERIFY0(zap_remove_int(dp->dp_meta_objset, in dsl_dataset_promote_sync()
3821 dsl_dir_phys(odd)->dd_clones, o, tx)); in dsl_dataset_promote_sync()
3822 VERIFY0(zap_add_int(dp->dp_meta_objset, in dsl_dataset_promote_sync()
3823 dsl_dir_phys(dd)->dd_clones, o, tx)); in dsl_dataset_promote_sync()
3835 * Note, pa->*usedsnap and dd_used_breakdown[SNAP] will either in dsl_dataset_promote_sync()
3840 delta = ddpa->cloneusedsnap - in dsl_dataset_promote_sync()
3841 dsl_dir_phys(dd)->dd_used_breakdown[DD_USED_SNAP]; in dsl_dataset_promote_sync()
3843 ASSERT3U(ddpa->used, >=, delta); in dsl_dataset_promote_sync()
3846 ddpa->used - delta, ddpa->comp, ddpa->uncomp, tx); in dsl_dataset_promote_sync()
3848 delta = ddpa->originusedsnap - in dsl_dataset_promote_sync()
3849 dsl_dir_phys(odd)->dd_used_breakdown[DD_USED_SNAP]; in dsl_dataset_promote_sync()
3851 ASSERT3U(ddpa->used, >=, -delta); in dsl_dataset_promote_sync()
3854 -ddpa->used - delta, -ddpa->comp, -ddpa->uncomp, tx); in dsl_dataset_promote_sync()
3856 dsl_dataset_phys(origin_ds)->ds_unique_bytes = ddpa->unique; in dsl_dataset_promote_sync()
3877 if (spa_feature_is_enabled(dp->dp_spa, SPA_FEATURE_HEAD_ERRLOG)) { in dsl_dataset_promote_sync()
3878 uint64_t old_head = origin_head->ds_object; in dsl_dataset_promote_sync()
3879 uint64_t new_head = hds->ds_object; in dsl_dataset_promote_sync()
3880 spa_swap_errlog(dp->dp_spa, new_head, old_head, tx); in dsl_dataset_promote_sync()
3912 first_obj = dsl_dir_phys(ds->ds_dir)->dd_origin_obj; in snaplist_make()
3915 snap->ds = ds; in snaplist_make()
3917 obj = dsl_dataset_phys(ds)->ds_prev_snap_obj; in snaplist_make()
3931 dsl_deadlist_space_range(&snap->ds->ds_deadlist, in snaplist_space()
3943 if (l == NULL || !list_link_active(&l->list_head)) in snaplist_destroy()
3947 dsl_dataset_rele(snap->ds, tag); in snaplist_destroy()
3960 error = dsl_dataset_hold(dp, ddpa->ddpa_clonename, tag, in promote_hold()
3961 &ddpa->ddpa_clone); in promote_hold()
3964 dd = ddpa->ddpa_clone->ds_dir; in promote_hold()
3966 if (ddpa->ddpa_clone->ds_is_snapshot || in promote_hold()
3968 dsl_dataset_rele(ddpa->ddpa_clone, tag); in promote_hold()
3972 error = snaplist_make(dp, 0, dsl_dir_phys(dd)->dd_origin_obj, in promote_hold()
3973 &ddpa->shared_snaps, tag); in promote_hold()
3977 error = snaplist_make(dp, 0, ddpa->ddpa_clone->ds_object, in promote_hold()
3978 &ddpa->clone_snaps, tag); in promote_hold()
3982 snap = list_head(&ddpa->shared_snaps); in promote_hold()
3983 ASSERT3U(snap->ds->ds_object, ==, dsl_dir_phys(dd)->dd_origin_obj); in promote_hold()
3984 error = snaplist_make(dp, dsl_dir_phys(dd)->dd_origin_obj, in promote_hold()
3985 dsl_dir_phys(snap->ds->ds_dir)->dd_head_dataset_obj, in promote_hold()
3986 &ddpa->origin_snaps, tag); in promote_hold()
3990 if (dsl_dir_phys(snap->ds->ds_dir)->dd_origin_obj != 0) { in promote_hold()
3992 dsl_dir_phys(snap->ds->ds_dir)->dd_origin_obj, in promote_hold()
3993 tag, &ddpa->origin_origin); in promote_hold()
4006 snaplist_destroy(&ddpa->shared_snaps, tag); in promote_rele()
4007 snaplist_destroy(&ddpa->clone_snaps, tag); in promote_rele()
4008 snaplist_destroy(&ddpa->origin_snaps, tag); in promote_rele()
4009 if (ddpa->origin_origin != NULL) in promote_rele()
4010 dsl_dataset_rele(ddpa->origin_origin, tag); in promote_rele()
4011 dsl_dataset_rele(ddpa->ddpa_clone, tag); in promote_rele()
4036 error = zap_count(dmu_objset_pool(os)->dp_meta_objset, in dsl_dataset_promote()
4037 dsl_dataset_phys(dmu_objset_ds(os))->ds_snapnames_zapobj, in dsl_dataset_promote()
4081 if (clone->ds_is_snapshot || in dsl_dataset_clone_swap_check_impl()
4082 origin_head->ds_is_snapshot) in dsl_dataset_clone_swap_check_impl()
4086 if (!force && clone->ds_prev != origin_head->ds_prev) in dsl_dataset_clone_swap_check_impl()
4090 if (clone->ds_prev != NULL && in dsl_dataset_clone_swap_check_impl()
4091 clone->ds_prev != clone->ds_dir->dd_pool->dp_origin_snap && in dsl_dataset_clone_swap_check_impl()
4092 origin_head->ds_dir != clone->ds_prev->ds_dir) in dsl_dataset_clone_swap_check_impl()
4096 if (clone->ds_dir->dd_parent != origin_head->ds_dir) in dsl_dataset_clone_swap_check_impl()
4101 dsl_dataset_modified_since_snap(origin_head, origin_head->ds_prev)) in dsl_dataset_clone_swap_check_impl()
4110 (int64_t)MIN(origin_head->ds_reserved, in dsl_dataset_clone_swap_check_impl()
4111 dsl_dataset_phys(origin_head)->ds_unique_bytes) - in dsl_dataset_clone_swap_check_impl()
4112 (int64_t)MIN(origin_head->ds_reserved, in dsl_dataset_clone_swap_check_impl()
4113 dsl_dataset_phys(clone)->ds_unique_bytes); in dsl_dataset_clone_swap_check_impl()
4117 dsl_dir_space_available(origin_head->ds_dir, NULL, 0, TRUE)) in dsl_dataset_clone_swap_check_impl()
4133 if (origin_head->ds_quota != 0 && in dsl_dataset_clone_swap_check_impl()
4134 dsl_dataset_phys(clone)->ds_referenced_bytes > in dsl_dataset_clone_swap_check_impl()
4135 origin_head->ds_quota + refquota_slack) in dsl_dataset_clone_swap_check_impl()
4154 dsl_deadlist_close(&clone->ds_remap_deadlist); in dsl_dataset_swap_remap_deadlists()
4158 dsl_deadlist_close(&origin->ds_remap_deadlist); in dsl_dataset_swap_remap_deadlists()
4165 VERIFY0(dsl_deadlist_open(&origin->ds_remap_deadlist, in dsl_dataset_swap_remap_deadlists()
4166 dp->dp_meta_objset, clone_remap_dl_obj)); in dsl_dataset_swap_remap_deadlists()
4171 VERIFY0(dsl_deadlist_open(&clone->ds_remap_deadlist, in dsl_dataset_swap_remap_deadlists()
4172 dp->dp_meta_objset, origin_remap_dl_obj)); in dsl_dataset_swap_remap_deadlists()
4183 ASSERT0(clone->ds_reserved); in dsl_dataset_clone_swap_sync_impl()
4188 ASSERT(origin_head->ds_quota == 0 || in dsl_dataset_clone_swap_sync_impl()
4189 dsl_dataset_phys(clone)->ds_unique_bytes <= origin_head->ds_quota + in dsl_dataset_clone_swap_sync_impl()
4191 ASSERT3P(clone->ds_prev, ==, origin_head->ds_prev); in dsl_dataset_clone_swap_sync_impl()
4193 dsl_dir_cancel_waiters(origin_head->ds_dir); in dsl_dataset_clone_swap_sync_impl()
4196 * Swap per-dataset feature flags. in dsl_dataset_clone_swap_sync_impl()
4207 void *clone_feature = clone->ds_feature[f]; in dsl_dataset_clone_swap_sync_impl()
4210 void *origin_head_feature = origin_head->ds_feature[f]; in dsl_dataset_clone_swap_sync_impl()
4218 dsl_dataset_activate_feature(origin_head->ds_object, f, in dsl_dataset_clone_swap_sync_impl()
4220 origin_head->ds_feature[f] = clone_feature; in dsl_dataset_clone_swap_sync_impl()
4223 dsl_dataset_activate_feature(clone->ds_object, f, in dsl_dataset_clone_swap_sync_impl()
4225 clone->ds_feature[f] = origin_head_feature; in dsl_dataset_clone_swap_sync_impl()
4229 dmu_buf_will_dirty(clone->ds_dbuf, tx); in dsl_dataset_clone_swap_sync_impl()
4230 dmu_buf_will_dirty(origin_head->ds_dbuf, tx); in dsl_dataset_clone_swap_sync_impl()
4232 if (clone->ds_objset != NULL) { in dsl_dataset_clone_swap_sync_impl()
4233 dmu_objset_evict(clone->ds_objset); in dsl_dataset_clone_swap_sync_impl()
4234 clone->ds_objset = NULL; in dsl_dataset_clone_swap_sync_impl()
4237 if (origin_head->ds_objset != NULL) { in dsl_dataset_clone_swap_sync_impl()
4238 dmu_objset_evict(origin_head->ds_objset); in dsl_dataset_clone_swap_sync_impl()
4239 origin_head->ds_objset = NULL; in dsl_dataset_clone_swap_sync_impl()
4243 (int64_t)MIN(origin_head->ds_reserved, in dsl_dataset_clone_swap_sync_impl()
4244 dsl_dataset_phys(origin_head)->ds_unique_bytes) - in dsl_dataset_clone_swap_sync_impl()
4245 (int64_t)MIN(origin_head->ds_reserved, in dsl_dataset_clone_swap_sync_impl()
4246 dsl_dataset_phys(clone)->ds_unique_bytes); in dsl_dataset_clone_swap_sync_impl()
4252 dsl_dataset_t *origin = clone->ds_prev; in dsl_dataset_clone_swap_sync_impl()
4255 dmu_buf_will_dirty(origin->ds_dbuf, tx); in dsl_dataset_clone_swap_sync_impl()
4256 dsl_deadlist_space_range(&clone->ds_deadlist, in dsl_dataset_clone_swap_sync_impl()
4257 dsl_dataset_phys(origin)->ds_prev_snap_txg, UINT64_MAX, in dsl_dataset_clone_swap_sync_impl()
4258 &dsl_dataset_phys(origin)->ds_unique_bytes, &comp, &uncomp); in dsl_dataset_clone_swap_sync_impl()
4263 rrw_enter(&clone->ds_bp_rwlock, RW_WRITER, FTAG); in dsl_dataset_clone_swap_sync_impl()
4264 rrw_enter(&origin_head->ds_bp_rwlock, RW_WRITER, FTAG); in dsl_dataset_clone_swap_sync_impl()
4266 tmp = dsl_dataset_phys(origin_head)->ds_bp; in dsl_dataset_clone_swap_sync_impl()
4267 dsl_dataset_phys(origin_head)->ds_bp = in dsl_dataset_clone_swap_sync_impl()
4268 dsl_dataset_phys(clone)->ds_bp; in dsl_dataset_clone_swap_sync_impl()
4269 dsl_dataset_phys(clone)->ds_bp = tmp; in dsl_dataset_clone_swap_sync_impl()
4270 rrw_exit(&origin_head->ds_bp_rwlock, FTAG); in dsl_dataset_clone_swap_sync_impl()
4271 rrw_exit(&clone->ds_bp_rwlock, FTAG); in dsl_dataset_clone_swap_sync_impl()
4280 ASSERT3U(dsl_dir_phys(clone->ds_dir)-> in dsl_dataset_clone_swap_sync_impl()
4283 dsl_deadlist_space(&clone->ds_deadlist, in dsl_dataset_clone_swap_sync_impl()
4285 dsl_deadlist_space(&origin_head->ds_deadlist, in dsl_dataset_clone_swap_sync_impl()
4288 dused = dsl_dataset_phys(clone)->ds_referenced_bytes + in dsl_dataset_clone_swap_sync_impl()
4289 cdl_used - in dsl_dataset_clone_swap_sync_impl()
4290 (dsl_dataset_phys(origin_head)->ds_referenced_bytes + in dsl_dataset_clone_swap_sync_impl()
4292 dcomp = dsl_dataset_phys(clone)->ds_compressed_bytes + in dsl_dataset_clone_swap_sync_impl()
4293 cdl_comp - in dsl_dataset_clone_swap_sync_impl()
4294 (dsl_dataset_phys(origin_head)->ds_compressed_bytes + in dsl_dataset_clone_swap_sync_impl()
4296 duncomp = dsl_dataset_phys(clone)->ds_uncompressed_bytes + in dsl_dataset_clone_swap_sync_impl()
4297 cdl_uncomp - in dsl_dataset_clone_swap_sync_impl()
4298 (dsl_dataset_phys(origin_head)->ds_uncompressed_bytes + in dsl_dataset_clone_swap_sync_impl()
4301 dsl_dir_diduse_space(origin_head->ds_dir, DD_USED_HEAD, in dsl_dataset_clone_swap_sync_impl()
4303 dsl_dir_diduse_space(clone->ds_dir, DD_USED_HEAD, in dsl_dataset_clone_swap_sync_impl()
4304 -dused, -dcomp, -duncomp, tx); in dsl_dataset_clone_swap_sync_impl()
4312 dsl_deadlist_space_range(&clone->ds_deadlist, in dsl_dataset_clone_swap_sync_impl()
4313 origin_head->ds_dir->dd_origin_txg, UINT64_MAX, in dsl_dataset_clone_swap_sync_impl()
4315 dsl_deadlist_space_range(&origin_head->ds_deadlist, in dsl_dataset_clone_swap_sync_impl()
4316 origin_head->ds_dir->dd_origin_txg, UINT64_MAX, in dsl_dataset_clone_swap_sync_impl()
4318 dsl_dir_transfer_space(origin_head->ds_dir, cdl_used - odl_used, in dsl_dataset_clone_swap_sync_impl()
4323 SWITCH64(dsl_dataset_phys(origin_head)->ds_referenced_bytes, in dsl_dataset_clone_swap_sync_impl()
4324 dsl_dataset_phys(clone)->ds_referenced_bytes); in dsl_dataset_clone_swap_sync_impl()
4325 SWITCH64(dsl_dataset_phys(origin_head)->ds_compressed_bytes, in dsl_dataset_clone_swap_sync_impl()
4326 dsl_dataset_phys(clone)->ds_compressed_bytes); in dsl_dataset_clone_swap_sync_impl()
4327 SWITCH64(dsl_dataset_phys(origin_head)->ds_uncompressed_bytes, in dsl_dataset_clone_swap_sync_impl()
4328 dsl_dataset_phys(clone)->ds_uncompressed_bytes); in dsl_dataset_clone_swap_sync_impl()
4329 SWITCH64(dsl_dataset_phys(origin_head)->ds_unique_bytes, in dsl_dataset_clone_swap_sync_impl()
4330 dsl_dataset_phys(clone)->ds_unique_bytes); in dsl_dataset_clone_swap_sync_impl()
4333 dsl_dir_diduse_space(origin_head->ds_dir, DD_USED_REFRSRV, in dsl_dataset_clone_swap_sync_impl()
4339 dsl_deadlist_close(&clone->ds_deadlist); in dsl_dataset_clone_swap_sync_impl()
4340 dsl_deadlist_close(&origin_head->ds_deadlist); in dsl_dataset_clone_swap_sync_impl()
4341 SWITCH64(dsl_dataset_phys(origin_head)->ds_deadlist_obj, in dsl_dataset_clone_swap_sync_impl()
4342 dsl_dataset_phys(clone)->ds_deadlist_obj); in dsl_dataset_clone_swap_sync_impl()
4343 VERIFY0(dsl_deadlist_open(&clone->ds_deadlist, dp->dp_meta_objset, in dsl_dataset_clone_swap_sync_impl()
4344 dsl_dataset_phys(clone)->ds_deadlist_obj)); in dsl_dataset_clone_swap_sync_impl()
4345 VERIFY0(dsl_deadlist_open(&origin_head->ds_deadlist, dp->dp_meta_objset, in dsl_dataset_clone_swap_sync_impl()
4346 dsl_dataset_phys(origin_head)->ds_deadlist_obj)); in dsl_dataset_clone_swap_sync_impl()
4353 dsl_bookmark_next_changed(origin_head, origin_head->ds_prev, tx); in dsl_dataset_clone_swap_sync_impl()
4362 dsl_dir_remove_livelist(clone->ds_dir, tx, B_TRUE); in dsl_dataset_clone_swap_sync_impl()
4363 dsl_dir_remove_livelist(origin_head->ds_dir, tx, B_TRUE); in dsl_dataset_clone_swap_sync_impl()
4366 "parent=%s", origin_head->ds_dir->dd_myname); in dsl_dataset_clone_swap_sync_impl()
4408 mutex_enter(&ds->ds_lock); in dsl_dataset_check_quota()
4412 if (ds->ds_reserved > dsl_dataset_phys(ds)->ds_unique_bytes) { in dsl_dataset_check_quota()
4414 ds->ds_reserved - dsl_dataset_phys(ds)->ds_unique_bytes); in dsl_dataset_check_quota()
4415 *used -= in dsl_dataset_check_quota()
4416 (ds->ds_reserved - dsl_dataset_phys(ds)->ds_unique_bytes); in dsl_dataset_check_quota()
4418 asize - MIN(asize, parent_delta(ds, asize + inflight)); in dsl_dataset_check_quota()
4421 if (!check_quota || ds->ds_quota == 0) { in dsl_dataset_check_quota()
4422 mutex_exit(&ds->ds_lock); in dsl_dataset_check_quota()
4428 * on-disk is over quota and there are no pending changes (which in dsl_dataset_check_quota()
4431 if (dsl_dataset_phys(ds)->ds_referenced_bytes + inflight >= in dsl_dataset_check_quota()
4432 ds->ds_quota) { in dsl_dataset_check_quota()
4434 dsl_dataset_phys(ds)->ds_referenced_bytes < ds->ds_quota) in dsl_dataset_check_quota()
4439 mutex_exit(&ds->ds_lock); in dsl_dataset_check_quota()
4460 if (spa_version(dp->dp_spa) < SPA_VERSION_REFQUOTA) in dsl_dataset_set_refquota_check()
4463 error = dsl_dataset_hold(dp, ddsqra->ddsqra_name, FTAG, &ds); in dsl_dataset_set_refquota_check()
4467 if (ds->ds_is_snapshot) { in dsl_dataset_set_refquota_check()
4472 error = dsl_prop_predict(ds->ds_dir, in dsl_dataset_set_refquota_check()
4474 ddsqra->ddsqra_source, ddsqra->ddsqra_value, &newval); in dsl_dataset_set_refquota_check()
4485 if (newval < dsl_dataset_phys(ds)->ds_referenced_bytes || in dsl_dataset_set_refquota_check()
4486 newval < ds->ds_reserved) { in dsl_dataset_set_refquota_check()
4503 VERIFY0(dsl_dataset_hold(dp, ddsqra->ddsqra_name, FTAG, &ds)); in dsl_dataset_set_refquota_sync()
4507 ddsqra->ddsqra_source, sizeof (ddsqra->ddsqra_value), 1, in dsl_dataset_set_refquota_sync()
4508 &ddsqra->ddsqra_value, tx); in dsl_dataset_set_refquota_sync()
4513 if (ds->ds_quota != newval) { in dsl_dataset_set_refquota_sync()
4514 dmu_buf_will_dirty(ds->ds_dbuf, tx); in dsl_dataset_set_refquota_sync()
4515 ds->ds_quota = newval; in dsl_dataset_set_refquota_sync()
4544 if (spa_version(dp->dp_spa) < SPA_VERSION_REFRESERVATION) in dsl_dataset_set_refreservation_check()
4547 error = dsl_dataset_hold(dp, ddsqra->ddsqra_name, FTAG, &ds); in dsl_dataset_set_refreservation_check()
4551 if (ds->ds_is_snapshot) { in dsl_dataset_set_refreservation_check()
4556 error = dsl_prop_predict(ds->ds_dir, in dsl_dataset_set_refreservation_check()
4558 ddsqra->ddsqra_source, ddsqra->ddsqra_value, &newval); in dsl_dataset_set_refreservation_check()
4573 mutex_enter(&ds->ds_lock); in dsl_dataset_set_refreservation_check()
4576 unique = dsl_dataset_phys(ds)->ds_unique_bytes; in dsl_dataset_set_refreservation_check()
4577 mutex_exit(&ds->ds_lock); in dsl_dataset_set_refreservation_check()
4579 if (MAX(unique, newval) > MAX(unique, ds->ds_reserved)) { in dsl_dataset_set_refreservation_check()
4580 uint64_t delta = MAX(unique, newval) - in dsl_dataset_set_refreservation_check()
4581 MAX(unique, ds->ds_reserved); in dsl_dataset_set_refreservation_check()
4584 dsl_dir_space_available(ds->ds_dir, NULL, 0, B_TRUE) || in dsl_dataset_set_refreservation_check()
4585 (ds->ds_quota > 0 && newval > ds->ds_quota)) { in dsl_dataset_set_refreservation_check()
4609 dmu_buf_will_dirty(ds->ds_dbuf, tx); in dsl_dataset_set_refreservation_sync_impl()
4610 mutex_enter(&ds->ds_dir->dd_lock); in dsl_dataset_set_refreservation_sync_impl()
4611 mutex_enter(&ds->ds_lock); in dsl_dataset_set_refreservation_sync_impl()
4613 unique = dsl_dataset_phys(ds)->ds_unique_bytes; in dsl_dataset_set_refreservation_sync_impl()
4614 delta = MAX(0, (int64_t)(newval - unique)) - in dsl_dataset_set_refreservation_sync_impl()
4615 MAX(0, (int64_t)(ds->ds_reserved - unique)); in dsl_dataset_set_refreservation_sync_impl()
4616 ds->ds_reserved = newval; in dsl_dataset_set_refreservation_sync_impl()
4617 mutex_exit(&ds->ds_lock); in dsl_dataset_set_refreservation_sync_impl()
4619 dsl_dir_diduse_space(ds->ds_dir, DD_USED_REFRSRV, delta, 0, 0, tx); in dsl_dataset_set_refreservation_sync_impl()
4620 mutex_exit(&ds->ds_dir->dd_lock); in dsl_dataset_set_refreservation_sync_impl()
4630 VERIFY0(dsl_dataset_hold(dp, ddsqra->ddsqra_name, FTAG, &ds)); in dsl_dataset_set_refreservation_sync()
4632 ddsqra->ddsqra_source, ddsqra->ddsqra_value, tx); in dsl_dataset_set_refreservation_sync()
4663 uint64_t compval = ZIO_COMPRESS_ALGO(ddsca->ddsca_value); in dsl_dataset_set_compression_check()
4669 if (!spa_feature_is_enabled(dp->dp_spa, f)) in dsl_dataset_set_compression_check()
4682 uint64_t compval = ZIO_COMPRESS_ALGO(ddsca->ddsca_value); in dsl_dataset_set_compression_sync()
4687 VERIFY0(dsl_dataset_hold(dp, ddsca->ddsca_name, FTAG, &ds)); in dsl_dataset_set_compression_sync()
4688 if (zfeature_active(f, ds->ds_feature[f]) != B_TRUE) { in dsl_dataset_set_compression_sync()
4689 ds->ds_feature_activation[f] = (void *)B_TRUE; in dsl_dataset_set_compression_sync()
4690 dsl_dataset_activate_feature(ds->ds_object, f, in dsl_dataset_set_compression_sync()
4691 ds->ds_feature_activation[f], tx); in dsl_dataset_set_compression_sync()
4692 ds->ds_feature[f] = ds->ds_feature_activation[f]; in dsl_dataset_set_compression_sync()
4723 * new's filesystem (or its origin) -- caller verifies this.
4733 * space freed [---------------------]
4734 * snapshots ---O-------O--------O-------O------
4746 dsl_pool_t *dp = new->ds_dir->dd_pool; in dsl_dataset_space_written_impl()
4750 ASSERT3U(bmp->zbm_creation_txg, <, in dsl_dataset_space_written_impl()
4751 dsl_dataset_phys(new)->ds_creation_txg); in dsl_dataset_space_written_impl()
4755 *usedp += dsl_dataset_phys(new)->ds_referenced_bytes; in dsl_dataset_space_written_impl()
4756 *usedp -= bmp->zbm_referenced_bytes_refd; in dsl_dataset_space_written_impl()
4759 *compp += dsl_dataset_phys(new)->ds_compressed_bytes; in dsl_dataset_space_written_impl()
4760 *compp -= bmp->zbm_compressed_bytes_refd; in dsl_dataset_space_written_impl()
4763 *uncompp += dsl_dataset_phys(new)->ds_uncompressed_bytes; in dsl_dataset_space_written_impl()
4764 *uncompp -= bmp->zbm_uncompressed_bytes_refd; in dsl_dataset_space_written_impl()
4768 while (dsl_dataset_phys(snap)->ds_prev_snap_txg > in dsl_dataset_space_written_impl()
4769 bmp->zbm_creation_txg) { in dsl_dataset_space_written_impl()
4772 dsl_deadlist_space_range(&snap->ds_deadlist, in dsl_dataset_space_written_impl()
4773 0, bmp->zbm_creation_txg, in dsl_dataset_space_written_impl()
4779 uint64_t snapobj = dsl_dataset_phys(snap)->ds_prev_snap_obj; in dsl_dataset_space_written_impl()
4792 if (bmp->zbm_flags & ZBM_FLAG_HAS_FBN) { in dsl_dataset_space_written_impl()
4793 *usedp += bmp->zbm_referenced_freed_before_next_snap; in dsl_dataset_space_written_impl()
4794 *compp += bmp->zbm_compressed_freed_before_next_snap; in dsl_dataset_space_written_impl()
4795 *uncompp += bmp->zbm_uncompressed_freed_before_next_snap; in dsl_dataset_space_written_impl()
4797 ASSERT3U(dsl_dataset_phys(snap)->ds_prev_snap_txg, ==, in dsl_dataset_space_written_impl()
4798 bmp->zbm_creation_txg); in dsl_dataset_space_written_impl()
4800 dsl_deadlist_space(&snap->ds_deadlist, &used, &comp, &uncomp); in dsl_dataset_space_written_impl()
4814 * new's filesystem (or its origin) -- caller verifies this.
4820 if (!(bmp->zbm_flags & ZBM_FLAG_HAS_FBN)) in dsl_dataset_space_written_bookmark()
4841 zbm.zbm_guid = dsp->ds_guid; in dsl_dataset_space_written()
4842 zbm.zbm_creation_txg = dsp->ds_creation_txg; in dsl_dataset_space_written()
4843 zbm.zbm_creation_time = dsp->ds_creation_time; in dsl_dataset_space_written()
4844 zbm.zbm_referenced_bytes_refd = dsp->ds_referenced_bytes; in dsl_dataset_space_written()
4845 zbm.zbm_compressed_bytes_refd = dsp->ds_compressed_bytes; in dsl_dataset_space_written()
4846 zbm.zbm_uncompressed_bytes_refd = dsp->ds_uncompressed_bytes; in dsl_dataset_space_written()
4863 * blocks that would be freed [---------------------------]
4864 * snapshots ---O-------O--------O-------O--------O
4868 * (birth > firstsnap->prev_snap_txg) and died before the snap after the
4869 * last snap (ie, is on lastsnap->ds_next->ds_deadlist or an earlier deadlist).
4881 dsl_pool_t *dp = firstsnap->ds_dir->dd_pool; in dsl_dataset_space_wouldfree()
4883 ASSERT(firstsnap->ds_is_snapshot); in dsl_dataset_space_wouldfree()
4884 ASSERT(lastsnap->ds_is_snapshot); in dsl_dataset_space_wouldfree()
4890 if (firstsnap->ds_dir != lastsnap->ds_dir || in dsl_dataset_space_wouldfree()
4891 dsl_dataset_phys(firstsnap)->ds_creation_txg > in dsl_dataset_space_wouldfree()
4892 dsl_dataset_phys(lastsnap)->ds_creation_txg) in dsl_dataset_space_wouldfree()
4897 snapobj = dsl_dataset_phys(lastsnap)->ds_next_snap_obj; in dsl_dataset_space_wouldfree()
4898 while (snapobj != firstsnap->ds_object) { in dsl_dataset_space_wouldfree()
4906 dsl_deadlist_space_range(&ds->ds_deadlist, in dsl_dataset_space_wouldfree()
4907 dsl_dataset_phys(firstsnap)->ds_prev_snap_txg, UINT64_MAX, in dsl_dataset_space_wouldfree()
4913 snapobj = dsl_dataset_phys(ds)->ds_prev_snap_obj; in dsl_dataset_space_wouldfree()
4927 * If non-zero, earlier_txg is used instead of earlier's ds_creation_txg.
4933 dsl_pool_t *dp = later->ds_dir->dd_pool; in dsl_dataset_is_before()
4938 ASSERT(earlier->ds_is_snapshot || earlier_txg != 0); in dsl_dataset_is_before()
4941 earlier_txg = dsl_dataset_phys(earlier)->ds_creation_txg; in dsl_dataset_is_before()
4943 if (later->ds_is_snapshot && in dsl_dataset_is_before()
4944 earlier_txg >= dsl_dataset_phys(later)->ds_creation_txg) in dsl_dataset_is_before()
4947 if (later->ds_dir == earlier->ds_dir) in dsl_dataset_is_before()
4956 if (dsl_dir_phys(later->ds_dir)->dd_origin_obj == 0) in dsl_dataset_is_before()
4961 dsl_dir_phys(later->ds_dir)->dd_origin_obj, FTAG, &origin); in dsl_dataset_is_before()
4964 if (dsl_dataset_phys(origin)->ds_creation_txg == earlier_txg && in dsl_dataset_is_before()
4965 origin->ds_dir == earlier->ds_dir) { in dsl_dataset_is_before()
4977 objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset; in dsl_dataset_zapify()
4978 dmu_object_zapify(mos, ds->ds_object, DMU_OT_DSL_DATASET, tx); in dsl_dataset_zapify()
4986 dmu_object_info_from_db(ds->ds_dbuf, &doi); in dsl_dataset_is_zapified()
4994 zap_contains(ds->ds_dir->dd_pool->dp_meta_objset, in dsl_dataset_has_resume_receive_state()
4995 ds->ds_object, DS_FIELD_RESUME_TOGUID) == 0); in dsl_dataset_has_resume_receive_state()
5007 err = zap_lookup(ds->ds_dir->dd_pool->dp_meta_objset, ds->ds_object, in dsl_dataset_get_remap_deadlist_object()
5023 EQUIV(dsl_deadlist_is_open(&ds->ds_remap_deadlist), in dsl_dataset_remap_deadlist_exists()
5025 return (dsl_deadlist_is_open(&ds->ds_remap_deadlist)); in dsl_dataset_remap_deadlist_exists()
5034 VERIFY0(zap_add(ds->ds_dir->dd_pool->dp_meta_objset, ds->ds_object, in dsl_dataset_set_remap_deadlist_object()
5041 VERIFY0(zap_remove(ds->ds_dir->dd_pool->dp_meta_objset, in dsl_dataset_unset_remap_deadlist_object()
5042 ds->ds_object, DS_FIELD_REMAP_DEADLIST, tx)); in dsl_dataset_unset_remap_deadlist_object()
5049 spa_t *spa = ds->ds_dir->dd_pool->dp_spa; in dsl_dataset_destroy_remap_deadlist()
5054 remap_deadlist_object = ds->ds_remap_deadlist.dl_object; in dsl_dataset_destroy_remap_deadlist()
5055 dsl_deadlist_close(&ds->ds_remap_deadlist); in dsl_dataset_destroy_remap_deadlist()
5065 spa_t *spa = ds->ds_dir->dd_pool->dp_spa; in dsl_dataset_create_remap_deadlist()
5068 ASSERT(MUTEX_HELD(&ds->ds_remap_deadlist_lock)); in dsl_dataset_create_remap_deadlist()
5076 &ds->ds_deadlist, UINT64_MAX, in dsl_dataset_create_remap_deadlist()
5077 dsl_dataset_phys(ds)->ds_prev_snap_obj, tx); in dsl_dataset_create_remap_deadlist()
5080 VERIFY0(dsl_deadlist_open(&ds->ds_remap_deadlist, spa_meta_objset(spa), in dsl_dataset_create_remap_deadlist()
5089 uint64_t dsobj = ds->ds_object; in dsl_dataset_activate_redaction()
5092 ftuaa->length = (int64_t)num_redact_snaps; in dsl_dataset_activate_redaction()
5094 ftuaa->array = kmem_alloc(num_redact_snaps * sizeof (uint64_t), in dsl_dataset_activate_redaction()
5096 memcpy(ftuaa->array, redact_snaps, num_redact_snaps * in dsl_dataset_activate_redaction()
5101 ds->ds_feature[SPA_FEATURE_REDACTED_DATASETS] = ftuaa; in dsl_dataset_activate_redaction()
5113 dsl_pool_t *dp = spa->spa_dsl_pool; in dsl_dataset_oldest_snapshot()
5119 uint64_t prev_obj = dsl_dataset_phys(ds)->ds_prev_snap_obj; in dsl_dataset_oldest_snapshot()
5120 uint64_t prev_obj_txg = dsl_dataset_phys(ds)->ds_prev_snap_txg; in dsl_dataset_oldest_snapshot()
5127 prev_obj_txg = dsl_dataset_phys(ds)->ds_prev_snap_txg; in dsl_dataset_oldest_snapshot()
5128 prev_obj = dsl_dataset_phys(ds)->ds_prev_snap_obj; in dsl_dataset_oldest_snapshot()
5130 *oldest_dsobj = ds->ds_object; in dsl_dataset_oldest_snapshot()