Lines Matching refs:ds
93 static void dsl_dataset_set_remap_deadlist_object(dsl_dataset_t *ds,
95 static void dsl_dataset_unset_remap_deadlist_object(dsl_dataset_t *ds,
98 static void unload_zfeature(dsl_dataset_t *ds, spa_feature_t f);
110 parent_delta(dsl_dataset_t *ds, int64_t delta) in parent_delta() argument
115 if (ds->ds_reserved == 0) in parent_delta()
118 ds_phys = dsl_dataset_phys(ds); in parent_delta()
119 old_bytes = MAX(ds_phys->ds_unique_bytes, ds->ds_reserved); in parent_delta()
120 new_bytes = MAX(ds_phys->ds_unique_bytes + delta, ds->ds_reserved); in parent_delta()
127 dsl_dataset_block_born(dsl_dataset_t *ds, const blkptr_t *bp, dmu_tx_t *tx) in dsl_dataset_block_born() argument
136 dprintf_bp(bp, "ds=%p", ds); in dsl_dataset_block_born()
144 if (ds == NULL) { in dsl_dataset_block_born()
150 ASSERT3U(bp->blk_birth, >, dsl_dataset_phys(ds)->ds_prev_snap_txg); in dsl_dataset_block_born()
151 dmu_buf_will_dirty(ds->ds_dbuf, tx); in dsl_dataset_block_born()
152 mutex_enter(&ds->ds_lock); in dsl_dataset_block_born()
153 delta = parent_delta(ds, used); in dsl_dataset_block_born()
154 dsl_dataset_phys(ds)->ds_referenced_bytes += used; in dsl_dataset_block_born()
155 dsl_dataset_phys(ds)->ds_compressed_bytes += compressed; in dsl_dataset_block_born()
156 dsl_dataset_phys(ds)->ds_uncompressed_bytes += uncompressed; in dsl_dataset_block_born()
157 dsl_dataset_phys(ds)->ds_unique_bytes += used; in dsl_dataset_block_born()
160 ds->ds_feature_activation[SPA_FEATURE_LARGE_BLOCKS] = in dsl_dataset_block_born()
169 ds->ds_feature_activation[f] = (void *)B_TRUE; in dsl_dataset_block_born()
176 ds->ds_feature_activation[f] = (void *)B_TRUE; in dsl_dataset_block_born()
183 if (dsl_deadlist_is_open(&ds->ds_dir->dd_livelist) && in dsl_dataset_block_born()
184 bp->blk_birth > ds->ds_dir->dd_origin_txg && in dsl_dataset_block_born()
186 ASSERT(dsl_dir_is_clone(ds->ds_dir)); in dsl_dataset_block_born()
189 bplist_append(&ds->ds_dir->dd_pending_allocs, bp); in dsl_dataset_block_born()
192 mutex_exit(&ds->ds_lock); in dsl_dataset_block_born()
193 dsl_dir_diduse_transfer_space(ds->ds_dir, delta, in dsl_dataset_block_born()
206 dsl_dataset_block_remapped(dsl_dataset_t *ds, uint64_t vdev, uint64_t offset, in dsl_dataset_block_remapped() argument
209 spa_t *spa = ds->ds_dir->dd_pool->dp_spa; in dsl_dataset_block_remapped()
213 ASSERT(!ds->ds_is_snapshot); in dsl_dataset_block_remapped()
215 if (birth > dsl_dataset_phys(ds)->ds_prev_snap_txg) { in dsl_dataset_block_remapped()
221 ASSERT(ds != NULL); in dsl_dataset_block_remapped()
223 mutex_enter(&ds->ds_remap_deadlist_lock); in dsl_dataset_block_remapped()
224 if (!dsl_dataset_remap_deadlist_exists(ds)) { in dsl_dataset_block_remapped()
225 dsl_dataset_create_remap_deadlist(ds, tx); in dsl_dataset_block_remapped()
227 mutex_exit(&ds->ds_remap_deadlist_lock); in dsl_dataset_block_remapped()
234 dsl_deadlist_insert(&ds->ds_remap_deadlist, &fakebp, B_FALSE, in dsl_dataset_block_remapped()
240 dsl_dataset_block_kill(dsl_dataset_t *ds, const blkptr_t *bp, dmu_tx_t *tx, in dsl_dataset_block_kill() argument
255 if (ds == NULL) { in dsl_dataset_block_kill()
261 ASSERT3P(tx->tx_pool, ==, ds->ds_dir->dd_pool); in dsl_dataset_block_kill()
263 ASSERT(!ds->ds_is_snapshot); in dsl_dataset_block_kill()
264 dmu_buf_will_dirty(ds->ds_dbuf, tx); in dsl_dataset_block_kill()
270 if (dsl_deadlist_is_open(&ds->ds_dir->dd_livelist) && in dsl_dataset_block_kill()
271 bp->blk_birth > ds->ds_dir->dd_origin_txg && in dsl_dataset_block_kill()
273 ASSERT(dsl_dir_is_clone(ds->ds_dir)); in dsl_dataset_block_kill()
276 bplist_append(&ds->ds_dir->dd_pending_frees, bp); in dsl_dataset_block_kill()
279 if (bp->blk_birth > dsl_dataset_phys(ds)->ds_prev_snap_txg) { in dsl_dataset_block_kill()
282 dprintf_bp(bp, "freeing ds=%llu", (u_longlong_t)ds->ds_object); in dsl_dataset_block_kill()
285 mutex_enter(&ds->ds_lock); in dsl_dataset_block_kill()
286 ASSERT(dsl_dataset_phys(ds)->ds_unique_bytes >= used || in dsl_dataset_block_kill()
287 !DS_UNIQUE_IS_ACCURATE(ds)); in dsl_dataset_block_kill()
288 delta = parent_delta(ds, -used); in dsl_dataset_block_kill()
289 dsl_dataset_phys(ds)->ds_unique_bytes -= used; in dsl_dataset_block_kill()
290 mutex_exit(&ds->ds_lock); in dsl_dataset_block_kill()
291 dsl_dir_diduse_transfer_space(ds->ds_dir, in dsl_dataset_block_kill()
304 bplist_append(&ds->ds_pending_deadlist, bp); in dsl_dataset_block_kill()
306 dsl_deadlist_insert(&ds->ds_deadlist, bp, B_FALSE, tx); in dsl_dataset_block_kill()
308 ASSERT3U(ds->ds_prev->ds_object, ==, in dsl_dataset_block_kill()
309 dsl_dataset_phys(ds)->ds_prev_snap_obj); in dsl_dataset_block_kill()
310 ASSERT(dsl_dataset_phys(ds->ds_prev)->ds_num_children > 0); in dsl_dataset_block_kill()
312 if (dsl_dataset_phys(ds->ds_prev)->ds_next_snap_obj == in dsl_dataset_block_kill()
313 ds->ds_object && bp->blk_birth > in dsl_dataset_block_kill()
314 dsl_dataset_phys(ds->ds_prev)->ds_prev_snap_txg) { in dsl_dataset_block_kill()
315 dmu_buf_will_dirty(ds->ds_prev->ds_dbuf, tx); in dsl_dataset_block_kill()
316 mutex_enter(&ds->ds_prev->ds_lock); in dsl_dataset_block_kill()
317 dsl_dataset_phys(ds->ds_prev)->ds_unique_bytes += used; in dsl_dataset_block_kill()
318 mutex_exit(&ds->ds_prev->ds_lock); in dsl_dataset_block_kill()
320 if (bp->blk_birth > ds->ds_dir->dd_origin_txg) { in dsl_dataset_block_kill()
321 dsl_dir_transfer_space(ds->ds_dir, used, in dsl_dataset_block_kill()
326 dsl_bookmark_block_killed(ds, bp, tx); in dsl_dataset_block_kill()
328 mutex_enter(&ds->ds_lock); in dsl_dataset_block_kill()
329 ASSERT3U(dsl_dataset_phys(ds)->ds_referenced_bytes, >=, used); in dsl_dataset_block_kill()
330 dsl_dataset_phys(ds)->ds_referenced_bytes -= used; in dsl_dataset_block_kill()
331 ASSERT3U(dsl_dataset_phys(ds)->ds_compressed_bytes, >=, compressed); in dsl_dataset_block_kill()
332 dsl_dataset_phys(ds)->ds_compressed_bytes -= compressed; in dsl_dataset_block_kill()
333 ASSERT3U(dsl_dataset_phys(ds)->ds_uncompressed_bytes, >=, uncompressed); in dsl_dataset_block_kill()
334 dsl_dataset_phys(ds)->ds_uncompressed_bytes -= uncompressed; in dsl_dataset_block_kill()
335 mutex_exit(&ds->ds_lock); in dsl_dataset_block_kill()
346 unload_zfeature(dsl_dataset_t *ds, spa_feature_t f) in unload_zfeature() argument
353 struct feature_type_uint64_array_arg *ftuaa = ds->ds_feature[f]; in unload_zfeature()
364 load_zfeature(objset_t *mos, dsl_dataset_t *ds, spa_feature_t f) in load_zfeature() argument
369 err = zap_contains(mos, ds->ds_object, in load_zfeature()
372 ds->ds_feature[f] = (void *)B_TRUE; in load_zfeature()
382 err = zap_length(mos, ds->ds_object, in load_zfeature()
391 VERIFY0(zap_lookup(mos, ds->ds_object, in load_zfeature()
397 ds->ds_feature[f] = ftuaa; in load_zfeature()
415 dsl_dataset_t *ds = dbu; in dsl_dataset_evict_sync() local
417 ASSERT(ds->ds_owner == NULL); in dsl_dataset_evict_sync()
419 unique_remove(ds->ds_fsid_guid); in dsl_dataset_evict_sync()
425 dsl_dataset_t *ds = dbu; in dsl_dataset_evict_async() local
427 ASSERT(ds->ds_owner == NULL); in dsl_dataset_evict_async()
429 ds->ds_dbuf = NULL; in dsl_dataset_evict_async()
431 if (ds->ds_objset != NULL) in dsl_dataset_evict_async()
432 dmu_objset_evict(ds->ds_objset); in dsl_dataset_evict_async()
434 if (ds->ds_prev) { in dsl_dataset_evict_async()
435 dsl_dataset_rele(ds->ds_prev, ds); in dsl_dataset_evict_async()
436 ds->ds_prev = NULL; in dsl_dataset_evict_async()
439 dsl_bookmark_fini_ds(ds); in dsl_dataset_evict_async()
441 bplist_destroy(&ds->ds_pending_deadlist); in dsl_dataset_evict_async()
442 if (dsl_deadlist_is_open(&ds->ds_deadlist)) in dsl_dataset_evict_async()
443 dsl_deadlist_close(&ds->ds_deadlist); in dsl_dataset_evict_async()
444 if (dsl_deadlist_is_open(&ds->ds_remap_deadlist)) in dsl_dataset_evict_async()
445 dsl_deadlist_close(&ds->ds_remap_deadlist); in dsl_dataset_evict_async()
446 if (ds->ds_dir) in dsl_dataset_evict_async()
447 dsl_dir_async_rele(ds->ds_dir, ds); in dsl_dataset_evict_async()
449 ASSERT(!list_link_active(&ds->ds_synced_link)); in dsl_dataset_evict_async()
452 if (dsl_dataset_feature_is_active(ds, f)) in dsl_dataset_evict_async()
453 unload_zfeature(ds, f); in dsl_dataset_evict_async()
456 list_destroy(&ds->ds_prop_cbs); in dsl_dataset_evict_async()
457 mutex_destroy(&ds->ds_lock); in dsl_dataset_evict_async()
458 mutex_destroy(&ds->ds_opening_lock); in dsl_dataset_evict_async()
459 mutex_destroy(&ds->ds_sendstream_lock); in dsl_dataset_evict_async()
460 mutex_destroy(&ds->ds_remap_deadlist_lock); in dsl_dataset_evict_async()
461 zfs_refcount_destroy(&ds->ds_longholds); in dsl_dataset_evict_async()
462 rrw_destroy(&ds->ds_bp_rwlock); in dsl_dataset_evict_async()
464 kmem_free(ds, sizeof (dsl_dataset_t)); in dsl_dataset_evict_async()
468 dsl_dataset_get_snapname(dsl_dataset_t *ds) in dsl_dataset_get_snapname() argument
473 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_dataset_get_snapname()
476 if (ds->ds_snapname[0]) in dsl_dataset_get_snapname()
478 if (dsl_dataset_phys(ds)->ds_next_snap_obj == 0) in dsl_dataset_get_snapname()
481 err = dmu_bonus_hold(mos, dsl_dir_phys(ds->ds_dir)->dd_head_dataset_obj, in dsl_dataset_get_snapname()
487 headphys->ds_snapnames_zapobj, ds->ds_object, 0, ds->ds_snapname); in dsl_dataset_get_snapname()
490 (void) snprintf(ds->ds_snapname, sizeof (ds->ds_snapname), in dsl_dataset_get_snapname()
492 (unsigned long long)ds->ds_object, err); in dsl_dataset_get_snapname()
499 dsl_dataset_snap_lookup(dsl_dataset_t *ds, const char *name, uint64_t *value) in dsl_dataset_snap_lookup() argument
501 objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset; in dsl_dataset_snap_lookup()
502 uint64_t snapobj = dsl_dataset_phys(ds)->ds_snapnames_zapobj; in dsl_dataset_snap_lookup()
506 if (dsl_dataset_phys(ds)->ds_flags & DS_FLAG_CI_DATASET) in dsl_dataset_snap_lookup()
517 dsl_dataset_snap_remove(dsl_dataset_t *ds, const char *name, dmu_tx_t *tx, in dsl_dataset_snap_remove() argument
520 objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset; in dsl_dataset_snap_remove()
521 uint64_t snapobj = dsl_dataset_phys(ds)->ds_snapnames_zapobj; in dsl_dataset_snap_remove()
525 dsl_dir_snap_cmtime_update(ds->ds_dir); in dsl_dataset_snap_remove()
527 if (dsl_dataset_phys(ds)->ds_flags & DS_FLAG_CI_DATASET) in dsl_dataset_snap_remove()
535 dsl_fs_ss_count_adjust(ds->ds_dir, -1, in dsl_dataset_snap_remove()
542 dsl_dataset_try_add_ref(dsl_pool_t *dp, dsl_dataset_t *ds, void *tag) in dsl_dataset_try_add_ref() argument
544 dmu_buf_t *dbuf = ds->ds_dbuf; in dsl_dataset_try_add_ref()
548 ds->ds_object, DMU_BONUS_BLKID, tag)) { in dsl_dataset_try_add_ref()
550 if (ds == dmu_buf_get_user(dbuf)) in dsl_dataset_try_add_ref()
565 dsl_dataset_t *ds; in dsl_dataset_hold_obj() local
582 ds = dmu_buf_get_user(dbuf); in dsl_dataset_hold_obj()
583 if (ds == NULL) { in dsl_dataset_hold_obj()
586 ds = kmem_zalloc(sizeof (dsl_dataset_t), KM_SLEEP); in dsl_dataset_hold_obj()
587 ds->ds_dbuf = dbuf; in dsl_dataset_hold_obj()
588 ds->ds_object = dsobj; in dsl_dataset_hold_obj()
589 ds->ds_is_snapshot = dsl_dataset_phys(ds)->ds_num_children != 0; in dsl_dataset_hold_obj()
590 list_link_init(&ds->ds_synced_link); in dsl_dataset_hold_obj()
592 err = dsl_dir_hold_obj(dp, dsl_dataset_phys(ds)->ds_dir_obj, in dsl_dataset_hold_obj()
593 NULL, ds, &ds->ds_dir); in dsl_dataset_hold_obj()
595 kmem_free(ds, sizeof (dsl_dataset_t)); in dsl_dataset_hold_obj()
600 mutex_init(&ds->ds_lock, NULL, MUTEX_DEFAULT, NULL); in dsl_dataset_hold_obj()
601 mutex_init(&ds->ds_opening_lock, NULL, MUTEX_DEFAULT, NULL); in dsl_dataset_hold_obj()
602 mutex_init(&ds->ds_sendstream_lock, NULL, MUTEX_DEFAULT, NULL); in dsl_dataset_hold_obj()
603 mutex_init(&ds->ds_remap_deadlist_lock, in dsl_dataset_hold_obj()
605 rrw_init(&ds->ds_bp_rwlock, B_FALSE); in dsl_dataset_hold_obj()
606 zfs_refcount_create(&ds->ds_longholds); in dsl_dataset_hold_obj()
608 bplist_create(&ds->ds_pending_deadlist); in dsl_dataset_hold_obj()
610 list_create(&ds->ds_sendstreams, sizeof (dmu_sendstatus_t), in dsl_dataset_hold_obj()
613 list_create(&ds->ds_prop_cbs, sizeof (dsl_prop_cb_record_t), in dsl_dataset_hold_obj()
623 err = load_zfeature(mos, ds, f); in dsl_dataset_hold_obj()
627 if (!ds->ds_is_snapshot) { in dsl_dataset_hold_obj()
628 ds->ds_snapname[0] = '\0'; in dsl_dataset_hold_obj()
629 if (dsl_dataset_phys(ds)->ds_prev_snap_obj != 0) { in dsl_dataset_hold_obj()
631 dsl_dataset_phys(ds)->ds_prev_snap_obj, in dsl_dataset_hold_obj()
632 ds, &ds->ds_prev); in dsl_dataset_hold_obj()
634 err = dsl_bookmark_init_ds(ds); in dsl_dataset_hold_obj()
637 err = dsl_dataset_get_snapname(ds); in dsl_dataset_hold_obj()
639 dsl_dataset_phys(ds)->ds_userrefs_obj != 0) { in dsl_dataset_hold_obj()
641 ds->ds_dir->dd_pool->dp_meta_objset, in dsl_dataset_hold_obj()
642 dsl_dataset_phys(ds)->ds_userrefs_obj, in dsl_dataset_hold_obj()
643 &ds->ds_userrefs); in dsl_dataset_hold_obj()
647 if (err == 0 && !ds->ds_is_snapshot) { in dsl_dataset_hold_obj()
648 err = dsl_prop_get_int_ds(ds, in dsl_dataset_hold_obj()
650 &ds->ds_reserved); in dsl_dataset_hold_obj()
652 err = dsl_prop_get_int_ds(ds, in dsl_dataset_hold_obj()
654 &ds->ds_quota); in dsl_dataset_hold_obj()
657 ds->ds_reserved = ds->ds_quota = 0; in dsl_dataset_hold_obj()
660 if (err == 0 && ds->ds_dir->dd_crypto_obj != 0 && in dsl_dataset_hold_obj()
661 ds->ds_is_snapshot && in dsl_dataset_hold_obj()
667 dsl_deadlist_open(&ds->ds_deadlist, in dsl_dataset_hold_obj()
668 mos, dsl_dataset_phys(ds)->ds_deadlist_obj); in dsl_dataset_hold_obj()
670 dsl_dataset_get_remap_deadlist_object(ds); in dsl_dataset_hold_obj()
672 dsl_deadlist_open(&ds->ds_remap_deadlist, mos, in dsl_dataset_hold_obj()
676 dmu_buf_init_user(&ds->ds_dbu, dsl_dataset_evict_sync, in dsl_dataset_hold_obj()
677 dsl_dataset_evict_async, &ds->ds_dbuf); in dsl_dataset_hold_obj()
679 winner = dmu_buf_set_user_ie(dbuf, &ds->ds_dbu); in dsl_dataset_hold_obj()
682 bplist_destroy(&ds->ds_pending_deadlist); in dsl_dataset_hold_obj()
683 dsl_deadlist_close(&ds->ds_deadlist); in dsl_dataset_hold_obj()
684 if (dsl_deadlist_is_open(&ds->ds_remap_deadlist)) in dsl_dataset_hold_obj()
685 dsl_deadlist_close(&ds->ds_remap_deadlist); in dsl_dataset_hold_obj()
686 dsl_bookmark_fini_ds(ds); in dsl_dataset_hold_obj()
687 if (ds->ds_prev) in dsl_dataset_hold_obj()
688 dsl_dataset_rele(ds->ds_prev, ds); in dsl_dataset_hold_obj()
689 dsl_dir_rele(ds->ds_dir, ds); in dsl_dataset_hold_obj()
691 if (dsl_dataset_feature_is_active(ds, f)) in dsl_dataset_hold_obj()
692 unload_zfeature(ds, f); in dsl_dataset_hold_obj()
695 list_destroy(&ds->ds_prop_cbs); in dsl_dataset_hold_obj()
696 list_destroy(&ds->ds_sendstreams); in dsl_dataset_hold_obj()
697 mutex_destroy(&ds->ds_lock); in dsl_dataset_hold_obj()
698 mutex_destroy(&ds->ds_opening_lock); in dsl_dataset_hold_obj()
699 mutex_destroy(&ds->ds_sendstream_lock); in dsl_dataset_hold_obj()
700 mutex_destroy(&ds->ds_remap_deadlist_lock); in dsl_dataset_hold_obj()
701 zfs_refcount_destroy(&ds->ds_longholds); in dsl_dataset_hold_obj()
702 rrw_destroy(&ds->ds_bp_rwlock); in dsl_dataset_hold_obj()
703 kmem_free(ds, sizeof (dsl_dataset_t)); in dsl_dataset_hold_obj()
708 ds = winner; in dsl_dataset_hold_obj()
710 ds->ds_fsid_guid = in dsl_dataset_hold_obj()
711 unique_insert(dsl_dataset_phys(ds)->ds_fsid_guid); in dsl_dataset_hold_obj()
712 if (ds->ds_fsid_guid != in dsl_dataset_hold_obj()
713 dsl_dataset_phys(ds)->ds_fsid_guid) { in dsl_dataset_hold_obj()
717 dsl_dataset_phys(ds)->ds_fsid_guid, in dsl_dataset_hold_obj()
718 (long long)ds->ds_fsid_guid, in dsl_dataset_hold_obj()
725 ASSERT3P(ds->ds_dbuf, ==, dbuf); in dsl_dataset_hold_obj()
726 ASSERT3P(dsl_dataset_phys(ds), ==, dbuf->db_data); in dsl_dataset_hold_obj()
727 ASSERT(dsl_dataset_phys(ds)->ds_prev_snap_obj != 0 || in dsl_dataset_hold_obj()
729 dp->dp_origin_snap == NULL || ds == dp->dp_origin_snap); in dsl_dataset_hold_obj()
730 *dsp = ds; in dsl_dataset_hold_obj()
736 dsl_dataset_create_key_mapping(dsl_dataset_t *ds) in dsl_dataset_create_key_mapping() argument
738 dsl_dir_t *dd = ds->ds_dir; in dsl_dataset_create_key_mapping()
744 ds, ds, &ds->ds_key_mapping)); in dsl_dataset_create_key_mapping()
776 dsl_dataset_t *ds; in dsl_dataset_hold_flags() local
785 err = dsl_dataset_hold_obj_flags(dp, obj, flags, tag, &ds); in dsl_dataset_hold_flags()
794 dsl_dataset_rele_flags(ds, flags, tag); in dsl_dataset_hold_flags()
800 err = dsl_dataset_snap_lookup(ds, snapname, &obj); in dsl_dataset_hold_flags()
805 dsl_dataset_rele_flags(ds, flags, tag); in dsl_dataset_hold_flags()
813 ds = snap_ds; in dsl_dataset_hold_flags()
817 *dsp = ds; in dsl_dataset_hold_flags()
897 dsl_dataset_long_hold(dsl_dataset_t *ds, void *tag) in dsl_dataset_long_hold() argument
899 ASSERT(dsl_pool_config_held(ds->ds_dir->dd_pool)); in dsl_dataset_long_hold()
900 (void) zfs_refcount_add(&ds->ds_longholds, tag); in dsl_dataset_long_hold()
904 dsl_dataset_long_rele(dsl_dataset_t *ds, void *tag) in dsl_dataset_long_rele() argument
906 (void) zfs_refcount_remove(&ds->ds_longholds, tag); in dsl_dataset_long_rele()
911 dsl_dataset_long_held(dsl_dataset_t *ds) in dsl_dataset_long_held() argument
913 return (!zfs_refcount_is_zero(&ds->ds_longholds)); in dsl_dataset_long_held()
917 dsl_dataset_name(dsl_dataset_t *ds, char *name) in dsl_dataset_name() argument
919 if (ds == NULL) { in dsl_dataset_name()
922 dsl_dir_name(ds->ds_dir, name); in dsl_dataset_name()
923 VERIFY0(dsl_dataset_get_snapname(ds)); in dsl_dataset_name()
924 if (ds->ds_snapname[0]) { in dsl_dataset_name()
931 if (!MUTEX_HELD(&ds->ds_lock)) { in dsl_dataset_name()
932 mutex_enter(&ds->ds_lock); in dsl_dataset_name()
933 VERIFY3U(strlcat(name, ds->ds_snapname, in dsl_dataset_name()
936 mutex_exit(&ds->ds_lock); in dsl_dataset_name()
938 VERIFY3U(strlcat(name, ds->ds_snapname, in dsl_dataset_name()
947 dsl_dataset_namelen(dsl_dataset_t *ds) in dsl_dataset_namelen() argument
949 VERIFY0(dsl_dataset_get_snapname(ds)); in dsl_dataset_namelen()
950 mutex_enter(&ds->ds_lock); in dsl_dataset_namelen()
951 int len = strlen(ds->ds_snapname); in dsl_dataset_namelen()
952 mutex_exit(&ds->ds_lock); in dsl_dataset_namelen()
956 len += dsl_dir_namelen(ds->ds_dir); in dsl_dataset_namelen()
961 dsl_dataset_rele(dsl_dataset_t *ds, void *tag) in dsl_dataset_rele() argument
963 dmu_buf_rele(ds->ds_dbuf, tag); in dsl_dataset_rele()
967 dsl_dataset_remove_key_mapping(dsl_dataset_t *ds) in dsl_dataset_remove_key_mapping() argument
969 dsl_dir_t *dd = ds->ds_dir; in dsl_dataset_remove_key_mapping()
975 ds->ds_object, ds); in dsl_dataset_remove_key_mapping()
979 dsl_dataset_rele_flags(dsl_dataset_t *ds, ds_hold_flags_t flags, void *tag) in dsl_dataset_rele_flags() argument
982 dsl_dataset_remove_key_mapping(ds); in dsl_dataset_rele_flags()
984 dsl_dataset_rele(ds, tag); in dsl_dataset_rele_flags()
988 dsl_dataset_disown(dsl_dataset_t *ds, ds_hold_flags_t flags, void *tag) in dsl_dataset_disown() argument
990 ASSERT3P(ds->ds_owner, ==, tag); in dsl_dataset_disown()
991 ASSERT(ds->ds_dbuf != NULL); in dsl_dataset_disown()
993 mutex_enter(&ds->ds_lock); in dsl_dataset_disown()
994 ds->ds_owner = NULL; in dsl_dataset_disown()
995 mutex_exit(&ds->ds_lock); in dsl_dataset_disown()
996 dsl_dataset_long_rele(ds, tag); in dsl_dataset_disown()
997 dsl_dataset_rele_flags(ds, flags, tag); in dsl_dataset_disown()
1001 dsl_dataset_tryown(dsl_dataset_t *ds, void *tag, boolean_t override) in dsl_dataset_tryown() argument
1005 ASSERT(dsl_pool_config_held(ds->ds_dir->dd_pool)); in dsl_dataset_tryown()
1006 mutex_enter(&ds->ds_lock); in dsl_dataset_tryown()
1007 if (ds->ds_owner == NULL && (override || !(DS_IS_INCONSISTENT(ds) || in dsl_dataset_tryown()
1008 (dsl_dataset_feature_is_active(ds, in dsl_dataset_tryown()
1011 ds->ds_owner = tag; in dsl_dataset_tryown()
1012 dsl_dataset_long_hold(ds, tag); in dsl_dataset_tryown()
1015 mutex_exit(&ds->ds_lock); in dsl_dataset_tryown()
1020 dsl_dataset_has_owner(dsl_dataset_t *ds) in dsl_dataset_has_owner() argument
1023 mutex_enter(&ds->ds_lock); in dsl_dataset_has_owner()
1024 rv = (ds->ds_owner != NULL); in dsl_dataset_has_owner()
1025 mutex_exit(&ds->ds_lock); in dsl_dataset_has_owner()
1051 dsl_dataset_feature_is_active(dsl_dataset_t *ds, spa_feature_t f) in dsl_dataset_feature_is_active() argument
1053 return (zfeature_active(f, ds->ds_feature[f])); in dsl_dataset_feature_is_active()
1062 dsl_dataset_get_uint64_array_feature(dsl_dataset_t *ds, spa_feature_t f, in dsl_dataset_get_uint64_array_feature() argument
1066 if (!dsl_dataset_feature_is_active(ds, f)) { in dsl_dataset_get_uint64_array_feature()
1069 struct feature_type_uint64_array_arg *ftuaa = ds->ds_feature[f]; in dsl_dataset_get_uint64_array_feature()
1107 dsl_dataset_deactivate_feature_impl(dsl_dataset_t *ds, spa_feature_t f, in dsl_dataset_deactivate_feature_impl() argument
1112 uint64_t dsobj = ds->ds_object; in dsl_dataset_deactivate_feature_impl()
1118 ds->ds_feature[f] = NULL; in dsl_dataset_deactivate_feature_impl()
1122 dsl_dataset_deactivate_feature(dsl_dataset_t *ds, spa_feature_t f, dmu_tx_t *tx) in dsl_dataset_deactivate_feature() argument
1124 unload_zfeature(ds, f); in dsl_dataset_deactivate_feature()
1125 dsl_dataset_deactivate_feature_impl(ds, f, tx); in dsl_dataset_deactivate_feature()
1246 dsl_dataset_zero_zil(dsl_dataset_t *ds, dmu_tx_t *tx) in dsl_dataset_zero_zil() argument
1250 VERIFY0(dmu_objset_from_ds(ds, &os)); in dsl_dataset_zero_zil()
1252 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_dataset_zero_zil()
1260 dsl_dataset_sync(ds, zio, tx); in dsl_dataset_zero_zil()
1262 dsl_dataset_sync_done(ds, tx); in dsl_dataset_zero_zil()
1330 dsl_dataset_t *ds; in dsl_dataset_create_sync() local
1332 VERIFY0(dsl_dataset_hold_obj(dp, dsobj, FTAG, &ds)); in dsl_dataset_create_sync()
1333 dsl_dataset_zero_zil(ds, tx); in dsl_dataset_create_sync()
1334 dsl_dataset_rele(ds, FTAG); in dsl_dataset_create_sync()
1349 dsl_dataset_recalc_head_uniq(dsl_dataset_t *ds) in dsl_dataset_recalc_head_uniq() argument
1354 ASSERT(!ds->ds_is_snapshot); in dsl_dataset_recalc_head_uniq()
1356 if (dsl_dataset_phys(ds)->ds_prev_snap_obj != 0) in dsl_dataset_recalc_head_uniq()
1357 mrs_used = dsl_dataset_phys(ds->ds_prev)->ds_referenced_bytes; in dsl_dataset_recalc_head_uniq()
1361 dsl_deadlist_space(&ds->ds_deadlist, &dlused, &dlcomp, &dluncomp); in dsl_dataset_recalc_head_uniq()
1364 dsl_dataset_phys(ds)->ds_unique_bytes = in dsl_dataset_recalc_head_uniq()
1365 dsl_dataset_phys(ds)->ds_referenced_bytes - (mrs_used - dlused); in dsl_dataset_recalc_head_uniq()
1367 if (spa_version(ds->ds_dir->dd_pool->dp_spa) >= in dsl_dataset_recalc_head_uniq()
1369 dsl_dataset_phys(ds)->ds_flags |= DS_FLAG_UNIQUE_ACCURATE; in dsl_dataset_recalc_head_uniq()
1373 dsl_dataset_remove_from_next_clones(dsl_dataset_t *ds, uint64_t obj, in dsl_dataset_remove_from_next_clones() argument
1376 objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset; in dsl_dataset_remove_from_next_clones()
1380 ASSERT(dsl_dataset_phys(ds)->ds_num_children >= 2); in dsl_dataset_remove_from_next_clones()
1381 err = zap_remove_int(mos, dsl_dataset_phys(ds)->ds_next_clones_obj, in dsl_dataset_remove_from_next_clones()
1395 ASSERT0(zap_count(mos, dsl_dataset_phys(ds)->ds_next_clones_obj, in dsl_dataset_remove_from_next_clones()
1397 ASSERT3U(count, <=, dsl_dataset_phys(ds)->ds_num_children - 2); in dsl_dataset_remove_from_next_clones()
1402 dsl_dataset_get_blkptr(dsl_dataset_t *ds) in dsl_dataset_get_blkptr() argument
1404 return (&dsl_dataset_phys(ds)->ds_bp); in dsl_dataset_get_blkptr()
1408 dsl_dataset_get_spa(dsl_dataset_t *ds) in dsl_dataset_get_spa() argument
1410 return (ds->ds_dir->dd_pool->dp_spa); in dsl_dataset_get_spa()
1414 dsl_dataset_dirty(dsl_dataset_t *ds, dmu_tx_t *tx) in dsl_dataset_dirty() argument
1418 if (ds == NULL) /* this is the meta-objset */ in dsl_dataset_dirty()
1421 ASSERT(ds->ds_objset != NULL); in dsl_dataset_dirty()
1423 if (dsl_dataset_phys(ds)->ds_next_snap_obj != 0) in dsl_dataset_dirty()
1427 ASSERT3U(tx->tx_txg, >, dsl_dataset_phys(ds)->ds_prev_snap_txg); in dsl_dataset_dirty()
1429 dp = ds->ds_dir->dd_pool; in dsl_dataset_dirty()
1430 if (txg_list_add(&dp->dp_dirty_datasets, ds, tx->tx_txg)) { in dsl_dataset_dirty()
1431 objset_t *os = ds->ds_objset; in dsl_dataset_dirty()
1434 dmu_buf_add_ref(ds->ds_dbuf, ds); in dsl_dataset_dirty()
1437 if (ds->ds_dir->dd_crypto_obj != 0 && in dsl_dataset_dirty()
1440 ASSERT3P(ds->ds_key_mapping, !=, NULL); in dsl_dataset_dirty()
1441 key_mapping_add_ref(ds->ds_key_mapping, ds); in dsl_dataset_dirty()
1447 dsl_dataset_snapshot_reserve_space(dsl_dataset_t *ds, dmu_tx_t *tx) in dsl_dataset_snapshot_reserve_space() argument
1459 ASSERT(ds->ds_reserved == 0 || DS_UNIQUE_IS_ACCURATE(ds)); in dsl_dataset_snapshot_reserve_space()
1460 asize = MIN(dsl_dataset_phys(ds)->ds_unique_bytes, ds->ds_reserved); in dsl_dataset_snapshot_reserve_space()
1461 if (asize > dsl_dir_space_available(ds->ds_dir, NULL, 0, TRUE)) in dsl_dataset_snapshot_reserve_space()
1469 dsl_dir_willuse_space(ds->ds_dir, asize, tx); in dsl_dataset_snapshot_reserve_space()
1475 dsl_dataset_snapshot_check_impl(dsl_dataset_t *ds, const char *snapname, in dsl_dataset_snapshot_check_impl() argument
1481 ds->ds_trysnap_txg = tx->tx_txg; in dsl_dataset_snapshot_check_impl()
1490 if (dsl_dataset_phys(ds)->ds_prev_snap_txg >= tx->tx_txg) in dsl_dataset_snapshot_check_impl()
1496 error = dsl_dataset_snap_lookup(ds, snapname, &value); in dsl_dataset_snapshot_check_impl()
1511 if (!recv && DS_IS_INCONSISTENT(ds)) in dsl_dataset_snapshot_check_impl()
1520 error = dsl_fs_ss_limit_check(ds->ds_dir, cnt, in dsl_dataset_snapshot_check_impl()
1526 error = dsl_dataset_snapshot_reserve_space(ds, tx); in dsl_dataset_snapshot_check_impl()
1612 dsl_dataset_t *ds; in dsl_dataset_snapshot_check() local
1618 error = dsl_dataset_hold(dp, name, FTAG, &ds); in dsl_dataset_snapshot_check()
1620 error = dsl_fs_ss_limit_check(ds->ds_dir, cnt, in dsl_dataset_snapshot_check()
1623 dsl_dataset_rele(ds, FTAG); in dsl_dataset_snapshot_check()
1641 dsl_dataset_t *ds; in dsl_dataset_snapshot_check() local
1656 error = dsl_dataset_hold(dp, dsname, FTAG, &ds); in dsl_dataset_snapshot_check()
1659 error = dsl_dataset_snapshot_check_impl(ds, in dsl_dataset_snapshot_check()
1661 dsl_dataset_rele(ds, FTAG); in dsl_dataset_snapshot_check()
1677 dsl_dataset_snapshot_sync_impl(dsl_dataset_t *ds, const char *snapname, in dsl_dataset_snapshot_sync_impl() argument
1680 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_dataset_snapshot_sync_impl()
1695 dmu_objset_from_ds(ds, &os) != 0 || in dsl_dataset_snapshot_sync_impl()
1700 ASSERT(!txg_list_member(&ds->ds_dir->dd_pool->dp_dirty_datasets, in dsl_dataset_snapshot_sync_impl()
1701 ds, tx->tx_txg)); in dsl_dataset_snapshot_sync_impl()
1703 dsl_fs_ss_count_adjust(ds->ds_dir, 1, DD_FIELD_SNAPSHOT_COUNT, tx); in dsl_dataset_snapshot_sync_impl()
1719 dsphys->ds_dir_obj = ds->ds_dir->dd_object; in dsl_dataset_snapshot_sync_impl()
1723 dsphys->ds_prev_snap_obj = dsl_dataset_phys(ds)->ds_prev_snap_obj; in dsl_dataset_snapshot_sync_impl()
1724 dsphys->ds_prev_snap_txg = dsl_dataset_phys(ds)->ds_prev_snap_txg; in dsl_dataset_snapshot_sync_impl()
1725 dsphys->ds_next_snap_obj = ds->ds_object; in dsl_dataset_snapshot_sync_impl()
1729 dsphys->ds_deadlist_obj = dsl_dataset_phys(ds)->ds_deadlist_obj; in dsl_dataset_snapshot_sync_impl()
1730 dsphys->ds_referenced_bytes = dsl_dataset_phys(ds)->ds_referenced_bytes; in dsl_dataset_snapshot_sync_impl()
1731 dsphys->ds_compressed_bytes = dsl_dataset_phys(ds)->ds_compressed_bytes; in dsl_dataset_snapshot_sync_impl()
1733 dsl_dataset_phys(ds)->ds_uncompressed_bytes; in dsl_dataset_snapshot_sync_impl()
1734 dsphys->ds_flags = dsl_dataset_phys(ds)->ds_flags; in dsl_dataset_snapshot_sync_impl()
1735 rrw_enter(&ds->ds_bp_rwlock, RW_READER, FTAG); in dsl_dataset_snapshot_sync_impl()
1736 dsphys->ds_bp = dsl_dataset_phys(ds)->ds_bp; in dsl_dataset_snapshot_sync_impl()
1737 rrw_exit(&ds->ds_bp_rwlock, FTAG); in dsl_dataset_snapshot_sync_impl()
1741 if (zfeature_active(f, ds->ds_feature[f])) { in dsl_dataset_snapshot_sync_impl()
1743 ds->ds_feature[f], tx); in dsl_dataset_snapshot_sync_impl()
1747 ASSERT3U(ds->ds_prev != 0, ==, in dsl_dataset_snapshot_sync_impl()
1748 dsl_dataset_phys(ds)->ds_prev_snap_obj != 0); in dsl_dataset_snapshot_sync_impl()
1749 if (ds->ds_prev) { in dsl_dataset_snapshot_sync_impl()
1751 dsl_dataset_phys(ds->ds_prev)->ds_next_clones_obj; in dsl_dataset_snapshot_sync_impl()
1752 ASSERT(dsl_dataset_phys(ds->ds_prev)->ds_next_snap_obj == in dsl_dataset_snapshot_sync_impl()
1753 ds->ds_object || in dsl_dataset_snapshot_sync_impl()
1754 dsl_dataset_phys(ds->ds_prev)->ds_num_children > 1); in dsl_dataset_snapshot_sync_impl()
1755 if (dsl_dataset_phys(ds->ds_prev)->ds_next_snap_obj == in dsl_dataset_snapshot_sync_impl()
1756 ds->ds_object) { in dsl_dataset_snapshot_sync_impl()
1757 dmu_buf_will_dirty(ds->ds_prev->ds_dbuf, tx); in dsl_dataset_snapshot_sync_impl()
1758 ASSERT3U(dsl_dataset_phys(ds)->ds_prev_snap_txg, ==, in dsl_dataset_snapshot_sync_impl()
1759 dsl_dataset_phys(ds->ds_prev)->ds_creation_txg); in dsl_dataset_snapshot_sync_impl()
1760 dsl_dataset_phys(ds->ds_prev)->ds_next_snap_obj = dsobj; in dsl_dataset_snapshot_sync_impl()
1762 dsl_dataset_remove_from_next_clones(ds->ds_prev, in dsl_dataset_snapshot_sync_impl()
1774 if (ds->ds_reserved) { in dsl_dataset_snapshot_sync_impl()
1776 ASSERT(DS_UNIQUE_IS_ACCURATE(ds)); in dsl_dataset_snapshot_sync_impl()
1777 delta = MIN(dsl_dataset_phys(ds)->ds_unique_bytes, in dsl_dataset_snapshot_sync_impl()
1778 ds->ds_reserved); in dsl_dataset_snapshot_sync_impl()
1779 dsl_dir_diduse_space(ds->ds_dir, DD_USED_REFRSRV, in dsl_dataset_snapshot_sync_impl()
1783 dmu_buf_will_dirty(ds->ds_dbuf, tx); in dsl_dataset_snapshot_sync_impl()
1784 dsl_dataset_phys(ds)->ds_deadlist_obj = in dsl_dataset_snapshot_sync_impl()
1785 dsl_deadlist_clone(&ds->ds_deadlist, UINT64_MAX, in dsl_dataset_snapshot_sync_impl()
1786 dsl_dataset_phys(ds)->ds_prev_snap_obj, tx); in dsl_dataset_snapshot_sync_impl()
1787 dsl_deadlist_close(&ds->ds_deadlist); in dsl_dataset_snapshot_sync_impl()
1788 dsl_deadlist_open(&ds->ds_deadlist, mos, in dsl_dataset_snapshot_sync_impl()
1789 dsl_dataset_phys(ds)->ds_deadlist_obj); in dsl_dataset_snapshot_sync_impl()
1790 dsl_deadlist_add_key(&ds->ds_deadlist, in dsl_dataset_snapshot_sync_impl()
1791 dsl_dataset_phys(ds)->ds_prev_snap_txg, tx); in dsl_dataset_snapshot_sync_impl()
1792 dsl_bookmark_snapshotted(ds, tx); in dsl_dataset_snapshot_sync_impl()
1794 if (dsl_dataset_remap_deadlist_exists(ds)) { in dsl_dataset_snapshot_sync_impl()
1796 dsl_dataset_get_remap_deadlist_object(ds); in dsl_dataset_snapshot_sync_impl()
1802 dsl_dataset_unset_remap_deadlist_object(ds, tx); in dsl_dataset_snapshot_sync_impl()
1803 dsl_deadlist_close(&ds->ds_remap_deadlist); in dsl_dataset_snapshot_sync_impl()
1825 if (ds->ds_dir->dd_crypto_obj != 0 && in dsl_dataset_snapshot_sync_impl()
1834 ASSERT3U(dsl_dataset_phys(ds)->ds_prev_snap_txg, <, tx->tx_txg); in dsl_dataset_snapshot_sync_impl()
1835 dsl_dataset_phys(ds)->ds_prev_snap_obj = dsobj; in dsl_dataset_snapshot_sync_impl()
1836 dsl_dataset_phys(ds)->ds_prev_snap_txg = crtxg; in dsl_dataset_snapshot_sync_impl()
1837 dsl_dataset_phys(ds)->ds_unique_bytes = 0; in dsl_dataset_snapshot_sync_impl()
1840 dsl_dataset_phys(ds)->ds_flags |= DS_FLAG_UNIQUE_ACCURATE; in dsl_dataset_snapshot_sync_impl()
1842 VERIFY0(zap_add(mos, dsl_dataset_phys(ds)->ds_snapnames_zapobj, in dsl_dataset_snapshot_sync_impl()
1845 if (ds->ds_prev) in dsl_dataset_snapshot_sync_impl()
1846 dsl_dataset_rele(ds->ds_prev, ds); in dsl_dataset_snapshot_sync_impl()
1848 dsl_dataset_phys(ds)->ds_prev_snap_obj, ds, &ds->ds_prev)); in dsl_dataset_snapshot_sync_impl()
1850 dsl_scan_ds_snapshotted(ds, tx); in dsl_dataset_snapshot_sync_impl()
1852 dsl_dir_snap_cmtime_update(ds->ds_dir); in dsl_dataset_snapshot_sync_impl()
1854 spa_history_log_internal_ds(ds->ds_prev, "snapshot", tx, " "); in dsl_dataset_snapshot_sync_impl()
1866 dsl_dataset_t *ds; in dsl_dataset_snapshot_sync() local
1873 VERIFY0(dsl_dataset_hold(dp, dsname, FTAG, &ds)); in dsl_dataset_snapshot_sync()
1875 dsl_dataset_snapshot_sync_impl(ds, atp + 1, tx); in dsl_dataset_snapshot_sync()
1877 dsl_props_set_sync_impl(ds->ds_prev, in dsl_dataset_snapshot_sync()
1880 dsl_dataset_rele(ds, FTAG); in dsl_dataset_snapshot_sync()
1977 dsl_dataset_t *ds; in dsl_dataset_snapshot_tmp_check() local
1980 error = dsl_dataset_hold(dp, ddsta->ddsta_fsname, FTAG, &ds); in dsl_dataset_snapshot_tmp_check()
1985 error = dsl_dataset_snapshot_check_impl(ds, ddsta->ddsta_snapname, in dsl_dataset_snapshot_tmp_check()
1988 dsl_dataset_rele(ds, FTAG); in dsl_dataset_snapshot_tmp_check()
1993 dsl_dataset_rele(ds, FTAG); in dsl_dataset_snapshot_tmp_check()
1999 dsl_dataset_rele(ds, FTAG); in dsl_dataset_snapshot_tmp_check()
2003 dsl_dataset_rele(ds, FTAG); in dsl_dataset_snapshot_tmp_check()
2012 dsl_dataset_t *ds = NULL; in dsl_dataset_snapshot_tmp_sync() local
2014 VERIFY0(dsl_dataset_hold(dp, ddsta->ddsta_fsname, FTAG, &ds)); in dsl_dataset_snapshot_tmp_sync()
2016 dsl_dataset_snapshot_sync_impl(ds, ddsta->ddsta_snapname, tx); in dsl_dataset_snapshot_tmp_sync()
2017 dsl_dataset_user_hold_sync_one(ds->ds_prev, ddsta->ddsta_htag, in dsl_dataset_snapshot_tmp_sync()
2019 dsl_destroy_snapshot_sync_impl(ds->ds_prev, B_TRUE, tx); in dsl_dataset_snapshot_tmp_sync()
2021 dsl_dataset_rele(ds, FTAG); in dsl_dataset_snapshot_tmp_sync()
2060 dsl_dataset_sync(dsl_dataset_t *ds, zio_t *zio, dmu_tx_t *tx) in dsl_dataset_sync() argument
2063 ASSERT(ds->ds_objset != NULL); in dsl_dataset_sync()
2064 ASSERT(dsl_dataset_phys(ds)->ds_next_snap_obj == 0); in dsl_dataset_sync()
2070 dmu_buf_will_dirty(ds->ds_dbuf, tx); in dsl_dataset_sync()
2071 dsl_dataset_phys(ds)->ds_fsid_guid = ds->ds_fsid_guid; in dsl_dataset_sync()
2073 if (ds->ds_resume_bytes[tx->tx_txg & TXG_MASK] != 0) { in dsl_dataset_sync()
2075 ds->ds_object, DS_FIELD_RESUME_OBJECT, 8, 1, in dsl_dataset_sync()
2076 &ds->ds_resume_object[tx->tx_txg & TXG_MASK], tx)); in dsl_dataset_sync()
2078 ds->ds_object, DS_FIELD_RESUME_OFFSET, 8, 1, in dsl_dataset_sync()
2079 &ds->ds_resume_offset[tx->tx_txg & TXG_MASK], tx)); in dsl_dataset_sync()
2081 ds->ds_object, DS_FIELD_RESUME_BYTES, 8, 1, in dsl_dataset_sync()
2082 &ds->ds_resume_bytes[tx->tx_txg & TXG_MASK], tx)); in dsl_dataset_sync()
2083 ds->ds_resume_object[tx->tx_txg & TXG_MASK] = 0; in dsl_dataset_sync()
2084 ds->ds_resume_offset[tx->tx_txg & TXG_MASK] = 0; in dsl_dataset_sync()
2085 ds->ds_resume_bytes[tx->tx_txg & TXG_MASK] = 0; in dsl_dataset_sync()
2088 dmu_objset_sync(ds->ds_objset, zio, tx); in dsl_dataset_sync()
2097 dsl_livelist_should_disable(dsl_dataset_t *ds) in dsl_livelist_should_disable() argument
2102 used = dsl_dir_get_usedds(ds->ds_dir); in dsl_livelist_should_disable()
2103 referenced = dsl_get_referenced(ds); in dsl_livelist_should_disable()
2137 dsl_dataset_t *ds; member
2149 dsl_dataset_t *ds = tca->ds; in dsl_livelist_try_condense() local
2150 dsl_deadlist_t *ll = &ds->ds_dir->dd_livelist; in dsl_livelist_try_condense()
2158 if (spa->spa_to_condense.ds != NULL) in dsl_livelist_try_condense()
2179 dmu_buf_add_ref(ds->ds_dbuf, spa); in dsl_livelist_try_condense()
2181 spa->spa_to_condense.ds = ds; in dsl_livelist_try_condense()
2192 dsl_flush_pending_livelist(dsl_dataset_t *ds, dmu_tx_t *tx) in dsl_flush_pending_livelist() argument
2194 dsl_dir_t *dd = ds->ds_dir; in dsl_flush_pending_livelist()
2195 spa_t *spa = ds->ds_dir->dd_pool->dp_spa; in dsl_flush_pending_livelist()
2230 .ds = ds in dsl_flush_pending_livelist()
2237 dsl_dataset_sync_done(dsl_dataset_t *ds, dmu_tx_t *tx) in dsl_dataset_sync_done() argument
2239 objset_t *os = ds->ds_objset; in dsl_dataset_sync_done()
2241 bplist_iterate(&ds->ds_pending_deadlist, in dsl_dataset_sync_done()
2242 dsl_deadlist_insert_alloc_cb, &ds->ds_deadlist, tx); in dsl_dataset_sync_done()
2244 if (dsl_deadlist_is_open(&ds->ds_dir->dd_livelist)) { in dsl_dataset_sync_done()
2245 dsl_flush_pending_livelist(ds, tx); in dsl_dataset_sync_done()
2246 if (dsl_livelist_should_disable(ds)) { in dsl_dataset_sync_done()
2247 dsl_dir_remove_livelist(ds->ds_dir, tx, B_TRUE); in dsl_dataset_sync_done()
2251 dsl_bookmark_sync_done(ds, tx); in dsl_dataset_sync_done()
2262 ds->ds_feature_activation[f])) { in dsl_dataset_sync_done()
2263 if (zfeature_active(f, ds->ds_feature[f])) in dsl_dataset_sync_done()
2265 dsl_dataset_activate_feature(ds->ds_object, f, in dsl_dataset_sync_done()
2266 ds->ds_feature_activation[f], tx); in dsl_dataset_sync_done()
2267 ds->ds_feature[f] = ds->ds_feature_activation[f]; in dsl_dataset_sync_done()
2275 get_clones_stat_impl(dsl_dataset_t *ds, nvlist_t *val) in get_clones_stat_impl() argument
2278 objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset; in get_clones_stat_impl()
2282 ASSERT(dsl_pool_config_held(ds->ds_dir->dd_pool)); in get_clones_stat_impl()
2289 if (dsl_dataset_phys(ds)->ds_next_clones_obj != 0) { in get_clones_stat_impl()
2290 VERIFY0(zap_count(mos, dsl_dataset_phys(ds)->ds_next_clones_obj, in get_clones_stat_impl()
2293 if (count != dsl_dataset_phys(ds)->ds_num_children - 1) { in get_clones_stat_impl()
2297 dsl_dataset_phys(ds)->ds_next_clones_obj); in get_clones_stat_impl()
2302 VERIFY0(dsl_dataset_hold_obj(ds->ds_dir->dd_pool, in get_clones_stat_impl()
2313 get_clones_stat(dsl_dataset_t *ds, nvlist_t *nv) in get_clones_stat() argument
2318 if (get_clones_stat_impl(ds, val) == 0) { in get_clones_stat()
2333 get_receive_resume_stats_impl(dsl_dataset_t *ds) in get_receive_resume_stats_impl() argument
2335 dsl_pool_t *dp = ds->ds_dir->dd_pool; in get_receive_resume_stats_impl()
2337 if (dsl_dataset_has_resume_receive_state(ds)) { in get_receive_resume_stats_impl()
2345 if (zap_lookup(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_stats_impl()
2349 if (zap_lookup(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_stats_impl()
2353 if (zap_lookup(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_stats_impl()
2357 if (zap_lookup(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_stats_impl()
2361 if (zap_lookup(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_stats_impl()
2366 if (zap_lookup(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_stats_impl()
2370 if (zap_contains(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_stats_impl()
2374 if (zap_contains(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_stats_impl()
2378 if (zap_contains(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_stats_impl()
2382 if (zap_contains(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_stats_impl()
2386 if (dsl_dataset_feature_is_active(ds, in get_receive_resume_stats_impl()
2390 VERIFY(dsl_dataset_get_uint64_array_feature(ds, in get_receive_resume_stats_impl()
2396 if (zap_contains(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_stats_impl()
2400 VERIFY0(zap_length(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_stats_impl()
2407 VERIFY0(zap_lookup(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_stats_impl()
2449 get_child_receive_stats(dsl_dataset_t *ds) in get_child_receive_stats() argument
2453 dsl_dataset_name(ds, recvname); in get_child_receive_stats()
2458 dsl_dataset_hold(ds->ds_dir->dd_pool, recvname, FTAG, in get_child_receive_stats()
2468 get_receive_resume_stats(dsl_dataset_t *ds, nvlist_t *nv) in get_receive_resume_stats() argument
2470 char *propval = get_receive_resume_stats_impl(ds); in get_receive_resume_stats()
2475 char *childval = get_child_receive_stats(ds); in get_receive_resume_stats()
2486 dsl_get_refratio(dsl_dataset_t *ds) in dsl_get_refratio() argument
2488 uint64_t ratio = dsl_dataset_phys(ds)->ds_compressed_bytes == 0 ? 100 : in dsl_get_refratio()
2489 (dsl_dataset_phys(ds)->ds_uncompressed_bytes * 100 / in dsl_get_refratio()
2490 dsl_dataset_phys(ds)->ds_compressed_bytes); in dsl_get_refratio()
2495 dsl_get_logicalreferenced(dsl_dataset_t *ds) in dsl_get_logicalreferenced() argument
2497 return (dsl_dataset_phys(ds)->ds_uncompressed_bytes); in dsl_get_logicalreferenced()
2501 dsl_get_compressratio(dsl_dataset_t *ds) in dsl_get_compressratio() argument
2503 if (ds->ds_is_snapshot) { in dsl_get_compressratio()
2504 return (dsl_get_refratio(ds)); in dsl_get_compressratio()
2506 dsl_dir_t *dd = ds->ds_dir; in dsl_get_compressratio()
2515 dsl_get_used(dsl_dataset_t *ds) in dsl_get_used() argument
2517 if (ds->ds_is_snapshot) { in dsl_get_used()
2518 return (dsl_dataset_phys(ds)->ds_unique_bytes); in dsl_get_used()
2520 dsl_dir_t *dd = ds->ds_dir; in dsl_get_used()
2529 dsl_get_creation(dsl_dataset_t *ds) in dsl_get_creation() argument
2531 return (dsl_dataset_phys(ds)->ds_creation_time); in dsl_get_creation()
2535 dsl_get_creationtxg(dsl_dataset_t *ds) in dsl_get_creationtxg() argument
2537 return (dsl_dataset_phys(ds)->ds_creation_txg); in dsl_get_creationtxg()
2541 dsl_get_refquota(dsl_dataset_t *ds) in dsl_get_refquota() argument
2543 return (ds->ds_quota); in dsl_get_refquota()
2547 dsl_get_refreservation(dsl_dataset_t *ds) in dsl_get_refreservation() argument
2549 return (ds->ds_reserved); in dsl_get_refreservation()
2553 dsl_get_guid(dsl_dataset_t *ds) in dsl_get_guid() argument
2555 return (dsl_dataset_phys(ds)->ds_guid); in dsl_get_guid()
2559 dsl_get_unique(dsl_dataset_t *ds) in dsl_get_unique() argument
2561 return (dsl_dataset_phys(ds)->ds_unique_bytes); in dsl_get_unique()
2565 dsl_get_objsetid(dsl_dataset_t *ds) in dsl_get_objsetid() argument
2567 return (ds->ds_object); in dsl_get_objsetid()
2571 dsl_get_userrefs(dsl_dataset_t *ds) in dsl_get_userrefs() argument
2573 return (ds->ds_userrefs); in dsl_get_userrefs()
2577 dsl_get_defer_destroy(dsl_dataset_t *ds) in dsl_get_defer_destroy() argument
2579 return (DS_IS_DEFER_DESTROY(ds) ? 1 : 0); in dsl_get_defer_destroy()
2583 dsl_get_referenced(dsl_dataset_t *ds) in dsl_get_referenced() argument
2585 return (dsl_dataset_phys(ds)->ds_referenced_bytes); in dsl_get_referenced()
2589 dsl_get_numclones(dsl_dataset_t *ds) in dsl_get_numclones() argument
2591 ASSERT(ds->ds_is_snapshot); in dsl_get_numclones()
2592 return (dsl_dataset_phys(ds)->ds_num_children - 1); in dsl_get_numclones()
2596 dsl_get_inconsistent(dsl_dataset_t *ds) in dsl_get_inconsistent() argument
2598 return ((dsl_dataset_phys(ds)->ds_flags & DS_FLAG_INCONSISTENT) ? in dsl_get_inconsistent()
2603 dsl_get_redacted(dsl_dataset_t *ds) in dsl_get_redacted() argument
2605 return (dsl_dataset_feature_is_active(ds, in dsl_get_redacted()
2610 dsl_get_available(dsl_dataset_t *ds) in dsl_get_available() argument
2612 uint64_t refdbytes = dsl_get_referenced(ds); in dsl_get_available()
2613 uint64_t availbytes = dsl_dir_space_available(ds->ds_dir, in dsl_get_available()
2615 if (ds->ds_reserved > dsl_dataset_phys(ds)->ds_unique_bytes) { in dsl_get_available()
2617 ds->ds_reserved - dsl_dataset_phys(ds)->ds_unique_bytes; in dsl_get_available()
2619 if (ds->ds_quota != 0) { in dsl_get_available()
2623 if (refdbytes < ds->ds_quota) { in dsl_get_available()
2625 ds->ds_quota - refdbytes); in dsl_get_available()
2634 dsl_get_written(dsl_dataset_t *ds, uint64_t *written) in dsl_get_written() argument
2636 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_get_written()
2639 dsl_dataset_phys(ds)->ds_prev_snap_obj, FTAG, &prev); in dsl_get_written()
2642 err = dsl_dataset_space_written(prev, ds, written, in dsl_get_written()
2653 dsl_get_prev_snap(dsl_dataset_t *ds, char *snap) in dsl_get_prev_snap() argument
2655 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_get_prev_snap()
2656 if (ds->ds_prev != NULL && ds->ds_prev != dp->dp_origin_snap) { in dsl_get_prev_snap()
2657 dsl_dataset_name(ds->ds_prev, snap); in dsl_get_prev_snap()
2665 dsl_get_redact_snaps(dsl_dataset_t *ds, nvlist_t *propval) in dsl_get_redact_snaps() argument
2669 if (dsl_dataset_get_uint64_array_feature(ds, in dsl_get_redact_snaps()
2683 dsl_get_mountpoint(dsl_dataset_t *ds, const char *dsname, char *value, in dsl_get_mountpoint() argument
2687 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_get_mountpoint()
2690 error = dsl_prop_get_ds(ds, zfs_prop_to_name(ZFS_PROP_MOUNTPOINT), 1, in dsl_get_mountpoint()
2756 dsl_dataset_stats(dsl_dataset_t *ds, nvlist_t *nv) in dsl_dataset_stats() argument
2758 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_dataset_stats()
2763 dsl_get_refratio(ds)); in dsl_dataset_stats()
2765 dsl_get_logicalreferenced(ds)); in dsl_dataset_stats()
2767 dsl_get_compressratio(ds)); in dsl_dataset_stats()
2769 dsl_get_used(ds)); in dsl_dataset_stats()
2771 if (ds->ds_is_snapshot) { in dsl_dataset_stats()
2772 get_clones_stat(ds, nv); in dsl_dataset_stats()
2775 if (dsl_get_prev_snap(ds, buf) == 0) in dsl_dataset_stats()
2778 dsl_dir_stats(ds->ds_dir, nv); in dsl_dataset_stats()
2782 dsl_get_redact_snaps(ds, propval); in dsl_dataset_stats()
2788 dsl_get_available(ds)); in dsl_dataset_stats()
2790 dsl_get_referenced(ds)); in dsl_dataset_stats()
2792 dsl_get_creation(ds)); in dsl_dataset_stats()
2794 dsl_get_creationtxg(ds)); in dsl_dataset_stats()
2796 dsl_get_refquota(ds)); in dsl_dataset_stats()
2798 dsl_get_refreservation(ds)); in dsl_dataset_stats()
2800 dsl_get_guid(ds)); in dsl_dataset_stats()
2802 dsl_get_unique(ds)); in dsl_dataset_stats()
2804 dsl_get_objsetid(ds)); in dsl_dataset_stats()
2806 dsl_get_userrefs(ds)); in dsl_dataset_stats()
2808 dsl_get_defer_destroy(ds)); in dsl_dataset_stats()
2809 dsl_dataset_crypt_stats(ds, nv); in dsl_dataset_stats()
2811 if (dsl_dataset_phys(ds)->ds_prev_snap_obj != 0) { in dsl_dataset_stats()
2813 if (dsl_get_written(ds, &written) == 0) { in dsl_dataset_stats()
2819 if (!dsl_dataset_is_snapshot(ds)) { in dsl_dataset_stats()
2824 get_receive_resume_stats(ds, nv); in dsl_dataset_stats()
2834 dsl_dataset_name(ds, recvname); in dsl_dataset_stats()
2847 dsl_dataset_fast_stat(dsl_dataset_t *ds, dmu_objset_stats_t *stat) in dsl_dataset_fast_stat() argument
2849 dsl_pool_t *dp __maybe_unused = ds->ds_dir->dd_pool; in dsl_dataset_fast_stat()
2852 stat->dds_creation_txg = dsl_get_creationtxg(ds); in dsl_dataset_fast_stat()
2853 stat->dds_inconsistent = dsl_get_inconsistent(ds); in dsl_dataset_fast_stat()
2854 stat->dds_guid = dsl_get_guid(ds); in dsl_dataset_fast_stat()
2855 stat->dds_redacted = dsl_get_redacted(ds); in dsl_dataset_fast_stat()
2857 if (ds->ds_is_snapshot) { in dsl_dataset_fast_stat()
2859 stat->dds_num_clones = dsl_get_numclones(ds); in dsl_dataset_fast_stat()
2864 if (dsl_dir_is_clone(ds->ds_dir)) { in dsl_dataset_fast_stat()
2865 dsl_dir_get_origin(ds->ds_dir, stat->dds_origin); in dsl_dataset_fast_stat()
2871 dsl_dataset_fsid_guid(dsl_dataset_t *ds) in dsl_dataset_fsid_guid() argument
2873 return (ds->ds_fsid_guid); in dsl_dataset_fsid_guid()
2877 dsl_dataset_space(dsl_dataset_t *ds, in dsl_dataset_space() argument
2881 *refdbytesp = dsl_dataset_phys(ds)->ds_referenced_bytes; in dsl_dataset_space()
2882 *availbytesp = dsl_dir_space_available(ds->ds_dir, NULL, 0, TRUE); in dsl_dataset_space()
2883 if (ds->ds_reserved > dsl_dataset_phys(ds)->ds_unique_bytes) in dsl_dataset_space()
2885 ds->ds_reserved - dsl_dataset_phys(ds)->ds_unique_bytes; in dsl_dataset_space()
2886 if (ds->ds_quota != 0) { in dsl_dataset_space()
2890 if (*refdbytesp < ds->ds_quota) in dsl_dataset_space()
2892 ds->ds_quota - *refdbytesp); in dsl_dataset_space()
2896 rrw_enter(&ds->ds_bp_rwlock, RW_READER, FTAG); in dsl_dataset_space()
2897 *usedobjsp = BP_GET_FILL(&dsl_dataset_phys(ds)->ds_bp); in dsl_dataset_space()
2898 rrw_exit(&ds->ds_bp_rwlock, FTAG); in dsl_dataset_space()
2903 dsl_dataset_modified_since_snap(dsl_dataset_t *ds, dsl_dataset_t *snap) in dsl_dataset_modified_since_snap() argument
2905 dsl_pool_t *dp __maybe_unused = ds->ds_dir->dd_pool; in dsl_dataset_modified_since_snap()
2911 rrw_enter(&ds->ds_bp_rwlock, RW_READER, FTAG); in dsl_dataset_modified_since_snap()
2912 birth = dsl_dataset_get_blkptr(ds)->blk_birth; in dsl_dataset_modified_since_snap()
2913 rrw_exit(&ds->ds_bp_rwlock, FTAG); in dsl_dataset_modified_since_snap()
2921 if (dmu_objset_from_ds(ds, &os) != 0) in dsl_dataset_modified_since_snap()
2998 dsl_dataset_t *ds; in dsl_dataset_rename_snapshot_sync_impl() local
3010 VERIFY0(dsl_dataset_hold_obj(dp, val, FTAG, &ds)); in dsl_dataset_rename_snapshot_sync_impl()
3013 spa_history_log_internal_ds(ds, "rename", tx, in dsl_dataset_rename_snapshot_sync_impl()
3018 mutex_enter(&ds->ds_lock); in dsl_dataset_rename_snapshot_sync_impl()
3019 (void) strlcpy(ds->ds_snapname, ddrsa->ddrsa_newsnapname, in dsl_dataset_rename_snapshot_sync_impl()
3020 sizeof (ds->ds_snapname)); in dsl_dataset_rename_snapshot_sync_impl()
3021 mutex_exit(&ds->ds_lock); in dsl_dataset_rename_snapshot_sync_impl()
3024 ds->ds_snapname, 8, 1, &ds->ds_object, tx)); in dsl_dataset_rename_snapshot_sync_impl()
3028 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rename_snapshot_sync_impl()
3075 dsl_dataset_handoff_check(dsl_dataset_t *ds, void *owner, dmu_tx_t *tx) in dsl_dataset_handoff_check() argument
3082 dsl_dir_t *dd = ds->ds_dir; in dsl_dataset_handoff_check()
3084 uint64_t holds = zfs_refcount_count(&ds->ds_longholds) - in dsl_dataset_handoff_check()
3109 dsl_dataset_t *ds; in dsl_dataset_rollback_check() local
3113 error = dsl_dataset_hold(dp, ddra->ddra_fsname, FTAG, &ds); in dsl_dataset_rollback_check()
3118 if (ds->ds_is_snapshot) { in dsl_dataset_rollback_check()
3119 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
3124 if (dsl_dataset_phys(ds)->ds_prev_snap_txg < TXG_INITIAL) { in dsl_dataset_rollback_check()
3125 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
3136 dsl_dataset_phys(ds)->ds_prev_snap_txg >= tx->tx_txg) { in dsl_dataset_rollback_check()
3137 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
3161 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
3167 if (snapds != ds->ds_prev) { in dsl_dataset_rollback_check()
3173 if (snapds->ds_dir == ds->ds_dir || in dsl_dataset_rollback_check()
3174 (dsl_dir_is_clone(ds->ds_dir) && in dsl_dataset_rollback_check()
3175 dsl_dir_phys(ds->ds_dir)->dd_origin_obj == in dsl_dataset_rollback_check()
3182 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
3189 if (dsl_bookmark_latest_txg(ds) > in dsl_dataset_rollback_check()
3190 dsl_dataset_phys(ds)->ds_prev_snap_txg) { in dsl_dataset_rollback_check()
3191 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
3195 error = dsl_dataset_handoff_check(ds, ddra->ddra_owner, tx); in dsl_dataset_rollback_check()
3197 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
3205 if (ds->ds_quota != 0 && in dsl_dataset_rollback_check()
3206 dsl_dataset_phys(ds->ds_prev)->ds_referenced_bytes > ds->ds_quota) { in dsl_dataset_rollback_check()
3207 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
3218 unused_refres_delta = (int64_t)MIN(ds->ds_reserved, in dsl_dataset_rollback_check()
3219 dsl_dataset_phys(ds)->ds_unique_bytes); in dsl_dataset_rollback_check()
3223 dsl_dir_space_available(ds->ds_dir, NULL, 0, TRUE)) { in dsl_dataset_rollback_check()
3224 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
3228 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
3237 dsl_dataset_t *ds, *clone; in dsl_dataset_rollback_sync() local
3241 VERIFY0(dsl_dataset_hold(dp, ddra->ddra_fsname, FTAG, &ds)); in dsl_dataset_rollback_sync()
3243 dsl_dataset_name(ds->ds_prev, namebuf); in dsl_dataset_rollback_sync()
3246 cloneobj = dsl_dataset_create_sync(ds->ds_dir, "%rollback", in dsl_dataset_rollback_sync()
3247 ds->ds_prev, DS_CREATE_FLAG_NODIRTY, kcred, NULL, tx); in dsl_dataset_rollback_sync()
3251 dsl_dataset_clone_swap_sync_impl(clone, ds, tx); in dsl_dataset_rollback_sync()
3252 dsl_dataset_zero_zil(ds, tx); in dsl_dataset_rollback_sync()
3257 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_sync()
3291 dsl_dataset_t *ds; member
3329 dsl_dataset_t *const origin_ds = snap->ds; in dsl_dataset_promote_check()
3353 ASSERT3U(dsl_dataset_phys(snap->ds)->ds_prev_snap_obj, ==, in dsl_dataset_promote_check()
3355 dsl_deadlist_space_range(&snap->ds->ds_deadlist, in dsl_dataset_promote_check()
3382 dsl_dataset_t *ds = snap->ds; in dsl_dataset_promote_check() local
3390 if (dsl_dataset_long_held(ds)) { in dsl_dataset_promote_check()
3396 VERIFY0(dsl_dataset_get_snapname(ds)); in dsl_dataset_promote_check()
3397 if (strlen(ds->ds_snapname) >= max_snap_len) { in dsl_dataset_promote_check()
3401 err = dsl_dataset_snap_lookup(hds, ds->ds_snapname, &val); in dsl_dataset_promote_check()
3404 snap->ds->ds_snapname); in dsl_dataset_promote_check()
3411 if (dsl_dataset_phys(ds)->ds_prev_snap_obj == 0) in dsl_dataset_promote_check()
3414 dsl_deadlist_space(&ds->ds_deadlist, in dsl_dataset_promote_check()
3498 snap->ds->ds_dir->dd_origin_txg, &ddpa->cloneusedsnap); in dsl_dataset_promote_check()
3503 snap->ds->ds_dir->dd_origin_txg, &space); in dsl_dataset_promote_check()
3544 origin_ds = snap->ds; in dsl_dataset_promote_sync()
3548 origin_head = snap->ds; in dsl_dataset_promote_sync()
3563 ASSERT3U(dsl_dataset_phys(snap->ds)->ds_prev_snap_obj, ==, in dsl_dataset_promote_sync()
3565 dsl_dataset_phys(origin_ds)->ds_next_snap_obj = snap->ds->ds_object; in dsl_dataset_promote_sync()
3570 snap->ds->ds_object, tx); in dsl_dataset_promote_sync()
3628 dsl_dataset_t *ds = snap->ds; in dsl_dataset_promote_sync() local
3635 if (ds->ds_objset) { in dsl_dataset_promote_sync()
3636 dmu_objset_evict(ds->ds_objset); in dsl_dataset_promote_sync()
3637 ds->ds_objset = NULL; in dsl_dataset_promote_sync()
3641 VERIFY0(dsl_dataset_get_snapname(ds)); in dsl_dataset_promote_sync()
3643 ds->ds_snapname, tx, B_TRUE)); in dsl_dataset_promote_sync()
3645 dsl_dataset_phys(hds)->ds_snapnames_zapobj, ds->ds_snapname, in dsl_dataset_promote_sync()
3646 8, 1, &ds->ds_object, tx)); in dsl_dataset_promote_sync()
3651 dmu_buf_will_dirty(ds->ds_dbuf, tx); in dsl_dataset_promote_sync()
3652 ASSERT3U(dsl_dataset_phys(ds)->ds_dir_obj, ==, odd->dd_object); in dsl_dataset_promote_sync()
3653 dsl_dataset_phys(ds)->ds_dir_obj = dd->dd_object; in dsl_dataset_promote_sync()
3654 ASSERT3P(ds->ds_dir, ==, odd); in dsl_dataset_promote_sync()
3655 dsl_dir_rele(ds->ds_dir, ds); in dsl_dataset_promote_sync()
3657 NULL, ds, &ds->ds_dir)); in dsl_dataset_promote_sync()
3660 if (dsl_dataset_phys(ds)->ds_next_clones_obj && in dsl_dataset_promote_sync()
3666 dsl_dataset_phys(ds)->ds_next_clones_obj); in dsl_dataset_promote_sync()
3694 ASSERT(!dsl_prop_hascb(ds)); in dsl_dataset_promote_sync()
3754 dsl_dataset_t *ds; in snaplist_make() local
3758 err = dsl_dataset_hold_obj(dp, obj, tag, &ds); in snaplist_make()
3764 first_obj = dsl_dir_phys(ds->ds_dir)->dd_origin_obj; in snaplist_make()
3767 snap->ds = ds; in snaplist_make()
3769 obj = dsl_dataset_phys(ds)->ds_prev_snap_obj; in snaplist_make()
3783 dsl_deadlist_space_range(&snap->ds->ds_deadlist, in snaplist_space()
3800 dsl_dataset_rele(snap->ds, tag); in snaplist_destroy()
3836 ASSERT3U(snap->ds->ds_object, ==, dsl_dir_phys(dd)->dd_origin_obj); in promote_hold()
3838 dsl_dir_phys(snap->ds->ds_dir)->dd_head_dataset_obj, in promote_hold()
3843 if (dsl_dir_phys(snap->ds->ds_dir)->dd_origin_obj != 0) { in promote_hold()
3845 dsl_dir_phys(snap->ds->ds_dir)->dd_origin_obj, in promote_hold()
4226 dsl_dataset_t *ds; in dsl_dsobj_to_dsname() local
4233 error = dsl_dataset_hold_obj(dp, obj, FTAG, &ds); in dsl_dsobj_to_dsname()
4235 dsl_dataset_name(ds, buf); in dsl_dsobj_to_dsname()
4236 dsl_dataset_rele(ds, FTAG); in dsl_dsobj_to_dsname()
4244 dsl_dataset_check_quota(dsl_dataset_t *ds, boolean_t check_quota, in dsl_dataset_check_quota() argument
4257 mutex_enter(&ds->ds_lock); in dsl_dataset_check_quota()
4261 if (ds->ds_reserved > dsl_dataset_phys(ds)->ds_unique_bytes) { in dsl_dataset_check_quota()
4263 ds->ds_reserved - dsl_dataset_phys(ds)->ds_unique_bytes); in dsl_dataset_check_quota()
4265 (ds->ds_reserved - dsl_dataset_phys(ds)->ds_unique_bytes); in dsl_dataset_check_quota()
4267 asize - MIN(asize, parent_delta(ds, asize + inflight)); in dsl_dataset_check_quota()
4270 if (!check_quota || ds->ds_quota == 0) { in dsl_dataset_check_quota()
4271 mutex_exit(&ds->ds_lock); in dsl_dataset_check_quota()
4280 if (dsl_dataset_phys(ds)->ds_referenced_bytes + inflight >= in dsl_dataset_check_quota()
4281 ds->ds_quota) { in dsl_dataset_check_quota()
4283 dsl_dataset_phys(ds)->ds_referenced_bytes < ds->ds_quota) in dsl_dataset_check_quota()
4288 mutex_exit(&ds->ds_lock); in dsl_dataset_check_quota()
4305 dsl_dataset_t *ds; in dsl_dataset_set_refquota_check() local
4312 error = dsl_dataset_hold(dp, ddsqra->ddsqra_name, FTAG, &ds); in dsl_dataset_set_refquota_check()
4316 if (ds->ds_is_snapshot) { in dsl_dataset_set_refquota_check()
4317 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refquota_check()
4321 error = dsl_prop_predict(ds->ds_dir, in dsl_dataset_set_refquota_check()
4325 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refquota_check()
4330 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refquota_check()
4334 if (newval < dsl_dataset_phys(ds)->ds_referenced_bytes || in dsl_dataset_set_refquota_check()
4335 newval < ds->ds_reserved) { in dsl_dataset_set_refquota_check()
4336 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refquota_check()
4340 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refquota_check()
4349 dsl_dataset_t *ds = NULL; in dsl_dataset_set_refquota_sync() local
4352 VERIFY0(dsl_dataset_hold(dp, ddsqra->ddsqra_name, FTAG, &ds)); in dsl_dataset_set_refquota_sync()
4354 dsl_prop_set_sync_impl(ds, in dsl_dataset_set_refquota_sync()
4359 VERIFY0(dsl_prop_get_int_ds(ds, in dsl_dataset_set_refquota_sync()
4362 if (ds->ds_quota != newval) { in dsl_dataset_set_refquota_sync()
4363 dmu_buf_will_dirty(ds->ds_dbuf, tx); in dsl_dataset_set_refquota_sync()
4364 ds->ds_quota = newval; in dsl_dataset_set_refquota_sync()
4366 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refquota_sync()
4389 dsl_dataset_t *ds; in dsl_dataset_set_refreservation_check() local
4396 error = dsl_dataset_hold(dp, ddsqra->ddsqra_name, FTAG, &ds); in dsl_dataset_set_refreservation_check()
4400 if (ds->ds_is_snapshot) { in dsl_dataset_set_refreservation_check()
4401 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refreservation_check()
4405 error = dsl_prop_predict(ds->ds_dir, in dsl_dataset_set_refreservation_check()
4409 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refreservation_check()
4418 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refreservation_check()
4422 mutex_enter(&ds->ds_lock); in dsl_dataset_set_refreservation_check()
4423 if (!DS_UNIQUE_IS_ACCURATE(ds)) in dsl_dataset_set_refreservation_check()
4424 dsl_dataset_recalc_head_uniq(ds); in dsl_dataset_set_refreservation_check()
4425 unique = dsl_dataset_phys(ds)->ds_unique_bytes; in dsl_dataset_set_refreservation_check()
4426 mutex_exit(&ds->ds_lock); in dsl_dataset_set_refreservation_check()
4428 if (MAX(unique, newval) > MAX(unique, ds->ds_reserved)) { in dsl_dataset_set_refreservation_check()
4430 MAX(unique, ds->ds_reserved); in dsl_dataset_set_refreservation_check()
4433 dsl_dir_space_available(ds->ds_dir, NULL, 0, B_TRUE) || in dsl_dataset_set_refreservation_check()
4434 (ds->ds_quota > 0 && newval > ds->ds_quota)) { in dsl_dataset_set_refreservation_check()
4435 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refreservation_check()
4440 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refreservation_check()
4445 dsl_dataset_set_refreservation_sync_impl(dsl_dataset_t *ds, in dsl_dataset_set_refreservation_sync_impl() argument
4452 dsl_prop_set_sync_impl(ds, zfs_prop_to_name(ZFS_PROP_REFRESERVATION), in dsl_dataset_set_refreservation_sync_impl()
4455 VERIFY0(dsl_prop_get_int_ds(ds, in dsl_dataset_set_refreservation_sync_impl()
4458 dmu_buf_will_dirty(ds->ds_dbuf, tx); in dsl_dataset_set_refreservation_sync_impl()
4459 mutex_enter(&ds->ds_dir->dd_lock); in dsl_dataset_set_refreservation_sync_impl()
4460 mutex_enter(&ds->ds_lock); in dsl_dataset_set_refreservation_sync_impl()
4461 ASSERT(DS_UNIQUE_IS_ACCURATE(ds)); in dsl_dataset_set_refreservation_sync_impl()
4462 unique = dsl_dataset_phys(ds)->ds_unique_bytes; in dsl_dataset_set_refreservation_sync_impl()
4464 MAX(0, (int64_t)(ds->ds_reserved - unique)); in dsl_dataset_set_refreservation_sync_impl()
4465 ds->ds_reserved = newval; in dsl_dataset_set_refreservation_sync_impl()
4466 mutex_exit(&ds->ds_lock); in dsl_dataset_set_refreservation_sync_impl()
4468 dsl_dir_diduse_space(ds->ds_dir, DD_USED_REFRSRV, delta, 0, 0, tx); in dsl_dataset_set_refreservation_sync_impl()
4469 mutex_exit(&ds->ds_dir->dd_lock); in dsl_dataset_set_refreservation_sync_impl()
4477 dsl_dataset_t *ds = NULL; in dsl_dataset_set_refreservation_sync() local
4479 VERIFY0(dsl_dataset_hold(dp, ddsqra->ddsqra_name, FTAG, &ds)); in dsl_dataset_set_refreservation_sync()
4480 dsl_dataset_set_refreservation_sync_impl(ds, in dsl_dataset_set_refreservation_sync()
4482 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refreservation_sync()
4529 dsl_dataset_t *ds = NULL; in dsl_dataset_set_compression_sync() local
4535 VERIFY0(dsl_dataset_hold(dp, ddsca->ddsca_name, FTAG, &ds)); in dsl_dataset_set_compression_sync()
4536 if (zfeature_active(f, ds->ds_feature[f]) != B_TRUE) { in dsl_dataset_set_compression_sync()
4537 ds->ds_feature_activation[f] = (void *)B_TRUE; in dsl_dataset_set_compression_sync()
4538 dsl_dataset_activate_feature(ds->ds_object, f, in dsl_dataset_set_compression_sync()
4539 ds->ds_feature_activation[f], tx); in dsl_dataset_set_compression_sync()
4540 ds->ds_feature[f] = ds->ds_feature_activation[f]; in dsl_dataset_set_compression_sync()
4542 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_compression_sync()
4747 dsl_dataset_t *ds; in dsl_dataset_space_wouldfree() local
4750 err = dsl_dataset_hold_obj(dp, snapobj, FTAG, &ds); in dsl_dataset_space_wouldfree()
4754 dsl_deadlist_space_range(&ds->ds_deadlist, in dsl_dataset_space_wouldfree()
4761 snapobj = dsl_dataset_phys(ds)->ds_prev_snap_obj; in dsl_dataset_space_wouldfree()
4763 dsl_dataset_rele(ds, FTAG); in dsl_dataset_space_wouldfree()
4823 dsl_dataset_zapify(dsl_dataset_t *ds, dmu_tx_t *tx) in dsl_dataset_zapify() argument
4825 objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset; in dsl_dataset_zapify()
4826 dmu_object_zapify(mos, ds->ds_object, DMU_OT_DSL_DATASET, tx); in dsl_dataset_zapify()
4830 dsl_dataset_is_zapified(dsl_dataset_t *ds) in dsl_dataset_is_zapified() argument
4834 dmu_object_info_from_db(ds->ds_dbuf, &doi); in dsl_dataset_is_zapified()
4839 dsl_dataset_has_resume_receive_state(dsl_dataset_t *ds) in dsl_dataset_has_resume_receive_state() argument
4841 return (dsl_dataset_is_zapified(ds) && in dsl_dataset_has_resume_receive_state()
4842 zap_contains(ds->ds_dir->dd_pool->dp_meta_objset, in dsl_dataset_has_resume_receive_state()
4843 ds->ds_object, DS_FIELD_RESUME_TOGUID) == 0); in dsl_dataset_has_resume_receive_state()
4847 dsl_dataset_get_remap_deadlist_object(dsl_dataset_t *ds) in dsl_dataset_get_remap_deadlist_object() argument
4852 if (!dsl_dataset_is_zapified(ds)) in dsl_dataset_get_remap_deadlist_object()
4855 err = zap_lookup(ds->ds_dir->dd_pool->dp_meta_objset, ds->ds_object, in dsl_dataset_get_remap_deadlist_object()
4869 dsl_dataset_remap_deadlist_exists(dsl_dataset_t *ds) in dsl_dataset_remap_deadlist_exists() argument
4871 EQUIV(dsl_deadlist_is_open(&ds->ds_remap_deadlist), in dsl_dataset_remap_deadlist_exists()
4872 dsl_dataset_get_remap_deadlist_object(ds) != 0); in dsl_dataset_remap_deadlist_exists()
4873 return (dsl_deadlist_is_open(&ds->ds_remap_deadlist)); in dsl_dataset_remap_deadlist_exists()
4877 dsl_dataset_set_remap_deadlist_object(dsl_dataset_t *ds, uint64_t obj, in dsl_dataset_set_remap_deadlist_object() argument
4881 dsl_dataset_zapify(ds, tx); in dsl_dataset_set_remap_deadlist_object()
4882 VERIFY0(zap_add(ds->ds_dir->dd_pool->dp_meta_objset, ds->ds_object, in dsl_dataset_set_remap_deadlist_object()
4887 dsl_dataset_unset_remap_deadlist_object(dsl_dataset_t *ds, dmu_tx_t *tx) in dsl_dataset_unset_remap_deadlist_object() argument
4889 VERIFY0(zap_remove(ds->ds_dir->dd_pool->dp_meta_objset, in dsl_dataset_unset_remap_deadlist_object()
4890 ds->ds_object, DS_FIELD_REMAP_DEADLIST, tx)); in dsl_dataset_unset_remap_deadlist_object()
4894 dsl_dataset_destroy_remap_deadlist(dsl_dataset_t *ds, dmu_tx_t *tx) in dsl_dataset_destroy_remap_deadlist() argument
4897 spa_t *spa = ds->ds_dir->dd_pool->dp_spa; in dsl_dataset_destroy_remap_deadlist()
4900 ASSERT(dsl_dataset_remap_deadlist_exists(ds)); in dsl_dataset_destroy_remap_deadlist()
4902 remap_deadlist_object = ds->ds_remap_deadlist.dl_object; in dsl_dataset_destroy_remap_deadlist()
4903 dsl_deadlist_close(&ds->ds_remap_deadlist); in dsl_dataset_destroy_remap_deadlist()
4905 dsl_dataset_unset_remap_deadlist_object(ds, tx); in dsl_dataset_destroy_remap_deadlist()
4910 dsl_dataset_create_remap_deadlist(dsl_dataset_t *ds, dmu_tx_t *tx) in dsl_dataset_create_remap_deadlist() argument
4913 spa_t *spa = ds->ds_dir->dd_pool->dp_spa; in dsl_dataset_create_remap_deadlist()
4916 ASSERT(MUTEX_HELD(&ds->ds_remap_deadlist_lock)); in dsl_dataset_create_remap_deadlist()
4924 &ds->ds_deadlist, UINT64_MAX, in dsl_dataset_create_remap_deadlist()
4925 dsl_dataset_phys(ds)->ds_prev_snap_obj, tx); in dsl_dataset_create_remap_deadlist()
4926 dsl_dataset_set_remap_deadlist_object(ds, in dsl_dataset_create_remap_deadlist()
4928 dsl_deadlist_open(&ds->ds_remap_deadlist, spa_meta_objset(spa), in dsl_dataset_create_remap_deadlist()
4934 dsl_dataset_activate_redaction(dsl_dataset_t *ds, uint64_t *redact_snaps, in dsl_dataset_activate_redaction() argument
4937 uint64_t dsobj = ds->ds_object; in dsl_dataset_activate_redaction()
4949 ds->ds_feature[SPA_FEATURE_REDACTED_DATASETS] = ftuaa; in dsl_dataset_activate_redaction()