Lines Matching refs:ds

84 extern inline dsl_dataset_phys_t *dsl_dataset_phys(dsl_dataset_t *ds);
86 static void dsl_dataset_set_remap_deadlist_object(dsl_dataset_t *ds,
88 static void dsl_dataset_unset_remap_deadlist_object(dsl_dataset_t *ds,
101 parent_delta(dsl_dataset_t *ds, int64_t delta) in parent_delta() argument
106 if (ds->ds_reserved == 0) in parent_delta()
109 ds_phys = dsl_dataset_phys(ds); in parent_delta()
110 old_bytes = MAX(ds_phys->ds_unique_bytes, ds->ds_reserved); in parent_delta()
111 new_bytes = MAX(ds_phys->ds_unique_bytes + delta, ds->ds_reserved); in parent_delta()
118 dsl_dataset_block_born(dsl_dataset_t *ds, const blkptr_t *bp, dmu_tx_t *tx) in dsl_dataset_block_born() argument
125 dprintf_bp(bp, "ds=%p", ds); in dsl_dataset_block_born()
133 if (ds == NULL) { in dsl_dataset_block_born()
139 ASSERT3U(bp->blk_birth, >, dsl_dataset_phys(ds)->ds_prev_snap_txg); in dsl_dataset_block_born()
140 dmu_buf_will_dirty(ds->ds_dbuf, tx); in dsl_dataset_block_born()
141 mutex_enter(&ds->ds_lock); in dsl_dataset_block_born()
142 delta = parent_delta(ds, used); in dsl_dataset_block_born()
143 dsl_dataset_phys(ds)->ds_referenced_bytes += used; in dsl_dataset_block_born()
144 dsl_dataset_phys(ds)->ds_compressed_bytes += compressed; in dsl_dataset_block_born()
145 dsl_dataset_phys(ds)->ds_uncompressed_bytes += uncompressed; in dsl_dataset_block_born()
146 dsl_dataset_phys(ds)->ds_unique_bytes += used; in dsl_dataset_block_born()
149 ds->ds_feature_activation_needed[SPA_FEATURE_LARGE_BLOCKS] = in dsl_dataset_block_born()
155 ds->ds_feature_activation_needed[f] = B_TRUE; in dsl_dataset_block_born()
157 mutex_exit(&ds->ds_lock); in dsl_dataset_block_born()
158 dsl_dir_diduse_space(ds->ds_dir, DD_USED_HEAD, delta, in dsl_dataset_block_born()
160 dsl_dir_transfer_space(ds->ds_dir, used - delta, in dsl_dataset_block_born()
172 dsl_dataset_block_remapped(dsl_dataset_t *ds, uint64_t vdev, uint64_t offset, in dsl_dataset_block_remapped() argument
175 spa_t *spa = ds->ds_dir->dd_pool->dp_spa; in dsl_dataset_block_remapped()
179 ASSERT(!ds->ds_is_snapshot); in dsl_dataset_block_remapped()
181 if (birth > dsl_dataset_phys(ds)->ds_prev_snap_txg) { in dsl_dataset_block_remapped()
187 ASSERT(ds != NULL); in dsl_dataset_block_remapped()
189 mutex_enter(&ds->ds_remap_deadlist_lock); in dsl_dataset_block_remapped()
190 if (!dsl_dataset_remap_deadlist_exists(ds)) { in dsl_dataset_block_remapped()
191 dsl_dataset_create_remap_deadlist(ds, tx); in dsl_dataset_block_remapped()
193 mutex_exit(&ds->ds_remap_deadlist_lock); in dsl_dataset_block_remapped()
201 dsl_deadlist_insert(&ds->ds_remap_deadlist, &fakebp, tx); in dsl_dataset_block_remapped()
206 dsl_dataset_block_kill(dsl_dataset_t *ds, const blkptr_t *bp, dmu_tx_t *tx, in dsl_dataset_block_kill() argument
221 if (ds == NULL) { in dsl_dataset_block_kill()
227 ASSERT3P(tx->tx_pool, ==, ds->ds_dir->dd_pool); in dsl_dataset_block_kill()
229 ASSERT(!ds->ds_is_snapshot); in dsl_dataset_block_kill()
230 dmu_buf_will_dirty(ds->ds_dbuf, tx); in dsl_dataset_block_kill()
232 if (bp->blk_birth > dsl_dataset_phys(ds)->ds_prev_snap_txg) { in dsl_dataset_block_kill()
235 dprintf_bp(bp, "freeing ds=%llu", ds->ds_object); in dsl_dataset_block_kill()
238 mutex_enter(&ds->ds_lock); in dsl_dataset_block_kill()
239 ASSERT(dsl_dataset_phys(ds)->ds_unique_bytes >= used || in dsl_dataset_block_kill()
240 !DS_UNIQUE_IS_ACCURATE(ds)); in dsl_dataset_block_kill()
241 delta = parent_delta(ds, -used); in dsl_dataset_block_kill()
242 dsl_dataset_phys(ds)->ds_unique_bytes -= used; in dsl_dataset_block_kill()
243 mutex_exit(&ds->ds_lock); in dsl_dataset_block_kill()
244 dsl_dir_diduse_space(ds->ds_dir, DD_USED_HEAD, in dsl_dataset_block_kill()
246 dsl_dir_transfer_space(ds->ds_dir, -used - delta, in dsl_dataset_block_kill()
258 bplist_append(&ds->ds_pending_deadlist, bp); in dsl_dataset_block_kill()
260 dsl_deadlist_insert(&ds->ds_deadlist, bp, tx); in dsl_dataset_block_kill()
262 ASSERT3U(ds->ds_prev->ds_object, ==, in dsl_dataset_block_kill()
263 dsl_dataset_phys(ds)->ds_prev_snap_obj); in dsl_dataset_block_kill()
264 ASSERT(dsl_dataset_phys(ds->ds_prev)->ds_num_children > 0); in dsl_dataset_block_kill()
266 if (dsl_dataset_phys(ds->ds_prev)->ds_next_snap_obj == in dsl_dataset_block_kill()
267 ds->ds_object && bp->blk_birth > in dsl_dataset_block_kill()
268 dsl_dataset_phys(ds->ds_prev)->ds_prev_snap_txg) { in dsl_dataset_block_kill()
269 dmu_buf_will_dirty(ds->ds_prev->ds_dbuf, tx); in dsl_dataset_block_kill()
270 mutex_enter(&ds->ds_prev->ds_lock); in dsl_dataset_block_kill()
271 dsl_dataset_phys(ds->ds_prev)->ds_unique_bytes += used; in dsl_dataset_block_kill()
272 mutex_exit(&ds->ds_prev->ds_lock); in dsl_dataset_block_kill()
274 if (bp->blk_birth > ds->ds_dir->dd_origin_txg) { in dsl_dataset_block_kill()
275 dsl_dir_transfer_space(ds->ds_dir, used, in dsl_dataset_block_kill()
279 mutex_enter(&ds->ds_lock); in dsl_dataset_block_kill()
280 ASSERT3U(dsl_dataset_phys(ds)->ds_referenced_bytes, >=, used); in dsl_dataset_block_kill()
281 dsl_dataset_phys(ds)->ds_referenced_bytes -= used; in dsl_dataset_block_kill()
282 ASSERT3U(dsl_dataset_phys(ds)->ds_compressed_bytes, >=, compressed); in dsl_dataset_block_kill()
283 dsl_dataset_phys(ds)->ds_compressed_bytes -= compressed; in dsl_dataset_block_kill()
284 ASSERT3U(dsl_dataset_phys(ds)->ds_uncompressed_bytes, >=, uncompressed); in dsl_dataset_block_kill()
285 dsl_dataset_phys(ds)->ds_uncompressed_bytes -= uncompressed; in dsl_dataset_block_kill()
286 mutex_exit(&ds->ds_lock); in dsl_dataset_block_kill()
300 dsl_dataset_t *ds = dbu; in dsl_dataset_evict_sync() local
302 ASSERT(ds->ds_owner == NULL); in dsl_dataset_evict_sync()
304 unique_remove(ds->ds_fsid_guid); in dsl_dataset_evict_sync()
310 dsl_dataset_t *ds = dbu; in dsl_dataset_evict_async() local
312 ASSERT(ds->ds_owner == NULL); in dsl_dataset_evict_async()
314 ds->ds_dbuf = NULL; in dsl_dataset_evict_async()
316 if (ds->ds_objset != NULL) in dsl_dataset_evict_async()
317 dmu_objset_evict(ds->ds_objset); in dsl_dataset_evict_async()
319 if (ds->ds_prev) { in dsl_dataset_evict_async()
320 dsl_dataset_rele(ds->ds_prev, ds); in dsl_dataset_evict_async()
321 ds->ds_prev = NULL; in dsl_dataset_evict_async()
324 bplist_destroy(&ds->ds_pending_deadlist); in dsl_dataset_evict_async()
325 if (dsl_deadlist_is_open(&ds->ds_deadlist)) in dsl_dataset_evict_async()
326 dsl_deadlist_close(&ds->ds_deadlist); in dsl_dataset_evict_async()
327 if (dsl_deadlist_is_open(&ds->ds_remap_deadlist)) in dsl_dataset_evict_async()
328 dsl_deadlist_close(&ds->ds_remap_deadlist); in dsl_dataset_evict_async()
329 if (ds->ds_dir) in dsl_dataset_evict_async()
330 dsl_dir_async_rele(ds->ds_dir, ds); in dsl_dataset_evict_async()
332 ASSERT(!list_link_active(&ds->ds_synced_link)); in dsl_dataset_evict_async()
334 list_destroy(&ds->ds_prop_cbs); in dsl_dataset_evict_async()
335 mutex_destroy(&ds->ds_lock); in dsl_dataset_evict_async()
336 mutex_destroy(&ds->ds_opening_lock); in dsl_dataset_evict_async()
337 mutex_destroy(&ds->ds_sendstream_lock); in dsl_dataset_evict_async()
338 mutex_destroy(&ds->ds_remap_deadlist_lock); in dsl_dataset_evict_async()
339 zfs_refcount_destroy(&ds->ds_longholds); in dsl_dataset_evict_async()
340 rrw_destroy(&ds->ds_bp_rwlock); in dsl_dataset_evict_async()
342 kmem_free(ds, sizeof (dsl_dataset_t)); in dsl_dataset_evict_async()
346 dsl_dataset_get_snapname(dsl_dataset_t *ds) in dsl_dataset_get_snapname() argument
351 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_dataset_get_snapname()
354 if (ds->ds_snapname[0]) in dsl_dataset_get_snapname()
356 if (dsl_dataset_phys(ds)->ds_next_snap_obj == 0) in dsl_dataset_get_snapname()
359 err = dmu_bonus_hold(mos, dsl_dir_phys(ds->ds_dir)->dd_head_dataset_obj, in dsl_dataset_get_snapname()
365 headphys->ds_snapnames_zapobj, ds->ds_object, 0, ds->ds_snapname); in dsl_dataset_get_snapname()
371 dsl_dataset_snap_lookup(dsl_dataset_t *ds, const char *name, uint64_t *value) in dsl_dataset_snap_lookup() argument
373 objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset; in dsl_dataset_snap_lookup()
374 uint64_t snapobj = dsl_dataset_phys(ds)->ds_snapnames_zapobj; in dsl_dataset_snap_lookup()
378 if (dsl_dataset_phys(ds)->ds_flags & DS_FLAG_CI_DATASET) in dsl_dataset_snap_lookup()
389 dsl_dataset_snap_remove(dsl_dataset_t *ds, const char *name, dmu_tx_t *tx, in dsl_dataset_snap_remove() argument
392 objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset; in dsl_dataset_snap_remove()
393 uint64_t snapobj = dsl_dataset_phys(ds)->ds_snapnames_zapobj; in dsl_dataset_snap_remove()
397 dsl_dir_snap_cmtime_update(ds->ds_dir); in dsl_dataset_snap_remove()
399 if (dsl_dataset_phys(ds)->ds_flags & DS_FLAG_CI_DATASET) in dsl_dataset_snap_remove()
407 dsl_fs_ss_count_adjust(ds->ds_dir, -1, in dsl_dataset_snap_remove()
414 dsl_dataset_try_add_ref(dsl_pool_t *dp, dsl_dataset_t *ds, void *tag) in dsl_dataset_try_add_ref() argument
416 dmu_buf_t *dbuf = ds->ds_dbuf; in dsl_dataset_try_add_ref()
420 ds->ds_object, DMU_BONUS_BLKID, tag)) { in dsl_dataset_try_add_ref()
422 if (ds == dmu_buf_get_user(dbuf)) in dsl_dataset_try_add_ref()
437 dsl_dataset_t *ds; in dsl_dataset_hold_obj() local
454 ds = dmu_buf_get_user(dbuf); in dsl_dataset_hold_obj()
455 if (ds == NULL) { in dsl_dataset_hold_obj()
458 ds = kmem_zalloc(sizeof (dsl_dataset_t), KM_SLEEP); in dsl_dataset_hold_obj()
459 ds->ds_dbuf = dbuf; in dsl_dataset_hold_obj()
460 ds->ds_object = dsobj; in dsl_dataset_hold_obj()
461 ds->ds_is_snapshot = dsl_dataset_phys(ds)->ds_num_children != 0; in dsl_dataset_hold_obj()
463 err = dsl_dir_hold_obj(dp, dsl_dataset_phys(ds)->ds_dir_obj, in dsl_dataset_hold_obj()
464 NULL, ds, &ds->ds_dir); in dsl_dataset_hold_obj()
466 kmem_free(ds, sizeof (dsl_dataset_t)); in dsl_dataset_hold_obj()
471 mutex_init(&ds->ds_lock, NULL, MUTEX_DEFAULT, NULL); in dsl_dataset_hold_obj()
472 mutex_init(&ds->ds_opening_lock, NULL, MUTEX_DEFAULT, NULL); in dsl_dataset_hold_obj()
473 mutex_init(&ds->ds_sendstream_lock, NULL, MUTEX_DEFAULT, NULL); in dsl_dataset_hold_obj()
474 mutex_init(&ds->ds_remap_deadlist_lock, in dsl_dataset_hold_obj()
476 rrw_init(&ds->ds_bp_rwlock, B_FALSE); in dsl_dataset_hold_obj()
477 zfs_refcount_create(&ds->ds_longholds); in dsl_dataset_hold_obj()
479 bplist_create(&ds->ds_pending_deadlist); in dsl_dataset_hold_obj()
481 list_create(&ds->ds_sendstreams, sizeof (dmu_sendarg_t), in dsl_dataset_hold_obj()
484 list_create(&ds->ds_prop_cbs, sizeof (dsl_prop_cb_record_t), in dsl_dataset_hold_obj()
495 ds->ds_feature_inuse[f] = B_TRUE; in dsl_dataset_hold_obj()
503 if (!ds->ds_is_snapshot) { in dsl_dataset_hold_obj()
504 ds->ds_snapname[0] = '\0'; in dsl_dataset_hold_obj()
505 if (dsl_dataset_phys(ds)->ds_prev_snap_obj != 0) { in dsl_dataset_hold_obj()
507 dsl_dataset_phys(ds)->ds_prev_snap_obj, in dsl_dataset_hold_obj()
508 ds, &ds->ds_prev); in dsl_dataset_hold_obj()
511 int zaperr = zap_lookup(mos, ds->ds_object, in dsl_dataset_hold_obj()
513 sizeof (ds->ds_bookmarks), 1, in dsl_dataset_hold_obj()
514 &ds->ds_bookmarks); in dsl_dataset_hold_obj()
520 err = dsl_dataset_get_snapname(ds); in dsl_dataset_hold_obj()
522 dsl_dataset_phys(ds)->ds_userrefs_obj != 0) { in dsl_dataset_hold_obj()
524 ds->ds_dir->dd_pool->dp_meta_objset, in dsl_dataset_hold_obj()
525 dsl_dataset_phys(ds)->ds_userrefs_obj, in dsl_dataset_hold_obj()
526 &ds->ds_userrefs); in dsl_dataset_hold_obj()
530 if (err == 0 && !ds->ds_is_snapshot) { in dsl_dataset_hold_obj()
531 err = dsl_prop_get_int_ds(ds, in dsl_dataset_hold_obj()
533 &ds->ds_reserved); in dsl_dataset_hold_obj()
535 err = dsl_prop_get_int_ds(ds, in dsl_dataset_hold_obj()
537 &ds->ds_quota); in dsl_dataset_hold_obj()
540 ds->ds_reserved = ds->ds_quota = 0; in dsl_dataset_hold_obj()
543 if (err == 0 && ds->ds_dir->dd_crypto_obj != 0 && in dsl_dataset_hold_obj()
544 ds->ds_is_snapshot && in dsl_dataset_hold_obj()
550 dsl_deadlist_open(&ds->ds_deadlist, in dsl_dataset_hold_obj()
551 mos, dsl_dataset_phys(ds)->ds_deadlist_obj); in dsl_dataset_hold_obj()
553 dsl_dataset_get_remap_deadlist_object(ds); in dsl_dataset_hold_obj()
555 dsl_deadlist_open(&ds->ds_remap_deadlist, mos, in dsl_dataset_hold_obj()
559 dmu_buf_init_user(&ds->ds_dbu, dsl_dataset_evict_sync, in dsl_dataset_hold_obj()
560 dsl_dataset_evict_async, &ds->ds_dbuf); in dsl_dataset_hold_obj()
562 winner = dmu_buf_set_user_ie(dbuf, &ds->ds_dbu); in dsl_dataset_hold_obj()
565 bplist_destroy(&ds->ds_pending_deadlist); in dsl_dataset_hold_obj()
566 dsl_deadlist_close(&ds->ds_deadlist); in dsl_dataset_hold_obj()
567 if (dsl_deadlist_is_open(&ds->ds_remap_deadlist)) in dsl_dataset_hold_obj()
568 dsl_deadlist_close(&ds->ds_remap_deadlist); in dsl_dataset_hold_obj()
569 if (ds->ds_prev) in dsl_dataset_hold_obj()
570 dsl_dataset_rele(ds->ds_prev, ds); in dsl_dataset_hold_obj()
571 dsl_dir_rele(ds->ds_dir, ds); in dsl_dataset_hold_obj()
572 list_destroy(&ds->ds_prop_cbs); in dsl_dataset_hold_obj()
573 list_destroy(&ds->ds_sendstreams); in dsl_dataset_hold_obj()
574 mutex_destroy(&ds->ds_lock); in dsl_dataset_hold_obj()
575 mutex_destroy(&ds->ds_opening_lock); in dsl_dataset_hold_obj()
576 mutex_destroy(&ds->ds_sendstream_lock); in dsl_dataset_hold_obj()
577 mutex_destroy(&ds->ds_remap_deadlist_lock); in dsl_dataset_hold_obj()
578 zfs_refcount_destroy(&ds->ds_longholds); in dsl_dataset_hold_obj()
579 rrw_destroy(&ds->ds_bp_rwlock); in dsl_dataset_hold_obj()
580 kmem_free(ds, sizeof (dsl_dataset_t)); in dsl_dataset_hold_obj()
585 ds = winner; in dsl_dataset_hold_obj()
587 ds->ds_fsid_guid = in dsl_dataset_hold_obj()
588 unique_insert(dsl_dataset_phys(ds)->ds_fsid_guid); in dsl_dataset_hold_obj()
589 if (ds->ds_fsid_guid != in dsl_dataset_hold_obj()
590 dsl_dataset_phys(ds)->ds_fsid_guid) { in dsl_dataset_hold_obj()
594 dsl_dataset_phys(ds)->ds_fsid_guid, in dsl_dataset_hold_obj()
595 (long long)ds->ds_fsid_guid, in dsl_dataset_hold_obj()
602 ASSERT3P(ds->ds_dbuf, ==, dbuf); in dsl_dataset_hold_obj()
603 ASSERT3P(dsl_dataset_phys(ds), ==, dbuf->db_data); in dsl_dataset_hold_obj()
604 ASSERT(dsl_dataset_phys(ds)->ds_prev_snap_obj != 0 || in dsl_dataset_hold_obj()
606 dp->dp_origin_snap == NULL || ds == dp->dp_origin_snap); in dsl_dataset_hold_obj()
607 *dsp = ds; in dsl_dataset_hold_obj()
613 dsl_dataset_create_key_mapping(dsl_dataset_t *ds) in dsl_dataset_create_key_mapping() argument
615 dsl_dir_t *dd = ds->ds_dir; in dsl_dataset_create_key_mapping()
621 ds, ds, &ds->ds_key_mapping)); in dsl_dataset_create_key_mapping()
653 dsl_dataset_t *ds; in dsl_dataset_hold_flags() local
662 err = dsl_dataset_hold_obj_flags(dp, obj, flags, tag, &ds); in dsl_dataset_hold_flags()
671 dsl_dataset_rele_flags(ds, flags, tag); in dsl_dataset_hold_flags()
677 err = dsl_dataset_snap_lookup(ds, snapname, &obj); in dsl_dataset_hold_flags()
682 dsl_dataset_rele_flags(ds, flags, tag); in dsl_dataset_hold_flags()
690 ds = snap_ds; in dsl_dataset_hold_flags()
694 *dsp = ds; in dsl_dataset_hold_flags()
745 dsl_dataset_long_hold(dsl_dataset_t *ds, void *tag) in dsl_dataset_long_hold() argument
747 ASSERT(dsl_pool_config_held(ds->ds_dir->dd_pool)); in dsl_dataset_long_hold()
748 (void) zfs_refcount_add(&ds->ds_longholds, tag); in dsl_dataset_long_hold()
752 dsl_dataset_long_rele(dsl_dataset_t *ds, void *tag) in dsl_dataset_long_rele() argument
754 (void) zfs_refcount_remove(&ds->ds_longholds, tag); in dsl_dataset_long_rele()
759 dsl_dataset_long_held(dsl_dataset_t *ds) in dsl_dataset_long_held() argument
761 return (!zfs_refcount_is_zero(&ds->ds_longholds)); in dsl_dataset_long_held()
765 dsl_dataset_name(dsl_dataset_t *ds, char *name) in dsl_dataset_name() argument
767 if (ds == NULL) { in dsl_dataset_name()
770 dsl_dir_name(ds->ds_dir, name); in dsl_dataset_name()
771 VERIFY0(dsl_dataset_get_snapname(ds)); in dsl_dataset_name()
772 if (ds->ds_snapname[0]) { in dsl_dataset_name()
779 if (!MUTEX_HELD(&ds->ds_lock)) { in dsl_dataset_name()
780 mutex_enter(&ds->ds_lock); in dsl_dataset_name()
781 VERIFY3U(strlcat(name, ds->ds_snapname, in dsl_dataset_name()
784 mutex_exit(&ds->ds_lock); in dsl_dataset_name()
786 VERIFY3U(strlcat(name, ds->ds_snapname, in dsl_dataset_name()
795 dsl_dataset_namelen(dsl_dataset_t *ds) in dsl_dataset_namelen() argument
797 VERIFY0(dsl_dataset_get_snapname(ds)); in dsl_dataset_namelen()
798 mutex_enter(&ds->ds_lock); in dsl_dataset_namelen()
799 int len = dsl_dir_namelen(ds->ds_dir) + 1 + strlen(ds->ds_snapname); in dsl_dataset_namelen()
800 mutex_exit(&ds->ds_lock); in dsl_dataset_namelen()
805 dsl_dataset_rele(dsl_dataset_t *ds, void *tag) in dsl_dataset_rele() argument
807 dmu_buf_rele(ds->ds_dbuf, tag); in dsl_dataset_rele()
811 dsl_dataset_remove_key_mapping(dsl_dataset_t *ds) in dsl_dataset_remove_key_mapping() argument
813 dsl_dir_t *dd = ds->ds_dir; in dsl_dataset_remove_key_mapping()
819 ds->ds_object, ds); in dsl_dataset_remove_key_mapping()
823 dsl_dataset_rele_flags(dsl_dataset_t *ds, ds_hold_flags_t flags, void *tag) in dsl_dataset_rele_flags() argument
826 dsl_dataset_remove_key_mapping(ds); in dsl_dataset_rele_flags()
828 dsl_dataset_rele(ds, tag); in dsl_dataset_rele_flags()
832 dsl_dataset_disown(dsl_dataset_t *ds, ds_hold_flags_t flags, void *tag) in dsl_dataset_disown() argument
834 ASSERT3P(ds->ds_owner, ==, tag); in dsl_dataset_disown()
835 ASSERT(ds->ds_dbuf != NULL); in dsl_dataset_disown()
837 mutex_enter(&ds->ds_lock); in dsl_dataset_disown()
838 ds->ds_owner = NULL; in dsl_dataset_disown()
839 mutex_exit(&ds->ds_lock); in dsl_dataset_disown()
840 dsl_dataset_long_rele(ds, tag); in dsl_dataset_disown()
841 dsl_dataset_rele_flags(ds, flags, tag); in dsl_dataset_disown()
845 dsl_dataset_tryown(dsl_dataset_t *ds, void *tag) in dsl_dataset_tryown() argument
849 ASSERT(dsl_pool_config_held(ds->ds_dir->dd_pool)); in dsl_dataset_tryown()
850 mutex_enter(&ds->ds_lock); in dsl_dataset_tryown()
851 if (ds->ds_owner == NULL && !DS_IS_INCONSISTENT(ds)) { in dsl_dataset_tryown()
852 ds->ds_owner = tag; in dsl_dataset_tryown()
853 dsl_dataset_long_hold(ds, tag); in dsl_dataset_tryown()
856 mutex_exit(&ds->ds_lock); in dsl_dataset_tryown()
861 dsl_dataset_has_owner(dsl_dataset_t *ds) in dsl_dataset_has_owner() argument
864 mutex_enter(&ds->ds_lock); in dsl_dataset_has_owner()
865 rv = (ds->ds_owner != NULL); in dsl_dataset_has_owner()
866 mutex_exit(&ds->ds_lock); in dsl_dataset_has_owner()
1014 dsl_dataset_zero_zil(dsl_dataset_t *ds, dmu_tx_t *tx) in dsl_dataset_zero_zil() argument
1018 VERIFY0(dmu_objset_from_ds(ds, &os)); in dsl_dataset_zero_zil()
1020 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_dataset_zero_zil()
1028 dsl_dataset_sync(ds, zio, tx); in dsl_dataset_zero_zil()
1032 dmu_buf_add_ref(ds->ds_dbuf, ds); in dsl_dataset_zero_zil()
1033 dsl_dataset_sync_done(ds, tx); in dsl_dataset_zero_zil()
1079 dsl_dataset_t *ds; in dsl_dataset_create_sync() local
1081 VERIFY0(dsl_dataset_hold_obj(dp, dsobj, FTAG, &ds)); in dsl_dataset_create_sync()
1082 dsl_dataset_zero_zil(ds, tx); in dsl_dataset_create_sync()
1083 dsl_dataset_rele(ds, FTAG); in dsl_dataset_create_sync()
1098 dsl_dataset_recalc_head_uniq(dsl_dataset_t *ds) in dsl_dataset_recalc_head_uniq() argument
1103 ASSERT(!ds->ds_is_snapshot); in dsl_dataset_recalc_head_uniq()
1105 if (dsl_dataset_phys(ds)->ds_prev_snap_obj != 0) in dsl_dataset_recalc_head_uniq()
1106 mrs_used = dsl_dataset_phys(ds->ds_prev)->ds_referenced_bytes; in dsl_dataset_recalc_head_uniq()
1110 dsl_deadlist_space(&ds->ds_deadlist, &dlused, &dlcomp, &dluncomp); in dsl_dataset_recalc_head_uniq()
1113 dsl_dataset_phys(ds)->ds_unique_bytes = in dsl_dataset_recalc_head_uniq()
1114 dsl_dataset_phys(ds)->ds_referenced_bytes - (mrs_used - dlused); in dsl_dataset_recalc_head_uniq()
1116 if (spa_version(ds->ds_dir->dd_pool->dp_spa) >= in dsl_dataset_recalc_head_uniq()
1118 dsl_dataset_phys(ds)->ds_flags |= DS_FLAG_UNIQUE_ACCURATE; in dsl_dataset_recalc_head_uniq()
1122 dsl_dataset_remove_from_next_clones(dsl_dataset_t *ds, uint64_t obj, in dsl_dataset_remove_from_next_clones() argument
1125 objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset; in dsl_dataset_remove_from_next_clones()
1129 ASSERT(dsl_dataset_phys(ds)->ds_num_children >= 2); in dsl_dataset_remove_from_next_clones()
1130 err = zap_remove_int(mos, dsl_dataset_phys(ds)->ds_next_clones_obj, in dsl_dataset_remove_from_next_clones()
1144 ASSERT0(zap_count(mos, dsl_dataset_phys(ds)->ds_next_clones_obj, in dsl_dataset_remove_from_next_clones()
1146 ASSERT3U(count, <=, dsl_dataset_phys(ds)->ds_num_children - 2); in dsl_dataset_remove_from_next_clones()
1151 dsl_dataset_get_blkptr(dsl_dataset_t *ds) in dsl_dataset_get_blkptr() argument
1153 return (&dsl_dataset_phys(ds)->ds_bp); in dsl_dataset_get_blkptr()
1157 dsl_dataset_get_spa(dsl_dataset_t *ds) in dsl_dataset_get_spa() argument
1159 return (ds->ds_dir->dd_pool->dp_spa); in dsl_dataset_get_spa()
1163 dsl_dataset_dirty(dsl_dataset_t *ds, dmu_tx_t *tx) in dsl_dataset_dirty() argument
1167 if (ds == NULL) /* this is the meta-objset */ in dsl_dataset_dirty()
1170 ASSERT(ds->ds_objset != NULL); in dsl_dataset_dirty()
1172 if (dsl_dataset_phys(ds)->ds_next_snap_obj != 0) in dsl_dataset_dirty()
1176 ASSERT3U(tx->tx_txg, >, dsl_dataset_phys(ds)->ds_prev_snap_txg); in dsl_dataset_dirty()
1178 dp = ds->ds_dir->dd_pool; in dsl_dataset_dirty()
1179 if (txg_list_add(&dp->dp_dirty_datasets, ds, tx->tx_txg)) { in dsl_dataset_dirty()
1180 objset_t *os = ds->ds_objset; in dsl_dataset_dirty()
1183 dmu_buf_add_ref(ds->ds_dbuf, ds); in dsl_dataset_dirty()
1186 if (ds->ds_dir->dd_crypto_obj != 0 && in dsl_dataset_dirty()
1189 ASSERT3P(ds->ds_key_mapping, !=, NULL); in dsl_dataset_dirty()
1190 key_mapping_add_ref(ds->ds_key_mapping, ds); in dsl_dataset_dirty()
1196 dsl_dataset_is_dirty(dsl_dataset_t *ds) in dsl_dataset_is_dirty() argument
1199 if (txg_list_member(&ds->ds_dir->dd_pool->dp_dirty_datasets, in dsl_dataset_is_dirty()
1200 ds, t)) in dsl_dataset_is_dirty()
1207 dsl_dataset_snapshot_reserve_space(dsl_dataset_t *ds, dmu_tx_t *tx) in dsl_dataset_snapshot_reserve_space() argument
1219 ASSERT(ds->ds_reserved == 0 || DS_UNIQUE_IS_ACCURATE(ds)); in dsl_dataset_snapshot_reserve_space()
1220 asize = MIN(dsl_dataset_phys(ds)->ds_unique_bytes, ds->ds_reserved); in dsl_dataset_snapshot_reserve_space()
1221 if (asize > dsl_dir_space_available(ds->ds_dir, NULL, 0, TRUE)) in dsl_dataset_snapshot_reserve_space()
1229 dsl_dir_willuse_space(ds->ds_dir, asize, tx); in dsl_dataset_snapshot_reserve_space()
1235 dsl_dataset_snapshot_check_impl(dsl_dataset_t *ds, const char *snapname, in dsl_dataset_snapshot_check_impl() argument
1241 ds->ds_trysnap_txg = tx->tx_txg; in dsl_dataset_snapshot_check_impl()
1250 if (dsl_dataset_phys(ds)->ds_prev_snap_txg >= tx->tx_txg) in dsl_dataset_snapshot_check_impl()
1256 error = dsl_dataset_snap_lookup(ds, snapname, &value); in dsl_dataset_snapshot_check_impl()
1271 if (!recv && DS_IS_INCONSISTENT(ds)) in dsl_dataset_snapshot_check_impl()
1280 error = dsl_fs_ss_limit_check(ds->ds_dir, cnt, in dsl_dataset_snapshot_check_impl()
1286 error = dsl_dataset_snapshot_reserve_space(ds, tx); in dsl_dataset_snapshot_check_impl()
1368 dsl_dataset_t *ds; in dsl_dataset_snapshot_check() local
1374 error = dsl_dataset_hold(dp, name, FTAG, &ds); in dsl_dataset_snapshot_check()
1376 error = dsl_fs_ss_limit_check(ds->ds_dir, cnt, in dsl_dataset_snapshot_check()
1379 dsl_dataset_rele(ds, FTAG); in dsl_dataset_snapshot_check()
1397 dsl_dataset_t *ds; in dsl_dataset_snapshot_check() local
1412 error = dsl_dataset_hold(dp, dsname, FTAG, &ds); in dsl_dataset_snapshot_check()
1415 error = dsl_dataset_snapshot_check_impl(ds, in dsl_dataset_snapshot_check()
1417 dsl_dataset_rele(ds, FTAG); in dsl_dataset_snapshot_check()
1433 dsl_dataset_snapshot_sync_impl(dsl_dataset_t *ds, const char *snapname, in dsl_dataset_snapshot_sync_impl() argument
1436 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_dataset_snapshot_sync_impl()
1450 dmu_objset_from_ds(ds, &os) != 0 || in dsl_dataset_snapshot_sync_impl()
1455 ASSERT(!txg_list_member(&ds->ds_dir->dd_pool->dp_dirty_datasets, in dsl_dataset_snapshot_sync_impl()
1456 ds, tx->tx_txg)); in dsl_dataset_snapshot_sync_impl()
1458 dsl_fs_ss_count_adjust(ds->ds_dir, 1, DD_FIELD_SNAPSHOT_COUNT, tx); in dsl_dataset_snapshot_sync_impl()
1474 dsphys->ds_dir_obj = ds->ds_dir->dd_object; in dsl_dataset_snapshot_sync_impl()
1478 dsphys->ds_prev_snap_obj = dsl_dataset_phys(ds)->ds_prev_snap_obj; in dsl_dataset_snapshot_sync_impl()
1479 dsphys->ds_prev_snap_txg = dsl_dataset_phys(ds)->ds_prev_snap_txg; in dsl_dataset_snapshot_sync_impl()
1480 dsphys->ds_next_snap_obj = ds->ds_object; in dsl_dataset_snapshot_sync_impl()
1484 dsphys->ds_deadlist_obj = dsl_dataset_phys(ds)->ds_deadlist_obj; in dsl_dataset_snapshot_sync_impl()
1485 dsphys->ds_referenced_bytes = dsl_dataset_phys(ds)->ds_referenced_bytes; in dsl_dataset_snapshot_sync_impl()
1486 dsphys->ds_compressed_bytes = dsl_dataset_phys(ds)->ds_compressed_bytes; in dsl_dataset_snapshot_sync_impl()
1488 dsl_dataset_phys(ds)->ds_uncompressed_bytes; in dsl_dataset_snapshot_sync_impl()
1489 dsphys->ds_flags = dsl_dataset_phys(ds)->ds_flags; in dsl_dataset_snapshot_sync_impl()
1490 rrw_enter(&ds->ds_bp_rwlock, RW_READER, FTAG); in dsl_dataset_snapshot_sync_impl()
1491 dsphys->ds_bp = dsl_dataset_phys(ds)->ds_bp; in dsl_dataset_snapshot_sync_impl()
1492 rrw_exit(&ds->ds_bp_rwlock, FTAG); in dsl_dataset_snapshot_sync_impl()
1496 if (ds->ds_feature_inuse[f]) in dsl_dataset_snapshot_sync_impl()
1500 ASSERT3U(ds->ds_prev != 0, ==, in dsl_dataset_snapshot_sync_impl()
1501 dsl_dataset_phys(ds)->ds_prev_snap_obj != 0); in dsl_dataset_snapshot_sync_impl()
1502 if (ds->ds_prev) { in dsl_dataset_snapshot_sync_impl()
1504 dsl_dataset_phys(ds->ds_prev)->ds_next_clones_obj; in dsl_dataset_snapshot_sync_impl()
1505 ASSERT(dsl_dataset_phys(ds->ds_prev)->ds_next_snap_obj == in dsl_dataset_snapshot_sync_impl()
1506 ds->ds_object || in dsl_dataset_snapshot_sync_impl()
1507 dsl_dataset_phys(ds->ds_prev)->ds_num_children > 1); in dsl_dataset_snapshot_sync_impl()
1508 if (dsl_dataset_phys(ds->ds_prev)->ds_next_snap_obj == in dsl_dataset_snapshot_sync_impl()
1509 ds->ds_object) { in dsl_dataset_snapshot_sync_impl()
1510 dmu_buf_will_dirty(ds->ds_prev->ds_dbuf, tx); in dsl_dataset_snapshot_sync_impl()
1511 ASSERT3U(dsl_dataset_phys(ds)->ds_prev_snap_txg, ==, in dsl_dataset_snapshot_sync_impl()
1512 dsl_dataset_phys(ds->ds_prev)->ds_creation_txg); in dsl_dataset_snapshot_sync_impl()
1513 dsl_dataset_phys(ds->ds_prev)->ds_next_snap_obj = dsobj; in dsl_dataset_snapshot_sync_impl()
1515 dsl_dataset_remove_from_next_clones(ds->ds_prev, in dsl_dataset_snapshot_sync_impl()
1527 if (ds->ds_reserved) { in dsl_dataset_snapshot_sync_impl()
1529 ASSERT(DS_UNIQUE_IS_ACCURATE(ds)); in dsl_dataset_snapshot_sync_impl()
1530 delta = MIN(dsl_dataset_phys(ds)->ds_unique_bytes, in dsl_dataset_snapshot_sync_impl()
1531 ds->ds_reserved); in dsl_dataset_snapshot_sync_impl()
1532 dsl_dir_diduse_space(ds->ds_dir, DD_USED_REFRSRV, in dsl_dataset_snapshot_sync_impl()
1536 dmu_buf_will_dirty(ds->ds_dbuf, tx); in dsl_dataset_snapshot_sync_impl()
1537 dsl_dataset_phys(ds)->ds_deadlist_obj = in dsl_dataset_snapshot_sync_impl()
1538 dsl_deadlist_clone(&ds->ds_deadlist, UINT64_MAX, in dsl_dataset_snapshot_sync_impl()
1539 dsl_dataset_phys(ds)->ds_prev_snap_obj, tx); in dsl_dataset_snapshot_sync_impl()
1540 dsl_deadlist_close(&ds->ds_deadlist); in dsl_dataset_snapshot_sync_impl()
1541 dsl_deadlist_open(&ds->ds_deadlist, mos, in dsl_dataset_snapshot_sync_impl()
1542 dsl_dataset_phys(ds)->ds_deadlist_obj); in dsl_dataset_snapshot_sync_impl()
1543 dsl_deadlist_add_key(&ds->ds_deadlist, in dsl_dataset_snapshot_sync_impl()
1544 dsl_dataset_phys(ds)->ds_prev_snap_txg, tx); in dsl_dataset_snapshot_sync_impl()
1546 if (dsl_dataset_remap_deadlist_exists(ds)) { in dsl_dataset_snapshot_sync_impl()
1548 dsl_dataset_get_remap_deadlist_object(ds); in dsl_dataset_snapshot_sync_impl()
1554 dsl_dataset_unset_remap_deadlist_object(ds, tx); in dsl_dataset_snapshot_sync_impl()
1555 dsl_deadlist_close(&ds->ds_remap_deadlist); in dsl_dataset_snapshot_sync_impl()
1577 if (ds->ds_dir->dd_crypto_obj != 0 && in dsl_dataset_snapshot_sync_impl()
1586 ASSERT3U(dsl_dataset_phys(ds)->ds_prev_snap_txg, <, tx->tx_txg); in dsl_dataset_snapshot_sync_impl()
1587 dsl_dataset_phys(ds)->ds_prev_snap_obj = dsobj; in dsl_dataset_snapshot_sync_impl()
1588 dsl_dataset_phys(ds)->ds_prev_snap_txg = crtxg; in dsl_dataset_snapshot_sync_impl()
1589 dsl_dataset_phys(ds)->ds_unique_bytes = 0; in dsl_dataset_snapshot_sync_impl()
1592 dsl_dataset_phys(ds)->ds_flags |= DS_FLAG_UNIQUE_ACCURATE; in dsl_dataset_snapshot_sync_impl()
1594 VERIFY0(zap_add(mos, dsl_dataset_phys(ds)->ds_snapnames_zapobj, in dsl_dataset_snapshot_sync_impl()
1597 if (ds->ds_prev) in dsl_dataset_snapshot_sync_impl()
1598 dsl_dataset_rele(ds->ds_prev, ds); in dsl_dataset_snapshot_sync_impl()
1600 dsl_dataset_phys(ds)->ds_prev_snap_obj, ds, &ds->ds_prev)); in dsl_dataset_snapshot_sync_impl()
1602 dsl_scan_ds_snapshotted(ds, tx); in dsl_dataset_snapshot_sync_impl()
1604 dsl_dir_snap_cmtime_update(ds->ds_dir); in dsl_dataset_snapshot_sync_impl()
1606 spa_history_log_internal_ds(ds->ds_prev, "snapshot", tx, ""); in dsl_dataset_snapshot_sync_impl()
1618 dsl_dataset_t *ds; in dsl_dataset_snapshot_sync() local
1625 VERIFY0(dsl_dataset_hold(dp, dsname, FTAG, &ds)); in dsl_dataset_snapshot_sync()
1627 dsl_dataset_snapshot_sync_impl(ds, atp + 1, tx); in dsl_dataset_snapshot_sync()
1629 dsl_props_set_sync_impl(ds->ds_prev, in dsl_dataset_snapshot_sync()
1632 dsl_dataset_rele(ds, FTAG); in dsl_dataset_snapshot_sync()
1721 dsl_dataset_t *ds; in dsl_dataset_snapshot_tmp_check() local
1724 error = dsl_dataset_hold(dp, ddsta->ddsta_fsname, FTAG, &ds); in dsl_dataset_snapshot_tmp_check()
1729 error = dsl_dataset_snapshot_check_impl(ds, ddsta->ddsta_snapname, in dsl_dataset_snapshot_tmp_check()
1732 dsl_dataset_rele(ds, FTAG); in dsl_dataset_snapshot_tmp_check()
1737 dsl_dataset_rele(ds, FTAG); in dsl_dataset_snapshot_tmp_check()
1743 dsl_dataset_rele(ds, FTAG); in dsl_dataset_snapshot_tmp_check()
1747 dsl_dataset_rele(ds, FTAG); in dsl_dataset_snapshot_tmp_check()
1756 dsl_dataset_t *ds; in dsl_dataset_snapshot_tmp_sync() local
1758 VERIFY0(dsl_dataset_hold(dp, ddsta->ddsta_fsname, FTAG, &ds)); in dsl_dataset_snapshot_tmp_sync()
1760 dsl_dataset_snapshot_sync_impl(ds, ddsta->ddsta_snapname, tx); in dsl_dataset_snapshot_tmp_sync()
1761 dsl_dataset_user_hold_sync_one(ds->ds_prev, ddsta->ddsta_htag, in dsl_dataset_snapshot_tmp_sync()
1763 dsl_destroy_snapshot_sync_impl(ds->ds_prev, B_TRUE, tx); in dsl_dataset_snapshot_tmp_sync()
1765 dsl_dataset_rele(ds, FTAG); in dsl_dataset_snapshot_tmp_sync()
1804 dsl_dataset_sync(dsl_dataset_t *ds, zio_t *zio, dmu_tx_t *tx) in dsl_dataset_sync() argument
1807 ASSERT(ds->ds_objset != NULL); in dsl_dataset_sync()
1808 ASSERT(dsl_dataset_phys(ds)->ds_next_snap_obj == 0); in dsl_dataset_sync()
1814 dmu_buf_will_dirty(ds->ds_dbuf, tx); in dsl_dataset_sync()
1815 dsl_dataset_phys(ds)->ds_fsid_guid = ds->ds_fsid_guid; in dsl_dataset_sync()
1817 if (ds->ds_resume_bytes[tx->tx_txg & TXG_MASK] != 0) { in dsl_dataset_sync()
1819 ds->ds_object, DS_FIELD_RESUME_OBJECT, 8, 1, in dsl_dataset_sync()
1820 &ds->ds_resume_object[tx->tx_txg & TXG_MASK], tx)); in dsl_dataset_sync()
1822 ds->ds_object, DS_FIELD_RESUME_OFFSET, 8, 1, in dsl_dataset_sync()
1823 &ds->ds_resume_offset[tx->tx_txg & TXG_MASK], tx)); in dsl_dataset_sync()
1825 ds->ds_object, DS_FIELD_RESUME_BYTES, 8, 1, in dsl_dataset_sync()
1826 &ds->ds_resume_bytes[tx->tx_txg & TXG_MASK], tx)); in dsl_dataset_sync()
1827 ds->ds_resume_object[tx->tx_txg & TXG_MASK] = 0; in dsl_dataset_sync()
1828 ds->ds_resume_offset[tx->tx_txg & TXG_MASK] = 0; in dsl_dataset_sync()
1829 ds->ds_resume_bytes[tx->tx_txg & TXG_MASK] = 0; in dsl_dataset_sync()
1832 dmu_objset_sync(ds->ds_objset, zio, tx); in dsl_dataset_sync()
1835 if (ds->ds_feature_activation_needed[f]) { in dsl_dataset_sync()
1836 if (ds->ds_feature_inuse[f]) in dsl_dataset_sync()
1838 dsl_dataset_activate_feature(ds->ds_object, f, tx); in dsl_dataset_sync()
1839 ds->ds_feature_inuse[f] = B_TRUE; in dsl_dataset_sync()
1853 dsl_dataset_sync_done(dsl_dataset_t *ds, dmu_tx_t *tx) in dsl_dataset_sync_done() argument
1855 objset_t *os = ds->ds_objset; in dsl_dataset_sync_done()
1857 bplist_iterate(&ds->ds_pending_deadlist, in dsl_dataset_sync_done()
1858 deadlist_enqueue_cb, &ds->ds_deadlist, tx); in dsl_dataset_sync_done()
1872 dmu_buf_rele(ds->ds_dbuf, ds); in dsl_dataset_sync_done()
1876 get_clones_stat_impl(dsl_dataset_t *ds, nvlist_t *val) in get_clones_stat_impl() argument
1879 objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset; in get_clones_stat_impl()
1883 ASSERT(dsl_pool_config_held(ds->ds_dir->dd_pool)); in get_clones_stat_impl()
1890 if (dsl_dataset_phys(ds)->ds_next_clones_obj != 0) { in get_clones_stat_impl()
1891 VERIFY0(zap_count(mos, dsl_dataset_phys(ds)->ds_next_clones_obj, in get_clones_stat_impl()
1894 if (count != dsl_dataset_phys(ds)->ds_num_children - 1) { in get_clones_stat_impl()
1898 dsl_dataset_phys(ds)->ds_next_clones_obj); in get_clones_stat_impl()
1903 VERIFY0(dsl_dataset_hold_obj(ds->ds_dir->dd_pool, in get_clones_stat_impl()
1914 get_clones_stat(dsl_dataset_t *ds, nvlist_t *nv) in get_clones_stat() argument
1930 if (get_clones_stat_impl(ds, val) == 0) { in get_clones_stat()
1945 get_receive_resume_stats_impl(dsl_dataset_t *ds) in get_receive_resume_stats_impl() argument
1947 dsl_pool_t *dp = ds->ds_dir->dd_pool; in get_receive_resume_stats_impl()
1949 if (dsl_dataset_has_resume_receive_state(ds)) { in get_receive_resume_stats_impl()
1957 if (zap_lookup(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_stats_impl()
1961 if (zap_lookup(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_stats_impl()
1965 if (zap_lookup(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_stats_impl()
1969 if (zap_lookup(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_stats_impl()
1973 if (zap_lookup(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_stats_impl()
1978 if (zap_lookup(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_stats_impl()
1982 if (zap_contains(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_stats_impl()
1986 if (zap_contains(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_stats_impl()
1990 if (zap_contains(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_stats_impl()
1994 if (zap_contains(dp->dp_meta_objset, ds->ds_object, in get_receive_resume_stats_impl()
2030 get_child_receive_stats(dsl_dataset_t *ds) in get_child_receive_stats() argument
2034 dsl_dataset_name(ds, recvname); in get_child_receive_stats()
2039 dsl_dataset_hold(ds->ds_dir->dd_pool, recvname, FTAG, in get_child_receive_stats()
2049 get_receive_resume_stats(dsl_dataset_t *ds, nvlist_t *nv) in get_receive_resume_stats() argument
2051 char *propval = get_receive_resume_stats_impl(ds); in get_receive_resume_stats()
2056 char *childval = get_child_receive_stats(ds); in get_receive_resume_stats()
2067 dsl_get_refratio(dsl_dataset_t *ds) in dsl_get_refratio() argument
2069 uint64_t ratio = dsl_dataset_phys(ds)->ds_compressed_bytes == 0 ? 100 : in dsl_get_refratio()
2070 (dsl_dataset_phys(ds)->ds_uncompressed_bytes * 100 / in dsl_get_refratio()
2071 dsl_dataset_phys(ds)->ds_compressed_bytes); in dsl_get_refratio()
2076 dsl_get_logicalreferenced(dsl_dataset_t *ds) in dsl_get_logicalreferenced() argument
2078 return (dsl_dataset_phys(ds)->ds_uncompressed_bytes); in dsl_get_logicalreferenced()
2082 dsl_get_compressratio(dsl_dataset_t *ds) in dsl_get_compressratio() argument
2084 if (ds->ds_is_snapshot) { in dsl_get_compressratio()
2085 return (dsl_get_refratio(ds)); in dsl_get_compressratio()
2087 dsl_dir_t *dd = ds->ds_dir; in dsl_get_compressratio()
2096 dsl_get_used(dsl_dataset_t *ds) in dsl_get_used() argument
2098 if (ds->ds_is_snapshot) { in dsl_get_used()
2099 return (dsl_dataset_phys(ds)->ds_unique_bytes); in dsl_get_used()
2101 dsl_dir_t *dd = ds->ds_dir; in dsl_get_used()
2110 dsl_get_creation(dsl_dataset_t *ds) in dsl_get_creation() argument
2112 return (dsl_dataset_phys(ds)->ds_creation_time); in dsl_get_creation()
2116 dsl_get_creationtxg(dsl_dataset_t *ds) in dsl_get_creationtxg() argument
2118 return (dsl_dataset_phys(ds)->ds_creation_txg); in dsl_get_creationtxg()
2122 dsl_get_refquota(dsl_dataset_t *ds) in dsl_get_refquota() argument
2124 return (ds->ds_quota); in dsl_get_refquota()
2128 dsl_get_refreservation(dsl_dataset_t *ds) in dsl_get_refreservation() argument
2130 return (ds->ds_reserved); in dsl_get_refreservation()
2134 dsl_get_guid(dsl_dataset_t *ds) in dsl_get_guid() argument
2136 return (dsl_dataset_phys(ds)->ds_guid); in dsl_get_guid()
2140 dsl_get_unique(dsl_dataset_t *ds) in dsl_get_unique() argument
2142 return (dsl_dataset_phys(ds)->ds_unique_bytes); in dsl_get_unique()
2146 dsl_get_objsetid(dsl_dataset_t *ds) in dsl_get_objsetid() argument
2148 return (ds->ds_object); in dsl_get_objsetid()
2152 dsl_get_userrefs(dsl_dataset_t *ds) in dsl_get_userrefs() argument
2154 return (ds->ds_userrefs); in dsl_get_userrefs()
2158 dsl_get_defer_destroy(dsl_dataset_t *ds) in dsl_get_defer_destroy() argument
2160 return (DS_IS_DEFER_DESTROY(ds) ? 1 : 0); in dsl_get_defer_destroy()
2164 dsl_get_referenced(dsl_dataset_t *ds) in dsl_get_referenced() argument
2166 return (dsl_dataset_phys(ds)->ds_referenced_bytes); in dsl_get_referenced()
2170 dsl_get_numclones(dsl_dataset_t *ds) in dsl_get_numclones() argument
2172 ASSERT(ds->ds_is_snapshot); in dsl_get_numclones()
2173 return (dsl_dataset_phys(ds)->ds_num_children - 1); in dsl_get_numclones()
2177 dsl_get_inconsistent(dsl_dataset_t *ds) in dsl_get_inconsistent() argument
2179 return ((dsl_dataset_phys(ds)->ds_flags & DS_FLAG_INCONSISTENT) ? in dsl_get_inconsistent()
2184 dsl_get_available(dsl_dataset_t *ds) in dsl_get_available() argument
2186 uint64_t refdbytes = dsl_get_referenced(ds); in dsl_get_available()
2187 uint64_t availbytes = dsl_dir_space_available(ds->ds_dir, in dsl_get_available()
2189 if (ds->ds_reserved > dsl_dataset_phys(ds)->ds_unique_bytes) { in dsl_get_available()
2191 ds->ds_reserved - dsl_dataset_phys(ds)->ds_unique_bytes; in dsl_get_available()
2193 if (ds->ds_quota != 0) { in dsl_get_available()
2197 if (refdbytes < ds->ds_quota) { in dsl_get_available()
2199 ds->ds_quota - refdbytes); in dsl_get_available()
2208 dsl_get_written(dsl_dataset_t *ds, uint64_t *written) in dsl_get_written() argument
2210 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_get_written()
2213 dsl_dataset_phys(ds)->ds_prev_snap_obj, FTAG, &prev); in dsl_get_written()
2216 err = dsl_dataset_space_written(prev, ds, written, in dsl_get_written()
2227 dsl_get_prev_snap(dsl_dataset_t *ds, char *snap) in dsl_get_prev_snap() argument
2229 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_get_prev_snap()
2230 if (ds->ds_prev != NULL && ds->ds_prev != dp->dp_origin_snap) { in dsl_get_prev_snap()
2231 dsl_dataset_name(ds->ds_prev, snap); in dsl_get_prev_snap()
2245 dsl_get_mountpoint(dsl_dataset_t *ds, const char *dsname, char *value, in dsl_get_mountpoint() argument
2249 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_get_mountpoint()
2252 error = dsl_prop_get_ds(ds, zfs_prop_to_name(ZFS_PROP_MOUNTPOINT), 1, in dsl_get_mountpoint()
2318 dsl_dataset_stats(dsl_dataset_t *ds, nvlist_t *nv) in dsl_dataset_stats() argument
2321 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_dataset_stats()
2326 dsl_get_refratio(ds)); in dsl_dataset_stats()
2328 dsl_get_logicalreferenced(ds)); in dsl_dataset_stats()
2330 dsl_get_compressratio(ds)); in dsl_dataset_stats()
2332 dsl_get_used(ds)); in dsl_dataset_stats()
2334 if (ds->ds_is_snapshot) { in dsl_dataset_stats()
2335 get_clones_stat(ds, nv); in dsl_dataset_stats()
2338 if (dsl_get_prev_snap(ds, buf) == 0) in dsl_dataset_stats()
2341 dsl_dir_stats(ds->ds_dir, nv); in dsl_dataset_stats()
2345 dsl_get_available(ds)); in dsl_dataset_stats()
2347 dsl_get_referenced(ds)); in dsl_dataset_stats()
2349 dsl_get_creation(ds)); in dsl_dataset_stats()
2351 dsl_get_creationtxg(ds)); in dsl_dataset_stats()
2353 dsl_get_refquota(ds)); in dsl_dataset_stats()
2355 dsl_get_refreservation(ds)); in dsl_dataset_stats()
2357 dsl_get_guid(ds)); in dsl_dataset_stats()
2359 dsl_get_unique(ds)); in dsl_dataset_stats()
2361 dsl_get_objsetid(ds)); in dsl_dataset_stats()
2363 dsl_get_userrefs(ds)); in dsl_dataset_stats()
2365 DS_IS_DEFER_DESTROY(ds) ? 1 : 0); in dsl_dataset_stats()
2366 dsl_dataset_crypt_stats(ds, nv); in dsl_dataset_stats()
2368 if (dsl_dataset_phys(ds)->ds_prev_snap_obj != 0) { in dsl_dataset_stats()
2370 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_dataset_stats()
2374 dsl_dataset_phys(ds)->ds_prev_snap_obj, FTAG, &prev); in dsl_dataset_stats()
2376 err = dsl_dataset_space_written(prev, ds, &written, in dsl_dataset_stats()
2386 if (!dsl_dataset_is_snapshot(ds)) { in dsl_dataset_stats()
2391 get_receive_resume_stats(ds, nv); in dsl_dataset_stats()
2401 dsl_dataset_name(ds, recvname); in dsl_dataset_stats()
2414 dsl_dataset_fast_stat(dsl_dataset_t *ds, dmu_objset_stats_t *stat) in dsl_dataset_fast_stat() argument
2416 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_dataset_fast_stat()
2419 stat->dds_creation_txg = dsl_get_creationtxg(ds); in dsl_dataset_fast_stat()
2420 stat->dds_inconsistent = dsl_get_inconsistent(ds); in dsl_dataset_fast_stat()
2421 stat->dds_guid = dsl_get_guid(ds); in dsl_dataset_fast_stat()
2423 if (ds->ds_is_snapshot) { in dsl_dataset_fast_stat()
2425 stat->dds_num_clones = dsl_get_numclones(ds); in dsl_dataset_fast_stat()
2430 if (dsl_dir_is_clone(ds->ds_dir)) { in dsl_dataset_fast_stat()
2431 dsl_dir_get_origin(ds->ds_dir, stat->dds_origin); in dsl_dataset_fast_stat()
2437 dsl_dataset_fsid_guid(dsl_dataset_t *ds) in dsl_dataset_fsid_guid() argument
2439 return (ds->ds_fsid_guid); in dsl_dataset_fsid_guid()
2443 dsl_dataset_space(dsl_dataset_t *ds, in dsl_dataset_space() argument
2447 *refdbytesp = dsl_dataset_phys(ds)->ds_referenced_bytes; in dsl_dataset_space()
2448 *availbytesp = dsl_dir_space_available(ds->ds_dir, NULL, 0, TRUE); in dsl_dataset_space()
2449 if (ds->ds_reserved > dsl_dataset_phys(ds)->ds_unique_bytes) in dsl_dataset_space()
2451 ds->ds_reserved - dsl_dataset_phys(ds)->ds_unique_bytes; in dsl_dataset_space()
2452 if (ds->ds_quota != 0) { in dsl_dataset_space()
2456 if (*refdbytesp < ds->ds_quota) in dsl_dataset_space()
2458 ds->ds_quota - *refdbytesp); in dsl_dataset_space()
2462 rrw_enter(&ds->ds_bp_rwlock, RW_READER, FTAG); in dsl_dataset_space()
2463 *usedobjsp = BP_GET_FILL(&dsl_dataset_phys(ds)->ds_bp); in dsl_dataset_space()
2464 rrw_exit(&ds->ds_bp_rwlock, FTAG); in dsl_dataset_space()
2469 dsl_dataset_modified_since_snap(dsl_dataset_t *ds, dsl_dataset_t *snap) in dsl_dataset_modified_since_snap() argument
2471 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_dataset_modified_since_snap()
2477 rrw_enter(&ds->ds_bp_rwlock, RW_READER, FTAG); in dsl_dataset_modified_since_snap()
2478 birth = dsl_dataset_get_blkptr(ds)->blk_birth; in dsl_dataset_modified_since_snap()
2479 rrw_exit(&ds->ds_bp_rwlock, FTAG); in dsl_dataset_modified_since_snap()
2487 if (dmu_objset_from_ds(ds, &os) != 0) in dsl_dataset_modified_since_snap()
2564 dsl_dataset_t *ds; in dsl_dataset_rename_snapshot_sync_impl() local
2576 VERIFY0(dsl_dataset_hold_obj(dp, val, FTAG, &ds)); in dsl_dataset_rename_snapshot_sync_impl()
2579 spa_history_log_internal_ds(ds, "rename", tx, in dsl_dataset_rename_snapshot_sync_impl()
2584 mutex_enter(&ds->ds_lock); in dsl_dataset_rename_snapshot_sync_impl()
2585 (void) strcpy(ds->ds_snapname, ddrsa->ddrsa_newsnapname); in dsl_dataset_rename_snapshot_sync_impl()
2586 mutex_exit(&ds->ds_lock); in dsl_dataset_rename_snapshot_sync_impl()
2589 ds->ds_snapname, 8, 1, &ds->ds_object, tx)); in dsl_dataset_rename_snapshot_sync_impl()
2591 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rename_snapshot_sync_impl()
2638 dsl_dataset_handoff_check(dsl_dataset_t *ds, void *owner, dmu_tx_t *tx) in dsl_dataset_handoff_check() argument
2646 VERIFY3P(ds->ds_owner, ==, owner); in dsl_dataset_handoff_check()
2647 dsl_dataset_long_rele(ds, owner); in dsl_dataset_handoff_check()
2650 held = dsl_dataset_long_held(ds); in dsl_dataset_handoff_check()
2653 dsl_dataset_long_hold(ds, owner); in dsl_dataset_handoff_check()
2666 dsl_dataset_t *ds; in dsl_dataset_rollback_check() local
2670 error = dsl_dataset_hold(dp, ddra->ddra_fsname, FTAG, &ds); in dsl_dataset_rollback_check()
2675 if (ds->ds_is_snapshot) { in dsl_dataset_rollback_check()
2676 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
2681 if (dsl_dataset_phys(ds)->ds_prev_snap_txg < TXG_INITIAL) { in dsl_dataset_rollback_check()
2682 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
2693 dsl_dataset_phys(ds)->ds_prev_snap_txg >= tx->tx_txg) { in dsl_dataset_rollback_check()
2694 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
2718 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
2724 if (snapds != ds->ds_prev) { in dsl_dataset_rollback_check()
2730 if (snapds->ds_dir == ds->ds_dir || in dsl_dataset_rollback_check()
2731 (dsl_dir_is_clone(ds->ds_dir) && in dsl_dataset_rollback_check()
2732 dsl_dir_phys(ds->ds_dir)->dd_origin_obj == in dsl_dataset_rollback_check()
2739 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
2749 error = dsl_get_bookmarks_impl(ds, proprequest, bookmarks); in dsl_dataset_rollback_check()
2752 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
2761 if (createtxg > dsl_dataset_phys(ds)->ds_prev_snap_txg) { in dsl_dataset_rollback_check()
2763 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
2769 error = dsl_dataset_handoff_check(ds, ddra->ddra_owner, tx); in dsl_dataset_rollback_check()
2771 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
2779 if (ds->ds_quota != 0 && in dsl_dataset_rollback_check()
2780 dsl_dataset_phys(ds->ds_prev)->ds_referenced_bytes > ds->ds_quota) { in dsl_dataset_rollback_check()
2781 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
2792 unused_refres_delta = (int64_t)MIN(ds->ds_reserved, in dsl_dataset_rollback_check()
2793 dsl_dataset_phys(ds)->ds_unique_bytes); in dsl_dataset_rollback_check()
2797 dsl_dir_space_available(ds->ds_dir, NULL, 0, TRUE)) { in dsl_dataset_rollback_check()
2798 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
2802 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_check()
2811 dsl_dataset_t *ds, *clone; in dsl_dataset_rollback_sync() local
2815 VERIFY0(dsl_dataset_hold(dp, ddra->ddra_fsname, FTAG, &ds)); in dsl_dataset_rollback_sync()
2817 dsl_dataset_name(ds->ds_prev, namebuf); in dsl_dataset_rollback_sync()
2820 cloneobj = dsl_dataset_create_sync(ds->ds_dir, "%rollback", in dsl_dataset_rollback_sync()
2821 ds->ds_prev, DS_CREATE_FLAG_NODIRTY, kcred, NULL, tx); in dsl_dataset_rollback_sync()
2825 dsl_dataset_clone_swap_sync_impl(clone, ds, tx); in dsl_dataset_rollback_sync()
2826 dsl_dataset_zero_zil(ds, tx); in dsl_dataset_rollback_sync()
2831 dsl_dataset_rele(ds, FTAG); in dsl_dataset_rollback_sync()
2865 dsl_dataset_t *ds; member
2893 origin_ds = snap->ds; in dsl_dataset_promote_check()
2908 origin_ds = snap->ds; in dsl_dataset_promote_check()
2931 ASSERT3U(dsl_dataset_phys(snap->ds)->ds_prev_snap_obj, ==, in dsl_dataset_promote_check()
2933 dsl_deadlist_space_range(&snap->ds->ds_deadlist, in dsl_dataset_promote_check()
2960 dsl_dataset_t *ds = snap->ds; in dsl_dataset_promote_check() local
2968 if (dsl_dataset_long_held(ds)) { in dsl_dataset_promote_check()
2974 VERIFY0(dsl_dataset_get_snapname(ds)); in dsl_dataset_promote_check()
2975 if (strlen(ds->ds_snapname) >= max_snap_len) { in dsl_dataset_promote_check()
2979 err = dsl_dataset_snap_lookup(hds, ds->ds_snapname, &val); in dsl_dataset_promote_check()
2982 snap->ds->ds_snapname); in dsl_dataset_promote_check()
2989 if (dsl_dataset_phys(ds)->ds_prev_snap_obj == 0) in dsl_dataset_promote_check()
2992 dsl_deadlist_space(&ds->ds_deadlist, in dsl_dataset_promote_check()
3046 snap->ds->ds_dir->dd_origin_txg, &ddpa->cloneusedsnap); in dsl_dataset_promote_check()
3051 snap->ds->ds_dir->dd_origin_txg, &space); in dsl_dataset_promote_check()
3090 origin_ds = snap->ds; in dsl_dataset_promote_sync()
3094 origin_head = snap->ds; in dsl_dataset_promote_sync()
3109 ASSERT3U(dsl_dataset_phys(snap->ds)->ds_prev_snap_obj, ==, in dsl_dataset_promote_sync()
3111 dsl_dataset_phys(origin_ds)->ds_next_snap_obj = snap->ds->ds_object; in dsl_dataset_promote_sync()
3116 snap->ds->ds_object, tx); in dsl_dataset_promote_sync()
3155 dsl_dataset_t *ds = snap->ds; in dsl_dataset_promote_sync() local
3162 if (ds->ds_objset) { in dsl_dataset_promote_sync()
3163 dmu_objset_evict(ds->ds_objset); in dsl_dataset_promote_sync()
3164 ds->ds_objset = NULL; in dsl_dataset_promote_sync()
3168 VERIFY0(dsl_dataset_get_snapname(ds)); in dsl_dataset_promote_sync()
3170 ds->ds_snapname, tx, B_TRUE)); in dsl_dataset_promote_sync()
3172 dsl_dataset_phys(hds)->ds_snapnames_zapobj, ds->ds_snapname, in dsl_dataset_promote_sync()
3173 8, 1, &ds->ds_object, tx)); in dsl_dataset_promote_sync()
3178 dmu_buf_will_dirty(ds->ds_dbuf, tx); in dsl_dataset_promote_sync()
3179 ASSERT3U(dsl_dataset_phys(ds)->ds_dir_obj, ==, odd->dd_object); in dsl_dataset_promote_sync()
3180 dsl_dataset_phys(ds)->ds_dir_obj = dd->dd_object; in dsl_dataset_promote_sync()
3181 ASSERT3P(ds->ds_dir, ==, odd); in dsl_dataset_promote_sync()
3182 dsl_dir_rele(ds->ds_dir, ds); in dsl_dataset_promote_sync()
3184 NULL, ds, &ds->ds_dir)); in dsl_dataset_promote_sync()
3187 if (dsl_dataset_phys(ds)->ds_next_clones_obj && in dsl_dataset_promote_sync()
3193 dsl_dataset_phys(ds)->ds_next_clones_obj); in dsl_dataset_promote_sync()
3221 ASSERT(!dsl_prop_hascb(ds)); in dsl_dataset_promote_sync()
3272 dsl_dataset_t *ds; in snaplist_make() local
3276 err = dsl_dataset_hold_obj(dp, obj, tag, &ds); in snaplist_make()
3282 first_obj = dsl_dir_phys(ds->ds_dir)->dd_origin_obj; in snaplist_make()
3285 snap->ds = ds; in snaplist_make()
3287 obj = dsl_dataset_phys(ds)->ds_prev_snap_obj; in snaplist_make()
3301 dsl_deadlist_space_range(&snap->ds->ds_deadlist, in snaplist_space()
3318 dsl_dataset_rele(snap->ds, tag); in snaplist_destroy()
3354 ASSERT3U(snap->ds->ds_object, ==, dsl_dir_phys(dd)->dd_origin_obj); in promote_hold()
3356 dsl_dir_phys(snap->ds->ds_dir)->dd_head_dataset_obj, in promote_hold()
3361 if (dsl_dir_phys(snap->ds->ds_dir)->dd_origin_obj != 0) { in promote_hold()
3363 dsl_dir_phys(snap->ds->ds_dir)->dd_origin_obj, in promote_hold()
3725 dsl_dataset_t *ds; in dsl_dsobj_to_dsname() local
3732 error = dsl_dataset_hold_obj(dp, obj, FTAG, &ds); in dsl_dsobj_to_dsname()
3734 dsl_dataset_name(ds, buf); in dsl_dsobj_to_dsname()
3735 dsl_dataset_rele(ds, FTAG); in dsl_dsobj_to_dsname()
3743 dsl_dataset_check_quota(dsl_dataset_t *ds, boolean_t check_quota, in dsl_dataset_check_quota() argument
3756 mutex_enter(&ds->ds_lock); in dsl_dataset_check_quota()
3760 if (ds->ds_reserved > dsl_dataset_phys(ds)->ds_unique_bytes) { in dsl_dataset_check_quota()
3762 ds->ds_reserved - dsl_dataset_phys(ds)->ds_unique_bytes); in dsl_dataset_check_quota()
3764 (ds->ds_reserved - dsl_dataset_phys(ds)->ds_unique_bytes); in dsl_dataset_check_quota()
3766 asize - MIN(asize, parent_delta(ds, asize + inflight)); in dsl_dataset_check_quota()
3769 if (!check_quota || ds->ds_quota == 0) { in dsl_dataset_check_quota()
3770 mutex_exit(&ds->ds_lock); in dsl_dataset_check_quota()
3779 if (dsl_dataset_phys(ds)->ds_referenced_bytes + inflight >= in dsl_dataset_check_quota()
3780 ds->ds_quota) { in dsl_dataset_check_quota()
3782 dsl_dataset_phys(ds)->ds_referenced_bytes < ds->ds_quota) in dsl_dataset_check_quota()
3787 mutex_exit(&ds->ds_lock); in dsl_dataset_check_quota()
3805 dsl_dataset_t *ds; in dsl_dataset_set_refquota_check() local
3812 error = dsl_dataset_hold(dp, ddsqra->ddsqra_name, FTAG, &ds); in dsl_dataset_set_refquota_check()
3816 if (ds->ds_is_snapshot) { in dsl_dataset_set_refquota_check()
3817 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refquota_check()
3821 error = dsl_prop_predict(ds->ds_dir, in dsl_dataset_set_refquota_check()
3825 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refquota_check()
3830 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refquota_check()
3834 if (newval < dsl_dataset_phys(ds)->ds_referenced_bytes || in dsl_dataset_set_refquota_check()
3835 newval < ds->ds_reserved) { in dsl_dataset_set_refquota_check()
3836 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refquota_check()
3840 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refquota_check()
3849 dsl_dataset_t *ds; in dsl_dataset_set_refquota_sync() local
3852 VERIFY0(dsl_dataset_hold(dp, ddsqra->ddsqra_name, FTAG, &ds)); in dsl_dataset_set_refquota_sync()
3854 dsl_prop_set_sync_impl(ds, in dsl_dataset_set_refquota_sync()
3859 VERIFY0(dsl_prop_get_int_ds(ds, in dsl_dataset_set_refquota_sync()
3862 if (ds->ds_quota != newval) { in dsl_dataset_set_refquota_sync()
3863 dmu_buf_will_dirty(ds->ds_dbuf, tx); in dsl_dataset_set_refquota_sync()
3864 ds->ds_quota = newval; in dsl_dataset_set_refquota_sync()
3866 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refquota_sync()
3889 dsl_dataset_t *ds; in dsl_dataset_set_refreservation_check() local
3896 error = dsl_dataset_hold(dp, ddsqra->ddsqra_name, FTAG, &ds); in dsl_dataset_set_refreservation_check()
3900 if (ds->ds_is_snapshot) { in dsl_dataset_set_refreservation_check()
3901 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refreservation_check()
3905 error = dsl_prop_predict(ds->ds_dir, in dsl_dataset_set_refreservation_check()
3909 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refreservation_check()
3918 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refreservation_check()
3922 mutex_enter(&ds->ds_lock); in dsl_dataset_set_refreservation_check()
3923 if (!DS_UNIQUE_IS_ACCURATE(ds)) in dsl_dataset_set_refreservation_check()
3924 dsl_dataset_recalc_head_uniq(ds); in dsl_dataset_set_refreservation_check()
3925 unique = dsl_dataset_phys(ds)->ds_unique_bytes; in dsl_dataset_set_refreservation_check()
3926 mutex_exit(&ds->ds_lock); in dsl_dataset_set_refreservation_check()
3928 if (MAX(unique, newval) > MAX(unique, ds->ds_reserved)) { in dsl_dataset_set_refreservation_check()
3930 MAX(unique, ds->ds_reserved); in dsl_dataset_set_refreservation_check()
3933 dsl_dir_space_available(ds->ds_dir, NULL, 0, B_TRUE) || in dsl_dataset_set_refreservation_check()
3934 (ds->ds_quota > 0 && newval > ds->ds_quota)) { in dsl_dataset_set_refreservation_check()
3935 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refreservation_check()
3940 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refreservation_check()
3945 dsl_dataset_set_refreservation_sync_impl(dsl_dataset_t *ds, in dsl_dataset_set_refreservation_sync_impl() argument
3952 dsl_prop_set_sync_impl(ds, zfs_prop_to_name(ZFS_PROP_REFRESERVATION), in dsl_dataset_set_refreservation_sync_impl()
3955 VERIFY0(dsl_prop_get_int_ds(ds, in dsl_dataset_set_refreservation_sync_impl()
3958 dmu_buf_will_dirty(ds->ds_dbuf, tx); in dsl_dataset_set_refreservation_sync_impl()
3959 mutex_enter(&ds->ds_dir->dd_lock); in dsl_dataset_set_refreservation_sync_impl()
3960 mutex_enter(&ds->ds_lock); in dsl_dataset_set_refreservation_sync_impl()
3961 ASSERT(DS_UNIQUE_IS_ACCURATE(ds)); in dsl_dataset_set_refreservation_sync_impl()
3962 unique = dsl_dataset_phys(ds)->ds_unique_bytes; in dsl_dataset_set_refreservation_sync_impl()
3964 MAX(0, (int64_t)(ds->ds_reserved - unique)); in dsl_dataset_set_refreservation_sync_impl()
3965 ds->ds_reserved = newval; in dsl_dataset_set_refreservation_sync_impl()
3966 mutex_exit(&ds->ds_lock); in dsl_dataset_set_refreservation_sync_impl()
3968 dsl_dir_diduse_space(ds->ds_dir, DD_USED_REFRSRV, delta, 0, 0, tx); in dsl_dataset_set_refreservation_sync_impl()
3969 mutex_exit(&ds->ds_dir->dd_lock); in dsl_dataset_set_refreservation_sync_impl()
3977 dsl_dataset_t *ds; in dsl_dataset_set_refreservation_sync() local
3979 VERIFY0(dsl_dataset_hold(dp, ddsqra->ddsqra_name, FTAG, &ds)); in dsl_dataset_set_refreservation_sync()
3980 dsl_dataset_set_refreservation_sync_impl(ds, in dsl_dataset_set_refreservation_sync()
3982 dsl_dataset_rele(ds, FTAG); in dsl_dataset_set_refreservation_sync()
4130 dsl_dataset_t *ds; in dsl_dataset_space_wouldfree() local
4133 err = dsl_dataset_hold_obj(dp, snapobj, FTAG, &ds); in dsl_dataset_space_wouldfree()
4137 dsl_deadlist_space_range(&ds->ds_deadlist, in dsl_dataset_space_wouldfree()
4144 snapobj = dsl_dataset_phys(ds)->ds_prev_snap_obj; in dsl_dataset_space_wouldfree()
4146 dsl_dataset_rele(ds, FTAG); in dsl_dataset_space_wouldfree()
4196 dsl_dataset_zapify(dsl_dataset_t *ds, dmu_tx_t *tx) in dsl_dataset_zapify() argument
4198 objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset; in dsl_dataset_zapify()
4199 dmu_object_zapify(mos, ds->ds_object, DMU_OT_DSL_DATASET, tx); in dsl_dataset_zapify()
4203 dsl_dataset_is_zapified(dsl_dataset_t *ds) in dsl_dataset_is_zapified() argument
4207 dmu_object_info_from_db(ds->ds_dbuf, &doi); in dsl_dataset_is_zapified()
4212 dsl_dataset_has_resume_receive_state(dsl_dataset_t *ds) in dsl_dataset_has_resume_receive_state() argument
4214 return (dsl_dataset_is_zapified(ds) && in dsl_dataset_has_resume_receive_state()
4215 zap_contains(ds->ds_dir->dd_pool->dp_meta_objset, in dsl_dataset_has_resume_receive_state()
4216 ds->ds_object, DS_FIELD_RESUME_TOGUID) == 0); in dsl_dataset_has_resume_receive_state()
4220 dsl_dataset_get_remap_deadlist_object(dsl_dataset_t *ds) in dsl_dataset_get_remap_deadlist_object() argument
4225 if (!dsl_dataset_is_zapified(ds)) in dsl_dataset_get_remap_deadlist_object()
4228 err = zap_lookup(ds->ds_dir->dd_pool->dp_meta_objset, ds->ds_object, in dsl_dataset_get_remap_deadlist_object()
4242 dsl_dataset_remap_deadlist_exists(dsl_dataset_t *ds) in dsl_dataset_remap_deadlist_exists() argument
4244 EQUIV(dsl_deadlist_is_open(&ds->ds_remap_deadlist), in dsl_dataset_remap_deadlist_exists()
4245 dsl_dataset_get_remap_deadlist_object(ds) != 0); in dsl_dataset_remap_deadlist_exists()
4246 return (dsl_deadlist_is_open(&ds->ds_remap_deadlist)); in dsl_dataset_remap_deadlist_exists()
4250 dsl_dataset_set_remap_deadlist_object(dsl_dataset_t *ds, uint64_t obj, in dsl_dataset_set_remap_deadlist_object() argument
4254 dsl_dataset_zapify(ds, tx); in dsl_dataset_set_remap_deadlist_object()
4255 VERIFY0(zap_add(ds->ds_dir->dd_pool->dp_meta_objset, ds->ds_object, in dsl_dataset_set_remap_deadlist_object()
4260 dsl_dataset_unset_remap_deadlist_object(dsl_dataset_t *ds, dmu_tx_t *tx) in dsl_dataset_unset_remap_deadlist_object() argument
4262 VERIFY0(zap_remove(ds->ds_dir->dd_pool->dp_meta_objset, in dsl_dataset_unset_remap_deadlist_object()
4263 ds->ds_object, DS_FIELD_REMAP_DEADLIST, tx)); in dsl_dataset_unset_remap_deadlist_object()
4267 dsl_dataset_destroy_remap_deadlist(dsl_dataset_t *ds, dmu_tx_t *tx) in dsl_dataset_destroy_remap_deadlist() argument
4270 spa_t *spa = ds->ds_dir->dd_pool->dp_spa; in dsl_dataset_destroy_remap_deadlist()
4273 ASSERT(dsl_dataset_remap_deadlist_exists(ds)); in dsl_dataset_destroy_remap_deadlist()
4275 remap_deadlist_object = ds->ds_remap_deadlist.dl_object; in dsl_dataset_destroy_remap_deadlist()
4276 dsl_deadlist_close(&ds->ds_remap_deadlist); in dsl_dataset_destroy_remap_deadlist()
4278 dsl_dataset_unset_remap_deadlist_object(ds, tx); in dsl_dataset_destroy_remap_deadlist()
4283 dsl_dataset_create_remap_deadlist(dsl_dataset_t *ds, dmu_tx_t *tx) in dsl_dataset_create_remap_deadlist() argument
4286 spa_t *spa = ds->ds_dir->dd_pool->dp_spa; in dsl_dataset_create_remap_deadlist()
4289 ASSERT(MUTEX_HELD(&ds->ds_remap_deadlist_lock)); in dsl_dataset_create_remap_deadlist()
4297 &ds->ds_deadlist, UINT64_MAX, in dsl_dataset_create_remap_deadlist()
4298 dsl_dataset_phys(ds)->ds_prev_snap_obj, tx); in dsl_dataset_create_remap_deadlist()
4299 dsl_dataset_set_remap_deadlist_object(ds, in dsl_dataset_create_remap_deadlist()
4301 dsl_deadlist_open(&ds->ds_remap_deadlist, spa_meta_objset(spa), in dsl_dataset_create_remap_deadlist()