4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
22 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
23 * Copyright (c) 2012, 2015 by Delphix. All rights reserved.
24 * Copyright (c) 2013 Steven Hartland. All rights reserved.
25 * Copyright (c) 2013 by Joyent, Inc. All rights reserved.
26 * Copyright (c) 2014 Integros [integros.com]
29 #include <sys/zfs_context.h>
30 #include <sys/dsl_userhold.h>
31 #include <sys/dsl_dataset.h>
32 #include <sys/dsl_synctask.h>
33 #include <sys/dmu_tx.h>
34 #include <sys/dsl_pool.h>
35 #include <sys/dsl_dir.h>
36 #include <sys/dmu_traverse.h>
37 #include <sys/dsl_scan.h>
38 #include <sys/dmu_objset.h>
40 #include <sys/zfeature.h>
41 #include <sys/zfs_ioctl.h>
42 #include <sys/dsl_deleg.h>
43 #include <sys/dmu_impl.h>
45 typedef struct dmu_snapshots_destroy_arg
{
47 nvlist_t
*dsda_successful_snaps
;
49 nvlist_t
*dsda_errlist
;
50 } dmu_snapshots_destroy_arg_t
;
53 dsl_destroy_snapshot_check_impl(dsl_dataset_t
*ds
, boolean_t defer
)
55 if (!ds
->ds_is_snapshot
)
56 return (SET_ERROR(EINVAL
));
58 if (dsl_dataset_long_held(ds
))
59 return (SET_ERROR(EBUSY
));
62 * Only allow deferred destroy on pools that support it.
63 * NOTE: deferred destroy is only supported on snapshots.
66 if (spa_version(ds
->ds_dir
->dd_pool
->dp_spa
) <
68 return (SET_ERROR(ENOTSUP
));
73 * If this snapshot has an elevated user reference count,
74 * we can't destroy it yet.
76 if (ds
->ds_userrefs
> 0)
77 return (SET_ERROR(EBUSY
));
80 * Can't delete a branch point.
82 if (dsl_dataset_phys(ds
)->ds_num_children
> 1)
83 return (SET_ERROR(EEXIST
));
89 dsl_destroy_snapshot_check(void *arg
, dmu_tx_t
*tx
)
91 dmu_snapshots_destroy_arg_t
*dsda
= arg
;
92 dsl_pool_t
*dp
= dmu_tx_pool(tx
);
96 if (!dmu_tx_is_syncing(tx
))
99 for (pair
= nvlist_next_nvpair(dsda
->dsda_snaps
, NULL
);
100 pair
!= NULL
; pair
= nvlist_next_nvpair(dsda
->dsda_snaps
, pair
)) {
103 error
= dsl_dataset_hold(dp
, nvpair_name(pair
),
107 * If the snapshot does not exist, silently ignore it
108 * (it's "already destroyed").
114 error
= dsl_destroy_snapshot_check_impl(ds
,
116 dsl_dataset_rele(ds
, FTAG
);
120 fnvlist_add_boolean(dsda
->dsda_successful_snaps
,
123 fnvlist_add_int32(dsda
->dsda_errlist
,
124 nvpair_name(pair
), error
);
128 pair
= nvlist_next_nvpair(dsda
->dsda_errlist
, NULL
);
130 return (fnvpair_value_int32(pair
));
135 struct process_old_arg
{
137 dsl_dataset_t
*ds_prev
;
138 boolean_t after_branch_point
;
140 uint64_t used
, comp
, uncomp
;
144 process_old_cb(void *arg
, const blkptr_t
*bp
, dmu_tx_t
*tx
)
146 struct process_old_arg
*poa
= arg
;
147 dsl_pool_t
*dp
= poa
->ds
->ds_dir
->dd_pool
;
149 ASSERT(!BP_IS_HOLE(bp
));
151 if (bp
->blk_birth
<= dsl_dataset_phys(poa
->ds
)->ds_prev_snap_txg
) {
152 dsl_deadlist_insert(&poa
->ds
->ds_deadlist
, bp
, tx
);
153 if (poa
->ds_prev
&& !poa
->after_branch_point
&&
155 dsl_dataset_phys(poa
->ds_prev
)->ds_prev_snap_txg
) {
156 dsl_dataset_phys(poa
->ds_prev
)->ds_unique_bytes
+=
157 bp_get_dsize_sync(dp
->dp_spa
, bp
);
160 poa
->used
+= bp_get_dsize_sync(dp
->dp_spa
, bp
);
161 poa
->comp
+= BP_GET_PSIZE(bp
);
162 poa
->uncomp
+= BP_GET_UCSIZE(bp
);
163 dsl_free_sync(poa
->pio
, dp
, tx
->tx_txg
, bp
);
169 process_old_deadlist(dsl_dataset_t
*ds
, dsl_dataset_t
*ds_prev
,
170 dsl_dataset_t
*ds_next
, boolean_t after_branch_point
, dmu_tx_t
*tx
)
172 struct process_old_arg poa
= { 0 };
173 dsl_pool_t
*dp
= ds
->ds_dir
->dd_pool
;
174 objset_t
*mos
= dp
->dp_meta_objset
;
175 uint64_t deadlist_obj
;
177 ASSERT(ds
->ds_deadlist
.dl_oldfmt
);
178 ASSERT(ds_next
->ds_deadlist
.dl_oldfmt
);
181 poa
.ds_prev
= ds_prev
;
182 poa
.after_branch_point
= after_branch_point
;
183 poa
.pio
= zio_root(dp
->dp_spa
, NULL
, NULL
, ZIO_FLAG_MUSTSUCCEED
);
184 VERIFY0(bpobj_iterate(&ds_next
->ds_deadlist
.dl_bpobj
,
185 process_old_cb
, &poa
, tx
));
186 VERIFY0(zio_wait(poa
.pio
));
187 ASSERT3U(poa
.used
, ==, dsl_dataset_phys(ds
)->ds_unique_bytes
);
189 /* change snapused */
190 dsl_dir_diduse_space(ds
->ds_dir
, DD_USED_SNAP
,
191 -poa
.used
, -poa
.comp
, -poa
.uncomp
, tx
);
193 /* swap next's deadlist to our deadlist */
194 dsl_deadlist_close(&ds
->ds_deadlist
);
195 dsl_deadlist_close(&ds_next
->ds_deadlist
);
196 deadlist_obj
= dsl_dataset_phys(ds
)->ds_deadlist_obj
;
197 dsl_dataset_phys(ds
)->ds_deadlist_obj
=
198 dsl_dataset_phys(ds_next
)->ds_deadlist_obj
;
199 dsl_dataset_phys(ds_next
)->ds_deadlist_obj
= deadlist_obj
;
200 dsl_deadlist_open(&ds
->ds_deadlist
, mos
,
201 dsl_dataset_phys(ds
)->ds_deadlist_obj
);
202 dsl_deadlist_open(&ds_next
->ds_deadlist
, mos
,
203 dsl_dataset_phys(ds_next
)->ds_deadlist_obj
);
207 dsl_dataset_remove_clones_key(dsl_dataset_t
*ds
, uint64_t mintxg
, dmu_tx_t
*tx
)
209 objset_t
*mos
= ds
->ds_dir
->dd_pool
->dp_meta_objset
;
214 * If it is the old version, dd_clones doesn't exist so we can't
215 * find the clones, but dsl_deadlist_remove_key() is a no-op so it
218 if (dsl_dir_phys(ds
->ds_dir
)->dd_clones
== 0)
221 for (zap_cursor_init(&zc
, mos
, dsl_dir_phys(ds
->ds_dir
)->dd_clones
);
222 zap_cursor_retrieve(&zc
, &za
) == 0;
223 zap_cursor_advance(&zc
)) {
224 dsl_dataset_t
*clone
;
226 VERIFY0(dsl_dataset_hold_obj(ds
->ds_dir
->dd_pool
,
227 za
.za_first_integer
, FTAG
, &clone
));
228 if (clone
->ds_dir
->dd_origin_txg
> mintxg
) {
229 dsl_deadlist_remove_key(&clone
->ds_deadlist
,
231 dsl_dataset_remove_clones_key(clone
, mintxg
, tx
);
233 dsl_dataset_rele(clone
, FTAG
);
235 zap_cursor_fini(&zc
);
239 dsl_destroy_snapshot_sync_impl(dsl_dataset_t
*ds
, boolean_t defer
, dmu_tx_t
*tx
)
242 int after_branch_point
= FALSE
;
243 dsl_pool_t
*dp
= ds
->ds_dir
->dd_pool
;
244 objset_t
*mos
= dp
->dp_meta_objset
;
245 dsl_dataset_t
*ds_prev
= NULL
;
248 ASSERT(RRW_WRITE_HELD(&dp
->dp_config_rwlock
));
249 rrw_enter(&ds
->ds_bp_rwlock
, RW_READER
, FTAG
);
250 ASSERT3U(dsl_dataset_phys(ds
)->ds_bp
.blk_birth
, <=, tx
->tx_txg
);
251 rrw_exit(&ds
->ds_bp_rwlock
, FTAG
);
252 ASSERT(refcount_is_zero(&ds
->ds_longholds
));
255 (ds
->ds_userrefs
> 0 ||
256 dsl_dataset_phys(ds
)->ds_num_children
> 1)) {
257 ASSERT(spa_version(dp
->dp_spa
) >= SPA_VERSION_USERREFS
);
258 dmu_buf_will_dirty(ds
->ds_dbuf
, tx
);
259 dsl_dataset_phys(ds
)->ds_flags
|= DS_FLAG_DEFER_DESTROY
;
260 spa_history_log_internal_ds(ds
, "defer_destroy", tx
, "");
264 ASSERT3U(dsl_dataset_phys(ds
)->ds_num_children
, <=, 1);
266 /* We need to log before removing it from the namespace. */
267 spa_history_log_internal_ds(ds
, "destroy", tx
, "");
269 dsl_scan_ds_destroyed(ds
, tx
);
273 for (spa_feature_t f
= 0; f
< SPA_FEATURES
; f
++) {
274 if (ds
->ds_feature_inuse
[f
]) {
275 dsl_dataset_deactivate_feature(obj
, f
, tx
);
276 ds
->ds_feature_inuse
[f
] = B_FALSE
;
279 if (dsl_dataset_phys(ds
)->ds_prev_snap_obj
!= 0) {
280 ASSERT3P(ds
->ds_prev
, ==, NULL
);
281 VERIFY0(dsl_dataset_hold_obj(dp
,
282 dsl_dataset_phys(ds
)->ds_prev_snap_obj
, FTAG
, &ds_prev
));
284 (dsl_dataset_phys(ds_prev
)->ds_next_snap_obj
!= obj
);
286 dmu_buf_will_dirty(ds_prev
->ds_dbuf
, tx
);
287 if (after_branch_point
&&
288 dsl_dataset_phys(ds_prev
)->ds_next_clones_obj
!= 0) {
289 dsl_dataset_remove_from_next_clones(ds_prev
, obj
, tx
);
290 if (dsl_dataset_phys(ds
)->ds_next_snap_obj
!= 0) {
291 VERIFY0(zap_add_int(mos
,
292 dsl_dataset_phys(ds_prev
)->
294 dsl_dataset_phys(ds
)->ds_next_snap_obj
,
298 if (!after_branch_point
) {
299 dsl_dataset_phys(ds_prev
)->ds_next_snap_obj
=
300 dsl_dataset_phys(ds
)->ds_next_snap_obj
;
304 dsl_dataset_t
*ds_next
;
306 uint64_t used
= 0, comp
= 0, uncomp
= 0;
308 VERIFY0(dsl_dataset_hold_obj(dp
,
309 dsl_dataset_phys(ds
)->ds_next_snap_obj
, FTAG
, &ds_next
));
310 ASSERT3U(dsl_dataset_phys(ds_next
)->ds_prev_snap_obj
, ==, obj
);
312 old_unique
= dsl_dataset_phys(ds_next
)->ds_unique_bytes
;
314 dmu_buf_will_dirty(ds_next
->ds_dbuf
, tx
);
315 dsl_dataset_phys(ds_next
)->ds_prev_snap_obj
=
316 dsl_dataset_phys(ds
)->ds_prev_snap_obj
;
317 dsl_dataset_phys(ds_next
)->ds_prev_snap_txg
=
318 dsl_dataset_phys(ds
)->ds_prev_snap_txg
;
319 ASSERT3U(dsl_dataset_phys(ds
)->ds_prev_snap_txg
, ==,
320 ds_prev
? dsl_dataset_phys(ds_prev
)->ds_creation_txg
: 0);
322 if (ds_next
->ds_deadlist
.dl_oldfmt
) {
323 process_old_deadlist(ds
, ds_prev
, ds_next
,
324 after_branch_point
, tx
);
326 /* Adjust prev's unique space. */
327 if (ds_prev
&& !after_branch_point
) {
328 dsl_deadlist_space_range(&ds_next
->ds_deadlist
,
329 dsl_dataset_phys(ds_prev
)->ds_prev_snap_txg
,
330 dsl_dataset_phys(ds
)->ds_prev_snap_txg
,
331 &used
, &comp
, &uncomp
);
332 dsl_dataset_phys(ds_prev
)->ds_unique_bytes
+= used
;
335 /* Adjust snapused. */
336 dsl_deadlist_space_range(&ds_next
->ds_deadlist
,
337 dsl_dataset_phys(ds
)->ds_prev_snap_txg
, UINT64_MAX
,
338 &used
, &comp
, &uncomp
);
339 dsl_dir_diduse_space(ds
->ds_dir
, DD_USED_SNAP
,
340 -used
, -comp
, -uncomp
, tx
);
342 /* Move blocks to be freed to pool's free list. */
343 dsl_deadlist_move_bpobj(&ds_next
->ds_deadlist
,
344 &dp
->dp_free_bpobj
, dsl_dataset_phys(ds
)->ds_prev_snap_txg
,
346 dsl_dir_diduse_space(tx
->tx_pool
->dp_free_dir
,
347 DD_USED_HEAD
, used
, comp
, uncomp
, tx
);
349 /* Merge our deadlist into next's and free it. */
350 dsl_deadlist_merge(&ds_next
->ds_deadlist
,
351 dsl_dataset_phys(ds
)->ds_deadlist_obj
, tx
);
353 dsl_deadlist_close(&ds
->ds_deadlist
);
354 dsl_deadlist_free(mos
, dsl_dataset_phys(ds
)->ds_deadlist_obj
, tx
);
355 dmu_buf_will_dirty(ds
->ds_dbuf
, tx
);
356 dsl_dataset_phys(ds
)->ds_deadlist_obj
= 0;
358 /* Collapse range in clone heads */
359 dsl_dataset_remove_clones_key(ds
,
360 dsl_dataset_phys(ds
)->ds_creation_txg
, tx
);
362 if (ds_next
->ds_is_snapshot
) {
363 dsl_dataset_t
*ds_nextnext
;
366 * Update next's unique to include blocks which
367 * were previously shared by only this snapshot
368 * and it. Those blocks will be born after the
369 * prev snap and before this snap, and will have
370 * died after the next snap and before the one
371 * after that (ie. be on the snap after next's
374 VERIFY0(dsl_dataset_hold_obj(dp
,
375 dsl_dataset_phys(ds_next
)->ds_next_snap_obj
,
376 FTAG
, &ds_nextnext
));
377 dsl_deadlist_space_range(&ds_nextnext
->ds_deadlist
,
378 dsl_dataset_phys(ds
)->ds_prev_snap_txg
,
379 dsl_dataset_phys(ds
)->ds_creation_txg
,
380 &used
, &comp
, &uncomp
);
381 dsl_dataset_phys(ds_next
)->ds_unique_bytes
+= used
;
382 dsl_dataset_rele(ds_nextnext
, FTAG
);
383 ASSERT3P(ds_next
->ds_prev
, ==, NULL
);
385 /* Collapse range in this head. */
387 VERIFY0(dsl_dataset_hold_obj(dp
,
388 dsl_dir_phys(ds
->ds_dir
)->dd_head_dataset_obj
, FTAG
, &hds
));
389 dsl_deadlist_remove_key(&hds
->ds_deadlist
,
390 dsl_dataset_phys(ds
)->ds_creation_txg
, tx
);
391 dsl_dataset_rele(hds
, FTAG
);
394 ASSERT3P(ds_next
->ds_prev
, ==, ds
);
395 dsl_dataset_rele(ds_next
->ds_prev
, ds_next
);
396 ds_next
->ds_prev
= NULL
;
398 VERIFY0(dsl_dataset_hold_obj(dp
,
399 dsl_dataset_phys(ds
)->ds_prev_snap_obj
,
400 ds_next
, &ds_next
->ds_prev
));
403 dsl_dataset_recalc_head_uniq(ds_next
);
406 * Reduce the amount of our unconsumed refreservation
407 * being charged to our parent by the amount of
408 * new unique data we have gained.
410 if (old_unique
< ds_next
->ds_reserved
) {
412 uint64_t new_unique
=
413 dsl_dataset_phys(ds_next
)->ds_unique_bytes
;
415 ASSERT(old_unique
<= new_unique
);
416 mrsdelta
= MIN(new_unique
- old_unique
,
417 ds_next
->ds_reserved
- old_unique
);
418 dsl_dir_diduse_space(ds
->ds_dir
,
419 DD_USED_REFRSRV
, -mrsdelta
, 0, 0, tx
);
422 dsl_dataset_rele(ds_next
, FTAG
);
425 * This must be done after the dsl_traverse(), because it will
426 * re-open the objset.
429 dmu_objset_evict(ds
->ds_objset
);
430 ds
->ds_objset
= NULL
;
433 /* remove from snapshot namespace */
434 dsl_dataset_t
*ds_head
;
435 ASSERT(dsl_dataset_phys(ds
)->ds_snapnames_zapobj
== 0);
436 VERIFY0(dsl_dataset_hold_obj(dp
,
437 dsl_dir_phys(ds
->ds_dir
)->dd_head_dataset_obj
, FTAG
, &ds_head
));
438 VERIFY0(dsl_dataset_get_snapname(ds
));
443 err
= dsl_dataset_snap_lookup(ds_head
,
444 ds
->ds_snapname
, &val
);
446 ASSERT3U(val
, ==, obj
);
449 VERIFY0(dsl_dataset_snap_remove(ds_head
, ds
->ds_snapname
, tx
, B_TRUE
));
450 dsl_dataset_rele(ds_head
, FTAG
);
453 dsl_dataset_rele(ds_prev
, FTAG
);
455 spa_prop_clear_bootfs(dp
->dp_spa
, ds
->ds_object
, tx
);
457 if (dsl_dataset_phys(ds
)->ds_next_clones_obj
!= 0) {
459 ASSERT0(zap_count(mos
,
460 dsl_dataset_phys(ds
)->ds_next_clones_obj
, &count
) &&
462 VERIFY0(dmu_object_free(mos
,
463 dsl_dataset_phys(ds
)->ds_next_clones_obj
, tx
));
465 if (dsl_dataset_phys(ds
)->ds_props_obj
!= 0)
466 VERIFY0(zap_destroy(mos
, dsl_dataset_phys(ds
)->ds_props_obj
,
468 if (dsl_dataset_phys(ds
)->ds_userrefs_obj
!= 0)
469 VERIFY0(zap_destroy(mos
, dsl_dataset_phys(ds
)->ds_userrefs_obj
,
471 dsl_dir_rele(ds
->ds_dir
, ds
);
473 dmu_object_free_zapified(mos
, obj
, tx
);
477 dsl_destroy_snapshot_sync(void *arg
, dmu_tx_t
*tx
)
479 dmu_snapshots_destroy_arg_t
*dsda
= arg
;
480 dsl_pool_t
*dp
= dmu_tx_pool(tx
);
483 for (pair
= nvlist_next_nvpair(dsda
->dsda_successful_snaps
, NULL
);
485 pair
= nvlist_next_nvpair(dsda
->dsda_successful_snaps
, pair
)) {
488 VERIFY0(dsl_dataset_hold(dp
, nvpair_name(pair
), FTAG
, &ds
));
490 dsl_destroy_snapshot_sync_impl(ds
, dsda
->dsda_defer
, tx
);
491 dsl_dataset_rele(ds
, FTAG
);
496 * The semantics of this function are described in the comment above
497 * lzc_destroy_snaps(). To summarize:
499 * The snapshots must all be in the same pool.
501 * Snapshots that don't exist will be silently ignored (considered to be
502 * "already deleted").
504 * On success, all snaps will be destroyed and this will return 0.
505 * On failure, no snaps will be destroyed, the errlist will be filled in,
506 * and this will return an errno.
509 dsl_destroy_snapshots_nvl(nvlist_t
*snaps
, boolean_t defer
,
512 dmu_snapshots_destroy_arg_t dsda
;
516 pair
= nvlist_next_nvpair(snaps
, NULL
);
520 dsda
.dsda_snaps
= snaps
;
521 dsda
.dsda_successful_snaps
= fnvlist_alloc();
522 dsda
.dsda_defer
= defer
;
523 dsda
.dsda_errlist
= errlist
;
525 error
= dsl_sync_task(nvpair_name(pair
),
526 dsl_destroy_snapshot_check
, dsl_destroy_snapshot_sync
,
527 &dsda
, 0, ZFS_SPACE_CHECK_NONE
);
528 fnvlist_free(dsda
.dsda_successful_snaps
);
534 dsl_destroy_snapshot(const char *name
, boolean_t defer
)
537 nvlist_t
*nvl
= fnvlist_alloc();
538 nvlist_t
*errlist
= fnvlist_alloc();
540 fnvlist_add_boolean(nvl
, name
);
541 error
= dsl_destroy_snapshots_nvl(nvl
, defer
, errlist
);
542 fnvlist_free(errlist
);
554 kill_blkptr(spa_t
*spa
, zilog_t
*zilog
, const blkptr_t
*bp
,
555 const zbookmark_phys_t
*zb
, const dnode_phys_t
*dnp
, void *arg
)
557 struct killarg
*ka
= arg
;
558 dmu_tx_t
*tx
= ka
->tx
;
560 if (bp
== NULL
|| BP_IS_HOLE(bp
) || BP_IS_EMBEDDED(bp
))
563 if (zb
->zb_level
== ZB_ZIL_LEVEL
) {
564 ASSERT(zilog
!= NULL
);
566 * It's a block in the intent log. It has no
567 * accounting, so just free it.
569 dsl_free(ka
->tx
->tx_pool
, ka
->tx
->tx_txg
, bp
);
571 ASSERT(zilog
== NULL
);
572 ASSERT3U(bp
->blk_birth
, >,
573 dsl_dataset_phys(ka
->ds
)->ds_prev_snap_txg
);
574 (void) dsl_dataset_block_kill(ka
->ds
, bp
, tx
, B_FALSE
);
581 old_synchronous_dataset_destroy(dsl_dataset_t
*ds
, dmu_tx_t
*tx
)
586 * Free everything that we point to (that's born after
587 * the previous snapshot, if we are a clone)
589 * NB: this should be very quick, because we already
590 * freed all the objects in open context.
594 VERIFY0(traverse_dataset(ds
,
595 dsl_dataset_phys(ds
)->ds_prev_snap_txg
, TRAVERSE_POST
,
597 ASSERT(!DS_UNIQUE_IS_ACCURATE(ds
) ||
598 dsl_dataset_phys(ds
)->ds_unique_bytes
== 0);
601 typedef struct dsl_destroy_head_arg
{
602 const char *ddha_name
;
603 } dsl_destroy_head_arg_t
;
606 dsl_destroy_head_check_impl(dsl_dataset_t
*ds
, int expected_holds
)
612 ASSERT(!ds
->ds_is_snapshot
);
613 if (ds
->ds_is_snapshot
)
614 return (SET_ERROR(EINVAL
));
616 if (refcount_count(&ds
->ds_longholds
) != expected_holds
)
617 return (SET_ERROR(EBUSY
));
619 mos
= ds
->ds_dir
->dd_pool
->dp_meta_objset
;
622 * Can't delete a head dataset if there are snapshots of it.
623 * (Except if the only snapshots are from the branch we cloned
626 if (ds
->ds_prev
!= NULL
&&
627 dsl_dataset_phys(ds
->ds_prev
)->ds_next_snap_obj
== ds
->ds_object
)
628 return (SET_ERROR(EBUSY
));
631 * Can't delete if there are children of this fs.
633 error
= zap_count(mos
,
634 dsl_dir_phys(ds
->ds_dir
)->dd_child_dir_zapobj
, &count
);
638 return (SET_ERROR(EEXIST
));
640 if (dsl_dir_is_clone(ds
->ds_dir
) && DS_IS_DEFER_DESTROY(ds
->ds_prev
) &&
641 dsl_dataset_phys(ds
->ds_prev
)->ds_num_children
== 2 &&
642 ds
->ds_prev
->ds_userrefs
== 0) {
643 /* We need to remove the origin snapshot as well. */
644 if (!refcount_is_zero(&ds
->ds_prev
->ds_longholds
))
645 return (SET_ERROR(EBUSY
));
651 dsl_destroy_head_check(void *arg
, dmu_tx_t
*tx
)
653 dsl_destroy_head_arg_t
*ddha
= arg
;
654 dsl_pool_t
*dp
= dmu_tx_pool(tx
);
658 error
= dsl_dataset_hold(dp
, ddha
->ddha_name
, FTAG
, &ds
);
662 error
= dsl_destroy_head_check_impl(ds
, 0);
663 dsl_dataset_rele(ds
, FTAG
);
668 dsl_dir_destroy_sync(uint64_t ddobj
, dmu_tx_t
*tx
)
671 dsl_pool_t
*dp
= dmu_tx_pool(tx
);
672 objset_t
*mos
= dp
->dp_meta_objset
;
675 ASSERT(RRW_WRITE_HELD(&dmu_tx_pool(tx
)->dp_config_rwlock
));
677 VERIFY0(dsl_dir_hold_obj(dp
, ddobj
, NULL
, FTAG
, &dd
));
679 ASSERT0(dsl_dir_phys(dd
)->dd_head_dataset_obj
);
682 * Decrement the filesystem count for all parent filesystems.
684 * When we receive an incremental stream into a filesystem that already
685 * exists, a temporary clone is created. We never count this temporary
686 * clone, whose name begins with a '%'.
688 if (dd
->dd_myname
[0] != '%' && dd
->dd_parent
!= NULL
)
689 dsl_fs_ss_count_adjust(dd
->dd_parent
, -1,
690 DD_FIELD_FILESYSTEM_COUNT
, tx
);
693 * Remove our reservation. The impl() routine avoids setting the
694 * actual property, which would require the (already destroyed) ds.
696 dsl_dir_set_reservation_sync_impl(dd
, 0, tx
);
698 ASSERT0(dsl_dir_phys(dd
)->dd_used_bytes
);
699 ASSERT0(dsl_dir_phys(dd
)->dd_reserved
);
700 for (t
= 0; t
< DD_USED_NUM
; t
++)
701 ASSERT0(dsl_dir_phys(dd
)->dd_used_breakdown
[t
]);
703 VERIFY0(zap_destroy(mos
, dsl_dir_phys(dd
)->dd_child_dir_zapobj
, tx
));
704 VERIFY0(zap_destroy(mos
, dsl_dir_phys(dd
)->dd_props_zapobj
, tx
));
705 VERIFY0(dsl_deleg_destroy(mos
, dsl_dir_phys(dd
)->dd_deleg_zapobj
, tx
));
706 VERIFY0(zap_remove(mos
,
707 dsl_dir_phys(dd
->dd_parent
)->dd_child_dir_zapobj
,
710 dsl_dir_rele(dd
, FTAG
);
711 dmu_object_free_zapified(mos
, ddobj
, tx
);
715 dsl_destroy_head_sync_impl(dsl_dataset_t
*ds
, dmu_tx_t
*tx
)
717 dsl_pool_t
*dp
= dmu_tx_pool(tx
);
718 objset_t
*mos
= dp
->dp_meta_objset
;
719 uint64_t obj
, ddobj
, prevobj
= 0;
722 ASSERT3U(dsl_dataset_phys(ds
)->ds_num_children
, <=, 1);
723 ASSERT(ds
->ds_prev
== NULL
||
724 dsl_dataset_phys(ds
->ds_prev
)->ds_next_snap_obj
!= ds
->ds_object
);
725 rrw_enter(&ds
->ds_bp_rwlock
, RW_READER
, FTAG
);
726 ASSERT3U(dsl_dataset_phys(ds
)->ds_bp
.blk_birth
, <=, tx
->tx_txg
);
727 rrw_exit(&ds
->ds_bp_rwlock
, FTAG
);
728 ASSERT(RRW_WRITE_HELD(&dp
->dp_config_rwlock
));
730 /* We need to log before removing it from the namespace. */
731 spa_history_log_internal_ds(ds
, "destroy", tx
, "");
733 rmorigin
= (dsl_dir_is_clone(ds
->ds_dir
) &&
734 DS_IS_DEFER_DESTROY(ds
->ds_prev
) &&
735 dsl_dataset_phys(ds
->ds_prev
)->ds_num_children
== 2 &&
736 ds
->ds_prev
->ds_userrefs
== 0);
738 /* Remove our reservation. */
739 if (ds
->ds_reserved
!= 0) {
740 dsl_dataset_set_refreservation_sync_impl(ds
,
741 (ZPROP_SRC_NONE
| ZPROP_SRC_LOCAL
| ZPROP_SRC_RECEIVED
),
743 ASSERT0(ds
->ds_reserved
);
748 for (spa_feature_t f
= 0; f
< SPA_FEATURES
; f
++) {
749 if (ds
->ds_feature_inuse
[f
]) {
750 dsl_dataset_deactivate_feature(obj
, f
, tx
);
751 ds
->ds_feature_inuse
[f
] = B_FALSE
;
755 dsl_scan_ds_destroyed(ds
, tx
);
757 if (dsl_dataset_phys(ds
)->ds_prev_snap_obj
!= 0) {
758 /* This is a clone */
759 ASSERT(ds
->ds_prev
!= NULL
);
760 ASSERT3U(dsl_dataset_phys(ds
->ds_prev
)->ds_next_snap_obj
, !=,
762 ASSERT0(dsl_dataset_phys(ds
)->ds_next_snap_obj
);
764 dmu_buf_will_dirty(ds
->ds_prev
->ds_dbuf
, tx
);
765 if (dsl_dataset_phys(ds
->ds_prev
)->ds_next_clones_obj
!= 0) {
766 dsl_dataset_remove_from_next_clones(ds
->ds_prev
,
770 ASSERT3U(dsl_dataset_phys(ds
->ds_prev
)->ds_num_children
, >, 1);
771 dsl_dataset_phys(ds
->ds_prev
)->ds_num_children
--;
775 * Destroy the deadlist. Unless it's a clone, the
776 * deadlist should be empty. (If it's a clone, it's
777 * safe to ignore the deadlist contents.)
779 dsl_deadlist_close(&ds
->ds_deadlist
);
780 dsl_deadlist_free(mos
, dsl_dataset_phys(ds
)->ds_deadlist_obj
, tx
);
781 dmu_buf_will_dirty(ds
->ds_dbuf
, tx
);
782 dsl_dataset_phys(ds
)->ds_deadlist_obj
= 0;
785 VERIFY0(dmu_objset_from_ds(ds
, &os
));
787 if (!spa_feature_is_enabled(dp
->dp_spa
, SPA_FEATURE_ASYNC_DESTROY
)) {
788 old_synchronous_dataset_destroy(ds
, tx
);
791 * Move the bptree into the pool's list of trees to
792 * clean up and update space accounting information.
794 uint64_t used
, comp
, uncomp
;
796 zil_destroy_sync(dmu_objset_zil(os
), tx
);
798 if (!spa_feature_is_active(dp
->dp_spa
,
799 SPA_FEATURE_ASYNC_DESTROY
)) {
800 dsl_scan_t
*scn
= dp
->dp_scan
;
801 spa_feature_incr(dp
->dp_spa
, SPA_FEATURE_ASYNC_DESTROY
,
803 dp
->dp_bptree_obj
= bptree_alloc(mos
, tx
);
805 DMU_POOL_DIRECTORY_OBJECT
,
806 DMU_POOL_BPTREE_OBJ
, sizeof (uint64_t), 1,
807 &dp
->dp_bptree_obj
, tx
));
808 ASSERT(!scn
->scn_async_destroying
);
809 scn
->scn_async_destroying
= B_TRUE
;
812 used
= dsl_dir_phys(ds
->ds_dir
)->dd_used_bytes
;
813 comp
= dsl_dir_phys(ds
->ds_dir
)->dd_compressed_bytes
;
814 uncomp
= dsl_dir_phys(ds
->ds_dir
)->dd_uncompressed_bytes
;
816 ASSERT(!DS_UNIQUE_IS_ACCURATE(ds
) ||
817 dsl_dataset_phys(ds
)->ds_unique_bytes
== used
);
819 rrw_enter(&ds
->ds_bp_rwlock
, RW_READER
, FTAG
);
820 bptree_add(mos
, dp
->dp_bptree_obj
,
821 &dsl_dataset_phys(ds
)->ds_bp
,
822 dsl_dataset_phys(ds
)->ds_prev_snap_txg
,
823 used
, comp
, uncomp
, tx
);
824 rrw_exit(&ds
->ds_bp_rwlock
, FTAG
);
825 dsl_dir_diduse_space(ds
->ds_dir
, DD_USED_HEAD
,
826 -used
, -comp
, -uncomp
, tx
);
827 dsl_dir_diduse_space(dp
->dp_free_dir
, DD_USED_HEAD
,
828 used
, comp
, uncomp
, tx
);
831 if (ds
->ds_prev
!= NULL
) {
832 if (spa_version(dp
->dp_spa
) >= SPA_VERSION_DIR_CLONES
) {
833 VERIFY0(zap_remove_int(mos
,
834 dsl_dir_phys(ds
->ds_prev
->ds_dir
)->dd_clones
,
837 prevobj
= ds
->ds_prev
->ds_object
;
838 dsl_dataset_rele(ds
->ds_prev
, ds
);
843 * This must be done after the dsl_traverse(), because it will
844 * re-open the objset.
847 dmu_objset_evict(ds
->ds_objset
);
848 ds
->ds_objset
= NULL
;
851 /* Erase the link in the dir */
852 dmu_buf_will_dirty(ds
->ds_dir
->dd_dbuf
, tx
);
853 dsl_dir_phys(ds
->ds_dir
)->dd_head_dataset_obj
= 0;
854 ddobj
= ds
->ds_dir
->dd_object
;
855 ASSERT(dsl_dataset_phys(ds
)->ds_snapnames_zapobj
!= 0);
856 VERIFY0(zap_destroy(mos
,
857 dsl_dataset_phys(ds
)->ds_snapnames_zapobj
, tx
));
859 if (ds
->ds_bookmarks
!= 0) {
860 VERIFY0(zap_destroy(mos
, ds
->ds_bookmarks
, tx
));
861 spa_feature_decr(dp
->dp_spa
, SPA_FEATURE_BOOKMARKS
, tx
);
864 spa_prop_clear_bootfs(dp
->dp_spa
, ds
->ds_object
, tx
);
866 ASSERT0(dsl_dataset_phys(ds
)->ds_next_clones_obj
);
867 ASSERT0(dsl_dataset_phys(ds
)->ds_props_obj
);
868 ASSERT0(dsl_dataset_phys(ds
)->ds_userrefs_obj
);
869 dsl_dir_rele(ds
->ds_dir
, ds
);
871 dmu_object_free_zapified(mos
, obj
, tx
);
873 dsl_dir_destroy_sync(ddobj
, tx
);
877 VERIFY0(dsl_dataset_hold_obj(dp
, prevobj
, FTAG
, &prev
));
878 dsl_destroy_snapshot_sync_impl(prev
, B_FALSE
, tx
);
879 dsl_dataset_rele(prev
, FTAG
);
884 dsl_destroy_head_sync(void *arg
, dmu_tx_t
*tx
)
886 dsl_destroy_head_arg_t
*ddha
= arg
;
887 dsl_pool_t
*dp
= dmu_tx_pool(tx
);
890 VERIFY0(dsl_dataset_hold(dp
, ddha
->ddha_name
, FTAG
, &ds
));
891 dsl_destroy_head_sync_impl(ds
, tx
);
892 dsl_dataset_rele(ds
, FTAG
);
896 dsl_destroy_head_begin_sync(void *arg
, dmu_tx_t
*tx
)
898 dsl_destroy_head_arg_t
*ddha
= arg
;
899 dsl_pool_t
*dp
= dmu_tx_pool(tx
);
902 VERIFY0(dsl_dataset_hold(dp
, ddha
->ddha_name
, FTAG
, &ds
));
904 /* Mark it as inconsistent on-disk, in case we crash */
905 dmu_buf_will_dirty(ds
->ds_dbuf
, tx
);
906 dsl_dataset_phys(ds
)->ds_flags
|= DS_FLAG_INCONSISTENT
;
908 spa_history_log_internal_ds(ds
, "destroy begin", tx
, "");
909 dsl_dataset_rele(ds
, FTAG
);
913 dsl_destroy_head(const char *name
)
915 dsl_destroy_head_arg_t ddha
;
921 zfs_destroy_unmount_origin(name
);
924 error
= spa_open(name
, &spa
, FTAG
);
927 isenabled
= spa_feature_is_enabled(spa
, SPA_FEATURE_ASYNC_DESTROY
);
928 spa_close(spa
, FTAG
);
930 ddha
.ddha_name
= name
;
935 error
= dsl_sync_task(name
, dsl_destroy_head_check
,
936 dsl_destroy_head_begin_sync
, &ddha
,
937 0, ZFS_SPACE_CHECK_NONE
);
942 * Head deletion is processed in one txg on old pools;
943 * remove the objects from open context so that the txg sync
946 error
= dmu_objset_own(name
, DMU_OST_ANY
, B_FALSE
, FTAG
, &os
);
948 uint64_t prev_snap_txg
=
949 dsl_dataset_phys(dmu_objset_ds(os
))->
951 for (uint64_t obj
= 0; error
== 0;
952 error
= dmu_object_next(os
, &obj
, FALSE
,
954 (void) dmu_free_long_object(os
, obj
);
955 /* sync out all frees */
956 txg_wait_synced(dmu_objset_pool(os
), 0);
957 dmu_objset_disown(os
, FTAG
);
961 return (dsl_sync_task(name
, dsl_destroy_head_check
,
962 dsl_destroy_head_sync
, &ddha
, 0, ZFS_SPACE_CHECK_NONE
));
966 * Note, this function is used as the callback for dmu_objset_find(). We
967 * always return 0 so that we will continue to find and process
968 * inconsistent datasets, even if we encounter an error trying to
969 * process one of them.
973 dsl_destroy_inconsistent(const char *dsname
, void *arg
)
977 if (dmu_objset_hold(dsname
, FTAG
, &os
) == 0) {
978 boolean_t need_destroy
= DS_IS_INCONSISTENT(dmu_objset_ds(os
));
981 * If the dataset is inconsistent because a resumable receive
982 * has failed, then do not destroy it.
984 if (dsl_dataset_has_resume_receive_state(dmu_objset_ds(os
)))
985 need_destroy
= B_FALSE
;
987 dmu_objset_rele(os
, FTAG
);
989 (void) dsl_destroy_head(dsname
);