1 /* 2 * CDDL HEADER START 3 * 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. 7 * 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. 12 * 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] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. 23 * Copyright (c) 2013 by Delphix. All rights reserved. 24 * Copyright (c) 2012, Joyent, Inc. All rights reserved. 25 */ 26 27 #include <sys/dmu_objset.h> 28 #include <sys/dsl_dataset.h> 29 #include <sys/dsl_dir.h> 30 #include <sys/dsl_prop.h> 31 #include <sys/dsl_synctask.h> 32 #include <sys/dmu_traverse.h> 33 #include <sys/dmu_impl.h> 34 #include <sys/dmu_tx.h> 35 #include <sys/arc.h> 36 #include <sys/zio.h> 37 #include <sys/zap.h> 38 #include <sys/zfeature.h> 39 #include <sys/unique.h> 40 #include <sys/zfs_context.h> 41 #include <sys/zfs_ioctl.h> 42 #include <sys/spa.h> 43 #include <sys/zfs_znode.h> 44 #include <sys/zfs_onexit.h> 45 #include <sys/zvol.h> 46 #include <sys/dsl_scan.h> 47 #include <sys/dsl_deadlist.h> 48 #include <sys/dsl_destroy.h> 49 #include <sys/dsl_userhold.h> 50 51 #define SWITCH64(x, y) \ 52 { \ 53 uint64_t __tmp = (x); \ 54 (x) = (y); \ 55 (y) = __tmp; \ 56 } 57 58 #define DS_REF_MAX (1ULL << 62) 59 60 #define DSL_DEADLIST_BLOCKSIZE SPA_MAXBLOCKSIZE 61 62 /* 63 * Figure out how much of this delta should be propogated to the dsl_dir 64 * layer. If there's a refreservation, that space has already been 65 * partially accounted for in our ancestors. 66 */ 67 static int64_t 68 parent_delta(dsl_dataset_t *ds, int64_t delta) 69 { 70 uint64_t old_bytes, new_bytes; 71 72 if (ds->ds_reserved == 0) 73 return (delta); 74 75 old_bytes = MAX(ds->ds_phys->ds_unique_bytes, ds->ds_reserved); 76 new_bytes = MAX(ds->ds_phys->ds_unique_bytes + delta, ds->ds_reserved); 77 78 ASSERT3U(ABS((int64_t)(new_bytes - old_bytes)), <=, ABS(delta)); 79 return (new_bytes - old_bytes); 80 } 81 82 void 83 dsl_dataset_block_born(dsl_dataset_t *ds, const blkptr_t *bp, dmu_tx_t *tx) 84 { 85 int used = bp_get_dsize_sync(tx->tx_pool->dp_spa, bp); 86 int compressed = BP_GET_PSIZE(bp); 87 int uncompressed = BP_GET_UCSIZE(bp); 88 int64_t delta; 89 90 dprintf_bp(bp, "ds=%p", ds); 91 92 ASSERT(dmu_tx_is_syncing(tx)); 93 /* It could have been compressed away to nothing */ 94 if (BP_IS_HOLE(bp)) 95 return; 96 ASSERT(BP_GET_TYPE(bp) != DMU_OT_NONE); 97 ASSERT(DMU_OT_IS_VALID(BP_GET_TYPE(bp))); 98 if (ds == NULL) { 99 dsl_pool_mos_diduse_space(tx->tx_pool, 100 used, compressed, uncompressed); 101 return; 102 } 103 dmu_buf_will_dirty(ds->ds_dbuf, tx); 104 105 mutex_enter(&ds->ds_dir->dd_lock); 106 mutex_enter(&ds->ds_lock); 107 delta = parent_delta(ds, used); 108 ds->ds_phys->ds_referenced_bytes += used; 109 ds->ds_phys->ds_compressed_bytes += compressed; 110 ds->ds_phys->ds_uncompressed_bytes += uncompressed; 111 ds->ds_phys->ds_unique_bytes += used; 112 mutex_exit(&ds->ds_lock); 113 dsl_dir_diduse_space(ds->ds_dir, DD_USED_HEAD, delta, 114 compressed, uncompressed, tx); 115 dsl_dir_transfer_space(ds->ds_dir, used - delta, 116 DD_USED_REFRSRV, DD_USED_HEAD, tx); 117 mutex_exit(&ds->ds_dir->dd_lock); 118 } 119 120 int 121 dsl_dataset_block_kill(dsl_dataset_t *ds, const blkptr_t *bp, dmu_tx_t *tx, 122 boolean_t async) 123 { 124 if (BP_IS_HOLE(bp)) 125 return (0); 126 127 ASSERT(dmu_tx_is_syncing(tx)); 128 ASSERT(bp->blk_birth <= tx->tx_txg); 129 130 int used = bp_get_dsize_sync(tx->tx_pool->dp_spa, bp); 131 int compressed = BP_GET_PSIZE(bp); 132 int uncompressed = BP_GET_UCSIZE(bp); 133 134 ASSERT(used > 0); 135 if (ds == NULL) { 136 dsl_free(tx->tx_pool, tx->tx_txg, bp); 137 dsl_pool_mos_diduse_space(tx->tx_pool, 138 -used, -compressed, -uncompressed); 139 return (used); 140 } 141 ASSERT3P(tx->tx_pool, ==, ds->ds_dir->dd_pool); 142 143 ASSERT(!dsl_dataset_is_snapshot(ds)); 144 dmu_buf_will_dirty(ds->ds_dbuf, tx); 145 146 if (bp->blk_birth > ds->ds_phys->ds_prev_snap_txg) { 147 int64_t delta; 148 149 dprintf_bp(bp, "freeing ds=%llu", ds->ds_object); 150 dsl_free(tx->tx_pool, tx->tx_txg, bp); 151 152 mutex_enter(&ds->ds_dir->dd_lock); 153 mutex_enter(&ds->ds_lock); 154 ASSERT(ds->ds_phys->ds_unique_bytes >= used || 155 !DS_UNIQUE_IS_ACCURATE(ds)); 156 delta = parent_delta(ds, -used); 157 ds->ds_phys->ds_unique_bytes -= used; 158 mutex_exit(&ds->ds_lock); 159 dsl_dir_diduse_space(ds->ds_dir, DD_USED_HEAD, 160 delta, -compressed, -uncompressed, tx); 161 dsl_dir_transfer_space(ds->ds_dir, -used - delta, 162 DD_USED_REFRSRV, DD_USED_HEAD, tx); 163 mutex_exit(&ds->ds_dir->dd_lock); 164 } else { 165 dprintf_bp(bp, "putting on dead list: %s", ""); 166 if (async) { 167 /* 168 * We are here as part of zio's write done callback, 169 * which means we're a zio interrupt thread. We can't 170 * call dsl_deadlist_insert() now because it may block 171 * waiting for I/O. Instead, put bp on the deferred 172 * queue and let dsl_pool_sync() finish the job. 173 */ 174 bplist_append(&ds->ds_pending_deadlist, bp); 175 } else { 176 dsl_deadlist_insert(&ds->ds_deadlist, bp, tx); 177 } 178 ASSERT3U(ds->ds_prev->ds_object, ==, 179 ds->ds_phys->ds_prev_snap_obj); 180 ASSERT(ds->ds_prev->ds_phys->ds_num_children > 0); 181 /* if (bp->blk_birth > prev prev snap txg) prev unique += bs */ 182 if (ds->ds_prev->ds_phys->ds_next_snap_obj == 183 ds->ds_object && bp->blk_birth > 184 ds->ds_prev->ds_phys->ds_prev_snap_txg) { 185 dmu_buf_will_dirty(ds->ds_prev->ds_dbuf, tx); 186 mutex_enter(&ds->ds_prev->ds_lock); 187 ds->ds_prev->ds_phys->ds_unique_bytes += used; 188 mutex_exit(&ds->ds_prev->ds_lock); 189 } 190 if (bp->blk_birth > ds->ds_dir->dd_origin_txg) { 191 dsl_dir_transfer_space(ds->ds_dir, used, 192 DD_USED_HEAD, DD_USED_SNAP, tx); 193 } 194 } 195 mutex_enter(&ds->ds_lock); 196 ASSERT3U(ds->ds_phys->ds_referenced_bytes, >=, used); 197 ds->ds_phys->ds_referenced_bytes -= used; 198 ASSERT3U(ds->ds_phys->ds_compressed_bytes, >=, compressed); 199 ds->ds_phys->ds_compressed_bytes -= compressed; 200 ASSERT3U(ds->ds_phys->ds_uncompressed_bytes, >=, uncompressed); 201 ds->ds_phys->ds_uncompressed_bytes -= uncompressed; 202 mutex_exit(&ds->ds_lock); 203 204 return (used); 205 } 206 207 uint64_t 208 dsl_dataset_prev_snap_txg(dsl_dataset_t *ds) 209 { 210 uint64_t trysnap = 0; 211 212 if (ds == NULL) 213 return (0); 214 /* 215 * The snapshot creation could fail, but that would cause an 216 * incorrect FALSE return, which would only result in an 217 * overestimation of the amount of space that an operation would 218 * consume, which is OK. 219 * 220 * There's also a small window where we could miss a pending 221 * snapshot, because we could set the sync task in the quiescing 222 * phase. So this should only be used as a guess. 223 */ 224 if (ds->ds_trysnap_txg > 225 spa_last_synced_txg(ds->ds_dir->dd_pool->dp_spa)) 226 trysnap = ds->ds_trysnap_txg; 227 return (MAX(ds->ds_phys->ds_prev_snap_txg, trysnap)); 228 } 229 230 boolean_t 231 dsl_dataset_block_freeable(dsl_dataset_t *ds, const blkptr_t *bp, 232 uint64_t blk_birth) 233 { 234 if (blk_birth <= dsl_dataset_prev_snap_txg(ds)) 235 return (B_FALSE); 236 237 ddt_prefetch(dsl_dataset_get_spa(ds), bp); 238 239 return (B_TRUE); 240 } 241 242 /* ARGSUSED */ 243 static void 244 dsl_dataset_evict_impl(dsl_dataset_t *ds, boolean_t evict_deadlist) 245 { 246 247 ASSERT(ds->ds_owner == NULL); 248 249 ds->ds_dbuf = NULL; 250 251 unique_remove(ds->ds_fsid_guid); 252 253 if (ds->ds_objset != NULL) 254 dmu_objset_evict(ds->ds_objset); 255 256 if (ds->ds_prev) { 257 dsl_dataset_rele(ds->ds_prev, ds); 258 ds->ds_prev = NULL; 259 } 260 261 bplist_destroy(&ds->ds_pending_deadlist); 262 if (evict_deadlist) 263 dsl_deadlist_close(&ds->ds_deadlist); 264 if (ds->ds_dir) 265 dsl_dir_rele(ds->ds_dir, ds); 266 267 ASSERT(!list_link_active(&ds->ds_synced_link)); 268 269 mutex_destroy(&ds->ds_lock); 270 mutex_destroy(&ds->ds_opening_lock); 271 refcount_destroy(&ds->ds_longholds); 272 273 kmem_free(ds, sizeof (dsl_dataset_t)); 274 } 275 276 /* ARGSUSED */ 277 static void 278 dsl_dataset_evict(dmu_buf_user_t *dbu) 279 { 280 dsl_dataset_evict_impl((dsl_dataset_t *)dbu, B_TRUE); 281 } 282 283 int 284 dsl_dataset_get_snapname(dsl_dataset_t *ds) 285 { 286 dsl_dataset_phys_t *headphys; 287 int err; 288 dmu_buf_t *headdbuf; 289 dsl_pool_t *dp = ds->ds_dir->dd_pool; 290 objset_t *mos = dp->dp_meta_objset; 291 292 if (ds->ds_snapname[0]) 293 return (0); 294 if (ds->ds_phys->ds_next_snap_obj == 0) 295 return (0); 296 297 err = dmu_bonus_hold(mos, ds->ds_dir->dd_phys->dd_head_dataset_obj, 298 FTAG, &headdbuf); 299 if (err != 0) 300 return (err); 301 headphys = headdbuf->db_data; 302 err = zap_value_search(dp->dp_meta_objset, 303 headphys->ds_snapnames_zapobj, ds->ds_object, 0, ds->ds_snapname); 304 dmu_buf_rele(headdbuf, FTAG); 305 return (err); 306 } 307 308 int 309 dsl_dataset_snap_lookup(dsl_dataset_t *ds, const char *name, uint64_t *value) 310 { 311 objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset; 312 uint64_t snapobj = ds->ds_phys->ds_snapnames_zapobj; 313 matchtype_t mt; 314 int err; 315 316 if (ds->ds_phys->ds_flags & DS_FLAG_CI_DATASET) 317 mt = MT_FIRST; 318 else 319 mt = MT_EXACT; 320 321 err = zap_lookup_norm(mos, snapobj, name, 8, 1, 322 value, mt, NULL, 0, NULL); 323 if (err == ENOTSUP && mt == MT_FIRST) 324 err = zap_lookup(mos, snapobj, name, 8, 1, value); 325 return (err); 326 } 327 328 int 329 dsl_dataset_snap_remove(dsl_dataset_t *ds, const char *name, dmu_tx_t *tx) 330 { 331 objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset; 332 uint64_t snapobj = ds->ds_phys->ds_snapnames_zapobj; 333 matchtype_t mt; 334 int err; 335 336 dsl_dir_snap_cmtime_update(ds->ds_dir); 337 338 if (ds->ds_phys->ds_flags & DS_FLAG_CI_DATASET) 339 mt = MT_FIRST; 340 else 341 mt = MT_EXACT; 342 343 err = zap_remove_norm(mos, snapobj, name, mt, tx); 344 if (err == ENOTSUP && mt == MT_FIRST) 345 err = zap_remove(mos, snapobj, name, tx); 346 return (err); 347 } 348 349 int 350 dsl_dataset_hold_obj(dsl_pool_t *dp, uint64_t dsobj, void *tag, 351 dsl_dataset_t **dsp) 352 { 353 objset_t *mos = dp->dp_meta_objset; 354 dmu_buf_t *dbuf; 355 dsl_dataset_t *ds; 356 int err; 357 dmu_object_info_t doi; 358 359 ASSERT(dsl_pool_config_held(dp)); 360 361 err = dmu_bonus_hold(mos, dsobj, tag, &dbuf); 362 if (err != 0) 363 return (err); 364 365 /* Make sure dsobj has the correct object type. */ 366 dmu_object_info_from_db(dbuf, &doi); 367 if (doi.doi_type != DMU_OT_DSL_DATASET) 368 return (SET_ERROR(EINVAL)); 369 370 ds = (dsl_dataset_t *)dmu_buf_get_user(dbuf); 371 if (ds == NULL) { 372 dsl_dataset_t *winner = NULL; 373 374 ds = kmem_zalloc(sizeof (dsl_dataset_t), KM_SLEEP); 375 ds->ds_dbuf = dbuf; 376 ds->ds_object = dsobj; 377 378 mutex_init(&ds->ds_lock, NULL, MUTEX_DEFAULT, NULL); 379 mutex_init(&ds->ds_opening_lock, NULL, MUTEX_DEFAULT, NULL); 380 mutex_init(&ds->ds_sendstream_lock, NULL, MUTEX_DEFAULT, NULL); 381 refcount_create(&ds->ds_longholds); 382 383 bplist_create(&ds->ds_pending_deadlist); 384 dsl_deadlist_open(&ds->ds_deadlist, 385 mos, ds->ds_phys->ds_deadlist_obj); 386 387 list_create(&ds->ds_sendstreams, sizeof (dmu_sendarg_t), 388 offsetof(dmu_sendarg_t, dsa_link)); 389 390 if (err == 0) { 391 err = dsl_dir_hold_obj(dp, 392 ds->ds_phys->ds_dir_obj, NULL, ds, &ds->ds_dir); 393 } 394 if (err != 0) { 395 mutex_destroy(&ds->ds_lock); 396 mutex_destroy(&ds->ds_opening_lock); 397 refcount_destroy(&ds->ds_longholds); 398 bplist_destroy(&ds->ds_pending_deadlist); 399 dsl_deadlist_close(&ds->ds_deadlist); 400 kmem_free(ds, sizeof (dsl_dataset_t)); 401 dmu_buf_rele(dbuf, tag); 402 return (err); 403 } 404 405 if (!dsl_dataset_is_snapshot(ds)) { 406 ds->ds_snapname[0] = '\0'; 407 if (ds->ds_phys->ds_prev_snap_obj != 0) { 408 err = dsl_dataset_hold_obj(dp, 409 ds->ds_phys->ds_prev_snap_obj, 410 ds, &ds->ds_prev); 411 } 412 } else { 413 if (zfs_flags & ZFS_DEBUG_SNAPNAMES) 414 err = dsl_dataset_get_snapname(ds); 415 if (err == 0 && ds->ds_phys->ds_userrefs_obj != 0) { 416 err = zap_count( 417 ds->ds_dir->dd_pool->dp_meta_objset, 418 ds->ds_phys->ds_userrefs_obj, 419 &ds->ds_userrefs); 420 } 421 } 422 423 if (err == 0 && !dsl_dataset_is_snapshot(ds)) { 424 err = dsl_prop_get_int_ds(ds, 425 zfs_prop_to_name(ZFS_PROP_REFRESERVATION), 426 &ds->ds_reserved); 427 if (err == 0) { 428 err = dsl_prop_get_int_ds(ds, 429 zfs_prop_to_name(ZFS_PROP_REFQUOTA), 430 &ds->ds_quota); 431 } 432 } else { 433 ds->ds_reserved = ds->ds_quota = 0; 434 } 435 436 dmu_buf_init_user(&ds->db_evict, dsl_dataset_evict); 437 if (err == 0) 438 winner = (dsl_dataset_t *) 439 dmu_buf_set_user_ie(dbuf, &ds->db_evict); 440 441 if (err || winner) { 442 bplist_destroy(&ds->ds_pending_deadlist); 443 dsl_deadlist_close(&ds->ds_deadlist); 444 if (ds->ds_prev) 445 dsl_dataset_rele(ds->ds_prev, ds); 446 dsl_dir_rele(ds->ds_dir, ds); 447 mutex_destroy(&ds->ds_lock); 448 mutex_destroy(&ds->ds_opening_lock); 449 refcount_destroy(&ds->ds_longholds); 450 kmem_free(ds, sizeof (dsl_dataset_t)); 451 if (err != 0) { 452 dmu_buf_rele(dbuf, tag); 453 return (err); 454 } 455 ds = winner; 456 } else { 457 ds->ds_fsid_guid = 458 unique_insert(ds->ds_phys->ds_fsid_guid); 459 } 460 } 461 ASSERT3P(ds->ds_dbuf, ==, dbuf); 462 ASSERT3P(ds->ds_phys, ==, dbuf->db_data); 463 ASSERT(ds->ds_phys->ds_prev_snap_obj != 0 || 464 spa_version(dp->dp_spa) < SPA_VERSION_ORIGIN || 465 dp->dp_origin_snap == NULL || ds == dp->dp_origin_snap); 466 *dsp = ds; 467 return (0); 468 } 469 470 int 471 dsl_dataset_hold(dsl_pool_t *dp, const char *name, 472 void *tag, dsl_dataset_t **dsp) 473 { 474 dsl_dir_t *dd; 475 const char *snapname; 476 uint64_t obj; 477 int err = 0; 478 479 err = dsl_dir_hold(dp, name, FTAG, &dd, &snapname); 480 if (err != 0) 481 return (err); 482 483 ASSERT(dsl_pool_config_held(dp)); 484 obj = dd->dd_phys->dd_head_dataset_obj; 485 if (obj != 0) 486 err = dsl_dataset_hold_obj(dp, obj, tag, dsp); 487 else 488 err = SET_ERROR(ENOENT); 489 490 /* we may be looking for a snapshot */ 491 if (err == 0 && snapname != NULL) { 492 dsl_dataset_t *ds; 493 494 if (*snapname++ != '@') { 495 dsl_dataset_rele(*dsp, tag); 496 dsl_dir_rele(dd, FTAG); 497 return (SET_ERROR(ENOENT)); 498 } 499 500 dprintf("looking for snapshot '%s'\n", snapname); 501 err = dsl_dataset_snap_lookup(*dsp, snapname, &obj); 502 if (err == 0) 503 err = dsl_dataset_hold_obj(dp, obj, tag, &ds); 504 dsl_dataset_rele(*dsp, tag); 505 506 if (err == 0) { 507 mutex_enter(&ds->ds_lock); 508 if (ds->ds_snapname[0] == 0) 509 (void) strlcpy(ds->ds_snapname, snapname, 510 sizeof (ds->ds_snapname)); 511 mutex_exit(&ds->ds_lock); 512 *dsp = ds; 513 } 514 } 515 516 dsl_dir_rele(dd, FTAG); 517 return (err); 518 } 519 520 int 521 dsl_dataset_own_obj(dsl_pool_t *dp, uint64_t dsobj, 522 void *tag, dsl_dataset_t **dsp) 523 { 524 int err = dsl_dataset_hold_obj(dp, dsobj, tag, dsp); 525 if (err != 0) 526 return (err); 527 if (!dsl_dataset_tryown(*dsp, tag)) { 528 dsl_dataset_rele(*dsp, tag); 529 *dsp = NULL; 530 return (SET_ERROR(EBUSY)); 531 } 532 return (0); 533 } 534 535 int 536 dsl_dataset_own(dsl_pool_t *dp, const char *name, 537 void *tag, dsl_dataset_t **dsp) 538 { 539 int err = dsl_dataset_hold(dp, name, tag, dsp); 540 if (err != 0) 541 return (err); 542 if (!dsl_dataset_tryown(*dsp, tag)) { 543 dsl_dataset_rele(*dsp, tag); 544 return (SET_ERROR(EBUSY)); 545 } 546 return (0); 547 } 548 549 /* 550 * See the comment above dsl_pool_hold() for details. In summary, a long 551 * hold is used to prevent destruction of a dataset while the pool hold 552 * is dropped, allowing other concurrent operations (e.g. spa_sync()). 553 * 554 * The dataset and pool must be held when this function is called. After it 555 * is called, the pool hold may be released while the dataset is still held 556 * and accessed. 557 */ 558 void 559 dsl_dataset_long_hold(dsl_dataset_t *ds, void *tag) 560 { 561 ASSERT(dsl_pool_config_held(ds->ds_dir->dd_pool)); 562 (void) refcount_add(&ds->ds_longholds, tag); 563 } 564 565 void 566 dsl_dataset_long_rele(dsl_dataset_t *ds, void *tag) 567 { 568 (void) refcount_remove(&ds->ds_longholds, tag); 569 } 570 571 /* Return B_TRUE if there are any long holds on this dataset. */ 572 boolean_t 573 dsl_dataset_long_held(dsl_dataset_t *ds) 574 { 575 return (!refcount_is_zero(&ds->ds_longholds)); 576 } 577 578 void 579 dsl_dataset_name(dsl_dataset_t *ds, char *name) 580 { 581 if (ds == NULL) { 582 (void) strcpy(name, "mos"); 583 } else { 584 dsl_dir_name(ds->ds_dir, name); 585 VERIFY0(dsl_dataset_get_snapname(ds)); 586 if (ds->ds_snapname[0]) { 587 (void) strcat(name, "@"); 588 /* 589 * We use a "recursive" mutex so that we 590 * can call dprintf_ds() with ds_lock held. 591 */ 592 if (!MUTEX_HELD(&ds->ds_lock)) { 593 mutex_enter(&ds->ds_lock); 594 (void) strcat(name, ds->ds_snapname); 595 mutex_exit(&ds->ds_lock); 596 } else { 597 (void) strcat(name, ds->ds_snapname); 598 } 599 } 600 } 601 } 602 603 static int 604 dsl_dataset_namelen(dsl_dataset_t *ds) 605 { 606 int result; 607 608 if (ds == NULL) { 609 result = 3; /* "mos" */ 610 } else { 611 result = dsl_dir_namelen(ds->ds_dir); 612 VERIFY0(dsl_dataset_get_snapname(ds)); 613 if (ds->ds_snapname[0]) { 614 ++result; /* adding one for the @-sign */ 615 if (!MUTEX_HELD(&ds->ds_lock)) { 616 mutex_enter(&ds->ds_lock); 617 result += strlen(ds->ds_snapname); 618 mutex_exit(&ds->ds_lock); 619 } else { 620 result += strlen(ds->ds_snapname); 621 } 622 } 623 } 624 625 return (result); 626 } 627 628 void 629 dsl_dataset_rele(dsl_dataset_t *ds, void *tag) 630 { 631 dmu_buf_rele(ds->ds_dbuf, tag); 632 } 633 634 void 635 dsl_dataset_disown(dsl_dataset_t *ds, void *tag) 636 { 637 ASSERT(ds->ds_owner == tag && ds->ds_dbuf != NULL); 638 639 mutex_enter(&ds->ds_lock); 640 ds->ds_owner = NULL; 641 mutex_exit(&ds->ds_lock); 642 dsl_dataset_long_rele(ds, tag); 643 if (ds->ds_dbuf != NULL) 644 dsl_dataset_rele(ds, tag); 645 else 646 dsl_dataset_evict_impl(ds, B_FALSE); 647 } 648 649 boolean_t 650 dsl_dataset_tryown(dsl_dataset_t *ds, void *tag) 651 { 652 boolean_t gotit = FALSE; 653 654 mutex_enter(&ds->ds_lock); 655 if (ds->ds_owner == NULL && !DS_IS_INCONSISTENT(ds)) { 656 ds->ds_owner = tag; 657 dsl_dataset_long_hold(ds, tag); 658 gotit = TRUE; 659 } 660 mutex_exit(&ds->ds_lock); 661 return (gotit); 662 } 663 664 uint64_t 665 dsl_dataset_create_sync_dd(dsl_dir_t *dd, dsl_dataset_t *origin, 666 uint64_t flags, dmu_tx_t *tx) 667 { 668 dsl_pool_t *dp = dd->dd_pool; 669 dmu_buf_t *dbuf; 670 dsl_dataset_phys_t *dsphys; 671 uint64_t dsobj; 672 objset_t *mos = dp->dp_meta_objset; 673 674 if (origin == NULL) 675 origin = dp->dp_origin_snap; 676 677 ASSERT(origin == NULL || origin->ds_dir->dd_pool == dp); 678 ASSERT(origin == NULL || origin->ds_phys->ds_num_children > 0); 679 ASSERT(dmu_tx_is_syncing(tx)); 680 ASSERT(dd->dd_phys->dd_head_dataset_obj == 0); 681 682 dsobj = dmu_object_alloc(mos, DMU_OT_DSL_DATASET, 0, 683 DMU_OT_DSL_DATASET, sizeof (dsl_dataset_phys_t), tx); 684 VERIFY0(dmu_bonus_hold(mos, dsobj, FTAG, &dbuf)); 685 dmu_buf_will_dirty(dbuf, tx); 686 dsphys = dbuf->db_data; 687 bzero(dsphys, sizeof (dsl_dataset_phys_t)); 688 dsphys->ds_dir_obj = dd->dd_object; 689 dsphys->ds_flags = flags; 690 dsphys->ds_fsid_guid = unique_create(); 691 (void) random_get_pseudo_bytes((void*)&dsphys->ds_guid, 692 sizeof (dsphys->ds_guid)); 693 dsphys->ds_snapnames_zapobj = 694 zap_create_norm(mos, U8_TEXTPREP_TOUPPER, DMU_OT_DSL_DS_SNAP_MAP, 695 DMU_OT_NONE, 0, tx); 696 dsphys->ds_creation_time = gethrestime_sec(); 697 dsphys->ds_creation_txg = tx->tx_txg == TXG_INITIAL ? 1 : tx->tx_txg; 698 699 if (origin == NULL) { 700 dsphys->ds_deadlist_obj = dsl_deadlist_alloc(mos, tx); 701 } else { 702 dsl_dataset_t *ohds; /* head of the origin snapshot */ 703 704 dsphys->ds_prev_snap_obj = origin->ds_object; 705 dsphys->ds_prev_snap_txg = 706 origin->ds_phys->ds_creation_txg; 707 dsphys->ds_referenced_bytes = 708 origin->ds_phys->ds_referenced_bytes; 709 dsphys->ds_compressed_bytes = 710 origin->ds_phys->ds_compressed_bytes; 711 dsphys->ds_uncompressed_bytes = 712 origin->ds_phys->ds_uncompressed_bytes; 713 dsphys->ds_bp = origin->ds_phys->ds_bp; 714 dsphys->ds_flags |= origin->ds_phys->ds_flags; 715 716 dmu_buf_will_dirty(origin->ds_dbuf, tx); 717 origin->ds_phys->ds_num_children++; 718 719 VERIFY0(dsl_dataset_hold_obj(dp, 720 origin->ds_dir->dd_phys->dd_head_dataset_obj, FTAG, &ohds)); 721 dsphys->ds_deadlist_obj = dsl_deadlist_clone(&ohds->ds_deadlist, 722 dsphys->ds_prev_snap_txg, dsphys->ds_prev_snap_obj, tx); 723 dsl_dataset_rele(ohds, FTAG); 724 725 if (spa_version(dp->dp_spa) >= SPA_VERSION_NEXT_CLONES) { 726 if (origin->ds_phys->ds_next_clones_obj == 0) { 727 origin->ds_phys->ds_next_clones_obj = 728 zap_create(mos, 729 DMU_OT_NEXT_CLONES, DMU_OT_NONE, 0, tx); 730 } 731 VERIFY0(zap_add_int(mos, 732 origin->ds_phys->ds_next_clones_obj, dsobj, tx)); 733 } 734 735 dmu_buf_will_dirty(dd->dd_dbuf, tx); 736 dd->dd_phys->dd_origin_obj = origin->ds_object; 737 if (spa_version(dp->dp_spa) >= SPA_VERSION_DIR_CLONES) { 738 if (origin->ds_dir->dd_phys->dd_clones == 0) { 739 dmu_buf_will_dirty(origin->ds_dir->dd_dbuf, tx); 740 origin->ds_dir->dd_phys->dd_clones = 741 zap_create(mos, 742 DMU_OT_DSL_CLONES, DMU_OT_NONE, 0, tx); 743 } 744 VERIFY0(zap_add_int(mos, 745 origin->ds_dir->dd_phys->dd_clones, dsobj, tx)); 746 } 747 } 748 749 if (spa_version(dp->dp_spa) >= SPA_VERSION_UNIQUE_ACCURATE) 750 dsphys->ds_flags |= DS_FLAG_UNIQUE_ACCURATE; 751 752 dmu_buf_rele(dbuf, FTAG); 753 754 dmu_buf_will_dirty(dd->dd_dbuf, tx); 755 dd->dd_phys->dd_head_dataset_obj = dsobj; 756 757 return (dsobj); 758 } 759 760 static void 761 dsl_dataset_zero_zil(dsl_dataset_t *ds, dmu_tx_t *tx) 762 { 763 objset_t *os; 764 765 VERIFY0(dmu_objset_from_ds(ds, &os)); 766 bzero(&os->os_zil_header, sizeof (os->os_zil_header)); 767 dsl_dataset_dirty(ds, tx); 768 } 769 770 uint64_t 771 dsl_dataset_create_sync(dsl_dir_t *pdd, const char *lastname, 772 dsl_dataset_t *origin, uint64_t flags, cred_t *cr, dmu_tx_t *tx) 773 { 774 dsl_pool_t *dp = pdd->dd_pool; 775 uint64_t dsobj, ddobj; 776 dsl_dir_t *dd; 777 778 ASSERT(dmu_tx_is_syncing(tx)); 779 ASSERT(lastname[0] != '@'); 780 781 ddobj = dsl_dir_create_sync(dp, pdd, lastname, tx); 782 VERIFY0(dsl_dir_hold_obj(dp, ddobj, lastname, FTAG, &dd)); 783 784 dsobj = dsl_dataset_create_sync_dd(dd, origin, 785 flags & ~DS_CREATE_FLAG_NODIRTY, tx); 786 787 dsl_deleg_set_create_perms(dd, tx, cr); 788 789 dsl_dir_rele(dd, FTAG); 790 791 /* 792 * If we are creating a clone, make sure we zero out any stale 793 * data from the origin snapshots zil header. 794 */ 795 if (origin != NULL && !(flags & DS_CREATE_FLAG_NODIRTY)) { 796 dsl_dataset_t *ds; 797 798 VERIFY0(dsl_dataset_hold_obj(dp, dsobj, FTAG, &ds)); 799 dsl_dataset_zero_zil(ds, tx); 800 dsl_dataset_rele(ds, FTAG); 801 } 802 803 return (dsobj); 804 } 805 806 /* 807 * The unique space in the head dataset can be calculated by subtracting 808 * the space used in the most recent snapshot, that is still being used 809 * in this file system, from the space currently in use. To figure out 810 * the space in the most recent snapshot still in use, we need to take 811 * the total space used in the snapshot and subtract out the space that 812 * has been freed up since the snapshot was taken. 813 */ 814 void 815 dsl_dataset_recalc_head_uniq(dsl_dataset_t *ds) 816 { 817 uint64_t mrs_used; 818 uint64_t dlused, dlcomp, dluncomp; 819 820 ASSERT(!dsl_dataset_is_snapshot(ds)); 821 822 if (ds->ds_phys->ds_prev_snap_obj != 0) 823 mrs_used = ds->ds_prev->ds_phys->ds_referenced_bytes; 824 else 825 mrs_used = 0; 826 827 dsl_deadlist_space(&ds->ds_deadlist, &dlused, &dlcomp, &dluncomp); 828 829 ASSERT3U(dlused, <=, mrs_used); 830 ds->ds_phys->ds_unique_bytes = 831 ds->ds_phys->ds_referenced_bytes - (mrs_used - dlused); 832 833 if (spa_version(ds->ds_dir->dd_pool->dp_spa) >= 834 SPA_VERSION_UNIQUE_ACCURATE) 835 ds->ds_phys->ds_flags |= DS_FLAG_UNIQUE_ACCURATE; 836 } 837 838 void 839 dsl_dataset_remove_from_next_clones(dsl_dataset_t *ds, uint64_t obj, 840 dmu_tx_t *tx) 841 { 842 objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset; 843 uint64_t count; 844 int err; 845 846 ASSERT(ds->ds_phys->ds_num_children >= 2); 847 err = zap_remove_int(mos, ds->ds_phys->ds_next_clones_obj, obj, tx); 848 /* 849 * The err should not be ENOENT, but a bug in a previous version 850 * of the code could cause upgrade_clones_cb() to not set 851 * ds_next_snap_obj when it should, leading to a missing entry. 852 * If we knew that the pool was created after 853 * SPA_VERSION_NEXT_CLONES, we could assert that it isn't 854 * ENOENT. However, at least we can check that we don't have 855 * too many entries in the next_clones_obj even after failing to 856 * remove this one. 857 */ 858 if (err != ENOENT) 859 VERIFY0(err); 860 ASSERT0(zap_count(mos, ds->ds_phys->ds_next_clones_obj, 861 &count)); 862 ASSERT3U(count, <=, ds->ds_phys->ds_num_children - 2); 863 } 864 865 866 blkptr_t * 867 dsl_dataset_get_blkptr(dsl_dataset_t *ds) 868 { 869 return (&ds->ds_phys->ds_bp); 870 } 871 872 void 873 dsl_dataset_set_blkptr(dsl_dataset_t *ds, blkptr_t *bp, dmu_tx_t *tx) 874 { 875 ASSERT(dmu_tx_is_syncing(tx)); 876 /* If it's the meta-objset, set dp_meta_rootbp */ 877 if (ds == NULL) { 878 tx->tx_pool->dp_meta_rootbp = *bp; 879 } else { 880 dmu_buf_will_dirty(ds->ds_dbuf, tx); 881 ds->ds_phys->ds_bp = *bp; 882 } 883 } 884 885 spa_t * 886 dsl_dataset_get_spa(dsl_dataset_t *ds) 887 { 888 return (ds->ds_dir->dd_pool->dp_spa); 889 } 890 891 void 892 dsl_dataset_dirty(dsl_dataset_t *ds, dmu_tx_t *tx) 893 { 894 dsl_pool_t *dp; 895 896 if (ds == NULL) /* this is the meta-objset */ 897 return; 898 899 ASSERT(ds->ds_objset != NULL); 900 901 if (ds->ds_phys->ds_next_snap_obj != 0) 902 panic("dirtying snapshot!"); 903 904 dp = ds->ds_dir->dd_pool; 905 906 if (txg_list_add(&dp->dp_dirty_datasets, ds, tx->tx_txg)) { 907 /* up the hold count until we can be written out */ 908 dmu_buf_add_ref(ds->ds_dbuf, ds); 909 } 910 } 911 912 boolean_t 913 dsl_dataset_is_dirty(dsl_dataset_t *ds) 914 { 915 for (int t = 0; t < TXG_SIZE; t++) { 916 if (txg_list_member(&ds->ds_dir->dd_pool->dp_dirty_datasets, 917 ds, t)) 918 return (B_TRUE); 919 } 920 return (B_FALSE); 921 } 922 923 static int 924 dsl_dataset_snapshot_reserve_space(dsl_dataset_t *ds, dmu_tx_t *tx) 925 { 926 uint64_t asize; 927 928 if (!dmu_tx_is_syncing(tx)) 929 return (0); 930 931 /* 932 * If there's an fs-only reservation, any blocks that might become 933 * owned by the snapshot dataset must be accommodated by space 934 * outside of the reservation. 935 */ 936 ASSERT(ds->ds_reserved == 0 || DS_UNIQUE_IS_ACCURATE(ds)); 937 asize = MIN(ds->ds_phys->ds_unique_bytes, ds->ds_reserved); 938 if (asize > dsl_dir_space_available(ds->ds_dir, NULL, 0, TRUE)) 939 return (SET_ERROR(ENOSPC)); 940 941 /* 942 * Propagate any reserved space for this snapshot to other 943 * snapshot checks in this sync group. 944 */ 945 if (asize > 0) 946 dsl_dir_willuse_space(ds->ds_dir, asize, tx); 947 948 return (0); 949 } 950 951 typedef struct dsl_dataset_snapshot_arg { 952 nvlist_t *ddsa_snaps; 953 nvlist_t *ddsa_props; 954 nvlist_t *ddsa_errors; 955 } dsl_dataset_snapshot_arg_t; 956 957 int 958 dsl_dataset_snapshot_check_impl(dsl_dataset_t *ds, const char *snapname, 959 dmu_tx_t *tx) 960 { 961 int error; 962 uint64_t value; 963 964 ds->ds_trysnap_txg = tx->tx_txg; 965 966 if (!dmu_tx_is_syncing(tx)) 967 return (0); 968 969 /* 970 * We don't allow multiple snapshots of the same txg. If there 971 * is already one, try again. 972 */ 973 if (ds->ds_phys->ds_prev_snap_txg >= tx->tx_txg) 974 return (SET_ERROR(EAGAIN)); 975 976 /* 977 * Check for conflicting snapshot name. 978 */ 979 error = dsl_dataset_snap_lookup(ds, snapname, &value); 980 if (error == 0) 981 return (SET_ERROR(EEXIST)); 982 if (error != ENOENT) 983 return (error); 984 985 error = dsl_dataset_snapshot_reserve_space(ds, tx); 986 if (error != 0) 987 return (error); 988 989 return (0); 990 } 991 992 static int 993 dsl_dataset_snapshot_check(void *arg, dmu_tx_t *tx) 994 { 995 dsl_dataset_snapshot_arg_t *ddsa = arg; 996 dsl_pool_t *dp = dmu_tx_pool(tx); 997 nvpair_t *pair; 998 int rv = 0; 999 1000 for (pair = nvlist_next_nvpair(ddsa->ddsa_snaps, NULL); 1001 pair != NULL; pair = nvlist_next_nvpair(ddsa->ddsa_snaps, pair)) { 1002 int error = 0; 1003 dsl_dataset_t *ds; 1004 char *name, *atp; 1005 char dsname[MAXNAMELEN]; 1006 1007 name = nvpair_name(pair); 1008 if (strlen(name) >= MAXNAMELEN) 1009 error = SET_ERROR(ENAMETOOLONG); 1010 if (error == 0) { 1011 atp = strchr(name, '@'); 1012 if (atp == NULL) 1013 error = SET_ERROR(EINVAL); 1014 if (error == 0) 1015 (void) strlcpy(dsname, name, atp - name + 1); 1016 } 1017 if (error == 0) 1018 error = dsl_dataset_hold(dp, dsname, FTAG, &ds); 1019 if (error == 0) { 1020 error = dsl_dataset_snapshot_check_impl(ds, 1021 atp + 1, tx); 1022 dsl_dataset_rele(ds, FTAG); 1023 } 1024 1025 if (error != 0) { 1026 if (ddsa->ddsa_errors != NULL) { 1027 fnvlist_add_int32(ddsa->ddsa_errors, 1028 name, error); 1029 } 1030 rv = error; 1031 } 1032 } 1033 return (rv); 1034 } 1035 1036 void 1037 dsl_dataset_snapshot_sync_impl(dsl_dataset_t *ds, const char *snapname, 1038 dmu_tx_t *tx) 1039 { 1040 static zil_header_t zero_zil; 1041 1042 dsl_pool_t *dp = ds->ds_dir->dd_pool; 1043 dmu_buf_t *dbuf; 1044 dsl_dataset_phys_t *dsphys; 1045 uint64_t dsobj, crtxg; 1046 objset_t *mos = dp->dp_meta_objset; 1047 objset_t *os; 1048 1049 ASSERT(RRW_WRITE_HELD(&dp->dp_config_rwlock)); 1050 1051 /* 1052 * If we are on an old pool, the zil must not be active, in which 1053 * case it will be zeroed. Usually zil_suspend() accomplishes this. 1054 */ 1055 ASSERT(spa_version(dmu_tx_pool(tx)->dp_spa) >= SPA_VERSION_FAST_SNAP || 1056 dmu_objset_from_ds(ds, &os) != 0 || 1057 bcmp(&os->os_phys->os_zil_header, &zero_zil, 1058 sizeof (zero_zil)) == 0); 1059 1060 1061 /* 1062 * The origin's ds_creation_txg has to be < TXG_INITIAL 1063 */ 1064 if (strcmp(snapname, ORIGIN_DIR_NAME) == 0) 1065 crtxg = 1; 1066 else 1067 crtxg = tx->tx_txg; 1068 1069 dsobj = dmu_object_alloc(mos, DMU_OT_DSL_DATASET, 0, 1070 DMU_OT_DSL_DATASET, sizeof (dsl_dataset_phys_t), tx); 1071 VERIFY0(dmu_bonus_hold(mos, dsobj, FTAG, &dbuf)); 1072 dmu_buf_will_dirty(dbuf, tx); 1073 dsphys = dbuf->db_data; 1074 bzero(dsphys, sizeof (dsl_dataset_phys_t)); 1075 dsphys->ds_dir_obj = ds->ds_dir->dd_object; 1076 dsphys->ds_fsid_guid = unique_create(); 1077 (void) random_get_pseudo_bytes((void*)&dsphys->ds_guid, 1078 sizeof (dsphys->ds_guid)); 1079 dsphys->ds_prev_snap_obj = ds->ds_phys->ds_prev_snap_obj; 1080 dsphys->ds_prev_snap_txg = ds->ds_phys->ds_prev_snap_txg; 1081 dsphys->ds_next_snap_obj = ds->ds_object; 1082 dsphys->ds_num_children = 1; 1083 dsphys->ds_creation_time = gethrestime_sec(); 1084 dsphys->ds_creation_txg = crtxg; 1085 dsphys->ds_deadlist_obj = ds->ds_phys->ds_deadlist_obj; 1086 dsphys->ds_referenced_bytes = ds->ds_phys->ds_referenced_bytes; 1087 dsphys->ds_compressed_bytes = ds->ds_phys->ds_compressed_bytes; 1088 dsphys->ds_uncompressed_bytes = ds->ds_phys->ds_uncompressed_bytes; 1089 dsphys->ds_flags = ds->ds_phys->ds_flags; 1090 dsphys->ds_bp = ds->ds_phys->ds_bp; 1091 dmu_buf_rele(dbuf, FTAG); 1092 1093 ASSERT3U(ds->ds_prev != 0, ==, ds->ds_phys->ds_prev_snap_obj != 0); 1094 if (ds->ds_prev) { 1095 uint64_t next_clones_obj = 1096 ds->ds_prev->ds_phys->ds_next_clones_obj; 1097 ASSERT(ds->ds_prev->ds_phys->ds_next_snap_obj == 1098 ds->ds_object || 1099 ds->ds_prev->ds_phys->ds_num_children > 1); 1100 if (ds->ds_prev->ds_phys->ds_next_snap_obj == ds->ds_object) { 1101 dmu_buf_will_dirty(ds->ds_prev->ds_dbuf, tx); 1102 ASSERT3U(ds->ds_phys->ds_prev_snap_txg, ==, 1103 ds->ds_prev->ds_phys->ds_creation_txg); 1104 ds->ds_prev->ds_phys->ds_next_snap_obj = dsobj; 1105 } else if (next_clones_obj != 0) { 1106 dsl_dataset_remove_from_next_clones(ds->ds_prev, 1107 dsphys->ds_next_snap_obj, tx); 1108 VERIFY0(zap_add_int(mos, 1109 next_clones_obj, dsobj, tx)); 1110 } 1111 } 1112 1113 /* 1114 * If we have a reference-reservation on this dataset, we will 1115 * need to increase the amount of refreservation being charged 1116 * since our unique space is going to zero. 1117 */ 1118 if (ds->ds_reserved) { 1119 int64_t delta; 1120 ASSERT(DS_UNIQUE_IS_ACCURATE(ds)); 1121 delta = MIN(ds->ds_phys->ds_unique_bytes, ds->ds_reserved); 1122 dsl_dir_diduse_space(ds->ds_dir, DD_USED_REFRSRV, 1123 delta, 0, 0, tx); 1124 } 1125 1126 dmu_buf_will_dirty(ds->ds_dbuf, tx); 1127 ds->ds_phys->ds_deadlist_obj = dsl_deadlist_clone(&ds->ds_deadlist, 1128 UINT64_MAX, ds->ds_phys->ds_prev_snap_obj, tx); 1129 dsl_deadlist_close(&ds->ds_deadlist); 1130 dsl_deadlist_open(&ds->ds_deadlist, mos, ds->ds_phys->ds_deadlist_obj); 1131 dsl_deadlist_add_key(&ds->ds_deadlist, 1132 ds->ds_phys->ds_prev_snap_txg, tx); 1133 1134 ASSERT3U(ds->ds_phys->ds_prev_snap_txg, <, tx->tx_txg); 1135 ds->ds_phys->ds_prev_snap_obj = dsobj; 1136 ds->ds_phys->ds_prev_snap_txg = crtxg; 1137 ds->ds_phys->ds_unique_bytes = 0; 1138 if (spa_version(dp->dp_spa) >= SPA_VERSION_UNIQUE_ACCURATE) 1139 ds->ds_phys->ds_flags |= DS_FLAG_UNIQUE_ACCURATE; 1140 1141 VERIFY0(zap_add(mos, ds->ds_phys->ds_snapnames_zapobj, 1142 snapname, 8, 1, &dsobj, tx)); 1143 1144 if (ds->ds_prev) 1145 dsl_dataset_rele(ds->ds_prev, ds); 1146 VERIFY0(dsl_dataset_hold_obj(dp, 1147 ds->ds_phys->ds_prev_snap_obj, ds, &ds->ds_prev)); 1148 1149 dsl_scan_ds_snapshotted(ds, tx); 1150 1151 dsl_dir_snap_cmtime_update(ds->ds_dir); 1152 1153 spa_history_log_internal_ds(ds->ds_prev, "snapshot", tx, ""); 1154 } 1155 1156 static void 1157 dsl_dataset_snapshot_sync(void *arg, dmu_tx_t *tx) 1158 { 1159 dsl_dataset_snapshot_arg_t *ddsa = arg; 1160 dsl_pool_t *dp = dmu_tx_pool(tx); 1161 nvpair_t *pair; 1162 1163 for (pair = nvlist_next_nvpair(ddsa->ddsa_snaps, NULL); 1164 pair != NULL; pair = nvlist_next_nvpair(ddsa->ddsa_snaps, pair)) { 1165 dsl_dataset_t *ds; 1166 char *name, *atp; 1167 char dsname[MAXNAMELEN]; 1168 1169 name = nvpair_name(pair); 1170 atp = strchr(name, '@'); 1171 (void) strlcpy(dsname, name, atp - name + 1); 1172 VERIFY0(dsl_dataset_hold(dp, dsname, FTAG, &ds)); 1173 1174 dsl_dataset_snapshot_sync_impl(ds, atp + 1, tx); 1175 if (ddsa->ddsa_props != NULL) { 1176 dsl_props_set_sync_impl(ds->ds_prev, 1177 ZPROP_SRC_LOCAL, ddsa->ddsa_props, tx); 1178 } 1179 dsl_dataset_rele(ds, FTAG); 1180 } 1181 } 1182 1183 /* 1184 * The snapshots must all be in the same pool. 1185 * All-or-nothing: if there are any failures, nothing will be modified. 1186 */ 1187 int 1188 dsl_dataset_snapshot(nvlist_t *snaps, nvlist_t *props, nvlist_t *errors) 1189 { 1190 dsl_dataset_snapshot_arg_t ddsa; 1191 nvpair_t *pair; 1192 boolean_t needsuspend; 1193 int error; 1194 spa_t *spa; 1195 char *firstname; 1196 nvlist_t *suspended = NULL; 1197 1198 pair = nvlist_next_nvpair(snaps, NULL); 1199 if (pair == NULL) 1200 return (0); 1201 firstname = nvpair_name(pair); 1202 1203 error = spa_open(firstname, &spa, FTAG); 1204 if (error != 0) 1205 return (error); 1206 needsuspend = (spa_version(spa) < SPA_VERSION_FAST_SNAP); 1207 spa_close(spa, FTAG); 1208 1209 if (needsuspend) { 1210 suspended = fnvlist_alloc(); 1211 for (pair = nvlist_next_nvpair(snaps, NULL); pair != NULL; 1212 pair = nvlist_next_nvpair(snaps, pair)) { 1213 char fsname[MAXNAMELEN]; 1214 char *snapname = nvpair_name(pair); 1215 char *atp; 1216 void *cookie; 1217 1218 atp = strchr(snapname, '@'); 1219 if (atp == NULL) { 1220 error = SET_ERROR(EINVAL); 1221 break; 1222 } 1223 (void) strlcpy(fsname, snapname, atp - snapname + 1); 1224 1225 error = zil_suspend(fsname, &cookie); 1226 if (error != 0) 1227 break; 1228 fnvlist_add_uint64(suspended, fsname, 1229 (uintptr_t)cookie); 1230 } 1231 } 1232 1233 ddsa.ddsa_snaps = snaps; 1234 ddsa.ddsa_props = props; 1235 ddsa.ddsa_errors = errors; 1236 1237 if (error == 0) { 1238 error = dsl_sync_task(firstname, dsl_dataset_snapshot_check, 1239 dsl_dataset_snapshot_sync, &ddsa, 1240 fnvlist_num_pairs(snaps) * 3); 1241 } 1242 1243 if (suspended != NULL) { 1244 for (pair = nvlist_next_nvpair(suspended, NULL); pair != NULL; 1245 pair = nvlist_next_nvpair(suspended, pair)) { 1246 zil_resume((void *)(uintptr_t) 1247 fnvpair_value_uint64(pair)); 1248 } 1249 fnvlist_free(suspended); 1250 } 1251 1252 return (error); 1253 } 1254 1255 typedef struct dsl_dataset_snapshot_tmp_arg { 1256 const char *ddsta_fsname; 1257 const char *ddsta_snapname; 1258 minor_t ddsta_cleanup_minor; 1259 const char *ddsta_htag; 1260 } dsl_dataset_snapshot_tmp_arg_t; 1261 1262 static int 1263 dsl_dataset_snapshot_tmp_check(void *arg, dmu_tx_t *tx) 1264 { 1265 dsl_dataset_snapshot_tmp_arg_t *ddsta = arg; 1266 dsl_pool_t *dp = dmu_tx_pool(tx); 1267 dsl_dataset_t *ds; 1268 int error; 1269 1270 error = dsl_dataset_hold(dp, ddsta->ddsta_fsname, FTAG, &ds); 1271 if (error != 0) 1272 return (error); 1273 1274 error = dsl_dataset_snapshot_check_impl(ds, ddsta->ddsta_snapname, tx); 1275 if (error != 0) { 1276 dsl_dataset_rele(ds, FTAG); 1277 return (error); 1278 } 1279 1280 if (spa_version(dp->dp_spa) < SPA_VERSION_USERREFS) { 1281 dsl_dataset_rele(ds, FTAG); 1282 return (SET_ERROR(ENOTSUP)); 1283 } 1284 error = dsl_dataset_user_hold_check_one(NULL, ddsta->ddsta_htag, 1285 B_TRUE, tx); 1286 if (error != 0) { 1287 dsl_dataset_rele(ds, FTAG); 1288 return (error); 1289 } 1290 1291 dsl_dataset_rele(ds, FTAG); 1292 return (0); 1293 } 1294 1295 static void 1296 dsl_dataset_snapshot_tmp_sync(void *arg, dmu_tx_t *tx) 1297 { 1298 dsl_dataset_snapshot_tmp_arg_t *ddsta = arg; 1299 dsl_pool_t *dp = dmu_tx_pool(tx); 1300 dsl_dataset_t *ds; 1301 1302 VERIFY0(dsl_dataset_hold(dp, ddsta->ddsta_fsname, FTAG, &ds)); 1303 1304 dsl_dataset_snapshot_sync_impl(ds, ddsta->ddsta_snapname, tx); 1305 dsl_dataset_user_hold_sync_one(ds->ds_prev, ddsta->ddsta_htag, 1306 ddsta->ddsta_cleanup_minor, gethrestime_sec(), tx); 1307 dsl_destroy_snapshot_sync_impl(ds->ds_prev, B_TRUE, tx); 1308 1309 dsl_dataset_rele(ds, FTAG); 1310 } 1311 1312 int 1313 dsl_dataset_snapshot_tmp(const char *fsname, const char *snapname, 1314 minor_t cleanup_minor, const char *htag) 1315 { 1316 dsl_dataset_snapshot_tmp_arg_t ddsta; 1317 int error; 1318 spa_t *spa; 1319 boolean_t needsuspend; 1320 void *cookie; 1321 1322 ddsta.ddsta_fsname = fsname; 1323 ddsta.ddsta_snapname = snapname; 1324 ddsta.ddsta_cleanup_minor = cleanup_minor; 1325 ddsta.ddsta_htag = htag; 1326 1327 error = spa_open(fsname, &spa, FTAG); 1328 if (error != 0) 1329 return (error); 1330 needsuspend = (spa_version(spa) < SPA_VERSION_FAST_SNAP); 1331 spa_close(spa, FTAG); 1332 1333 if (needsuspend) { 1334 error = zil_suspend(fsname, &cookie); 1335 if (error != 0) 1336 return (error); 1337 } 1338 1339 error = dsl_sync_task(fsname, dsl_dataset_snapshot_tmp_check, 1340 dsl_dataset_snapshot_tmp_sync, &ddsta, 3); 1341 1342 if (needsuspend) 1343 zil_resume(cookie); 1344 return (error); 1345 } 1346 1347 1348 void 1349 dsl_dataset_sync(dsl_dataset_t *ds, zio_t *zio, dmu_tx_t *tx) 1350 { 1351 ASSERT(dmu_tx_is_syncing(tx)); 1352 ASSERT(ds->ds_objset != NULL); 1353 ASSERT(ds->ds_phys->ds_next_snap_obj == 0); 1354 1355 /* 1356 * in case we had to change ds_fsid_guid when we opened it, 1357 * sync it out now. 1358 */ 1359 dmu_buf_will_dirty(ds->ds_dbuf, tx); 1360 ds->ds_phys->ds_fsid_guid = ds->ds_fsid_guid; 1361 1362 dmu_objset_sync(ds->ds_objset, zio, tx); 1363 } 1364 1365 static void 1366 get_clones_stat(dsl_dataset_t *ds, nvlist_t *nv) 1367 { 1368 uint64_t count = 0; 1369 objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset; 1370 zap_cursor_t zc; 1371 zap_attribute_t za; 1372 nvlist_t *propval = fnvlist_alloc(); 1373 nvlist_t *val = fnvlist_alloc(); 1374 1375 ASSERT(dsl_pool_config_held(ds->ds_dir->dd_pool)); 1376 1377 /* 1378 * There may be missing entries in ds_next_clones_obj 1379 * due to a bug in a previous version of the code. 1380 * Only trust it if it has the right number of entries. 1381 */ 1382 if (ds->ds_phys->ds_next_clones_obj != 0) { 1383 ASSERT0(zap_count(mos, ds->ds_phys->ds_next_clones_obj, 1384 &count)); 1385 } 1386 if (count != ds->ds_phys->ds_num_children - 1) 1387 goto fail; 1388 for (zap_cursor_init(&zc, mos, ds->ds_phys->ds_next_clones_obj); 1389 zap_cursor_retrieve(&zc, &za) == 0; 1390 zap_cursor_advance(&zc)) { 1391 dsl_dataset_t *clone; 1392 char buf[ZFS_MAXNAMELEN]; 1393 VERIFY0(dsl_dataset_hold_obj(ds->ds_dir->dd_pool, 1394 za.za_first_integer, FTAG, &clone)); 1395 dsl_dir_name(clone->ds_dir, buf); 1396 fnvlist_add_boolean(val, buf); 1397 dsl_dataset_rele(clone, FTAG); 1398 } 1399 zap_cursor_fini(&zc); 1400 fnvlist_add_nvlist(propval, ZPROP_VALUE, val); 1401 fnvlist_add_nvlist(nv, zfs_prop_to_name(ZFS_PROP_CLONES), propval); 1402 fail: 1403 nvlist_free(val); 1404 nvlist_free(propval); 1405 } 1406 1407 void 1408 dsl_dataset_stats(dsl_dataset_t *ds, nvlist_t *nv) 1409 { 1410 dsl_pool_t *dp = ds->ds_dir->dd_pool; 1411 uint64_t refd, avail, uobjs, aobjs, ratio; 1412 1413 ASSERT(dsl_pool_config_held(dp)); 1414 1415 ratio = ds->ds_phys->ds_compressed_bytes == 0 ? 100 : 1416 (ds->ds_phys->ds_uncompressed_bytes * 100 / 1417 ds->ds_phys->ds_compressed_bytes); 1418 1419 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_REFRATIO, ratio); 1420 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_LOGICALREFERENCED, 1421 ds->ds_phys->ds_uncompressed_bytes); 1422 1423 if (dsl_dataset_is_snapshot(ds)) { 1424 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_COMPRESSRATIO, ratio); 1425 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_USED, 1426 ds->ds_phys->ds_unique_bytes); 1427 get_clones_stat(ds, nv); 1428 } else { 1429 dsl_dir_stats(ds->ds_dir, nv); 1430 } 1431 1432 dsl_dataset_space(ds, &refd, &avail, &uobjs, &aobjs); 1433 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_AVAILABLE, avail); 1434 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_REFERENCED, refd); 1435 1436 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_CREATION, 1437 ds->ds_phys->ds_creation_time); 1438 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_CREATETXG, 1439 ds->ds_phys->ds_creation_txg); 1440 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_REFQUOTA, 1441 ds->ds_quota); 1442 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_REFRESERVATION, 1443 ds->ds_reserved); 1444 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_GUID, 1445 ds->ds_phys->ds_guid); 1446 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_UNIQUE, 1447 ds->ds_phys->ds_unique_bytes); 1448 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_OBJSETID, 1449 ds->ds_object); 1450 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_USERREFS, 1451 ds->ds_userrefs); 1452 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_DEFER_DESTROY, 1453 DS_IS_DEFER_DESTROY(ds) ? 1 : 0); 1454 1455 if (ds->ds_phys->ds_prev_snap_obj != 0) { 1456 uint64_t written, comp, uncomp; 1457 dsl_pool_t *dp = ds->ds_dir->dd_pool; 1458 dsl_dataset_t *prev; 1459 1460 int err = dsl_dataset_hold_obj(dp, 1461 ds->ds_phys->ds_prev_snap_obj, FTAG, &prev); 1462 if (err == 0) { 1463 err = dsl_dataset_space_written(prev, ds, &written, 1464 &comp, &uncomp); 1465 dsl_dataset_rele(prev, FTAG); 1466 if (err == 0) { 1467 dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_WRITTEN, 1468 written); 1469 } 1470 } 1471 } 1472 } 1473 1474 void 1475 dsl_dataset_fast_stat(dsl_dataset_t *ds, dmu_objset_stats_t *stat) 1476 { 1477 dsl_pool_t *dp = ds->ds_dir->dd_pool; 1478 ASSERT(dsl_pool_config_held(dp)); 1479 1480 stat->dds_creation_txg = ds->ds_phys->ds_creation_txg; 1481 stat->dds_inconsistent = ds->ds_phys->ds_flags & DS_FLAG_INCONSISTENT; 1482 stat->dds_guid = ds->ds_phys->ds_guid; 1483 stat->dds_origin[0] = '\0'; 1484 if (dsl_dataset_is_snapshot(ds)) { 1485 stat->dds_is_snapshot = B_TRUE; 1486 stat->dds_num_clones = ds->ds_phys->ds_num_children - 1; 1487 } else { 1488 stat->dds_is_snapshot = B_FALSE; 1489 stat->dds_num_clones = 0; 1490 1491 if (dsl_dir_is_clone(ds->ds_dir)) { 1492 dsl_dataset_t *ods; 1493 1494 VERIFY0(dsl_dataset_hold_obj(dp, 1495 ds->ds_dir->dd_phys->dd_origin_obj, FTAG, &ods)); 1496 dsl_dataset_name(ods, stat->dds_origin); 1497 dsl_dataset_rele(ods, FTAG); 1498 } 1499 } 1500 } 1501 1502 uint64_t 1503 dsl_dataset_fsid_guid(dsl_dataset_t *ds) 1504 { 1505 return (ds->ds_fsid_guid); 1506 } 1507 1508 void 1509 dsl_dataset_space(dsl_dataset_t *ds, 1510 uint64_t *refdbytesp, uint64_t *availbytesp, 1511 uint64_t *usedobjsp, uint64_t *availobjsp) 1512 { 1513 *refdbytesp = ds->ds_phys->ds_referenced_bytes; 1514 *availbytesp = dsl_dir_space_available(ds->ds_dir, NULL, 0, TRUE); 1515 if (ds->ds_reserved > ds->ds_phys->ds_unique_bytes) 1516 *availbytesp += ds->ds_reserved - ds->ds_phys->ds_unique_bytes; 1517 if (ds->ds_quota != 0) { 1518 /* 1519 * Adjust available bytes according to refquota 1520 */ 1521 if (*refdbytesp < ds->ds_quota) 1522 *availbytesp = MIN(*availbytesp, 1523 ds->ds_quota - *refdbytesp); 1524 else 1525 *availbytesp = 0; 1526 } 1527 *usedobjsp = ds->ds_phys->ds_bp.blk_fill; 1528 *availobjsp = DN_MAX_OBJECT - *usedobjsp; 1529 } 1530 1531 boolean_t 1532 dsl_dataset_modified_since_lastsnap(dsl_dataset_t *ds) 1533 { 1534 dsl_pool_t *dp = ds->ds_dir->dd_pool; 1535 1536 ASSERT(dsl_pool_config_held(dp)); 1537 if (ds->ds_prev == NULL) 1538 return (B_FALSE); 1539 if (ds->ds_phys->ds_bp.blk_birth > 1540 ds->ds_prev->ds_phys->ds_creation_txg) { 1541 objset_t *os, *os_prev; 1542 /* 1543 * It may be that only the ZIL differs, because it was 1544 * reset in the head. Don't count that as being 1545 * modified. 1546 */ 1547 if (dmu_objset_from_ds(ds, &os) != 0) 1548 return (B_TRUE); 1549 if (dmu_objset_from_ds(ds->ds_prev, &os_prev) != 0) 1550 return (B_TRUE); 1551 return (bcmp(&os->os_phys->os_meta_dnode, 1552 &os_prev->os_phys->os_meta_dnode, 1553 sizeof (os->os_phys->os_meta_dnode)) != 0); 1554 } 1555 return (B_FALSE); 1556 } 1557 1558 typedef struct dsl_dataset_rename_snapshot_arg { 1559 const char *ddrsa_fsname; 1560 const char *ddrsa_oldsnapname; 1561 const char *ddrsa_newsnapname; 1562 boolean_t ddrsa_recursive; 1563 dmu_tx_t *ddrsa_tx; 1564 } dsl_dataset_rename_snapshot_arg_t; 1565 1566 /* ARGSUSED */ 1567 static int 1568 dsl_dataset_rename_snapshot_check_impl(dsl_pool_t *dp, 1569 dsl_dataset_t *hds, void *arg) 1570 { 1571 dsl_dataset_rename_snapshot_arg_t *ddrsa = arg; 1572 int error; 1573 uint64_t val; 1574 1575 error = dsl_dataset_snap_lookup(hds, ddrsa->ddrsa_oldsnapname, &val); 1576 if (error != 0) { 1577 /* ignore nonexistent snapshots */ 1578 return (error == ENOENT ? 0 : error); 1579 } 1580 1581 /* new name should not exist */ 1582 error = dsl_dataset_snap_lookup(hds, ddrsa->ddrsa_newsnapname, &val); 1583 if (error == 0) 1584 error = SET_ERROR(EEXIST); 1585 else if (error == ENOENT) 1586 error = 0; 1587 1588 /* dataset name + 1 for the "@" + the new snapshot name must fit */ 1589 if (dsl_dir_namelen(hds->ds_dir) + 1 + 1590 strlen(ddrsa->ddrsa_newsnapname) >= MAXNAMELEN) 1591 error = SET_ERROR(ENAMETOOLONG); 1592 1593 return (error); 1594 } 1595 1596 static int 1597 dsl_dataset_rename_snapshot_check(void *arg, dmu_tx_t *tx) 1598 { 1599 dsl_dataset_rename_snapshot_arg_t *ddrsa = arg; 1600 dsl_pool_t *dp = dmu_tx_pool(tx); 1601 dsl_dataset_t *hds; 1602 int error; 1603 1604 error = dsl_dataset_hold(dp, ddrsa->ddrsa_fsname, FTAG, &hds); 1605 if (error != 0) 1606 return (error); 1607 1608 if (ddrsa->ddrsa_recursive) { 1609 error = dmu_objset_find_dp(dp, hds->ds_dir->dd_object, 1610 dsl_dataset_rename_snapshot_check_impl, ddrsa, 1611 DS_FIND_CHILDREN); 1612 } else { 1613 error = dsl_dataset_rename_snapshot_check_impl(dp, hds, ddrsa); 1614 } 1615 dsl_dataset_rele(hds, FTAG); 1616 return (error); 1617 } 1618 1619 static int 1620 dsl_dataset_rename_snapshot_sync_impl(dsl_pool_t *dp, 1621 dsl_dataset_t *hds, void *arg) 1622 { 1623 dsl_dataset_rename_snapshot_arg_t *ddrsa = arg; 1624 dsl_dataset_t *ds; 1625 uint64_t val; 1626 dmu_tx_t *tx = ddrsa->ddrsa_tx; 1627 int error; 1628 1629 error = dsl_dataset_snap_lookup(hds, ddrsa->ddrsa_oldsnapname, &val); 1630 ASSERT(error == 0 || error == ENOENT); 1631 if (error == ENOENT) { 1632 /* ignore nonexistent snapshots */ 1633 return (0); 1634 } 1635 1636 VERIFY0(dsl_dataset_hold_obj(dp, val, FTAG, &ds)); 1637 1638 /* log before we change the name */ 1639 spa_history_log_internal_ds(ds, "rename", tx, 1640 "-> @%s", ddrsa->ddrsa_newsnapname); 1641 1642 VERIFY0(dsl_dataset_snap_remove(hds, ddrsa->ddrsa_oldsnapname, tx)); 1643 mutex_enter(&ds->ds_lock); 1644 (void) strcpy(ds->ds_snapname, ddrsa->ddrsa_newsnapname); 1645 mutex_exit(&ds->ds_lock); 1646 VERIFY0(zap_add(dp->dp_meta_objset, hds->ds_phys->ds_snapnames_zapobj, 1647 ds->ds_snapname, 8, 1, &ds->ds_object, tx)); 1648 1649 dsl_dataset_rele(ds, FTAG); 1650 return (0); 1651 } 1652 1653 static void 1654 dsl_dataset_rename_snapshot_sync(void *arg, dmu_tx_t *tx) 1655 { 1656 dsl_dataset_rename_snapshot_arg_t *ddrsa = arg; 1657 dsl_pool_t *dp = dmu_tx_pool(tx); 1658 dsl_dataset_t *hds; 1659 1660 VERIFY0(dsl_dataset_hold(dp, ddrsa->ddrsa_fsname, FTAG, &hds)); 1661 ddrsa->ddrsa_tx = tx; 1662 if (ddrsa->ddrsa_recursive) { 1663 VERIFY0(dmu_objset_find_dp(dp, hds->ds_dir->dd_object, 1664 dsl_dataset_rename_snapshot_sync_impl, ddrsa, 1665 DS_FIND_CHILDREN)); 1666 } else { 1667 VERIFY0(dsl_dataset_rename_snapshot_sync_impl(dp, hds, ddrsa)); 1668 } 1669 dsl_dataset_rele(hds, FTAG); 1670 } 1671 1672 int 1673 dsl_dataset_rename_snapshot(const char *fsname, 1674 const char *oldsnapname, const char *newsnapname, boolean_t recursive) 1675 { 1676 dsl_dataset_rename_snapshot_arg_t ddrsa; 1677 1678 ddrsa.ddrsa_fsname = fsname; 1679 ddrsa.ddrsa_oldsnapname = oldsnapname; 1680 ddrsa.ddrsa_newsnapname = newsnapname; 1681 ddrsa.ddrsa_recursive = recursive; 1682 1683 return (dsl_sync_task(fsname, dsl_dataset_rename_snapshot_check, 1684 dsl_dataset_rename_snapshot_sync, &ddrsa, 1)); 1685 } 1686 1687 static int 1688 dsl_dataset_rollback_check(void *arg, dmu_tx_t *tx) 1689 { 1690 const char *fsname = arg; 1691 dsl_pool_t *dp = dmu_tx_pool(tx); 1692 dsl_dataset_t *ds; 1693 int64_t unused_refres_delta; 1694 int error; 1695 1696 error = dsl_dataset_hold(dp, fsname, FTAG, &ds); 1697 if (error != 0) 1698 return (error); 1699 1700 /* must not be a snapshot */ 1701 if (dsl_dataset_is_snapshot(ds)) { 1702 dsl_dataset_rele(ds, FTAG); 1703 return (SET_ERROR(EINVAL)); 1704 } 1705 1706 /* must have a most recent snapshot */ 1707 if (ds->ds_phys->ds_prev_snap_txg < TXG_INITIAL) { 1708 dsl_dataset_rele(ds, FTAG); 1709 return (SET_ERROR(EINVAL)); 1710 } 1711 1712 if (dsl_dataset_long_held(ds)) { 1713 dsl_dataset_rele(ds, FTAG); 1714 return (SET_ERROR(EBUSY)); 1715 } 1716 1717 /* 1718 * Check if the snap we are rolling back to uses more than 1719 * the refquota. 1720 */ 1721 if (ds->ds_quota != 0 && 1722 ds->ds_prev->ds_phys->ds_referenced_bytes > ds->ds_quota) { 1723 dsl_dataset_rele(ds, FTAG); 1724 return (SET_ERROR(EDQUOT)); 1725 } 1726 1727 /* 1728 * When we do the clone swap, we will temporarily use more space 1729 * due to the refreservation (the head will no longer have any 1730 * unique space, so the entire amount of the refreservation will need 1731 * to be free). We will immediately destroy the clone, freeing 1732 * this space, but the freeing happens over many txg's. 1733 */ 1734 unused_refres_delta = (int64_t)MIN(ds->ds_reserved, 1735 ds->ds_phys->ds_unique_bytes); 1736 1737 if (unused_refres_delta > 0 && 1738 unused_refres_delta > 1739 dsl_dir_space_available(ds->ds_dir, NULL, 0, TRUE)) { 1740 dsl_dataset_rele(ds, FTAG); 1741 return (SET_ERROR(ENOSPC)); 1742 } 1743 1744 dsl_dataset_rele(ds, FTAG); 1745 return (0); 1746 } 1747 1748 static void 1749 dsl_dataset_rollback_sync(void *arg, dmu_tx_t *tx) 1750 { 1751 const char *fsname = arg; 1752 dsl_pool_t *dp = dmu_tx_pool(tx); 1753 dsl_dataset_t *ds, *clone; 1754 uint64_t cloneobj; 1755 1756 VERIFY0(dsl_dataset_hold(dp, fsname, FTAG, &ds)); 1757 1758 cloneobj = dsl_dataset_create_sync(ds->ds_dir, "%rollback", 1759 ds->ds_prev, DS_CREATE_FLAG_NODIRTY, kcred, tx); 1760 1761 VERIFY0(dsl_dataset_hold_obj(dp, cloneobj, FTAG, &clone)); 1762 1763 dsl_dataset_clone_swap_sync_impl(clone, ds, tx); 1764 dsl_dataset_zero_zil(ds, tx); 1765 1766 dsl_destroy_head_sync_impl(clone, tx); 1767 1768 dsl_dataset_rele(clone, FTAG); 1769 dsl_dataset_rele(ds, FTAG); 1770 } 1771 1772 int 1773 dsl_dataset_rollback(const char *fsname) 1774 { 1775 return (dsl_sync_task(fsname, dsl_dataset_rollback_check, 1776 dsl_dataset_rollback_sync, (void *)fsname, 1)); 1777 } 1778 1779 struct promotenode { 1780 list_node_t link; 1781 dsl_dataset_t *ds; 1782 }; 1783 1784 typedef struct dsl_dataset_promote_arg { 1785 const char *ddpa_clonename; 1786 dsl_dataset_t *ddpa_clone; 1787 list_t shared_snaps, origin_snaps, clone_snaps; 1788 dsl_dataset_t *origin_origin; /* origin of the origin */ 1789 uint64_t used, comp, uncomp, unique, cloneusedsnap, originusedsnap; 1790 char *err_ds; 1791 } dsl_dataset_promote_arg_t; 1792 1793 static int snaplist_space(list_t *l, uint64_t mintxg, uint64_t *spacep); 1794 static int promote_hold(dsl_dataset_promote_arg_t *ddpa, dsl_pool_t *dp, 1795 void *tag); 1796 static void promote_rele(dsl_dataset_promote_arg_t *ddpa, void *tag); 1797 1798 static int 1799 dsl_dataset_promote_check(void *arg, dmu_tx_t *tx) 1800 { 1801 dsl_dataset_promote_arg_t *ddpa = arg; 1802 dsl_pool_t *dp = dmu_tx_pool(tx); 1803 dsl_dataset_t *hds; 1804 struct promotenode *snap; 1805 dsl_dataset_t *origin_ds; 1806 int err; 1807 uint64_t unused; 1808 1809 err = promote_hold(ddpa, dp, FTAG); 1810 if (err != 0) 1811 return (err); 1812 1813 hds = ddpa->ddpa_clone; 1814 1815 if (hds->ds_phys->ds_flags & DS_FLAG_NOPROMOTE) { 1816 promote_rele(ddpa, FTAG); 1817 return (SET_ERROR(EXDEV)); 1818 } 1819 1820 /* 1821 * Compute and check the amount of space to transfer. Since this is 1822 * so expensive, don't do the preliminary check. 1823 */ 1824 if (!dmu_tx_is_syncing(tx)) { 1825 promote_rele(ddpa, FTAG); 1826 return (0); 1827 } 1828 1829 snap = list_head(&ddpa->shared_snaps); 1830 origin_ds = snap->ds; 1831 1832 /* compute origin's new unique space */ 1833 snap = list_tail(&ddpa->clone_snaps); 1834 ASSERT3U(snap->ds->ds_phys->ds_prev_snap_obj, ==, origin_ds->ds_object); 1835 dsl_deadlist_space_range(&snap->ds->ds_deadlist, 1836 origin_ds->ds_phys->ds_prev_snap_txg, UINT64_MAX, 1837 &ddpa->unique, &unused, &unused); 1838 1839 /* 1840 * Walk the snapshots that we are moving 1841 * 1842 * Compute space to transfer. Consider the incremental changes 1843 * to used by each snapshot: 1844 * (my used) = (prev's used) + (blocks born) - (blocks killed) 1845 * So each snapshot gave birth to: 1846 * (blocks born) = (my used) - (prev's used) + (blocks killed) 1847 * So a sequence would look like: 1848 * (uN - u(N-1) + kN) + ... + (u1 - u0 + k1) + (u0 - 0 + k0) 1849 * Which simplifies to: 1850 * uN + kN + kN-1 + ... + k1 + k0 1851 * Note however, if we stop before we reach the ORIGIN we get: 1852 * uN + kN + kN-1 + ... + kM - uM-1 1853 */ 1854 ddpa->used = origin_ds->ds_phys->ds_referenced_bytes; 1855 ddpa->comp = origin_ds->ds_phys->ds_compressed_bytes; 1856 ddpa->uncomp = origin_ds->ds_phys->ds_uncompressed_bytes; 1857 for (snap = list_head(&ddpa->shared_snaps); snap; 1858 snap = list_next(&ddpa->shared_snaps, snap)) { 1859 uint64_t val, dlused, dlcomp, dluncomp; 1860 dsl_dataset_t *ds = snap->ds; 1861 1862 /* 1863 * If there are long holds, we won't be able to evict 1864 * the objset. 1865 */ 1866 if (dsl_dataset_long_held(ds)) { 1867 err = SET_ERROR(EBUSY); 1868 goto out; 1869 } 1870 1871 /* Check that the snapshot name does not conflict */ 1872 VERIFY0(dsl_dataset_get_snapname(ds)); 1873 err = dsl_dataset_snap_lookup(hds, ds->ds_snapname, &val); 1874 if (err == 0) { 1875 (void) strcpy(ddpa->err_ds, snap->ds->ds_snapname); 1876 err = SET_ERROR(EEXIST); 1877 goto out; 1878 } 1879 if (err != ENOENT) 1880 goto out; 1881 1882 /* The very first snapshot does not have a deadlist */ 1883 if (ds->ds_phys->ds_prev_snap_obj == 0) 1884 continue; 1885 1886 dsl_deadlist_space(&ds->ds_deadlist, 1887 &dlused, &dlcomp, &dluncomp); 1888 ddpa->used += dlused; 1889 ddpa->comp += dlcomp; 1890 ddpa->uncomp += dluncomp; 1891 } 1892 1893 /* 1894 * If we are a clone of a clone then we never reached ORIGIN, 1895 * so we need to subtract out the clone origin's used space. 1896 */ 1897 if (ddpa->origin_origin) { 1898 ddpa->used -= ddpa->origin_origin->ds_phys->ds_referenced_bytes; 1899 ddpa->comp -= ddpa->origin_origin->ds_phys->ds_compressed_bytes; 1900 ddpa->uncomp -= 1901 ddpa->origin_origin->ds_phys->ds_uncompressed_bytes; 1902 } 1903 1904 /* Check that there is enough space here */ 1905 err = dsl_dir_transfer_possible(origin_ds->ds_dir, hds->ds_dir, 1906 ddpa->used); 1907 if (err != 0) 1908 goto out; 1909 1910 /* 1911 * Compute the amounts of space that will be used by snapshots 1912 * after the promotion (for both origin and clone). For each, 1913 * it is the amount of space that will be on all of their 1914 * deadlists (that was not born before their new origin). 1915 */ 1916 if (hds->ds_dir->dd_phys->dd_flags & DD_FLAG_USED_BREAKDOWN) { 1917 uint64_t space; 1918 1919 /* 1920 * Note, typically this will not be a clone of a clone, 1921 * so dd_origin_txg will be < TXG_INITIAL, so 1922 * these snaplist_space() -> dsl_deadlist_space_range() 1923 * calls will be fast because they do not have to 1924 * iterate over all bps. 1925 */ 1926 snap = list_head(&ddpa->origin_snaps); 1927 err = snaplist_space(&ddpa->shared_snaps, 1928 snap->ds->ds_dir->dd_origin_txg, &ddpa->cloneusedsnap); 1929 if (err != 0) 1930 goto out; 1931 1932 err = snaplist_space(&ddpa->clone_snaps, 1933 snap->ds->ds_dir->dd_origin_txg, &space); 1934 if (err != 0) 1935 goto out; 1936 ddpa->cloneusedsnap += space; 1937 } 1938 if (origin_ds->ds_dir->dd_phys->dd_flags & DD_FLAG_USED_BREAKDOWN) { 1939 err = snaplist_space(&ddpa->origin_snaps, 1940 origin_ds->ds_phys->ds_creation_txg, &ddpa->originusedsnap); 1941 if (err != 0) 1942 goto out; 1943 } 1944 1945 out: 1946 promote_rele(ddpa, FTAG); 1947 return (err); 1948 } 1949 1950 static void 1951 dsl_dataset_promote_sync(void *arg, dmu_tx_t *tx) 1952 { 1953 dsl_dataset_promote_arg_t *ddpa = arg; 1954 dsl_pool_t *dp = dmu_tx_pool(tx); 1955 dsl_dataset_t *hds; 1956 struct promotenode *snap; 1957 dsl_dataset_t *origin_ds; 1958 dsl_dataset_t *origin_head; 1959 dsl_dir_t *dd; 1960 dsl_dir_t *odd = NULL; 1961 uint64_t oldnext_obj; 1962 int64_t delta; 1963 1964 VERIFY0(promote_hold(ddpa, dp, FTAG)); 1965 hds = ddpa->ddpa_clone; 1966 1967 ASSERT0(hds->ds_phys->ds_flags & DS_FLAG_NOPROMOTE); 1968 1969 snap = list_head(&ddpa->shared_snaps); 1970 origin_ds = snap->ds; 1971 dd = hds->ds_dir; 1972 1973 snap = list_head(&ddpa->origin_snaps); 1974 origin_head = snap->ds; 1975 1976 /* 1977 * We need to explicitly open odd, since origin_ds's dd will be 1978 * changing. 1979 */ 1980 VERIFY0(dsl_dir_hold_obj(dp, origin_ds->ds_dir->dd_object, 1981 NULL, FTAG, &odd)); 1982 1983 /* change origin's next snap */ 1984 dmu_buf_will_dirty(origin_ds->ds_dbuf, tx); 1985 oldnext_obj = origin_ds->ds_phys->ds_next_snap_obj; 1986 snap = list_tail(&ddpa->clone_snaps); 1987 ASSERT3U(snap->ds->ds_phys->ds_prev_snap_obj, ==, origin_ds->ds_object); 1988 origin_ds->ds_phys->ds_next_snap_obj = snap->ds->ds_object; 1989 1990 /* change the origin's next clone */ 1991 if (origin_ds->ds_phys->ds_next_clones_obj) { 1992 dsl_dataset_remove_from_next_clones(origin_ds, 1993 snap->ds->ds_object, tx); 1994 VERIFY0(zap_add_int(dp->dp_meta_objset, 1995 origin_ds->ds_phys->ds_next_clones_obj, 1996 oldnext_obj, tx)); 1997 } 1998 1999 /* change origin */ 2000 dmu_buf_will_dirty(dd->dd_dbuf, tx); 2001 ASSERT3U(dd->dd_phys->dd_origin_obj, ==, origin_ds->ds_object); 2002 dd->dd_phys->dd_origin_obj = odd->dd_phys->dd_origin_obj; 2003 dd->dd_origin_txg = origin_head->ds_dir->dd_origin_txg; 2004 dmu_buf_will_dirty(odd->dd_dbuf, tx); 2005 odd->dd_phys->dd_origin_obj = origin_ds->ds_object; 2006 origin_head->ds_dir->dd_origin_txg = 2007 origin_ds->ds_phys->ds_creation_txg; 2008 2009 /* change dd_clone entries */ 2010 if (spa_version(dp->dp_spa) >= SPA_VERSION_DIR_CLONES) { 2011 VERIFY0(zap_remove_int(dp->dp_meta_objset, 2012 odd->dd_phys->dd_clones, hds->ds_object, tx)); 2013 VERIFY0(zap_add_int(dp->dp_meta_objset, 2014 ddpa->origin_origin->ds_dir->dd_phys->dd_clones, 2015 hds->ds_object, tx)); 2016 2017 VERIFY0(zap_remove_int(dp->dp_meta_objset, 2018 ddpa->origin_origin->ds_dir->dd_phys->dd_clones, 2019 origin_head->ds_object, tx)); 2020 if (dd->dd_phys->dd_clones == 0) { 2021 dd->dd_phys->dd_clones = zap_create(dp->dp_meta_objset, 2022 DMU_OT_DSL_CLONES, DMU_OT_NONE, 0, tx); 2023 } 2024 VERIFY0(zap_add_int(dp->dp_meta_objset, 2025 dd->dd_phys->dd_clones, origin_head->ds_object, tx)); 2026 } 2027 2028 /* move snapshots to this dir */ 2029 for (snap = list_head(&ddpa->shared_snaps); snap; 2030 snap = list_next(&ddpa->shared_snaps, snap)) { 2031 dsl_dataset_t *ds = snap->ds; 2032 2033 /* 2034 * Property callbacks are registered to a particular 2035 * dsl_dir. Since ours is changing, evict the objset 2036 * so that they will be unregistered from the old dsl_dir. 2037 */ 2038 if (ds->ds_objset) { 2039 dmu_objset_evict(ds->ds_objset); 2040 ds->ds_objset = NULL; 2041 } 2042 2043 /* move snap name entry */ 2044 VERIFY0(dsl_dataset_get_snapname(ds)); 2045 VERIFY0(dsl_dataset_snap_remove(origin_head, 2046 ds->ds_snapname, tx)); 2047 VERIFY0(zap_add(dp->dp_meta_objset, 2048 hds->ds_phys->ds_snapnames_zapobj, ds->ds_snapname, 2049 8, 1, &ds->ds_object, tx)); 2050 2051 /* change containing dsl_dir */ 2052 dmu_buf_will_dirty(ds->ds_dbuf, tx); 2053 ASSERT3U(ds->ds_phys->ds_dir_obj, ==, odd->dd_object); 2054 ds->ds_phys->ds_dir_obj = dd->dd_object; 2055 ASSERT3P(ds->ds_dir, ==, odd); 2056 dsl_dir_rele(ds->ds_dir, ds); 2057 VERIFY0(dsl_dir_hold_obj(dp, dd->dd_object, 2058 NULL, ds, &ds->ds_dir)); 2059 2060 /* move any clone references */ 2061 if (ds->ds_phys->ds_next_clones_obj && 2062 spa_version(dp->dp_spa) >= SPA_VERSION_DIR_CLONES) { 2063 zap_cursor_t zc; 2064 zap_attribute_t za; 2065 2066 for (zap_cursor_init(&zc, dp->dp_meta_objset, 2067 ds->ds_phys->ds_next_clones_obj); 2068 zap_cursor_retrieve(&zc, &za) == 0; 2069 zap_cursor_advance(&zc)) { 2070 dsl_dataset_t *cnds; 2071 uint64_t o; 2072 2073 if (za.za_first_integer == oldnext_obj) { 2074 /* 2075 * We've already moved the 2076 * origin's reference. 2077 */ 2078 continue; 2079 } 2080 2081 VERIFY0(dsl_dataset_hold_obj(dp, 2082 za.za_first_integer, FTAG, &cnds)); 2083 o = cnds->ds_dir->dd_phys->dd_head_dataset_obj; 2084 2085 VERIFY0(zap_remove_int(dp->dp_meta_objset, 2086 odd->dd_phys->dd_clones, o, tx)); 2087 VERIFY0(zap_add_int(dp->dp_meta_objset, 2088 dd->dd_phys->dd_clones, o, tx)); 2089 dsl_dataset_rele(cnds, FTAG); 2090 } 2091 zap_cursor_fini(&zc); 2092 } 2093 2094 ASSERT(!dsl_prop_hascb(ds)); 2095 } 2096 2097 /* 2098 * Change space accounting. 2099 * Note, pa->*usedsnap and dd_used_breakdown[SNAP] will either 2100 * both be valid, or both be 0 (resulting in delta == 0). This 2101 * is true for each of {clone,origin} independently. 2102 */ 2103 2104 delta = ddpa->cloneusedsnap - 2105 dd->dd_phys->dd_used_breakdown[DD_USED_SNAP]; 2106 ASSERT3S(delta, >=, 0); 2107 ASSERT3U(ddpa->used, >=, delta); 2108 dsl_dir_diduse_space(dd, DD_USED_SNAP, delta, 0, 0, tx); 2109 dsl_dir_diduse_space(dd, DD_USED_HEAD, 2110 ddpa->used - delta, ddpa->comp, ddpa->uncomp, tx); 2111 2112 delta = ddpa->originusedsnap - 2113 odd->dd_phys->dd_used_breakdown[DD_USED_SNAP]; 2114 ASSERT3S(delta, <=, 0); 2115 ASSERT3U(ddpa->used, >=, -delta); 2116 dsl_dir_diduse_space(odd, DD_USED_SNAP, delta, 0, 0, tx); 2117 dsl_dir_diduse_space(odd, DD_USED_HEAD, 2118 -ddpa->used - delta, -ddpa->comp, -ddpa->uncomp, tx); 2119 2120 origin_ds->ds_phys->ds_unique_bytes = ddpa->unique; 2121 2122 /* log history record */ 2123 spa_history_log_internal_ds(hds, "promote", tx, ""); 2124 2125 dsl_dir_rele(odd, FTAG); 2126 promote_rele(ddpa, FTAG); 2127 } 2128 2129 /* 2130 * Make a list of dsl_dataset_t's for the snapshots between first_obj 2131 * (exclusive) and last_obj (inclusive). The list will be in reverse 2132 * order (last_obj will be the list_head()). If first_obj == 0, do all 2133 * snapshots back to this dataset's origin. 2134 */ 2135 static int 2136 snaplist_make(dsl_pool_t *dp, 2137 uint64_t first_obj, uint64_t last_obj, list_t *l, void *tag) 2138 { 2139 uint64_t obj = last_obj; 2140 2141 list_create(l, sizeof (struct promotenode), 2142 offsetof(struct promotenode, link)); 2143 2144 while (obj != first_obj) { 2145 dsl_dataset_t *ds; 2146 struct promotenode *snap; 2147 int err; 2148 2149 err = dsl_dataset_hold_obj(dp, obj, tag, &ds); 2150 ASSERT(err != ENOENT); 2151 if (err != 0) 2152 return (err); 2153 2154 if (first_obj == 0) 2155 first_obj = ds->ds_dir->dd_phys->dd_origin_obj; 2156 2157 snap = kmem_alloc(sizeof (*snap), KM_SLEEP); 2158 snap->ds = ds; 2159 list_insert_tail(l, snap); 2160 obj = ds->ds_phys->ds_prev_snap_obj; 2161 } 2162 2163 return (0); 2164 } 2165 2166 static int 2167 snaplist_space(list_t *l, uint64_t mintxg, uint64_t *spacep) 2168 { 2169 struct promotenode *snap; 2170 2171 *spacep = 0; 2172 for (snap = list_head(l); snap; snap = list_next(l, snap)) { 2173 uint64_t used, comp, uncomp; 2174 dsl_deadlist_space_range(&snap->ds->ds_deadlist, 2175 mintxg, UINT64_MAX, &used, &comp, &uncomp); 2176 *spacep += used; 2177 } 2178 return (0); 2179 } 2180 2181 static void 2182 snaplist_destroy(list_t *l, void *tag) 2183 { 2184 struct promotenode *snap; 2185 2186 if (l == NULL || !list_link_active(&l->list_head)) 2187 return; 2188 2189 while ((snap = list_tail(l)) != NULL) { 2190 list_remove(l, snap); 2191 dsl_dataset_rele(snap->ds, tag); 2192 kmem_free(snap, sizeof (*snap)); 2193 } 2194 list_destroy(l); 2195 } 2196 2197 static int 2198 promote_hold(dsl_dataset_promote_arg_t *ddpa, dsl_pool_t *dp, void *tag) 2199 { 2200 int error; 2201 dsl_dir_t *dd; 2202 struct promotenode *snap; 2203 2204 error = dsl_dataset_hold(dp, ddpa->ddpa_clonename, tag, 2205 &ddpa->ddpa_clone); 2206 if (error != 0) 2207 return (error); 2208 dd = ddpa->ddpa_clone->ds_dir; 2209 2210 if (dsl_dataset_is_snapshot(ddpa->ddpa_clone) || 2211 !dsl_dir_is_clone(dd)) { 2212 dsl_dataset_rele(ddpa->ddpa_clone, tag); 2213 return (SET_ERROR(EINVAL)); 2214 } 2215 2216 error = snaplist_make(dp, 0, dd->dd_phys->dd_origin_obj, 2217 &ddpa->shared_snaps, tag); 2218 if (error != 0) 2219 goto out; 2220 2221 error = snaplist_make(dp, 0, ddpa->ddpa_clone->ds_object, 2222 &ddpa->clone_snaps, tag); 2223 if (error != 0) 2224 goto out; 2225 2226 snap = list_head(&ddpa->shared_snaps); 2227 ASSERT3U(snap->ds->ds_object, ==, dd->dd_phys->dd_origin_obj); 2228 error = snaplist_make(dp, dd->dd_phys->dd_origin_obj, 2229 snap->ds->ds_dir->dd_phys->dd_head_dataset_obj, 2230 &ddpa->origin_snaps, tag); 2231 if (error != 0) 2232 goto out; 2233 2234 if (snap->ds->ds_dir->dd_phys->dd_origin_obj != 0) { 2235 error = dsl_dataset_hold_obj(dp, 2236 snap->ds->ds_dir->dd_phys->dd_origin_obj, 2237 tag, &ddpa->origin_origin); 2238 if (error != 0) 2239 goto out; 2240 } 2241 out: 2242 if (error != 0) 2243 promote_rele(ddpa, tag); 2244 return (error); 2245 } 2246 2247 static void 2248 promote_rele(dsl_dataset_promote_arg_t *ddpa, void *tag) 2249 { 2250 snaplist_destroy(&ddpa->shared_snaps, tag); 2251 snaplist_destroy(&ddpa->clone_snaps, tag); 2252 snaplist_destroy(&ddpa->origin_snaps, tag); 2253 if (ddpa->origin_origin != NULL) 2254 dsl_dataset_rele(ddpa->origin_origin, tag); 2255 dsl_dataset_rele(ddpa->ddpa_clone, tag); 2256 } 2257 2258 /* 2259 * Promote a clone. 2260 * 2261 * If it fails due to a conflicting snapshot name, "conflsnap" will be filled 2262 * in with the name. (It must be at least MAXNAMELEN bytes long.) 2263 */ 2264 int 2265 dsl_dataset_promote(const char *name, char *conflsnap) 2266 { 2267 dsl_dataset_promote_arg_t ddpa = { 0 }; 2268 uint64_t numsnaps; 2269 int error; 2270 objset_t *os; 2271 2272 /* 2273 * We will modify space proportional to the number of 2274 * snapshots. Compute numsnaps. 2275 */ 2276 error = dmu_objset_hold(name, FTAG, &os); 2277 if (error != 0) 2278 return (error); 2279 error = zap_count(dmu_objset_pool(os)->dp_meta_objset, 2280 dmu_objset_ds(os)->ds_phys->ds_snapnames_zapobj, &numsnaps); 2281 dmu_objset_rele(os, FTAG); 2282 if (error != 0) 2283 return (error); 2284 2285 ddpa.ddpa_clonename = name; 2286 ddpa.err_ds = conflsnap; 2287 2288 return (dsl_sync_task(name, dsl_dataset_promote_check, 2289 dsl_dataset_promote_sync, &ddpa, 2 + numsnaps)); 2290 } 2291 2292 int 2293 dsl_dataset_clone_swap_check_impl(dsl_dataset_t *clone, 2294 dsl_dataset_t *origin_head, boolean_t force) 2295 { 2296 int64_t unused_refres_delta; 2297 2298 /* they should both be heads */ 2299 if (dsl_dataset_is_snapshot(clone) || 2300 dsl_dataset_is_snapshot(origin_head)) 2301 return (SET_ERROR(EINVAL)); 2302 2303 /* the branch point should be just before them */ 2304 if (clone->ds_prev != origin_head->ds_prev) 2305 return (SET_ERROR(EINVAL)); 2306 2307 /* clone should be the clone (unless they are unrelated) */ 2308 if (clone->ds_prev != NULL && 2309 clone->ds_prev != clone->ds_dir->dd_pool->dp_origin_snap && 2310 origin_head->ds_object != 2311 clone->ds_prev->ds_phys->ds_next_snap_obj) 2312 return (SET_ERROR(EINVAL)); 2313 2314 /* the clone should be a child of the origin */ 2315 if (clone->ds_dir->dd_parent != origin_head->ds_dir) 2316 return (SET_ERROR(EINVAL)); 2317 2318 /* origin_head shouldn't be modified unless 'force' */ 2319 if (!force && dsl_dataset_modified_since_lastsnap(origin_head)) 2320 return (SET_ERROR(ETXTBSY)); 2321 2322 /* origin_head should have no long holds (e.g. is not mounted) */ 2323 if (dsl_dataset_long_held(origin_head)) 2324 return (SET_ERROR(EBUSY)); 2325 2326 /* check amount of any unconsumed refreservation */ 2327 unused_refres_delta = 2328 (int64_t)MIN(origin_head->ds_reserved, 2329 origin_head->ds_phys->ds_unique_bytes) - 2330 (int64_t)MIN(origin_head->ds_reserved, 2331 clone->ds_phys->ds_unique_bytes); 2332 2333 if (unused_refres_delta > 0 && 2334 unused_refres_delta > 2335 dsl_dir_space_available(origin_head->ds_dir, NULL, 0, TRUE)) 2336 return (SET_ERROR(ENOSPC)); 2337 2338 /* clone can't be over the head's refquota */ 2339 if (origin_head->ds_quota != 0 && 2340 clone->ds_phys->ds_referenced_bytes > origin_head->ds_quota) 2341 return (SET_ERROR(EDQUOT)); 2342 2343 return (0); 2344 } 2345 2346 void 2347 dsl_dataset_clone_swap_sync_impl(dsl_dataset_t *clone, 2348 dsl_dataset_t *origin_head, dmu_tx_t *tx) 2349 { 2350 dsl_pool_t *dp = dmu_tx_pool(tx); 2351 int64_t unused_refres_delta; 2352 2353 ASSERT(clone->ds_reserved == 0); 2354 ASSERT(origin_head->ds_quota == 0 || 2355 clone->ds_phys->ds_unique_bytes <= origin_head->ds_quota); 2356 2357 dmu_buf_will_dirty(clone->ds_dbuf, tx); 2358 dmu_buf_will_dirty(origin_head->ds_dbuf, tx); 2359 2360 if (clone->ds_objset != NULL) { 2361 dmu_objset_evict(clone->ds_objset); 2362 clone->ds_objset = NULL; 2363 } 2364 2365 if (origin_head->ds_objset != NULL) { 2366 dmu_objset_evict(origin_head->ds_objset); 2367 origin_head->ds_objset = NULL; 2368 } 2369 2370 unused_refres_delta = 2371 (int64_t)MIN(origin_head->ds_reserved, 2372 origin_head->ds_phys->ds_unique_bytes) - 2373 (int64_t)MIN(origin_head->ds_reserved, 2374 clone->ds_phys->ds_unique_bytes); 2375 2376 /* 2377 * Reset origin's unique bytes, if it exists. 2378 */ 2379 if (clone->ds_prev) { 2380 dsl_dataset_t *origin = clone->ds_prev; 2381 uint64_t comp, uncomp; 2382 2383 dmu_buf_will_dirty(origin->ds_dbuf, tx); 2384 dsl_deadlist_space_range(&clone->ds_deadlist, 2385 origin->ds_phys->ds_prev_snap_txg, UINT64_MAX, 2386 &origin->ds_phys->ds_unique_bytes, &comp, &uncomp); 2387 } 2388 2389 /* swap blkptrs */ 2390 { 2391 blkptr_t tmp; 2392 tmp = origin_head->ds_phys->ds_bp; 2393 origin_head->ds_phys->ds_bp = clone->ds_phys->ds_bp; 2394 clone->ds_phys->ds_bp = tmp; 2395 } 2396 2397 /* set dd_*_bytes */ 2398 { 2399 int64_t dused, dcomp, duncomp; 2400 uint64_t cdl_used, cdl_comp, cdl_uncomp; 2401 uint64_t odl_used, odl_comp, odl_uncomp; 2402 2403 ASSERT3U(clone->ds_dir->dd_phys-> 2404 dd_used_breakdown[DD_USED_SNAP], ==, 0); 2405 2406 dsl_deadlist_space(&clone->ds_deadlist, 2407 &cdl_used, &cdl_comp, &cdl_uncomp); 2408 dsl_deadlist_space(&origin_head->ds_deadlist, 2409 &odl_used, &odl_comp, &odl_uncomp); 2410 2411 dused = clone->ds_phys->ds_referenced_bytes + cdl_used - 2412 (origin_head->ds_phys->ds_referenced_bytes + odl_used); 2413 dcomp = clone->ds_phys->ds_compressed_bytes + cdl_comp - 2414 (origin_head->ds_phys->ds_compressed_bytes + odl_comp); 2415 duncomp = clone->ds_phys->ds_uncompressed_bytes + 2416 cdl_uncomp - 2417 (origin_head->ds_phys->ds_uncompressed_bytes + odl_uncomp); 2418 2419 dsl_dir_diduse_space(origin_head->ds_dir, DD_USED_HEAD, 2420 dused, dcomp, duncomp, tx); 2421 dsl_dir_diduse_space(clone->ds_dir, DD_USED_HEAD, 2422 -dused, -dcomp, -duncomp, tx); 2423 2424 /* 2425 * The difference in the space used by snapshots is the 2426 * difference in snapshot space due to the head's 2427 * deadlist (since that's the only thing that's 2428 * changing that affects the snapused). 2429 */ 2430 dsl_deadlist_space_range(&clone->ds_deadlist, 2431 origin_head->ds_dir->dd_origin_txg, UINT64_MAX, 2432 &cdl_used, &cdl_comp, &cdl_uncomp); 2433 dsl_deadlist_space_range(&origin_head->ds_deadlist, 2434 origin_head->ds_dir->dd_origin_txg, UINT64_MAX, 2435 &odl_used, &odl_comp, &odl_uncomp); 2436 dsl_dir_transfer_space(origin_head->ds_dir, cdl_used - odl_used, 2437 DD_USED_HEAD, DD_USED_SNAP, tx); 2438 } 2439 2440 /* swap ds_*_bytes */ 2441 SWITCH64(origin_head->ds_phys->ds_referenced_bytes, 2442 clone->ds_phys->ds_referenced_bytes); 2443 SWITCH64(origin_head->ds_phys->ds_compressed_bytes, 2444 clone->ds_phys->ds_compressed_bytes); 2445 SWITCH64(origin_head->ds_phys->ds_uncompressed_bytes, 2446 clone->ds_phys->ds_uncompressed_bytes); 2447 SWITCH64(origin_head->ds_phys->ds_unique_bytes, 2448 clone->ds_phys->ds_unique_bytes); 2449 2450 /* apply any parent delta for change in unconsumed refreservation */ 2451 dsl_dir_diduse_space(origin_head->ds_dir, DD_USED_REFRSRV, 2452 unused_refres_delta, 0, 0, tx); 2453 2454 /* 2455 * Swap deadlists. 2456 */ 2457 dsl_deadlist_close(&clone->ds_deadlist); 2458 dsl_deadlist_close(&origin_head->ds_deadlist); 2459 SWITCH64(origin_head->ds_phys->ds_deadlist_obj, 2460 clone->ds_phys->ds_deadlist_obj); 2461 dsl_deadlist_open(&clone->ds_deadlist, dp->dp_meta_objset, 2462 clone->ds_phys->ds_deadlist_obj); 2463 dsl_deadlist_open(&origin_head->ds_deadlist, dp->dp_meta_objset, 2464 origin_head->ds_phys->ds_deadlist_obj); 2465 2466 dsl_scan_ds_clone_swapped(origin_head, clone, tx); 2467 2468 spa_history_log_internal_ds(clone, "clone swap", tx, 2469 "parent=%s", origin_head->ds_dir->dd_myname); 2470 } 2471 2472 /* 2473 * Given a pool name and a dataset object number in that pool, 2474 * return the name of that dataset. 2475 */ 2476 int 2477 dsl_dsobj_to_dsname(char *pname, uint64_t obj, char *buf) 2478 { 2479 dsl_pool_t *dp; 2480 dsl_dataset_t *ds; 2481 int error; 2482 2483 error = dsl_pool_hold(pname, FTAG, &dp); 2484 if (error != 0) 2485 return (error); 2486 2487 error = dsl_dataset_hold_obj(dp, obj, FTAG, &ds); 2488 if (error == 0) { 2489 dsl_dataset_name(ds, buf); 2490 dsl_dataset_rele(ds, FTAG); 2491 } 2492 dsl_pool_rele(dp, FTAG); 2493 2494 return (error); 2495 } 2496 2497 int 2498 dsl_dataset_check_quota(dsl_dataset_t *ds, boolean_t check_quota, 2499 uint64_t asize, uint64_t inflight, uint64_t *used, uint64_t *ref_rsrv) 2500 { 2501 int error = 0; 2502 2503 ASSERT3S(asize, >, 0); 2504 2505 /* 2506 * *ref_rsrv is the portion of asize that will come from any 2507 * unconsumed refreservation space. 2508 */ 2509 *ref_rsrv = 0; 2510 2511 mutex_enter(&ds->ds_lock); 2512 /* 2513 * Make a space adjustment for reserved bytes. 2514 */ 2515 if (ds->ds_reserved > ds->ds_phys->ds_unique_bytes) { 2516 ASSERT3U(*used, >=, 2517 ds->ds_reserved - ds->ds_phys->ds_unique_bytes); 2518 *used -= (ds->ds_reserved - ds->ds_phys->ds_unique_bytes); 2519 *ref_rsrv = 2520 asize - MIN(asize, parent_delta(ds, asize + inflight)); 2521 } 2522 2523 if (!check_quota || ds->ds_quota == 0) { 2524 mutex_exit(&ds->ds_lock); 2525 return (0); 2526 } 2527 /* 2528 * If they are requesting more space, and our current estimate 2529 * is over quota, they get to try again unless the actual 2530 * on-disk is over quota and there are no pending changes (which 2531 * may free up space for us). 2532 */ 2533 if (ds->ds_phys->ds_referenced_bytes + inflight >= ds->ds_quota) { 2534 if (inflight > 0 || 2535 ds->ds_phys->ds_referenced_bytes < ds->ds_quota) 2536 error = SET_ERROR(ERESTART); 2537 else 2538 error = SET_ERROR(EDQUOT); 2539 } 2540 mutex_exit(&ds->ds_lock); 2541 2542 return (error); 2543 } 2544 2545 typedef struct dsl_dataset_set_qr_arg { 2546 const char *ddsqra_name; 2547 zprop_source_t ddsqra_source; 2548 uint64_t ddsqra_value; 2549 } dsl_dataset_set_qr_arg_t; 2550 2551 2552 /* ARGSUSED */ 2553 static int 2554 dsl_dataset_set_refquota_check(void *arg, dmu_tx_t *tx) 2555 { 2556 dsl_dataset_set_qr_arg_t *ddsqra = arg; 2557 dsl_pool_t *dp = dmu_tx_pool(tx); 2558 dsl_dataset_t *ds; 2559 int error; 2560 uint64_t newval; 2561 2562 if (spa_version(dp->dp_spa) < SPA_VERSION_REFQUOTA) 2563 return (SET_ERROR(ENOTSUP)); 2564 2565 error = dsl_dataset_hold(dp, ddsqra->ddsqra_name, FTAG, &ds); 2566 if (error != 0) 2567 return (error); 2568 2569 if (dsl_dataset_is_snapshot(ds)) { 2570 dsl_dataset_rele(ds, FTAG); 2571 return (SET_ERROR(EINVAL)); 2572 } 2573 2574 error = dsl_prop_predict(ds->ds_dir, 2575 zfs_prop_to_name(ZFS_PROP_REFQUOTA), 2576 ddsqra->ddsqra_source, ddsqra->ddsqra_value, &newval); 2577 if (error != 0) { 2578 dsl_dataset_rele(ds, FTAG); 2579 return (error); 2580 } 2581 2582 if (newval == 0) { 2583 dsl_dataset_rele(ds, FTAG); 2584 return (0); 2585 } 2586 2587 if (newval < ds->ds_phys->ds_referenced_bytes || 2588 newval < ds->ds_reserved) { 2589 dsl_dataset_rele(ds, FTAG); 2590 return (SET_ERROR(ENOSPC)); 2591 } 2592 2593 dsl_dataset_rele(ds, FTAG); 2594 return (0); 2595 } 2596 2597 static void 2598 dsl_dataset_set_refquota_sync(void *arg, dmu_tx_t *tx) 2599 { 2600 dsl_dataset_set_qr_arg_t *ddsqra = arg; 2601 dsl_pool_t *dp = dmu_tx_pool(tx); 2602 dsl_dataset_t *ds; 2603 uint64_t newval; 2604 2605 VERIFY0(dsl_dataset_hold(dp, ddsqra->ddsqra_name, FTAG, &ds)); 2606 2607 dsl_prop_set_sync_impl(ds, 2608 zfs_prop_to_name(ZFS_PROP_REFQUOTA), 2609 ddsqra->ddsqra_source, sizeof (ddsqra->ddsqra_value), 1, 2610 &ddsqra->ddsqra_value, tx); 2611 2612 VERIFY0(dsl_prop_get_int_ds(ds, 2613 zfs_prop_to_name(ZFS_PROP_REFQUOTA), &newval)); 2614 2615 if (ds->ds_quota != newval) { 2616 dmu_buf_will_dirty(ds->ds_dbuf, tx); 2617 ds->ds_quota = newval; 2618 } 2619 dsl_dataset_rele(ds, FTAG); 2620 } 2621 2622 int 2623 dsl_dataset_set_refquota(const char *dsname, zprop_source_t source, 2624 uint64_t refquota) 2625 { 2626 dsl_dataset_set_qr_arg_t ddsqra; 2627 2628 ddsqra.ddsqra_name = dsname; 2629 ddsqra.ddsqra_source = source; 2630 ddsqra.ddsqra_value = refquota; 2631 2632 return (dsl_sync_task(dsname, dsl_dataset_set_refquota_check, 2633 dsl_dataset_set_refquota_sync, &ddsqra, 0)); 2634 } 2635 2636 static int 2637 dsl_dataset_set_refreservation_check(void *arg, dmu_tx_t *tx) 2638 { 2639 dsl_dataset_set_qr_arg_t *ddsqra = arg; 2640 dsl_pool_t *dp = dmu_tx_pool(tx); 2641 dsl_dataset_t *ds; 2642 int error; 2643 uint64_t newval, unique; 2644 2645 if (spa_version(dp->dp_spa) < SPA_VERSION_REFRESERVATION) 2646 return (SET_ERROR(ENOTSUP)); 2647 2648 error = dsl_dataset_hold(dp, ddsqra->ddsqra_name, FTAG, &ds); 2649 if (error != 0) 2650 return (error); 2651 2652 if (dsl_dataset_is_snapshot(ds)) { 2653 dsl_dataset_rele(ds, FTAG); 2654 return (SET_ERROR(EINVAL)); 2655 } 2656 2657 error = dsl_prop_predict(ds->ds_dir, 2658 zfs_prop_to_name(ZFS_PROP_REFRESERVATION), 2659 ddsqra->ddsqra_source, ddsqra->ddsqra_value, &newval); 2660 if (error != 0) { 2661 dsl_dataset_rele(ds, FTAG); 2662 return (error); 2663 } 2664 2665 /* 2666 * If we are doing the preliminary check in open context, the 2667 * space estimates may be inaccurate. 2668 */ 2669 if (!dmu_tx_is_syncing(tx)) { 2670 dsl_dataset_rele(ds, FTAG); 2671 return (0); 2672 } 2673 2674 mutex_enter(&ds->ds_lock); 2675 if (!DS_UNIQUE_IS_ACCURATE(ds)) 2676 dsl_dataset_recalc_head_uniq(ds); 2677 unique = ds->ds_phys->ds_unique_bytes; 2678 mutex_exit(&ds->ds_lock); 2679 2680 if (MAX(unique, newval) > MAX(unique, ds->ds_reserved)) { 2681 uint64_t delta = MAX(unique, newval) - 2682 MAX(unique, ds->ds_reserved); 2683 2684 if (delta > 2685 dsl_dir_space_available(ds->ds_dir, NULL, 0, B_TRUE) || 2686 (ds->ds_quota > 0 && newval > ds->ds_quota)) { 2687 dsl_dataset_rele(ds, FTAG); 2688 return (SET_ERROR(ENOSPC)); 2689 } 2690 } 2691 2692 dsl_dataset_rele(ds, FTAG); 2693 return (0); 2694 } 2695 2696 void 2697 dsl_dataset_set_refreservation_sync_impl(dsl_dataset_t *ds, 2698 zprop_source_t source, uint64_t value, dmu_tx_t *tx) 2699 { 2700 uint64_t newval; 2701 uint64_t unique; 2702 int64_t delta; 2703 2704 dsl_prop_set_sync_impl(ds, zfs_prop_to_name(ZFS_PROP_REFRESERVATION), 2705 source, sizeof (value), 1, &value, tx); 2706 2707 VERIFY0(dsl_prop_get_int_ds(ds, 2708 zfs_prop_to_name(ZFS_PROP_REFRESERVATION), &newval)); 2709 2710 dmu_buf_will_dirty(ds->ds_dbuf, tx); 2711 mutex_enter(&ds->ds_dir->dd_lock); 2712 mutex_enter(&ds->ds_lock); 2713 ASSERT(DS_UNIQUE_IS_ACCURATE(ds)); 2714 unique = ds->ds_phys->ds_unique_bytes; 2715 delta = MAX(0, (int64_t)(newval - unique)) - 2716 MAX(0, (int64_t)(ds->ds_reserved - unique)); 2717 ds->ds_reserved = newval; 2718 mutex_exit(&ds->ds_lock); 2719 2720 dsl_dir_diduse_space(ds->ds_dir, DD_USED_REFRSRV, delta, 0, 0, tx); 2721 mutex_exit(&ds->ds_dir->dd_lock); 2722 } 2723 2724 static void 2725 dsl_dataset_set_refreservation_sync(void *arg, dmu_tx_t *tx) 2726 { 2727 dsl_dataset_set_qr_arg_t *ddsqra = arg; 2728 dsl_pool_t *dp = dmu_tx_pool(tx); 2729 dsl_dataset_t *ds; 2730 2731 VERIFY0(dsl_dataset_hold(dp, ddsqra->ddsqra_name, FTAG, &ds)); 2732 dsl_dataset_set_refreservation_sync_impl(ds, 2733 ddsqra->ddsqra_source, ddsqra->ddsqra_value, tx); 2734 dsl_dataset_rele(ds, FTAG); 2735 } 2736 2737 int 2738 dsl_dataset_set_refreservation(const char *dsname, zprop_source_t source, 2739 uint64_t refreservation) 2740 { 2741 dsl_dataset_set_qr_arg_t ddsqra; 2742 2743 ddsqra.ddsqra_name = dsname; 2744 ddsqra.ddsqra_source = source; 2745 ddsqra.ddsqra_value = refreservation; 2746 2747 return (dsl_sync_task(dsname, dsl_dataset_set_refreservation_check, 2748 dsl_dataset_set_refreservation_sync, &ddsqra, 0)); 2749 } 2750 2751 /* 2752 * Return (in *usedp) the amount of space written in new that is not 2753 * present in oldsnap. New may be a snapshot or the head. Old must be 2754 * a snapshot before new, in new's filesystem (or its origin). If not then 2755 * fail and return EINVAL. 2756 * 2757 * The written space is calculated by considering two components: First, we 2758 * ignore any freed space, and calculate the written as new's used space 2759 * minus old's used space. Next, we add in the amount of space that was freed 2760 * between the two snapshots, thus reducing new's used space relative to old's. 2761 * Specifically, this is the space that was born before old->ds_creation_txg, 2762 * and freed before new (ie. on new's deadlist or a previous deadlist). 2763 * 2764 * space freed [---------------------] 2765 * snapshots ---O-------O--------O-------O------ 2766 * oldsnap new 2767 */ 2768 int 2769 dsl_dataset_space_written(dsl_dataset_t *oldsnap, dsl_dataset_t *new, 2770 uint64_t *usedp, uint64_t *compp, uint64_t *uncompp) 2771 { 2772 int err = 0; 2773 uint64_t snapobj; 2774 dsl_pool_t *dp = new->ds_dir->dd_pool; 2775 2776 ASSERT(dsl_pool_config_held(dp)); 2777 2778 *usedp = 0; 2779 *usedp += new->ds_phys->ds_referenced_bytes; 2780 *usedp -= oldsnap->ds_phys->ds_referenced_bytes; 2781 2782 *compp = 0; 2783 *compp += new->ds_phys->ds_compressed_bytes; 2784 *compp -= oldsnap->ds_phys->ds_compressed_bytes; 2785 2786 *uncompp = 0; 2787 *uncompp += new->ds_phys->ds_uncompressed_bytes; 2788 *uncompp -= oldsnap->ds_phys->ds_uncompressed_bytes; 2789 2790 snapobj = new->ds_object; 2791 while (snapobj != oldsnap->ds_object) { 2792 dsl_dataset_t *snap; 2793 uint64_t used, comp, uncomp; 2794 2795 if (snapobj == new->ds_object) { 2796 snap = new; 2797 } else { 2798 err = dsl_dataset_hold_obj(dp, snapobj, FTAG, &snap); 2799 if (err != 0) 2800 break; 2801 } 2802 2803 if (snap->ds_phys->ds_prev_snap_txg == 2804 oldsnap->ds_phys->ds_creation_txg) { 2805 /* 2806 * The blocks in the deadlist can not be born after 2807 * ds_prev_snap_txg, so get the whole deadlist space, 2808 * which is more efficient (especially for old-format 2809 * deadlists). Unfortunately the deadlist code 2810 * doesn't have enough information to make this 2811 * optimization itself. 2812 */ 2813 dsl_deadlist_space(&snap->ds_deadlist, 2814 &used, &comp, &uncomp); 2815 } else { 2816 dsl_deadlist_space_range(&snap->ds_deadlist, 2817 0, oldsnap->ds_phys->ds_creation_txg, 2818 &used, &comp, &uncomp); 2819 } 2820 *usedp += used; 2821 *compp += comp; 2822 *uncompp += uncomp; 2823 2824 /* 2825 * If we get to the beginning of the chain of snapshots 2826 * (ds_prev_snap_obj == 0) before oldsnap, then oldsnap 2827 * was not a snapshot of/before new. 2828 */ 2829 snapobj = snap->ds_phys->ds_prev_snap_obj; 2830 if (snap != new) 2831 dsl_dataset_rele(snap, FTAG); 2832 if (snapobj == 0) { 2833 err = SET_ERROR(EINVAL); 2834 break; 2835 } 2836 2837 } 2838 return (err); 2839 } 2840 2841 /* 2842 * Return (in *usedp) the amount of space that will be reclaimed if firstsnap, 2843 * lastsnap, and all snapshots in between are deleted. 2844 * 2845 * blocks that would be freed [---------------------------] 2846 * snapshots ---O-------O--------O-------O--------O 2847 * firstsnap lastsnap 2848 * 2849 * This is the set of blocks that were born after the snap before firstsnap, 2850 * (birth > firstsnap->prev_snap_txg) and died before the snap after the 2851 * last snap (ie, is on lastsnap->ds_next->ds_deadlist or an earlier deadlist). 2852 * We calculate this by iterating over the relevant deadlists (from the snap 2853 * after lastsnap, backward to the snap after firstsnap), summing up the 2854 * space on the deadlist that was born after the snap before firstsnap. 2855 */ 2856 int 2857 dsl_dataset_space_wouldfree(dsl_dataset_t *firstsnap, 2858 dsl_dataset_t *lastsnap, 2859 uint64_t *usedp, uint64_t *compp, uint64_t *uncompp) 2860 { 2861 int err = 0; 2862 uint64_t snapobj; 2863 dsl_pool_t *dp = firstsnap->ds_dir->dd_pool; 2864 2865 ASSERT(dsl_dataset_is_snapshot(firstsnap)); 2866 ASSERT(dsl_dataset_is_snapshot(lastsnap)); 2867 2868 /* 2869 * Check that the snapshots are in the same dsl_dir, and firstsnap 2870 * is before lastsnap. 2871 */ 2872 if (firstsnap->ds_dir != lastsnap->ds_dir || 2873 firstsnap->ds_phys->ds_creation_txg > 2874 lastsnap->ds_phys->ds_creation_txg) 2875 return (SET_ERROR(EINVAL)); 2876 2877 *usedp = *compp = *uncompp = 0; 2878 2879 snapobj = lastsnap->ds_phys->ds_next_snap_obj; 2880 while (snapobj != firstsnap->ds_object) { 2881 dsl_dataset_t *ds; 2882 uint64_t used, comp, uncomp; 2883 2884 err = dsl_dataset_hold_obj(dp, snapobj, FTAG, &ds); 2885 if (err != 0) 2886 break; 2887 2888 dsl_deadlist_space_range(&ds->ds_deadlist, 2889 firstsnap->ds_phys->ds_prev_snap_txg, UINT64_MAX, 2890 &used, &comp, &uncomp); 2891 *usedp += used; 2892 *compp += comp; 2893 *uncompp += uncomp; 2894 2895 snapobj = ds->ds_phys->ds_prev_snap_obj; 2896 ASSERT3U(snapobj, !=, 0); 2897 dsl_dataset_rele(ds, FTAG); 2898 } 2899 return (err); 2900 } 2901 2902 /* 2903 * Return TRUE if 'earlier' is an earlier snapshot in 'later's timeline. 2904 * For example, they could both be snapshots of the same filesystem, and 2905 * 'earlier' is before 'later'. Or 'earlier' could be the origin of 2906 * 'later's filesystem. Or 'earlier' could be an older snapshot in the origin's 2907 * filesystem. Or 'earlier' could be the origin's origin. 2908 */ 2909 boolean_t 2910 dsl_dataset_is_before(dsl_dataset_t *later, dsl_dataset_t *earlier) 2911 { 2912 dsl_pool_t *dp = later->ds_dir->dd_pool; 2913 int error; 2914 boolean_t ret; 2915 2916 ASSERT(dsl_pool_config_held(dp)); 2917 2918 if (earlier->ds_phys->ds_creation_txg >= 2919 later->ds_phys->ds_creation_txg) 2920 return (B_FALSE); 2921 2922 if (later->ds_dir == earlier->ds_dir) 2923 return (B_TRUE); 2924 if (!dsl_dir_is_clone(later->ds_dir)) 2925 return (B_FALSE); 2926 2927 if (later->ds_dir->dd_phys->dd_origin_obj == earlier->ds_object) 2928 return (B_TRUE); 2929 dsl_dataset_t *origin; 2930 error = dsl_dataset_hold_obj(dp, 2931 later->ds_dir->dd_phys->dd_origin_obj, FTAG, &origin); 2932 if (error != 0) 2933 return (B_FALSE); 2934 ret = dsl_dataset_is_before(origin, earlier); 2935 dsl_dataset_rele(origin, FTAG); 2936 return (ret); 2937 }