Lines Matching +full:n +full:- +full:mos
1 // SPDX-License-Identifier: CDDL-1.0
10 * or https://opensource.org/licenses/CDDL-1.0.
58 if (!ds->ds_is_snapshot) in dsl_destroy_snapshot_check_impl()
69 if (spa_version(ds->ds_dir->dd_pool->dp_spa) < in dsl_destroy_snapshot_check_impl()
79 if (ds->ds_userrefs > 0) in dsl_destroy_snapshot_check_impl()
85 if (dsl_dataset_phys(ds)->ds_num_children > 1) in dsl_destroy_snapshot_check_impl()
95 const char *dsname = ddsa->ddsa_name; in dsl_destroy_snapshot_check()
96 boolean_t defer = ddsa->ddsa_defer; in dsl_destroy_snapshot_check()
106 * dsl_destroy_snapshot_sync() will be a no-op in dsl_destroy_snapshot_check()
132 dsl_pool_t *dp = poa->ds->ds_dir->dd_pool; in process_old_cb()
137 dsl_dataset_phys(poa->ds)->ds_prev_snap_txg) { in process_old_cb()
138 dsl_deadlist_insert(&poa->ds->ds_deadlist, bp, bp_freed, tx); in process_old_cb()
139 if (poa->ds_prev && !poa->after_branch_point && in process_old_cb()
141 dsl_dataset_phys(poa->ds_prev)->ds_prev_snap_txg) { in process_old_cb()
142 dsl_dataset_phys(poa->ds_prev)->ds_unique_bytes += in process_old_cb()
143 bp_get_dsize_sync(dp->dp_spa, bp); in process_old_cb()
146 poa->used += bp_get_dsize_sync(dp->dp_spa, bp); in process_old_cb()
147 poa->comp += BP_GET_PSIZE(bp); in process_old_cb()
148 poa->uncomp += BP_GET_UCSIZE(bp); in process_old_cb()
149 dsl_free_sync(poa->pio, dp, tx->tx_txg, bp); in process_old_cb()
159 dsl_pool_t *dp = ds->ds_dir->dd_pool; in process_old_deadlist()
160 objset_t *mos = dp->dp_meta_objset; in process_old_deadlist() local
163 ASSERT(ds->ds_deadlist.dl_oldfmt); in process_old_deadlist()
164 ASSERT(ds_next->ds_deadlist.dl_oldfmt); in process_old_deadlist()
169 poa.pio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED); in process_old_deadlist()
170 VERIFY0(bpobj_iterate(&ds_next->ds_deadlist.dl_bpobj, in process_old_deadlist()
173 ASSERT3U(poa.used, ==, dsl_dataset_phys(ds)->ds_unique_bytes); in process_old_deadlist()
176 dsl_dir_diduse_space(ds->ds_dir, DD_USED_SNAP, in process_old_deadlist()
177 -poa.used, -poa.comp, -poa.uncomp, tx); in process_old_deadlist()
180 dsl_deadlist_close(&ds->ds_deadlist); in process_old_deadlist()
181 dsl_deadlist_close(&ds_next->ds_deadlist); in process_old_deadlist()
182 deadlist_obj = dsl_dataset_phys(ds)->ds_deadlist_obj; in process_old_deadlist()
183 dsl_dataset_phys(ds)->ds_deadlist_obj = in process_old_deadlist()
184 dsl_dataset_phys(ds_next)->ds_deadlist_obj; in process_old_deadlist()
185 dsl_dataset_phys(ds_next)->ds_deadlist_obj = deadlist_obj; in process_old_deadlist()
186 VERIFY0(dsl_deadlist_open(&ds->ds_deadlist, mos, in process_old_deadlist()
187 dsl_dataset_phys(ds)->ds_deadlist_obj)); in process_old_deadlist()
188 VERIFY0(dsl_deadlist_open(&ds_next->ds_deadlist, mos, in process_old_deadlist()
189 dsl_dataset_phys(ds_next)->ds_deadlist_obj)); in process_old_deadlist()
201 rck->rck_clone = clone; in rck_alloc()
209 objset_t *mos = dd->dd_pool->dp_meta_objset; in dsl_dir_remove_clones_key_impl() local
213 * find the clones, but dsl_deadlist_remove_key() is a no-op so it in dsl_dir_remove_clones_key_impl()
216 if (dsl_dir_phys(dd)->dd_clones == 0) in dsl_dir_remove_clones_key_impl()
222 for (zap_cursor_init(zc, mos, dsl_dir_phys(dd)->dd_clones); in dsl_dir_remove_clones_key_impl()
227 VERIFY0(dsl_dataset_hold_obj(dd->dd_pool, in dsl_dir_remove_clones_key_impl()
228 za->za_first_integer, tag, &clone)); in dsl_dir_remove_clones_key_impl()
230 if (clone->ds_dir->dd_origin_txg > mintxg) { in dsl_dir_remove_clones_key_impl()
231 dsl_deadlist_remove_key(&clone->ds_deadlist, in dsl_dir_remove_clones_key_impl()
236 &clone->ds_remap_deadlist, mintxg, tx); in dsl_dir_remove_clones_key_impl()
261 dsl_dataset_t *clone = rck->rck_clone; in dsl_dir_remove_clones_key()
262 dsl_dir_t *clone_dir = clone->ds_dir; in dsl_dir_remove_clones_key()
278 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_destroy_snapshot_handle_remaps()
282 if (!bpobj_is_open(&dp->dp_obsolete_bpobj)) in dsl_destroy_snapshot_handle_remaps()
285 dsl_deadlist_move_bpobj(&ds_next->ds_remap_deadlist, in dsl_destroy_snapshot_handle_remaps()
286 &dp->dp_obsolete_bpobj, in dsl_destroy_snapshot_handle_remaps()
287 dsl_dataset_phys(ds)->ds_prev_snap_txg, tx); in dsl_destroy_snapshot_handle_remaps()
296 mutex_enter(&ds_next->ds_remap_deadlist_lock); in dsl_destroy_snapshot_handle_remaps()
299 mutex_exit(&ds_next->ds_remap_deadlist_lock); in dsl_destroy_snapshot_handle_remaps()
301 dsl_deadlist_merge(&ds_next->ds_remap_deadlist, in dsl_destroy_snapshot_handle_remaps()
311 dsl_pool_t *dp = ds->ds_dir->dd_pool; in dsl_destroy_snapshot_sync_impl()
312 objset_t *mos = dp->dp_meta_objset; in dsl_destroy_snapshot_sync_impl() local
316 ASSERT(RRW_WRITE_HELD(&dp->dp_config_rwlock)); in dsl_destroy_snapshot_sync_impl()
317 rrw_enter(&ds->ds_bp_rwlock, RW_READER, FTAG); in dsl_destroy_snapshot_sync_impl()
318 ASSERT3U(BP_GET_LOGICAL_BIRTH(&dsl_dataset_phys(ds)->ds_bp), <=, in dsl_destroy_snapshot_sync_impl()
319 tx->tx_txg); in dsl_destroy_snapshot_sync_impl()
320 rrw_exit(&ds->ds_bp_rwlock, FTAG); in dsl_destroy_snapshot_sync_impl()
321 ASSERT(zfs_refcount_is_zero(&ds->ds_longholds)); in dsl_destroy_snapshot_sync_impl()
324 (ds->ds_userrefs > 0 || in dsl_destroy_snapshot_sync_impl()
325 dsl_dataset_phys(ds)->ds_num_children > 1)) { in dsl_destroy_snapshot_sync_impl()
326 ASSERT(spa_version(dp->dp_spa) >= SPA_VERSION_USERREFS); in dsl_destroy_snapshot_sync_impl()
327 dmu_buf_will_dirty(ds->ds_dbuf, tx); in dsl_destroy_snapshot_sync_impl()
328 dsl_dataset_phys(ds)->ds_flags |= DS_FLAG_DEFER_DESTROY; in dsl_destroy_snapshot_sync_impl()
336 ASSERT3U(dsl_dataset_phys(ds)->ds_num_children, <=, 1); in dsl_destroy_snapshot_sync_impl()
345 obj = ds->ds_object; in dsl_destroy_snapshot_sync_impl()
353 if (dsl_dataset_phys(ds)->ds_prev_snap_obj != 0) { in dsl_destroy_snapshot_sync_impl()
354 ASSERT3P(ds->ds_prev, ==, NULL); in dsl_destroy_snapshot_sync_impl()
356 dsl_dataset_phys(ds)->ds_prev_snap_obj, FTAG, &ds_prev)); in dsl_destroy_snapshot_sync_impl()
358 (dsl_dataset_phys(ds_prev)->ds_next_snap_obj != obj); in dsl_destroy_snapshot_sync_impl()
360 dmu_buf_will_dirty(ds_prev->ds_dbuf, tx); in dsl_destroy_snapshot_sync_impl()
362 dsl_dataset_phys(ds_prev)->ds_next_clones_obj != 0) { in dsl_destroy_snapshot_sync_impl()
364 if (dsl_dataset_phys(ds)->ds_next_snap_obj != 0) { in dsl_destroy_snapshot_sync_impl()
365 VERIFY0(zap_add_int(mos, in dsl_destroy_snapshot_sync_impl()
366 dsl_dataset_phys(ds_prev)-> in dsl_destroy_snapshot_sync_impl()
368 dsl_dataset_phys(ds)->ds_next_snap_obj, in dsl_destroy_snapshot_sync_impl()
373 dsl_dataset_phys(ds_prev)->ds_next_snap_obj = in dsl_destroy_snapshot_sync_impl()
374 dsl_dataset_phys(ds)->ds_next_snap_obj; in dsl_destroy_snapshot_sync_impl()
383 dsl_dataset_phys(ds)->ds_next_snap_obj, FTAG, &ds_next)); in dsl_destroy_snapshot_sync_impl()
384 ASSERT3U(dsl_dataset_phys(ds_next)->ds_prev_snap_obj, ==, obj); in dsl_destroy_snapshot_sync_impl()
386 old_unique = dsl_dataset_phys(ds_next)->ds_unique_bytes; in dsl_destroy_snapshot_sync_impl()
388 dmu_buf_will_dirty(ds_next->ds_dbuf, tx); in dsl_destroy_snapshot_sync_impl()
389 dsl_dataset_phys(ds_next)->ds_prev_snap_obj = in dsl_destroy_snapshot_sync_impl()
390 dsl_dataset_phys(ds)->ds_prev_snap_obj; in dsl_destroy_snapshot_sync_impl()
391 dsl_dataset_phys(ds_next)->ds_prev_snap_txg = in dsl_destroy_snapshot_sync_impl()
392 dsl_dataset_phys(ds)->ds_prev_snap_txg; in dsl_destroy_snapshot_sync_impl()
393 ASSERT3U(dsl_dataset_phys(ds)->ds_prev_snap_txg, ==, in dsl_destroy_snapshot_sync_impl()
394 ds_prev ? dsl_dataset_phys(ds_prev)->ds_creation_txg : 0); in dsl_destroy_snapshot_sync_impl()
396 if (ds_next->ds_deadlist.dl_oldfmt) { in dsl_destroy_snapshot_sync_impl()
402 dsl_deadlist_space_range(&ds_next->ds_deadlist, in dsl_destroy_snapshot_sync_impl()
403 dsl_dataset_phys(ds_prev)->ds_prev_snap_txg, in dsl_destroy_snapshot_sync_impl()
404 dsl_dataset_phys(ds)->ds_prev_snap_txg, in dsl_destroy_snapshot_sync_impl()
406 dsl_dataset_phys(ds_prev)->ds_unique_bytes += used; in dsl_destroy_snapshot_sync_impl()
410 dsl_deadlist_space_range(&ds_next->ds_deadlist, in dsl_destroy_snapshot_sync_impl()
411 dsl_dataset_phys(ds)->ds_prev_snap_txg, UINT64_MAX, in dsl_destroy_snapshot_sync_impl()
413 dsl_dir_diduse_space(ds->ds_dir, DD_USED_SNAP, in dsl_destroy_snapshot_sync_impl()
414 -used, -comp, -uncomp, tx); in dsl_destroy_snapshot_sync_impl()
417 dsl_deadlist_move_bpobj(&ds_next->ds_deadlist, in dsl_destroy_snapshot_sync_impl()
418 &dp->dp_free_bpobj, dsl_dataset_phys(ds)->ds_prev_snap_txg, in dsl_destroy_snapshot_sync_impl()
420 dsl_dir_diduse_space(tx->tx_pool->dp_free_dir, in dsl_destroy_snapshot_sync_impl()
424 dsl_deadlist_merge(&ds_next->ds_deadlist, in dsl_destroy_snapshot_sync_impl()
425 dsl_dataset_phys(ds)->ds_deadlist_obj, tx); in dsl_destroy_snapshot_sync_impl()
432 dsl_deadlist_discard_tree(&ds_next->ds_deadlist); in dsl_destroy_snapshot_sync_impl()
435 dsl_deadlist_close(&ds->ds_deadlist); in dsl_destroy_snapshot_sync_impl()
436 dsl_deadlist_free(mos, dsl_dataset_phys(ds)->ds_deadlist_obj, tx); in dsl_destroy_snapshot_sync_impl()
437 dmu_buf_will_dirty(ds->ds_dbuf, tx); in dsl_destroy_snapshot_sync_impl()
438 dsl_dataset_phys(ds)->ds_deadlist_obj = 0; in dsl_destroy_snapshot_sync_impl()
444 dsl_dir_remove_clones_key(ds->ds_dir, in dsl_destroy_snapshot_sync_impl()
445 dsl_dataset_phys(ds)->ds_creation_txg, tx); in dsl_destroy_snapshot_sync_impl()
448 if (ds_next->ds_is_snapshot) { in dsl_destroy_snapshot_sync_impl()
461 dsl_dataset_phys(ds_next)->ds_next_snap_obj, in dsl_destroy_snapshot_sync_impl()
463 dsl_deadlist_space_range(&ds_nextnext->ds_deadlist, in dsl_destroy_snapshot_sync_impl()
464 dsl_dataset_phys(ds)->ds_prev_snap_txg, in dsl_destroy_snapshot_sync_impl()
465 dsl_dataset_phys(ds)->ds_creation_txg, in dsl_destroy_snapshot_sync_impl()
467 dsl_dataset_phys(ds_next)->ds_unique_bytes += used; in dsl_destroy_snapshot_sync_impl()
469 ASSERT3P(ds_next->ds_prev, ==, NULL); in dsl_destroy_snapshot_sync_impl()
474 dsl_dir_phys(ds->ds_dir)->dd_head_dataset_obj, in dsl_destroy_snapshot_sync_impl()
478 dsl_deadlist_remove_key(&hds->ds_deadlist, in dsl_destroy_snapshot_sync_impl()
479 dsl_dataset_phys(ds)->ds_creation_txg, tx); in dsl_destroy_snapshot_sync_impl()
482 dsl_deadlist_remove_key(&hds->ds_remap_deadlist, in dsl_destroy_snapshot_sync_impl()
483 dsl_dataset_phys(ds)->ds_creation_txg, tx); in dsl_destroy_snapshot_sync_impl()
488 ASSERT3P(ds_next->ds_prev, ==, ds); in dsl_destroy_snapshot_sync_impl()
489 dsl_dataset_rele(ds_next->ds_prev, ds_next); in dsl_destroy_snapshot_sync_impl()
490 ds_next->ds_prev = NULL; in dsl_destroy_snapshot_sync_impl()
493 dsl_dataset_phys(ds)->ds_prev_snap_obj, in dsl_destroy_snapshot_sync_impl()
494 ds_next, &ds_next->ds_prev)); in dsl_destroy_snapshot_sync_impl()
504 if (old_unique < ds_next->ds_reserved) { in dsl_destroy_snapshot_sync_impl()
507 dsl_dataset_phys(ds_next)->ds_unique_bytes; in dsl_destroy_snapshot_sync_impl()
510 mrsdelta = MIN(new_unique - old_unique, in dsl_destroy_snapshot_sync_impl()
511 ds_next->ds_reserved - old_unique); in dsl_destroy_snapshot_sync_impl()
512 dsl_dir_diduse_space(ds->ds_dir, in dsl_destroy_snapshot_sync_impl()
513 DD_USED_REFRSRV, -mrsdelta, 0, 0, tx); in dsl_destroy_snapshot_sync_impl()
520 * re-open the objset. in dsl_destroy_snapshot_sync_impl()
522 if (ds->ds_objset) { in dsl_destroy_snapshot_sync_impl()
523 dmu_objset_evict(ds->ds_objset); in dsl_destroy_snapshot_sync_impl()
524 ds->ds_objset = NULL; in dsl_destroy_snapshot_sync_impl()
529 ASSERT(dsl_dataset_phys(ds)->ds_snapnames_zapobj == 0); in dsl_destroy_snapshot_sync_impl()
531 dsl_dir_phys(ds->ds_dir)->dd_head_dataset_obj, FTAG, &ds_head)); in dsl_destroy_snapshot_sync_impl()
539 ds->ds_snapname, &val); in dsl_destroy_snapshot_sync_impl()
544 VERIFY0(dsl_dataset_snap_remove(ds_head, ds->ds_snapname, tx, B_TRUE)); in dsl_destroy_snapshot_sync_impl()
550 spa_prop_clear_bootfs(dp->dp_spa, ds->ds_object, tx); in dsl_destroy_snapshot_sync_impl()
552 if (dsl_dataset_phys(ds)->ds_next_clones_obj != 0) { in dsl_destroy_snapshot_sync_impl()
554 ASSERT0(zap_count(mos, in dsl_destroy_snapshot_sync_impl()
555 dsl_dataset_phys(ds)->ds_next_clones_obj, &count) && in dsl_destroy_snapshot_sync_impl()
557 VERIFY0(dmu_object_free(mos, in dsl_destroy_snapshot_sync_impl()
558 dsl_dataset_phys(ds)->ds_next_clones_obj, tx)); in dsl_destroy_snapshot_sync_impl()
560 if (dsl_dataset_phys(ds)->ds_props_obj != 0) in dsl_destroy_snapshot_sync_impl()
561 VERIFY0(zap_destroy(mos, dsl_dataset_phys(ds)->ds_props_obj, in dsl_destroy_snapshot_sync_impl()
563 if (dsl_dataset_phys(ds)->ds_userrefs_obj != 0) in dsl_destroy_snapshot_sync_impl()
564 VERIFY0(zap_destroy(mos, dsl_dataset_phys(ds)->ds_userrefs_obj, in dsl_destroy_snapshot_sync_impl()
566 dsl_dir_rele(ds->ds_dir, ds); in dsl_destroy_snapshot_sync_impl()
567 ds->ds_dir = NULL; in dsl_destroy_snapshot_sync_impl()
568 dmu_object_free_zapified(mos, obj, tx); in dsl_destroy_snapshot_sync_impl()
575 const char *dsname = ddsa->ddsa_name; in dsl_destroy_snapshot_sync()
576 boolean_t defer = ddsa->ddsa_defer; in dsl_destroy_snapshot_sync()
586 zvol_remove_minors(dp->dp_spa, dsname, B_TRUE); in dsl_destroy_snapshot_sync()
632 "arg = ...\n" in dsl_destroy_snapshots_nvl()
633 "snaps = arg['snaps']\n" in dsl_destroy_snapshots_nvl()
634 "defer = arg['defer']\n" in dsl_destroy_snapshots_nvl()
635 "errors = { }\n" in dsl_destroy_snapshots_nvl()
636 "has_errors = false\n" in dsl_destroy_snapshots_nvl()
637 "for snap, v in pairs(snaps) do\n" in dsl_destroy_snapshots_nvl()
638 " errno = zfs.check.destroy{snap, defer=defer}\n" in dsl_destroy_snapshots_nvl()
639 " zfs.debug('snap: ' .. snap .. ' errno: ' .. errno)\n" in dsl_destroy_snapshots_nvl()
640 " if errno == ENOENT then\n" in dsl_destroy_snapshots_nvl()
641 " snaps[snap] = nil\n" in dsl_destroy_snapshots_nvl()
642 " elseif errno ~= 0 then\n" in dsl_destroy_snapshots_nvl()
643 " errors[snap] = errno\n" in dsl_destroy_snapshots_nvl()
644 " has_errors = true\n" in dsl_destroy_snapshots_nvl()
645 " end\n" in dsl_destroy_snapshots_nvl()
646 "end\n" in dsl_destroy_snapshots_nvl()
647 "if has_errors then\n" in dsl_destroy_snapshots_nvl()
648 " return errors\n" in dsl_destroy_snapshots_nvl()
649 "end\n" in dsl_destroy_snapshots_nvl()
650 "for snap, v in pairs(snaps) do\n" in dsl_destroy_snapshots_nvl()
651 " errno = zfs.sync.destroy{snap, defer=defer}\n" in dsl_destroy_snapshots_nvl()
652 " assert(errno == 0)\n" in dsl_destroy_snapshots_nvl()
653 "end\n" in dsl_destroy_snapshots_nvl()
654 "return { }\n"; in dsl_destroy_snapshots_nvl()
718 dmu_tx_t *tx = ka->tx; in kill_blkptr()
720 if (zb->zb_level == ZB_DNODE_LEVEL || BP_IS_HOLE(bp) || in kill_blkptr()
724 if (zb->zb_level == ZB_ZIL_LEVEL) { in kill_blkptr()
730 dsl_free(ka->tx->tx_pool, ka->tx->tx_txg, bp); in kill_blkptr()
734 dsl_dataset_phys(ka->ds)->ds_prev_snap_txg); in kill_blkptr()
735 (void) dsl_dataset_block_kill(ka->ds, bp, tx, B_FALSE); in kill_blkptr()
748 (long long)dsl_dataset_phys(ds)->ds_prev_snap_txg); in old_synchronous_dataset_destroy()
760 dsl_dataset_phys(ds)->ds_prev_snap_txg, TRAVERSE_POST | in old_synchronous_dataset_destroy()
763 dsl_dataset_phys(ds)->ds_unique_bytes == 0); in old_synchronous_dataset_destroy()
771 objset_t *mos; in dsl_destroy_head_check_impl() local
773 ASSERT(!ds->ds_is_snapshot); in dsl_destroy_head_check_impl()
774 if (ds->ds_is_snapshot) in dsl_destroy_head_check_impl()
777 if (zfs_refcount_count(&ds->ds_longholds) != expected_holds) in dsl_destroy_head_check_impl()
780 ASSERT0(ds->ds_dir->dd_activity_waiters); in dsl_destroy_head_check_impl()
782 mos = ds->ds_dir->dd_pool->dp_meta_objset; in dsl_destroy_head_check_impl()
789 if (ds->ds_prev != NULL && in dsl_destroy_head_check_impl()
790 dsl_dataset_phys(ds->ds_prev)->ds_next_snap_obj == ds->ds_object) in dsl_destroy_head_check_impl()
796 error = zap_count(mos, in dsl_destroy_head_check_impl()
797 dsl_dir_phys(ds->ds_dir)->dd_child_dir_zapobj, &count); in dsl_destroy_head_check_impl()
803 if (dsl_dir_is_clone(ds->ds_dir) && DS_IS_DEFER_DESTROY(ds->ds_prev) && in dsl_destroy_head_check_impl()
804 dsl_dataset_phys(ds->ds_prev)->ds_num_children == 2 && in dsl_destroy_head_check_impl()
805 ds->ds_prev->ds_userrefs == 0) { in dsl_destroy_head_check_impl()
807 if (!zfs_refcount_is_zero(&ds->ds_prev->ds_longholds)) in dsl_destroy_head_check_impl()
821 error = dsl_dataset_hold(dp, ddha->ddha_name, FTAG, &ds); in dsl_destroy_head_check()
835 objset_t *mos = dp->dp_meta_objset; in dsl_dir_destroy_sync() local
838 ASSERT(RRW_WRITE_HELD(&dmu_tx_pool(tx)->dp_config_rwlock)); in dsl_dir_destroy_sync()
842 ASSERT0(dsl_dir_phys(dd)->dd_head_dataset_obj); in dsl_dir_destroy_sync()
845 if (dd->dd_parent != NULL) in dsl_dir_destroy_sync()
846 dsl_fs_ss_count_adjust(dd->dd_parent, -1, in dsl_dir_destroy_sync()
855 ASSERT0(dsl_dir_phys(dd)->dd_used_bytes); in dsl_dir_destroy_sync()
856 ASSERT0(dsl_dir_phys(dd)->dd_reserved); in dsl_dir_destroy_sync()
858 ASSERT0(dsl_dir_phys(dd)->dd_used_breakdown[t]); in dsl_dir_destroy_sync()
860 if (dd->dd_crypto_obj != 0) { in dsl_dir_destroy_sync()
861 dsl_crypto_key_destroy_sync(dd->dd_crypto_obj, tx); in dsl_dir_destroy_sync()
862 (void) spa_keystore_unload_wkey_impl(dp->dp_spa, dd->dd_object); in dsl_dir_destroy_sync()
865 VERIFY0(zap_destroy(mos, dsl_dir_phys(dd)->dd_child_dir_zapobj, tx)); in dsl_dir_destroy_sync()
866 VERIFY0(zap_destroy(mos, dsl_dir_phys(dd)->dd_props_zapobj, tx)); in dsl_dir_destroy_sync()
867 if (dsl_dir_phys(dd)->dd_clones != 0) in dsl_dir_destroy_sync()
868 VERIFY0(zap_destroy(mos, dsl_dir_phys(dd)->dd_clones, tx)); in dsl_dir_destroy_sync()
869 VERIFY0(dsl_deleg_destroy(mos, dsl_dir_phys(dd)->dd_deleg_zapobj, tx)); in dsl_dir_destroy_sync()
870 VERIFY0(zap_remove(mos, in dsl_dir_destroy_sync()
871 dsl_dir_phys(dd->dd_parent)->dd_child_dir_zapobj, in dsl_dir_destroy_sync()
872 dd->dd_myname, tx)); in dsl_dir_destroy_sync()
875 dmu_object_free_zapified(mos, ddobj, tx); in dsl_dir_destroy_sync()
884 dsl_deadlist_space(&dd->dd_livelist, &used, &comp, &uncomp); in dsl_clone_destroy_assert()
886 ASSERT3U(dsl_dir_phys(dd)->dd_used_bytes, ==, used); in dsl_clone_destroy_assert()
887 ASSERT3U(dsl_dir_phys(dd)->dd_compressed_bytes, ==, comp); in dsl_clone_destroy_assert()
892 ASSERT3U(dsl_dir_phys(dd)->dd_uncompressed_bytes, >=, uncomp); in dsl_clone_destroy_assert()
894 ASSERT(list_is_empty(&dd->dd_pending_allocs.bpl_list)); in dsl_clone_destroy_assert()
895 ASSERT(list_is_empty(&dd->dd_pending_frees.bpl_list)); in dsl_clone_destroy_assert()
900 * and queue the blkptrs for deletion by adding the livelist to the pool-wide
908 dsl_dir_t *dd = ds->ds_dir; in dsl_async_clone_destroy()
910 objset_t *mos = dp->dp_meta_objset; in dsl_async_clone_destroy() local
911 spa_t *spa = dmu_tx_pool(tx)->dp_spa; in dsl_async_clone_destroy()
915 dsl_deadlist_entry_t *dle = dsl_deadlist_first(&dd->dd_livelist); in dsl_async_clone_destroy()
917 mintxg = dle->dle_mintxg; in dsl_async_clone_destroy()
928 VERIFY0(zap_lookup(mos, dd->dd_object, in dsl_async_clone_destroy()
931 int error = zap_lookup(mos, DMU_POOL_DIRECTORY_OBJECT, in dsl_async_clone_destroy()
934 zap_obj = zap_create(mos, DMU_OTN_ZAP_METADATA, in dsl_async_clone_destroy()
936 VERIFY0(zap_add(mos, DMU_POOL_DIRECTORY_OBJECT, in dsl_async_clone_destroy()
939 spa->spa_livelists_to_delete = zap_obj; in dsl_async_clone_destroy()
945 VERIFY0(zap_add_int(mos, zap_obj, to_delete, tx)); in dsl_async_clone_destroy()
948 dsl_deadlist_space(&dd->dd_livelist, &used, &comp, &uncomp); in dsl_async_clone_destroy()
950 -used, -comp, -dsl_dir_phys(dd)->dd_uncompressed_bytes, in dsl_async_clone_destroy()
952 dsl_dir_diduse_space(dp->dp_free_dir, DD_USED_HEAD, in dsl_async_clone_destroy()
955 zthr_wakeup(spa->spa_livelist_delete_zthr); in dsl_async_clone_destroy()
970 objset_t *mos = dp->dp_meta_objset; in dsl_async_dataset_destroy() local
974 (long long)dsl_dataset_phys(ds)->ds_prev_snap_txg); in dsl_async_dataset_destroy()
978 if (!spa_feature_is_active(dp->dp_spa, in dsl_async_dataset_destroy()
980 dsl_scan_t *scn = dp->dp_scan; in dsl_async_dataset_destroy()
981 spa_feature_incr(dp->dp_spa, SPA_FEATURE_ASYNC_DESTROY, in dsl_async_dataset_destroy()
983 dp->dp_bptree_obj = bptree_alloc(mos, tx); in dsl_async_dataset_destroy()
984 VERIFY0(zap_add(mos, in dsl_async_dataset_destroy()
987 &dp->dp_bptree_obj, tx)); in dsl_async_dataset_destroy()
988 ASSERT(!scn->scn_async_destroying); in dsl_async_dataset_destroy()
989 scn->scn_async_destroying = B_TRUE; in dsl_async_dataset_destroy()
992 used = dsl_dir_phys(ds->ds_dir)->dd_used_bytes; in dsl_async_dataset_destroy()
993 comp = dsl_dir_phys(ds->ds_dir)->dd_compressed_bytes; in dsl_async_dataset_destroy()
994 uncomp = dsl_dir_phys(ds->ds_dir)->dd_uncompressed_bytes; in dsl_async_dataset_destroy()
997 dsl_dataset_phys(ds)->ds_unique_bytes == used); in dsl_async_dataset_destroy()
999 rrw_enter(&ds->ds_bp_rwlock, RW_READER, FTAG); in dsl_async_dataset_destroy()
1000 bptree_add(mos, dp->dp_bptree_obj, in dsl_async_dataset_destroy()
1001 &dsl_dataset_phys(ds)->ds_bp, in dsl_async_dataset_destroy()
1002 dsl_dataset_phys(ds)->ds_prev_snap_txg, in dsl_async_dataset_destroy()
1004 rrw_exit(&ds->ds_bp_rwlock, FTAG); in dsl_async_dataset_destroy()
1005 dsl_dir_diduse_space(ds->ds_dir, DD_USED_HEAD, in dsl_async_dataset_destroy()
1006 -used, -comp, -uncomp, tx); in dsl_async_dataset_destroy()
1007 dsl_dir_diduse_space(dp->dp_free_dir, DD_USED_HEAD, in dsl_async_dataset_destroy()
1015 objset_t *mos = dp->dp_meta_objset; in dsl_destroy_head_sync_impl() local
1019 ASSERT3U(dsl_dataset_phys(ds)->ds_num_children, <=, 1); in dsl_destroy_head_sync_impl()
1020 ASSERT(ds->ds_prev == NULL || in dsl_destroy_head_sync_impl()
1021 dsl_dataset_phys(ds->ds_prev)->ds_next_snap_obj != ds->ds_object); in dsl_destroy_head_sync_impl()
1022 rrw_enter(&ds->ds_bp_rwlock, RW_READER, FTAG); in dsl_destroy_head_sync_impl()
1023 ASSERT3U(BP_GET_LOGICAL_BIRTH(&dsl_dataset_phys(ds)->ds_bp), <=, in dsl_destroy_head_sync_impl()
1024 tx->tx_txg); in dsl_destroy_head_sync_impl()
1025 rrw_exit(&ds->ds_bp_rwlock, FTAG); in dsl_destroy_head_sync_impl()
1026 ASSERT(RRW_WRITE_HELD(&dp->dp_config_rwlock)); in dsl_destroy_head_sync_impl()
1028 dsl_dir_cancel_waiters(ds->ds_dir); in dsl_destroy_head_sync_impl()
1030 rmorigin = (dsl_dir_is_clone(ds->ds_dir) && in dsl_destroy_head_sync_impl()
1031 DS_IS_DEFER_DESTROY(ds->ds_prev) && in dsl_destroy_head_sync_impl()
1032 dsl_dataset_phys(ds->ds_prev)->ds_num_children == 2 && in dsl_destroy_head_sync_impl()
1033 ds->ds_prev->ds_userrefs == 0); in dsl_destroy_head_sync_impl()
1036 if (ds->ds_reserved != 0) { in dsl_destroy_head_sync_impl()
1040 ASSERT0(ds->ds_reserved); in dsl_destroy_head_sync_impl()
1043 obj = ds->ds_object; in dsl_destroy_head_sync_impl()
1052 if (dsl_dataset_phys(ds)->ds_prev_snap_obj != 0) { in dsl_destroy_head_sync_impl()
1054 ASSERT(ds->ds_prev != NULL); in dsl_destroy_head_sync_impl()
1055 ASSERT3U(dsl_dataset_phys(ds->ds_prev)->ds_next_snap_obj, !=, in dsl_destroy_head_sync_impl()
1057 ASSERT0(dsl_dataset_phys(ds)->ds_next_snap_obj); in dsl_destroy_head_sync_impl()
1059 dmu_buf_will_dirty(ds->ds_prev->ds_dbuf, tx); in dsl_destroy_head_sync_impl()
1060 if (dsl_dataset_phys(ds->ds_prev)->ds_next_clones_obj != 0) { in dsl_destroy_head_sync_impl()
1061 dsl_dataset_remove_from_next_clones(ds->ds_prev, in dsl_destroy_head_sync_impl()
1065 ASSERT3U(dsl_dataset_phys(ds->ds_prev)->ds_num_children, >, 1); in dsl_destroy_head_sync_impl()
1066 dsl_dataset_phys(ds->ds_prev)->ds_num_children--; in dsl_destroy_head_sync_impl()
1075 dsl_deadlist_close(&ds->ds_deadlist); in dsl_destroy_head_sync_impl()
1076 dsl_deadlist_free(mos, dsl_dataset_phys(ds)->ds_deadlist_obj, tx); in dsl_destroy_head_sync_impl()
1077 dmu_buf_will_dirty(ds->ds_dbuf, tx); in dsl_destroy_head_sync_impl()
1078 dsl_dataset_phys(ds)->ds_deadlist_obj = 0; in dsl_destroy_head_sync_impl()
1088 if (dsl_deadlist_is_open(&ds->ds_dir->dd_livelist)) { in dsl_destroy_head_sync_impl()
1090 } else if (spa_feature_is_enabled(dp->dp_spa, in dsl_destroy_head_sync_impl()
1097 if (ds->ds_prev != NULL) { in dsl_destroy_head_sync_impl()
1098 if (spa_version(dp->dp_spa) >= SPA_VERSION_DIR_CLONES) { in dsl_destroy_head_sync_impl()
1099 VERIFY0(zap_remove_int(mos, in dsl_destroy_head_sync_impl()
1100 dsl_dir_phys(ds->ds_prev->ds_dir)->dd_clones, in dsl_destroy_head_sync_impl()
1101 ds->ds_object, tx)); in dsl_destroy_head_sync_impl()
1103 prevobj = ds->ds_prev->ds_object; in dsl_destroy_head_sync_impl()
1104 dsl_dataset_rele(ds->ds_prev, ds); in dsl_destroy_head_sync_impl()
1105 ds->ds_prev = NULL; in dsl_destroy_head_sync_impl()
1110 * re-open the objset. in dsl_destroy_head_sync_impl()
1112 if (ds->ds_objset) { in dsl_destroy_head_sync_impl()
1113 dmu_objset_evict(ds->ds_objset); in dsl_destroy_head_sync_impl()
1114 ds->ds_objset = NULL; in dsl_destroy_head_sync_impl()
1118 dmu_buf_will_dirty(ds->ds_dir->dd_dbuf, tx); in dsl_destroy_head_sync_impl()
1119 dsl_dir_phys(ds->ds_dir)->dd_head_dataset_obj = 0; in dsl_destroy_head_sync_impl()
1120 ddobj = ds->ds_dir->dd_object; in dsl_destroy_head_sync_impl()
1121 ASSERT(dsl_dataset_phys(ds)->ds_snapnames_zapobj != 0); in dsl_destroy_head_sync_impl()
1122 VERIFY0(zap_destroy(mos, in dsl_destroy_head_sync_impl()
1123 dsl_dataset_phys(ds)->ds_snapnames_zapobj, tx)); in dsl_destroy_head_sync_impl()
1125 if (ds->ds_bookmarks_obj != 0) { in dsl_destroy_head_sync_impl()
1129 while ((dbn = avl_destroy_nodes(&ds->ds_bookmarks, &cookie)) != in dsl_destroy_head_sync_impl()
1131 if (dbn->dbn_phys.zbm_redaction_obj != 0) { in dsl_destroy_head_sync_impl()
1133 VERIFY0(dnode_hold(mos, in dsl_destroy_head_sync_impl()
1134 dbn->dbn_phys.zbm_redaction_obj, FTAG, in dsl_destroy_head_sync_impl()
1136 if (rl->dn_have_spill) { in dsl_destroy_head_sync_impl()
1137 spa_feature_decr(dmu_objset_spa(mos), in dsl_destroy_head_sync_impl()
1142 VERIFY0(dmu_object_free(mos, in dsl_destroy_head_sync_impl()
1143 dbn->dbn_phys.zbm_redaction_obj, tx)); in dsl_destroy_head_sync_impl()
1144 spa_feature_decr(dmu_objset_spa(mos), in dsl_destroy_head_sync_impl()
1147 if (dbn->dbn_phys.zbm_flags & ZBM_FLAG_HAS_FBN) { in dsl_destroy_head_sync_impl()
1148 spa_feature_decr(dmu_objset_spa(mos), in dsl_destroy_head_sync_impl()
1151 spa_strfree(dbn->dbn_name); in dsl_destroy_head_sync_impl()
1152 mutex_destroy(&dbn->dbn_lock); in dsl_destroy_head_sync_impl()
1155 avl_destroy(&ds->ds_bookmarks); in dsl_destroy_head_sync_impl()
1156 VERIFY0(zap_destroy(mos, ds->ds_bookmarks_obj, tx)); in dsl_destroy_head_sync_impl()
1157 spa_feature_decr(dp->dp_spa, SPA_FEATURE_BOOKMARKS, tx); in dsl_destroy_head_sync_impl()
1160 spa_prop_clear_bootfs(dp->dp_spa, ds->ds_object, tx); in dsl_destroy_head_sync_impl()
1162 ASSERT0(dsl_dataset_phys(ds)->ds_next_clones_obj); in dsl_destroy_head_sync_impl()
1163 ASSERT0(dsl_dataset_phys(ds)->ds_props_obj); in dsl_destroy_head_sync_impl()
1164 ASSERT0(dsl_dataset_phys(ds)->ds_userrefs_obj); in dsl_destroy_head_sync_impl()
1165 dsl_dir_rele(ds->ds_dir, ds); in dsl_destroy_head_sync_impl()
1166 ds->ds_dir = NULL; in dsl_destroy_head_sync_impl()
1167 dmu_object_free_zapified(mos, obj, tx); in dsl_destroy_head_sync_impl()
1178 if (spa_feature_is_enabled(dp->dp_spa, SPA_FEATURE_HEAD_ERRLOG)) in dsl_destroy_head_sync_impl()
1179 spa_delete_dataset_errlog(dp->dp_spa, ds->ds_object, tx); in dsl_destroy_head_sync_impl()
1189 VERIFY0(dsl_dataset_hold(dp, ddha->ddha_name, FTAG, &ds)); in dsl_destroy_head_sync()
1191 zvol_remove_minors(dp->dp_spa, ddha->ddha_name, B_TRUE); in dsl_destroy_head_sync()
1202 VERIFY0(dsl_dataset_hold(dp, ddha->ddha_name, FTAG, &ds)); in dsl_destroy_head_begin_sync()
1204 /* Mark it as inconsistent on-disk, in case we crash */ in dsl_destroy_head_begin_sync()
1205 dmu_buf_will_dirty(ds->ds_dbuf, tx); in dsl_destroy_head_begin_sync()
1206 dsl_dataset_phys(ds)->ds_flags |= DS_FLAG_INCONSISTENT; in dsl_destroy_head_begin_sync()
1251 dsl_dataset_phys(dmu_objset_ds(os))-> in dsl_destroy_head()