Lines Matching full:ds
55 dsl_destroy_snapshot_check_impl(dsl_dataset_t *ds, boolean_t defer)
57 if (!ds->ds_is_snapshot)
60 if (dsl_dataset_long_held(ds))
68 if (spa_version(ds->ds_dir->dd_pool->dp_spa) <
78 if (ds->ds_userrefs > 0)
84 if (dsl_dataset_phys(ds)->ds_num_children > 1)
99 dsl_dataset_t *ds;
101 error = dsl_dataset_hold(dp, dsname, FTAG, &ds);
112 error = dsl_destroy_snapshot_check_impl(ds, defer);
113 dsl_dataset_rele(ds, FTAG);
120 dsl_dataset_t *ds;
131 dsl_pool_t *dp = poa->ds->ds_dir->dd_pool;
136 dsl_dataset_phys(poa->ds)->ds_prev_snap_txg) {
137 dsl_deadlist_insert(&poa->ds->ds_deadlist, bp, bp_freed, tx);
154 process_old_deadlist(dsl_dataset_t *ds, dsl_dataset_t *ds_prev,
158 dsl_pool_t *dp = ds->ds_dir->dd_pool;
162 ASSERT(ds->ds_deadlist.dl_oldfmt);
165 poa.ds = ds;
172 ASSERT3U(poa.used, ==, dsl_dataset_phys(ds)->ds_unique_bytes);
175 dsl_dir_diduse_space(ds->ds_dir, DD_USED_SNAP,
179 dsl_deadlist_close(&ds->ds_deadlist);
181 deadlist_obj = dsl_dataset_phys(ds)->ds_deadlist_obj;
182 dsl_dataset_phys(ds)->ds_deadlist_obj =
185 VERIFY0(dsl_deadlist_open(&ds->ds_deadlist, mos,
186 dsl_dataset_phys(ds)->ds_deadlist_obj));
274 dsl_destroy_snapshot_handle_remaps(dsl_dataset_t *ds, dsl_dataset_t *ds_next,
277 dsl_pool_t *dp = ds->ds_dir->dd_pool;
286 dsl_dataset_phys(ds)->ds_prev_snap_txg, tx);
290 if (dsl_dataset_remap_deadlist_exists(ds)) {
292 dsl_dataset_get_remap_deadlist_object(ds);
302 dsl_dataset_destroy_remap_deadlist(ds, tx);
307 dsl_destroy_snapshot_sync_impl(dsl_dataset_t *ds, boolean_t defer, dmu_tx_t *tx)
310 dsl_pool_t *dp = ds->ds_dir->dd_pool;
316 rrw_enter(&ds->ds_bp_rwlock, RW_READER, FTAG);
317 ASSERT3U(BP_GET_LOGICAL_BIRTH(&dsl_dataset_phys(ds)->ds_bp), <=,
319 rrw_exit(&ds->ds_bp_rwlock, FTAG);
320 ASSERT(zfs_refcount_is_zero(&ds->ds_longholds));
323 (ds->ds_userrefs > 0 ||
324 dsl_dataset_phys(ds)->ds_num_children > 1)) {
326 dmu_buf_will_dirty(ds->ds_dbuf, tx);
327 dsl_dataset_phys(ds)->ds_flags |= DS_FLAG_DEFER_DESTROY;
329 spa_history_log_internal_ds(ds, "defer_destroy", tx,
335 ASSERT3U(dsl_dataset_phys(ds)->ds_num_children, <=, 1);
339 spa_history_log_internal_ds(ds, "destroy", tx, " ");
342 dsl_scan_ds_destroyed(ds, tx);
344 obj = ds->ds_object;
346 boolean_t book_exists = dsl_bookmark_ds_destroyed(ds, tx);
349 if (dsl_dataset_feature_is_active(ds, f))
350 dsl_dataset_deactivate_feature(ds, f, tx);
352 if (dsl_dataset_phys(ds)->ds_prev_snap_obj != 0) {
353 ASSERT3P(ds->ds_prev, ==, NULL);
355 dsl_dataset_phys(ds)->ds_prev_snap_obj, FTAG, &ds_prev));
363 if (dsl_dataset_phys(ds)->ds_next_snap_obj != 0) {
367 dsl_dataset_phys(ds)->ds_next_snap_obj,
373 dsl_dataset_phys(ds)->ds_next_snap_obj;
382 dsl_dataset_phys(ds)->ds_next_snap_obj, FTAG, &ds_next));
389 dsl_dataset_phys(ds)->ds_prev_snap_obj;
391 dsl_dataset_phys(ds)->ds_prev_snap_txg;
392 ASSERT3U(dsl_dataset_phys(ds)->ds_prev_snap_txg, ==,
396 process_old_deadlist(ds, ds_prev, ds_next,
403 dsl_dataset_phys(ds)->ds_prev_snap_txg,
410 dsl_dataset_phys(ds)->ds_prev_snap_txg, UINT64_MAX,
412 dsl_dir_diduse_space(ds->ds_dir, DD_USED_SNAP,
417 &dp->dp_free_bpobj, dsl_dataset_phys(ds)->ds_prev_snap_txg,
424 dsl_dataset_phys(ds)->ds_deadlist_obj, tx);
434 dsl_deadlist_close(&ds->ds_deadlist);
435 dsl_deadlist_free(mos, dsl_dataset_phys(ds)->ds_deadlist_obj, tx);
436 dmu_buf_will_dirty(ds->ds_dbuf, tx);
437 dsl_dataset_phys(ds)->ds_deadlist_obj = 0;
439 dsl_destroy_snapshot_handle_remaps(ds, ds_next, tx);
443 dsl_dir_remove_clones_key(ds->ds_dir,
444 dsl_dataset_phys(ds)->ds_creation_txg, tx);
463 dsl_dataset_phys(ds)->ds_prev_snap_txg,
464 dsl_dataset_phys(ds)->ds_creation_txg,
473 dsl_dir_phys(ds->ds_dir)->dd_head_dataset_obj,
478 dsl_dataset_phys(ds)->ds_creation_txg, tx);
482 dsl_dataset_phys(ds)->ds_creation_txg, tx);
487 ASSERT3P(ds_next->ds_prev, ==, ds);
492 dsl_dataset_phys(ds)->ds_prev_snap_obj,
511 dsl_dir_diduse_space(ds->ds_dir,
521 if (ds->ds_objset) {
522 dmu_objset_evict(ds->ds_objset);
523 ds->ds_objset = NULL;
528 ASSERT(dsl_dataset_phys(ds)->ds_snapnames_zapobj == 0);
530 dsl_dir_phys(ds->ds_dir)->dd_head_dataset_obj, FTAG, &ds_head));
531 VERIFY0(dsl_dataset_get_snapname(ds));
538 ds->ds_snapname, &val);
543 VERIFY0(dsl_dataset_snap_remove(ds_head, ds->ds_snapname, tx, B_TRUE));
549 spa_prop_clear_bootfs(dp->dp_spa, ds->ds_object, tx);
551 if (dsl_dataset_phys(ds)->ds_next_clones_obj != 0) {
554 dsl_dataset_phys(ds)->ds_next_clones_obj, &count) &&
557 dsl_dataset_phys(ds)->ds_next_clones_obj, tx));
559 if (dsl_dataset_phys(ds)->ds_props_obj != 0)
560 VERIFY0(zap_destroy(mos, dsl_dataset_phys(ds)->ds_props_obj,
562 if (dsl_dataset_phys(ds)->ds_userrefs_obj != 0)
563 VERIFY0(zap_destroy(mos, dsl_dataset_phys(ds)->ds_userrefs_obj,
565 dsl_dir_rele(ds->ds_dir, ds);
566 ds->ds_dir = NULL;
578 dsl_dataset_t *ds;
580 int error = dsl_dataset_hold(dp, dsname, FTAG, &ds);
584 dsl_destroy_snapshot_sync_impl(ds, defer, tx);
586 dsl_dataset_rele(ds, FTAG);
707 dsl_dataset_t *ds;
733 dsl_dataset_phys(ka->ds)->ds_prev_snap_txg);
734 (void) dsl_dataset_block_kill(ka->ds, bp, tx, B_FALSE);
741 old_synchronous_dataset_destroy(dsl_dataset_t *ds, dmu_tx_t *tx)
745 spa_history_log_internal_ds(ds, "destroy", tx,
747 (long long)dsl_dataset_phys(ds)->ds_prev_snap_txg);
756 ka.ds = ds;
758 VERIFY0(traverse_dataset(ds,
759 dsl_dataset_phys(ds)->ds_prev_snap_txg, TRAVERSE_POST |
761 ASSERT(!DS_UNIQUE_IS_ACCURATE(ds) ||
762 dsl_dataset_phys(ds)->ds_unique_bytes == 0);
766 dsl_destroy_head_check_impl(dsl_dataset_t *ds, int expected_holds)
772 ASSERT(!ds->ds_is_snapshot);
773 if (ds->ds_is_snapshot)
776 if (zfs_refcount_count(&ds->ds_longholds) != expected_holds)
779 ASSERT0(ds->ds_dir->dd_activity_waiters);
781 mos = ds->ds_dir->dd_pool->dp_meta_objset;
788 if (ds->ds_prev != NULL &&
789 dsl_dataset_phys(ds->ds_prev)->ds_next_snap_obj == ds->ds_object)
796 dsl_dir_phys(ds->ds_dir)->dd_child_dir_zapobj, &count);
802 if (dsl_dir_is_clone(ds->ds_dir) && DS_IS_DEFER_DESTROY(ds->ds_prev) &&
803 dsl_dataset_phys(ds->ds_prev)->ds_num_children == 2 &&
804 ds->ds_prev->ds_userrefs == 0) {
806 if (!zfs_refcount_is_zero(&ds->ds_prev->ds_longholds))
817 dsl_dataset_t *ds;
820 error = dsl_dataset_hold(dp, ddha->ddha_name, FTAG, &ds);
824 error = dsl_destroy_head_check_impl(ds, 0);
825 dsl_dataset_rele(ds, FTAG);
850 * actual property, which would require the (already destroyed) ds.
903 dsl_async_clone_destroy(dsl_dataset_t *ds, dmu_tx_t *tx)
907 dsl_dir_t *dd = ds->ds_dir;
911 VERIFY0(dmu_objset_from_ds(ds, &os));
918 spa_history_log_internal_ds(ds, "destroy", tx,
962 dsl_async_dataset_destroy(dsl_dataset_t *ds, dmu_tx_t *tx)
967 VERIFY0(dmu_objset_from_ds(ds, &os));
971 spa_history_log_internal_ds(ds, "destroy", tx,
973 (long long)dsl_dataset_phys(ds)->ds_prev_snap_txg);
991 used = dsl_dir_phys(ds->ds_dir)->dd_used_bytes;
992 comp = dsl_dir_phys(ds->ds_dir)->dd_compressed_bytes;
993 uncomp = dsl_dir_phys(ds->ds_dir)->dd_uncompressed_bytes;
995 ASSERT(!DS_UNIQUE_IS_ACCURATE(ds) ||
996 dsl_dataset_phys(ds)->ds_unique_bytes == used);
998 rrw_enter(&ds->ds_bp_rwlock, RW_READER, FTAG);
1000 &dsl_dataset_phys(ds)->ds_bp,
1001 dsl_dataset_phys(ds)->ds_prev_snap_txg,
1003 rrw_exit(&ds->ds_bp_rwlock, FTAG);
1004 dsl_dir_diduse_space(ds->ds_dir, DD_USED_HEAD,
1011 dsl_destroy_head_sync_impl(dsl_dataset_t *ds, dmu_tx_t *tx)
1018 ASSERT3U(dsl_dataset_phys(ds)->ds_num_children, <=, 1);
1019 ASSERT(ds->ds_prev == NULL ||
1020 dsl_dataset_phys(ds->ds_prev)->ds_next_snap_obj != ds->ds_object);
1021 rrw_enter(&ds->ds_bp_rwlock, RW_READER, FTAG);
1022 ASSERT3U(BP_GET_LOGICAL_BIRTH(&dsl_dataset_phys(ds)->ds_bp), <=,
1024 rrw_exit(&ds->ds_bp_rwlock, FTAG);
1027 dsl_dir_cancel_waiters(ds->ds_dir);
1029 rmorigin = (dsl_dir_is_clone(ds->ds_dir) &&
1030 DS_IS_DEFER_DESTROY(ds->ds_prev) &&
1031 dsl_dataset_phys(ds->ds_prev)->ds_num_children == 2 &&
1032 ds->ds_prev->ds_userrefs == 0);
1035 if (ds->ds_reserved != 0) {
1036 dsl_dataset_set_refreservation_sync_impl(ds,
1039 ASSERT0(ds->ds_reserved);
1042 obj = ds->ds_object;
1045 if (dsl_dataset_feature_is_active(ds, f))
1046 dsl_dataset_deactivate_feature(ds, f, tx);
1049 dsl_scan_ds_destroyed(ds, tx);
1051 if (dsl_dataset_phys(ds)->ds_prev_snap_obj != 0) {
1053 ASSERT(ds->ds_prev != NULL);
1054 ASSERT3U(dsl_dataset_phys(ds->ds_prev)->ds_next_snap_obj, !=,
1056 ASSERT0(dsl_dataset_phys(ds)->ds_next_snap_obj);
1058 dmu_buf_will_dirty(ds->ds_prev->ds_dbuf, tx);
1059 if (dsl_dataset_phys(ds->ds_prev)->ds_next_clones_obj != 0) {
1060 dsl_dataset_remove_from_next_clones(ds->ds_prev,
1064 ASSERT3U(dsl_dataset_phys(ds->ds_prev)->ds_num_children, >, 1);
1065 dsl_dataset_phys(ds->ds_prev)->ds_num_children--;
1074 dsl_deadlist_close(&ds->ds_deadlist);
1075 dsl_deadlist_free(mos, dsl_dataset_phys(ds)->ds_deadlist_obj, tx);
1076 dmu_buf_will_dirty(ds->ds_dbuf, tx);
1077 dsl_dataset_phys(ds)->ds_deadlist_obj = 0;
1079 if (dsl_dataset_remap_deadlist_exists(ds))
1080 dsl_dataset_destroy_remap_deadlist(ds, tx);
1087 if (dsl_deadlist_is_open(&ds->ds_dir->dd_livelist)) {
1088 dsl_async_clone_destroy(ds, tx);
1091 dsl_async_dataset_destroy(ds, tx);
1093 old_synchronous_dataset_destroy(ds, tx);
1096 if (ds->ds_prev != NULL) {
1099 dsl_dir_phys(ds->ds_prev->ds_dir)->dd_clones,
1100 ds->ds_object, tx));
1102 prevobj = ds->ds_prev->ds_object;
1103 dsl_dataset_rele(ds->ds_prev, ds);
1104 ds->ds_prev = NULL;
1111 if (ds->ds_objset) {
1112 dmu_objset_evict(ds->ds_objset);
1113 ds->ds_objset = NULL;
1117 dmu_buf_will_dirty(ds->ds_dir->dd_dbuf, tx);
1118 dsl_dir_phys(ds->ds_dir)->dd_head_dataset_obj = 0;
1119 ddobj = ds->ds_dir->dd_object;
1120 ASSERT(dsl_dataset_phys(ds)->ds_snapnames_zapobj != 0);
1122 dsl_dataset_phys(ds)->ds_snapnames_zapobj, tx));
1124 if (ds->ds_bookmarks_obj != 0) {
1128 while ((dbn = avl_destroy_nodes(&ds->ds_bookmarks, &cookie)) !=
1154 avl_destroy(&ds->ds_bookmarks);
1155 VERIFY0(zap_destroy(mos, ds->ds_bookmarks_obj, tx));
1159 spa_prop_clear_bootfs(dp->dp_spa, ds->ds_object, tx);
1161 ASSERT0(dsl_dataset_phys(ds)->ds_next_clones_obj);
1162 ASSERT0(dsl_dataset_phys(ds)->ds_props_obj);
1163 ASSERT0(dsl_dataset_phys(ds)->ds_userrefs_obj);
1164 dsl_dir_rele(ds->ds_dir, ds);
1165 ds->ds_dir = NULL;
1178 spa_delete_dataset_errlog(dp->dp_spa, ds->ds_object, tx);
1186 dsl_dataset_t *ds;
1188 VERIFY0(dsl_dataset_hold(dp, ddha->ddha_name, FTAG, &ds));
1189 dsl_destroy_head_sync_impl(ds, tx);
1191 dsl_dataset_rele(ds, FTAG);
1199 dsl_dataset_t *ds;
1201 VERIFY0(dsl_dataset_hold(dp, ddha->ddha_name, FTAG, &ds));
1204 dmu_buf_will_dirty(ds->ds_dbuf, tx);
1205 dsl_dataset_phys(ds)->ds_flags |= DS_FLAG_INCONSISTENT;
1207 spa_history_log_internal_ds(ds, "destroy begin", tx, " ");
1208 dsl_dataset_rele(ds, FTAG);