dsl_pool.c revision 321592
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) 2011, 2016 by Delphix. All rights reserved. 24 * Copyright (c) 2013 Steven Hartland. All rights reserved. 25 * Copyright (c) 2014 Spectra Logic Corporation, All rights reserved. 26 * Copyright (c) 2014 Integros [integros.com] 27 */ 28 29#include <sys/dsl_pool.h> 30#include <sys/dsl_dataset.h> 31#include <sys/dsl_prop.h> 32#include <sys/dsl_dir.h> 33#include <sys/dsl_synctask.h> 34#include <sys/dsl_scan.h> 35#include <sys/dnode.h> 36#include <sys/dmu_tx.h> 37#include <sys/dmu_objset.h> 38#include <sys/arc.h> 39#include <sys/zap.h> 40#include <sys/zio.h> 41#include <sys/zfs_context.h> 42#include <sys/fs/zfs.h> 43#include <sys/zfs_znode.h> 44#include <sys/spa_impl.h> 45#include <sys/dsl_deadlist.h> 46#include <sys/bptree.h> 47#include <sys/zfeature.h> 48#include <sys/zil_impl.h> 49#include <sys/dsl_userhold.h> 50 51#ifdef __FreeBSD__ 52#include <sys/types.h> 53#include <sys/sysctl.h> 54#endif 55 56/* 57 * ZFS Write Throttle 58 * ------------------ 59 * 60 * ZFS must limit the rate of incoming writes to the rate at which it is able 61 * to sync data modifications to the backend storage. Throttling by too much 62 * creates an artificial limit; throttling by too little can only be sustained 63 * for short periods and would lead to highly lumpy performance. On a per-pool 64 * basis, ZFS tracks the amount of modified (dirty) data. As operations change 65 * data, the amount of dirty data increases; as ZFS syncs out data, the amount 66 * of dirty data decreases. When the amount of dirty data exceeds a 67 * predetermined threshold further modifications are blocked until the amount 68 * of dirty data decreases (as data is synced out). 69 * 70 * The limit on dirty data is tunable, and should be adjusted according to 71 * both the IO capacity and available memory of the system. The larger the 72 * window, the more ZFS is able to aggregate and amortize metadata (and data) 73 * changes. However, memory is a limited resource, and allowing for more dirty 74 * data comes at the cost of keeping other useful data in memory (for example 75 * ZFS data cached by the ARC). 76 * 77 * Implementation 78 * 79 * As buffers are modified dsl_pool_willuse_space() increments both the per- 80 * txg (dp_dirty_pertxg[]) and poolwide (dp_dirty_total) accounting of 81 * dirty space used; dsl_pool_dirty_space() decrements those values as data 82 * is synced out from dsl_pool_sync(). While only the poolwide value is 83 * relevant, the per-txg value is useful for debugging. The tunable 84 * zfs_dirty_data_max determines the dirty space limit. Once that value is 85 * exceeded, new writes are halted until space frees up. 86 * 87 * The zfs_dirty_data_sync tunable dictates the threshold at which we 88 * ensure that there is a txg syncing (see the comment in txg.c for a full 89 * description of transaction group stages). 90 * 91 * The IO scheduler uses both the dirty space limit and current amount of 92 * dirty data as inputs. Those values affect the number of concurrent IOs ZFS 93 * issues. See the comment in vdev_queue.c for details of the IO scheduler. 94 * 95 * The delay is also calculated based on the amount of dirty data. See the 96 * comment above dmu_tx_delay() for details. 97 */ 98 99/* 100 * zfs_dirty_data_max will be set to zfs_dirty_data_max_percent% of all memory, 101 * capped at zfs_dirty_data_max_max. It can also be overridden in /etc/system. 102 */ 103uint64_t zfs_dirty_data_max; 104uint64_t zfs_dirty_data_max_max = 4ULL * 1024 * 1024 * 1024; 105int zfs_dirty_data_max_percent = 10; 106 107/* 108 * If there is at least this much dirty data, push out a txg. 109 */ 110uint64_t zfs_dirty_data_sync = 64 * 1024 * 1024; 111 112/* 113 * Once there is this amount of dirty data, the dmu_tx_delay() will kick in 114 * and delay each transaction. 115 * This value should be >= zfs_vdev_async_write_active_max_dirty_percent. 116 */ 117int zfs_delay_min_dirty_percent = 60; 118 119/* 120 * This controls how quickly the delay approaches infinity. 121 * Larger values cause it to delay more for a given amount of dirty data. 122 * Therefore larger values will cause there to be less dirty data for a 123 * given throughput. 124 * 125 * For the smoothest delay, this value should be about 1 billion divided 126 * by the maximum number of operations per second. This will smoothly 127 * handle between 10x and 1/10th this number. 128 * 129 * Note: zfs_delay_scale * zfs_dirty_data_max must be < 2^64, due to the 130 * multiply in dmu_tx_delay(). 131 */ 132uint64_t zfs_delay_scale = 1000 * 1000 * 1000 / 2000; 133 134 135#ifdef __FreeBSD__ 136 137extern int zfs_vdev_async_write_active_max_dirty_percent; 138 139SYSCTL_DECL(_vfs_zfs); 140 141TUNABLE_QUAD("vfs.zfs.dirty_data_max", &zfs_dirty_data_max); 142SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, dirty_data_max, CTLFLAG_RWTUN, 143 &zfs_dirty_data_max, 0, 144 "The maximum amount of dirty data in bytes after which new writes are " 145 "halted until space becomes available"); 146 147TUNABLE_QUAD("vfs.zfs.dirty_data_max_max", &zfs_dirty_data_max_max); 148SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, dirty_data_max_max, CTLFLAG_RDTUN, 149 &zfs_dirty_data_max_max, 0, 150 "The absolute cap on dirty_data_max when auto calculating"); 151 152TUNABLE_INT("vfs.zfs.dirty_data_max_percent", &zfs_dirty_data_max_percent); 153static int sysctl_zfs_dirty_data_max_percent(SYSCTL_HANDLER_ARGS); 154SYSCTL_PROC(_vfs_zfs, OID_AUTO, dirty_data_max_percent, 155 CTLTYPE_INT | CTLFLAG_MPSAFE | CTLFLAG_RWTUN, 0, sizeof(int), 156 sysctl_zfs_dirty_data_max_percent, "I", 157 "The percent of physical memory used to auto calculate dirty_data_max"); 158 159TUNABLE_QUAD("vfs.zfs.dirty_data_sync", &zfs_dirty_data_sync); 160SYSCTL_UQUAD(_vfs_zfs, OID_AUTO, dirty_data_sync, CTLFLAG_RWTUN, 161 &zfs_dirty_data_sync, 0, 162 "Force a txg if the number of dirty buffer bytes exceed this value"); 163 164static int sysctl_zfs_delay_min_dirty_percent(SYSCTL_HANDLER_ARGS); 165/* No zfs_delay_min_dirty_percent tunable due to limit requirements */ 166SYSCTL_PROC(_vfs_zfs, OID_AUTO, delay_min_dirty_percent, 167 CTLTYPE_INT | CTLFLAG_MPSAFE | CTLFLAG_RW, 0, sizeof(int), 168 sysctl_zfs_delay_min_dirty_percent, "I", 169 "The limit of outstanding dirty data before transactions are delayed"); 170 171static int sysctl_zfs_delay_scale(SYSCTL_HANDLER_ARGS); 172/* No zfs_delay_scale tunable due to limit requirements */ 173SYSCTL_PROC(_vfs_zfs, OID_AUTO, delay_scale, 174 CTLTYPE_U64 | CTLFLAG_MPSAFE | CTLFLAG_RW, 0, sizeof(uint64_t), 175 sysctl_zfs_delay_scale, "QU", 176 "Controls how quickly the delay approaches infinity"); 177 178static int 179sysctl_zfs_dirty_data_max_percent(SYSCTL_HANDLER_ARGS) 180{ 181 int val, err; 182 183 val = zfs_dirty_data_max_percent; 184 err = sysctl_handle_int(oidp, &val, 0, req); 185 if (err != 0 || req->newptr == NULL) 186 return (err); 187 188 if (val < 0 || val > 100) 189 return (EINVAL); 190 191 zfs_dirty_data_max_percent = val; 192 193 return (0); 194} 195 196static int 197sysctl_zfs_delay_min_dirty_percent(SYSCTL_HANDLER_ARGS) 198{ 199 int val, err; 200 201 val = zfs_delay_min_dirty_percent; 202 err = sysctl_handle_int(oidp, &val, 0, req); 203 if (err != 0 || req->newptr == NULL) 204 return (err); 205 206 if (val < zfs_vdev_async_write_active_max_dirty_percent) 207 return (EINVAL); 208 209 zfs_delay_min_dirty_percent = val; 210 211 return (0); 212} 213 214static int 215sysctl_zfs_delay_scale(SYSCTL_HANDLER_ARGS) 216{ 217 uint64_t val; 218 int err; 219 220 val = zfs_delay_scale; 221 err = sysctl_handle_64(oidp, &val, 0, req); 222 if (err != 0 || req->newptr == NULL) 223 return (err); 224 225 if (val > UINT64_MAX / zfs_dirty_data_max) 226 return (EINVAL); 227 228 zfs_delay_scale = val; 229 230 return (0); 231} 232#endif 233 234int 235dsl_pool_open_special_dir(dsl_pool_t *dp, const char *name, dsl_dir_t **ddp) 236{ 237 uint64_t obj; 238 int err; 239 240 err = zap_lookup(dp->dp_meta_objset, 241 dsl_dir_phys(dp->dp_root_dir)->dd_child_dir_zapobj, 242 name, sizeof (obj), 1, &obj); 243 if (err) 244 return (err); 245 246 return (dsl_dir_hold_obj(dp, obj, name, dp, ddp)); 247} 248 249static dsl_pool_t * 250dsl_pool_open_impl(spa_t *spa, uint64_t txg) 251{ 252 dsl_pool_t *dp; 253 blkptr_t *bp = spa_get_rootblkptr(spa); 254 255 dp = kmem_zalloc(sizeof (dsl_pool_t), KM_SLEEP); 256 dp->dp_spa = spa; 257 dp->dp_meta_rootbp = *bp; 258 rrw_init(&dp->dp_config_rwlock, B_TRUE); 259 txg_init(dp, txg); 260 261 txg_list_create(&dp->dp_dirty_datasets, 262 offsetof(dsl_dataset_t, ds_dirty_link)); 263 txg_list_create(&dp->dp_dirty_zilogs, 264 offsetof(zilog_t, zl_dirty_link)); 265 txg_list_create(&dp->dp_dirty_dirs, 266 offsetof(dsl_dir_t, dd_dirty_link)); 267 txg_list_create(&dp->dp_sync_tasks, 268 offsetof(dsl_sync_task_t, dst_node)); 269 270 mutex_init(&dp->dp_lock, NULL, MUTEX_DEFAULT, NULL); 271 cv_init(&dp->dp_spaceavail_cv, NULL, CV_DEFAULT, NULL); 272 273 dp->dp_vnrele_taskq = taskq_create("zfs_vn_rele_taskq", 1, minclsyspri, 274 1, 4, 0); 275 276 return (dp); 277} 278 279int 280dsl_pool_init(spa_t *spa, uint64_t txg, dsl_pool_t **dpp) 281{ 282 int err; 283 dsl_pool_t *dp = dsl_pool_open_impl(spa, txg); 284 285 err = dmu_objset_open_impl(spa, NULL, &dp->dp_meta_rootbp, 286 &dp->dp_meta_objset); 287 if (err != 0) 288 dsl_pool_close(dp); 289 else 290 *dpp = dp; 291 292 return (err); 293} 294 295int 296dsl_pool_open(dsl_pool_t *dp) 297{ 298 int err; 299 dsl_dir_t *dd; 300 dsl_dataset_t *ds; 301 uint64_t obj; 302 303 rrw_enter(&dp->dp_config_rwlock, RW_WRITER, FTAG); 304 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT, 305 DMU_POOL_ROOT_DATASET, sizeof (uint64_t), 1, 306 &dp->dp_root_dir_obj); 307 if (err) 308 goto out; 309 310 err = dsl_dir_hold_obj(dp, dp->dp_root_dir_obj, 311 NULL, dp, &dp->dp_root_dir); 312 if (err) 313 goto out; 314 315 err = dsl_pool_open_special_dir(dp, MOS_DIR_NAME, &dp->dp_mos_dir); 316 if (err) 317 goto out; 318 319 if (spa_version(dp->dp_spa) >= SPA_VERSION_ORIGIN) { 320 err = dsl_pool_open_special_dir(dp, ORIGIN_DIR_NAME, &dd); 321 if (err) 322 goto out; 323 err = dsl_dataset_hold_obj(dp, 324 dsl_dir_phys(dd)->dd_head_dataset_obj, FTAG, &ds); 325 if (err == 0) { 326 err = dsl_dataset_hold_obj(dp, 327 dsl_dataset_phys(ds)->ds_prev_snap_obj, dp, 328 &dp->dp_origin_snap); 329 dsl_dataset_rele(ds, FTAG); 330 } 331 dsl_dir_rele(dd, dp); 332 if (err) 333 goto out; 334 } 335 336 if (spa_version(dp->dp_spa) >= SPA_VERSION_DEADLISTS) { 337 err = dsl_pool_open_special_dir(dp, FREE_DIR_NAME, 338 &dp->dp_free_dir); 339 if (err) 340 goto out; 341 342 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT, 343 DMU_POOL_FREE_BPOBJ, sizeof (uint64_t), 1, &obj); 344 if (err) 345 goto out; 346 VERIFY0(bpobj_open(&dp->dp_free_bpobj, 347 dp->dp_meta_objset, obj)); 348 } 349 350 /* 351 * Note: errors ignored, because the leak dir will not exist if we 352 * have not encountered a leak yet. 353 */ 354 (void) dsl_pool_open_special_dir(dp, LEAK_DIR_NAME, 355 &dp->dp_leak_dir); 356 357 if (spa_feature_is_active(dp->dp_spa, SPA_FEATURE_ASYNC_DESTROY)) { 358 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT, 359 DMU_POOL_BPTREE_OBJ, sizeof (uint64_t), 1, 360 &dp->dp_bptree_obj); 361 if (err != 0) 362 goto out; 363 } 364 365 if (spa_feature_is_active(dp->dp_spa, SPA_FEATURE_EMPTY_BPOBJ)) { 366 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT, 367 DMU_POOL_EMPTY_BPOBJ, sizeof (uint64_t), 1, 368 &dp->dp_empty_bpobj); 369 if (err != 0) 370 goto out; 371 } 372 373 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT, 374 DMU_POOL_TMP_USERREFS, sizeof (uint64_t), 1, 375 &dp->dp_tmp_userrefs_obj); 376 if (err == ENOENT) 377 err = 0; 378 if (err) 379 goto out; 380 381 err = dsl_scan_init(dp, dp->dp_tx.tx_open_txg); 382 383out: 384 rrw_exit(&dp->dp_config_rwlock, FTAG); 385 return (err); 386} 387 388void 389dsl_pool_close(dsl_pool_t *dp) 390{ 391 /* 392 * Drop our references from dsl_pool_open(). 393 * 394 * Since we held the origin_snap from "syncing" context (which 395 * includes pool-opening context), it actually only got a "ref" 396 * and not a hold, so just drop that here. 397 */ 398 if (dp->dp_origin_snap) 399 dsl_dataset_rele(dp->dp_origin_snap, dp); 400 if (dp->dp_mos_dir) 401 dsl_dir_rele(dp->dp_mos_dir, dp); 402 if (dp->dp_free_dir) 403 dsl_dir_rele(dp->dp_free_dir, dp); 404 if (dp->dp_leak_dir) 405 dsl_dir_rele(dp->dp_leak_dir, dp); 406 if (dp->dp_root_dir) 407 dsl_dir_rele(dp->dp_root_dir, dp); 408 409 bpobj_close(&dp->dp_free_bpobj); 410 411 /* undo the dmu_objset_open_impl(mos) from dsl_pool_open() */ 412 if (dp->dp_meta_objset) 413 dmu_objset_evict(dp->dp_meta_objset); 414 415 txg_list_destroy(&dp->dp_dirty_datasets); 416 txg_list_destroy(&dp->dp_dirty_zilogs); 417 txg_list_destroy(&dp->dp_sync_tasks); 418 txg_list_destroy(&dp->dp_dirty_dirs); 419 420 /* 421 * We can't set retry to TRUE since we're explicitly specifying 422 * a spa to flush. This is good enough; any missed buffers for 423 * this spa won't cause trouble, and they'll eventually fall 424 * out of the ARC just like any other unused buffer. 425 */ 426 arc_flush(dp->dp_spa, FALSE); 427 428 txg_fini(dp); 429 dsl_scan_fini(dp); 430 dmu_buf_user_evict_wait(); 431 432 rrw_destroy(&dp->dp_config_rwlock); 433 mutex_destroy(&dp->dp_lock); 434 taskq_destroy(dp->dp_vnrele_taskq); 435 if (dp->dp_blkstats) 436 kmem_free(dp->dp_blkstats, sizeof (zfs_all_blkstats_t)); 437 kmem_free(dp, sizeof (dsl_pool_t)); 438} 439 440dsl_pool_t * 441dsl_pool_create(spa_t *spa, nvlist_t *zplprops, uint64_t txg) 442{ 443 int err; 444 dsl_pool_t *dp = dsl_pool_open_impl(spa, txg); 445 dmu_tx_t *tx = dmu_tx_create_assigned(dp, txg); 446 objset_t *os; 447 dsl_dataset_t *ds; 448 uint64_t obj; 449 450 rrw_enter(&dp->dp_config_rwlock, RW_WRITER, FTAG); 451 452 /* create and open the MOS (meta-objset) */ 453 dp->dp_meta_objset = dmu_objset_create_impl(spa, 454 NULL, &dp->dp_meta_rootbp, DMU_OST_META, tx); 455 456 /* create the pool directory */ 457 err = zap_create_claim(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT, 458 DMU_OT_OBJECT_DIRECTORY, DMU_OT_NONE, 0, tx); 459 ASSERT0(err); 460 461 /* Initialize scan structures */ 462 VERIFY0(dsl_scan_init(dp, txg)); 463 464 /* create and open the root dir */ 465 dp->dp_root_dir_obj = dsl_dir_create_sync(dp, NULL, NULL, tx); 466 VERIFY0(dsl_dir_hold_obj(dp, dp->dp_root_dir_obj, 467 NULL, dp, &dp->dp_root_dir)); 468 469 /* create and open the meta-objset dir */ 470 (void) dsl_dir_create_sync(dp, dp->dp_root_dir, MOS_DIR_NAME, tx); 471 VERIFY0(dsl_pool_open_special_dir(dp, 472 MOS_DIR_NAME, &dp->dp_mos_dir)); 473 474 if (spa_version(spa) >= SPA_VERSION_DEADLISTS) { 475 /* create and open the free dir */ 476 (void) dsl_dir_create_sync(dp, dp->dp_root_dir, 477 FREE_DIR_NAME, tx); 478 VERIFY0(dsl_pool_open_special_dir(dp, 479 FREE_DIR_NAME, &dp->dp_free_dir)); 480 481 /* create and open the free_bplist */ 482 obj = bpobj_alloc(dp->dp_meta_objset, SPA_OLD_MAXBLOCKSIZE, tx); 483 VERIFY(zap_add(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT, 484 DMU_POOL_FREE_BPOBJ, sizeof (uint64_t), 1, &obj, tx) == 0); 485 VERIFY0(bpobj_open(&dp->dp_free_bpobj, 486 dp->dp_meta_objset, obj)); 487 } 488 489 if (spa_version(spa) >= SPA_VERSION_DSL_SCRUB) 490 dsl_pool_create_origin(dp, tx); 491 492 /* create the root dataset */ 493 obj = dsl_dataset_create_sync_dd(dp->dp_root_dir, NULL, 0, tx); 494 495 /* create the root objset */ 496 VERIFY0(dsl_dataset_hold_obj(dp, obj, FTAG, &ds)); 497 rrw_enter(&ds->ds_bp_rwlock, RW_READER, FTAG); 498 os = dmu_objset_create_impl(dp->dp_spa, ds, 499 dsl_dataset_get_blkptr(ds), DMU_OST_ZFS, tx); 500 rrw_exit(&ds->ds_bp_rwlock, FTAG); 501#ifdef _KERNEL 502 zfs_create_fs(os, kcred, zplprops, tx); 503#endif 504 dsl_dataset_rele(ds, FTAG); 505 506 dmu_tx_commit(tx); 507 508 rrw_exit(&dp->dp_config_rwlock, FTAG); 509 510 return (dp); 511} 512 513/* 514 * Account for the meta-objset space in its placeholder dsl_dir. 515 */ 516void 517dsl_pool_mos_diduse_space(dsl_pool_t *dp, 518 int64_t used, int64_t comp, int64_t uncomp) 519{ 520 ASSERT3U(comp, ==, uncomp); /* it's all metadata */ 521 mutex_enter(&dp->dp_lock); 522 dp->dp_mos_used_delta += used; 523 dp->dp_mos_compressed_delta += comp; 524 dp->dp_mos_uncompressed_delta += uncomp; 525 mutex_exit(&dp->dp_lock); 526} 527 528static void 529dsl_pool_sync_mos(dsl_pool_t *dp, dmu_tx_t *tx) 530{ 531 zio_t *zio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED); 532 dmu_objset_sync(dp->dp_meta_objset, zio, tx); 533 VERIFY0(zio_wait(zio)); 534 dprintf_bp(&dp->dp_meta_rootbp, "meta objset rootbp is %s", ""); 535 spa_set_rootblkptr(dp->dp_spa, &dp->dp_meta_rootbp); 536} 537 538static void 539dsl_pool_dirty_delta(dsl_pool_t *dp, int64_t delta) 540{ 541 ASSERT(MUTEX_HELD(&dp->dp_lock)); 542 543 if (delta < 0) 544 ASSERT3U(-delta, <=, dp->dp_dirty_total); 545 546 dp->dp_dirty_total += delta; 547 548 /* 549 * Note: we signal even when increasing dp_dirty_total. 550 * This ensures forward progress -- each thread wakes the next waiter. 551 */ 552 if (dp->dp_dirty_total < zfs_dirty_data_max) 553 cv_signal(&dp->dp_spaceavail_cv); 554} 555 556void 557dsl_pool_sync(dsl_pool_t *dp, uint64_t txg) 558{ 559 zio_t *zio; 560 dmu_tx_t *tx; 561 dsl_dir_t *dd; 562 dsl_dataset_t *ds; 563 objset_t *mos = dp->dp_meta_objset; 564 list_t synced_datasets; 565 566 list_create(&synced_datasets, sizeof (dsl_dataset_t), 567 offsetof(dsl_dataset_t, ds_synced_link)); 568 569 tx = dmu_tx_create_assigned(dp, txg); 570 571 /* 572 * Write out all dirty blocks of dirty datasets. 573 */ 574 zio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED); 575 while ((ds = txg_list_remove(&dp->dp_dirty_datasets, txg)) != NULL) { 576 /* 577 * We must not sync any non-MOS datasets twice, because 578 * we may have taken a snapshot of them. However, we 579 * may sync newly-created datasets on pass 2. 580 */ 581 ASSERT(!list_link_active(&ds->ds_synced_link)); 582 list_insert_tail(&synced_datasets, ds); 583 dsl_dataset_sync(ds, zio, tx); 584 } 585 VERIFY0(zio_wait(zio)); 586 587 /* 588 * We have written all of the accounted dirty data, so our 589 * dp_space_towrite should now be zero. However, some seldom-used 590 * code paths do not adhere to this (e.g. dbuf_undirty(), also 591 * rounding error in dbuf_write_physdone). 592 * Shore up the accounting of any dirtied space now. 593 */ 594 dsl_pool_undirty_space(dp, dp->dp_dirty_pertxg[txg & TXG_MASK], txg); 595 596 /* 597 * After the data blocks have been written (ensured by the zio_wait() 598 * above), update the user/group space accounting. 599 */ 600 for (ds = list_head(&synced_datasets); ds != NULL; 601 ds = list_next(&synced_datasets, ds)) { 602 dmu_objset_do_userquota_updates(ds->ds_objset, tx); 603 } 604 605 /* 606 * Sync the datasets again to push out the changes due to 607 * userspace updates. This must be done before we process the 608 * sync tasks, so that any snapshots will have the correct 609 * user accounting information (and we won't get confused 610 * about which blocks are part of the snapshot). 611 */ 612 zio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED); 613 while ((ds = txg_list_remove(&dp->dp_dirty_datasets, txg)) != NULL) { 614 ASSERT(list_link_active(&ds->ds_synced_link)); 615 dmu_buf_rele(ds->ds_dbuf, ds); 616 dsl_dataset_sync(ds, zio, tx); 617 } 618 VERIFY0(zio_wait(zio)); 619 620 /* 621 * Now that the datasets have been completely synced, we can 622 * clean up our in-memory structures accumulated while syncing: 623 * 624 * - move dead blocks from the pending deadlist to the on-disk deadlist 625 * - release hold from dsl_dataset_dirty() 626 */ 627 while ((ds = list_remove_head(&synced_datasets)) != NULL) { 628 dsl_dataset_sync_done(ds, tx); 629 } 630 while ((dd = txg_list_remove(&dp->dp_dirty_dirs, txg)) != NULL) { 631 dsl_dir_sync(dd, tx); 632 } 633 634 /* 635 * The MOS's space is accounted for in the pool/$MOS 636 * (dp_mos_dir). We can't modify the mos while we're syncing 637 * it, so we remember the deltas and apply them here. 638 */ 639 if (dp->dp_mos_used_delta != 0 || dp->dp_mos_compressed_delta != 0 || 640 dp->dp_mos_uncompressed_delta != 0) { 641 dsl_dir_diduse_space(dp->dp_mos_dir, DD_USED_HEAD, 642 dp->dp_mos_used_delta, 643 dp->dp_mos_compressed_delta, 644 dp->dp_mos_uncompressed_delta, tx); 645 dp->dp_mos_used_delta = 0; 646 dp->dp_mos_compressed_delta = 0; 647 dp->dp_mos_uncompressed_delta = 0; 648 } 649 650 if (list_head(&mos->os_dirty_dnodes[txg & TXG_MASK]) != NULL || 651 list_head(&mos->os_free_dnodes[txg & TXG_MASK]) != NULL) { 652 dsl_pool_sync_mos(dp, tx); 653 } 654 655 /* 656 * If we modify a dataset in the same txg that we want to destroy it, 657 * its dsl_dir's dd_dbuf will be dirty, and thus have a hold on it. 658 * dsl_dir_destroy_check() will fail if there are unexpected holds. 659 * Therefore, we want to sync the MOS (thus syncing the dd_dbuf 660 * and clearing the hold on it) before we process the sync_tasks. 661 * The MOS data dirtied by the sync_tasks will be synced on the next 662 * pass. 663 */ 664 if (!txg_list_empty(&dp->dp_sync_tasks, txg)) { 665 dsl_sync_task_t *dst; 666 /* 667 * No more sync tasks should have been added while we 668 * were syncing. 669 */ 670 ASSERT3U(spa_sync_pass(dp->dp_spa), ==, 1); 671 while ((dst = txg_list_remove(&dp->dp_sync_tasks, txg)) != NULL) 672 dsl_sync_task_sync(dst, tx); 673 } 674 675 dmu_tx_commit(tx); 676 677 DTRACE_PROBE2(dsl_pool_sync__done, dsl_pool_t *dp, dp, uint64_t, txg); 678} 679 680void 681dsl_pool_sync_done(dsl_pool_t *dp, uint64_t txg) 682{ 683 zilog_t *zilog; 684 685 while (zilog = txg_list_head(&dp->dp_dirty_zilogs, txg)) { 686 dsl_dataset_t *ds = dmu_objset_ds(zilog->zl_os); 687 /* 688 * We don't remove the zilog from the dp_dirty_zilogs 689 * list until after we've cleaned it. This ensures that 690 * callers of zilog_is_dirty() receive an accurate 691 * answer when they are racing with the spa sync thread. 692 */ 693 zil_clean(zilog, txg); 694 (void) txg_list_remove_this(&dp->dp_dirty_zilogs, zilog, txg); 695 ASSERT(!dmu_objset_is_dirty(zilog->zl_os, txg)); 696 dmu_buf_rele(ds->ds_dbuf, zilog); 697 } 698 ASSERT(!dmu_objset_is_dirty(dp->dp_meta_objset, txg)); 699} 700 701/* 702 * TRUE if the current thread is the tx_sync_thread or if we 703 * are being called from SPA context during pool initialization. 704 */ 705int 706dsl_pool_sync_context(dsl_pool_t *dp) 707{ 708 return (curthread == dp->dp_tx.tx_sync_thread || 709 spa_is_initializing(dp->dp_spa)); 710} 711 712uint64_t 713dsl_pool_adjustedsize(dsl_pool_t *dp, boolean_t netfree) 714{ 715 uint64_t space, resv; 716 717 /* 718 * If we're trying to assess whether it's OK to do a free, 719 * cut the reservation in half to allow forward progress 720 * (e.g. make it possible to rm(1) files from a full pool). 721 */ 722 space = spa_get_dspace(dp->dp_spa); 723 resv = spa_get_slop_space(dp->dp_spa); 724 if (netfree) 725 resv >>= 1; 726 727 return (space - resv); 728} 729 730boolean_t 731dsl_pool_need_dirty_delay(dsl_pool_t *dp) 732{ 733 uint64_t delay_min_bytes = 734 zfs_dirty_data_max * zfs_delay_min_dirty_percent / 100; 735 boolean_t rv; 736 737 mutex_enter(&dp->dp_lock); 738 if (dp->dp_dirty_total > zfs_dirty_data_sync) 739 txg_kick(dp); 740 rv = (dp->dp_dirty_total > delay_min_bytes); 741 mutex_exit(&dp->dp_lock); 742 return (rv); 743} 744 745void 746dsl_pool_dirty_space(dsl_pool_t *dp, int64_t space, dmu_tx_t *tx) 747{ 748 if (space > 0) { 749 mutex_enter(&dp->dp_lock); 750 dp->dp_dirty_pertxg[tx->tx_txg & TXG_MASK] += space; 751 dsl_pool_dirty_delta(dp, space); 752 mutex_exit(&dp->dp_lock); 753 } 754} 755 756void 757dsl_pool_undirty_space(dsl_pool_t *dp, int64_t space, uint64_t txg) 758{ 759 ASSERT3S(space, >=, 0); 760 if (space == 0) 761 return; 762 mutex_enter(&dp->dp_lock); 763 if (dp->dp_dirty_pertxg[txg & TXG_MASK] < space) { 764 /* XXX writing something we didn't dirty? */ 765 space = dp->dp_dirty_pertxg[txg & TXG_MASK]; 766 } 767 ASSERT3U(dp->dp_dirty_pertxg[txg & TXG_MASK], >=, space); 768 dp->dp_dirty_pertxg[txg & TXG_MASK] -= space; 769 ASSERT3U(dp->dp_dirty_total, >=, space); 770 dsl_pool_dirty_delta(dp, -space); 771 mutex_exit(&dp->dp_lock); 772} 773 774/* ARGSUSED */ 775static int 776upgrade_clones_cb(dsl_pool_t *dp, dsl_dataset_t *hds, void *arg) 777{ 778 dmu_tx_t *tx = arg; 779 dsl_dataset_t *ds, *prev = NULL; 780 int err; 781 782 err = dsl_dataset_hold_obj(dp, hds->ds_object, FTAG, &ds); 783 if (err) 784 return (err); 785 786 while (dsl_dataset_phys(ds)->ds_prev_snap_obj != 0) { 787 err = dsl_dataset_hold_obj(dp, 788 dsl_dataset_phys(ds)->ds_prev_snap_obj, FTAG, &prev); 789 if (err) { 790 dsl_dataset_rele(ds, FTAG); 791 return (err); 792 } 793 794 if (dsl_dataset_phys(prev)->ds_next_snap_obj != ds->ds_object) 795 break; 796 dsl_dataset_rele(ds, FTAG); 797 ds = prev; 798 prev = NULL; 799 } 800 801 if (prev == NULL) { 802 prev = dp->dp_origin_snap; 803 804 /* 805 * The $ORIGIN can't have any data, or the accounting 806 * will be wrong. 807 */ 808 rrw_enter(&ds->ds_bp_rwlock, RW_READER, FTAG); 809 ASSERT0(dsl_dataset_phys(prev)->ds_bp.blk_birth); 810 rrw_exit(&ds->ds_bp_rwlock, FTAG); 811 812 /* The origin doesn't get attached to itself */ 813 if (ds->ds_object == prev->ds_object) { 814 dsl_dataset_rele(ds, FTAG); 815 return (0); 816 } 817 818 dmu_buf_will_dirty(ds->ds_dbuf, tx); 819 dsl_dataset_phys(ds)->ds_prev_snap_obj = prev->ds_object; 820 dsl_dataset_phys(ds)->ds_prev_snap_txg = 821 dsl_dataset_phys(prev)->ds_creation_txg; 822 823 dmu_buf_will_dirty(ds->ds_dir->dd_dbuf, tx); 824 dsl_dir_phys(ds->ds_dir)->dd_origin_obj = prev->ds_object; 825 826 dmu_buf_will_dirty(prev->ds_dbuf, tx); 827 dsl_dataset_phys(prev)->ds_num_children++; 828 829 if (dsl_dataset_phys(ds)->ds_next_snap_obj == 0) { 830 ASSERT(ds->ds_prev == NULL); 831 VERIFY0(dsl_dataset_hold_obj(dp, 832 dsl_dataset_phys(ds)->ds_prev_snap_obj, 833 ds, &ds->ds_prev)); 834 } 835 } 836 837 ASSERT3U(dsl_dir_phys(ds->ds_dir)->dd_origin_obj, ==, prev->ds_object); 838 ASSERT3U(dsl_dataset_phys(ds)->ds_prev_snap_obj, ==, prev->ds_object); 839 840 if (dsl_dataset_phys(prev)->ds_next_clones_obj == 0) { 841 dmu_buf_will_dirty(prev->ds_dbuf, tx); 842 dsl_dataset_phys(prev)->ds_next_clones_obj = 843 zap_create(dp->dp_meta_objset, 844 DMU_OT_NEXT_CLONES, DMU_OT_NONE, 0, tx); 845 } 846 VERIFY0(zap_add_int(dp->dp_meta_objset, 847 dsl_dataset_phys(prev)->ds_next_clones_obj, ds->ds_object, tx)); 848 849 dsl_dataset_rele(ds, FTAG); 850 if (prev != dp->dp_origin_snap) 851 dsl_dataset_rele(prev, FTAG); 852 return (0); 853} 854 855void 856dsl_pool_upgrade_clones(dsl_pool_t *dp, dmu_tx_t *tx) 857{ 858 ASSERT(dmu_tx_is_syncing(tx)); 859 ASSERT(dp->dp_origin_snap != NULL); 860 861 VERIFY0(dmu_objset_find_dp(dp, dp->dp_root_dir_obj, upgrade_clones_cb, 862 tx, DS_FIND_CHILDREN | DS_FIND_SERIALIZE)); 863} 864 865/* ARGSUSED */ 866static int 867upgrade_dir_clones_cb(dsl_pool_t *dp, dsl_dataset_t *ds, void *arg) 868{ 869 dmu_tx_t *tx = arg; 870 objset_t *mos = dp->dp_meta_objset; 871 872 if (dsl_dir_phys(ds->ds_dir)->dd_origin_obj != 0) { 873 dsl_dataset_t *origin; 874 875 VERIFY0(dsl_dataset_hold_obj(dp, 876 dsl_dir_phys(ds->ds_dir)->dd_origin_obj, FTAG, &origin)); 877 878 if (dsl_dir_phys(origin->ds_dir)->dd_clones == 0) { 879 dmu_buf_will_dirty(origin->ds_dir->dd_dbuf, tx); 880 dsl_dir_phys(origin->ds_dir)->dd_clones = 881 zap_create(mos, DMU_OT_DSL_CLONES, DMU_OT_NONE, 882 0, tx); 883 } 884 885 VERIFY0(zap_add_int(dp->dp_meta_objset, 886 dsl_dir_phys(origin->ds_dir)->dd_clones, 887 ds->ds_object, tx)); 888 889 dsl_dataset_rele(origin, FTAG); 890 } 891 return (0); 892} 893 894void 895dsl_pool_upgrade_dir_clones(dsl_pool_t *dp, dmu_tx_t *tx) 896{ 897 ASSERT(dmu_tx_is_syncing(tx)); 898 uint64_t obj; 899 900 (void) dsl_dir_create_sync(dp, dp->dp_root_dir, FREE_DIR_NAME, tx); 901 VERIFY0(dsl_pool_open_special_dir(dp, 902 FREE_DIR_NAME, &dp->dp_free_dir)); 903 904 /* 905 * We can't use bpobj_alloc(), because spa_version() still 906 * returns the old version, and we need a new-version bpobj with 907 * subobj support. So call dmu_object_alloc() directly. 908 */ 909 obj = dmu_object_alloc(dp->dp_meta_objset, DMU_OT_BPOBJ, 910 SPA_OLD_MAXBLOCKSIZE, DMU_OT_BPOBJ_HDR, sizeof (bpobj_phys_t), tx); 911 VERIFY0(zap_add(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT, 912 DMU_POOL_FREE_BPOBJ, sizeof (uint64_t), 1, &obj, tx)); 913 VERIFY0(bpobj_open(&dp->dp_free_bpobj, dp->dp_meta_objset, obj)); 914 915 VERIFY0(dmu_objset_find_dp(dp, dp->dp_root_dir_obj, 916 upgrade_dir_clones_cb, tx, DS_FIND_CHILDREN | DS_FIND_SERIALIZE)); 917} 918 919void 920dsl_pool_create_origin(dsl_pool_t *dp, dmu_tx_t *tx) 921{ 922 uint64_t dsobj; 923 dsl_dataset_t *ds; 924 925 ASSERT(dmu_tx_is_syncing(tx)); 926 ASSERT(dp->dp_origin_snap == NULL); 927 ASSERT(rrw_held(&dp->dp_config_rwlock, RW_WRITER)); 928 929 /* create the origin dir, ds, & snap-ds */ 930 dsobj = dsl_dataset_create_sync(dp->dp_root_dir, ORIGIN_DIR_NAME, 931 NULL, 0, kcred, tx); 932 VERIFY0(dsl_dataset_hold_obj(dp, dsobj, FTAG, &ds)); 933 dsl_dataset_snapshot_sync_impl(ds, ORIGIN_DIR_NAME, tx); 934 VERIFY0(dsl_dataset_hold_obj(dp, dsl_dataset_phys(ds)->ds_prev_snap_obj, 935 dp, &dp->dp_origin_snap)); 936 dsl_dataset_rele(ds, FTAG); 937} 938 939taskq_t * 940dsl_pool_vnrele_taskq(dsl_pool_t *dp) 941{ 942 return (dp->dp_vnrele_taskq); 943} 944 945/* 946 * Walk through the pool-wide zap object of temporary snapshot user holds 947 * and release them. 948 */ 949void 950dsl_pool_clean_tmp_userrefs(dsl_pool_t *dp) 951{ 952 zap_attribute_t za; 953 zap_cursor_t zc; 954 objset_t *mos = dp->dp_meta_objset; 955 uint64_t zapobj = dp->dp_tmp_userrefs_obj; 956 nvlist_t *holds; 957 958 if (zapobj == 0) 959 return; 960 ASSERT(spa_version(dp->dp_spa) >= SPA_VERSION_USERREFS); 961 962 holds = fnvlist_alloc(); 963 964 for (zap_cursor_init(&zc, mos, zapobj); 965 zap_cursor_retrieve(&zc, &za) == 0; 966 zap_cursor_advance(&zc)) { 967 char *htag; 968 nvlist_t *tags; 969 970 htag = strchr(za.za_name, '-'); 971 *htag = '\0'; 972 ++htag; 973 if (nvlist_lookup_nvlist(holds, za.za_name, &tags) != 0) { 974 tags = fnvlist_alloc(); 975 fnvlist_add_boolean(tags, htag); 976 fnvlist_add_nvlist(holds, za.za_name, tags); 977 fnvlist_free(tags); 978 } else { 979 fnvlist_add_boolean(tags, htag); 980 } 981 } 982 dsl_dataset_user_release_tmp(dp, holds); 983 fnvlist_free(holds); 984 zap_cursor_fini(&zc); 985} 986 987/* 988 * Create the pool-wide zap object for storing temporary snapshot holds. 989 */ 990void 991dsl_pool_user_hold_create_obj(dsl_pool_t *dp, dmu_tx_t *tx) 992{ 993 objset_t *mos = dp->dp_meta_objset; 994 995 ASSERT(dp->dp_tmp_userrefs_obj == 0); 996 ASSERT(dmu_tx_is_syncing(tx)); 997 998 dp->dp_tmp_userrefs_obj = zap_create_link(mos, DMU_OT_USERREFS, 999 DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_TMP_USERREFS, tx); 1000} 1001 1002static int 1003dsl_pool_user_hold_rele_impl(dsl_pool_t *dp, uint64_t dsobj, 1004 const char *tag, uint64_t now, dmu_tx_t *tx, boolean_t holding) 1005{ 1006 objset_t *mos = dp->dp_meta_objset; 1007 uint64_t zapobj = dp->dp_tmp_userrefs_obj; 1008 char *name; 1009 int error; 1010 1011 ASSERT(spa_version(dp->dp_spa) >= SPA_VERSION_USERREFS); 1012 ASSERT(dmu_tx_is_syncing(tx)); 1013 1014 /* 1015 * If the pool was created prior to SPA_VERSION_USERREFS, the 1016 * zap object for temporary holds might not exist yet. 1017 */ 1018 if (zapobj == 0) { 1019 if (holding) { 1020 dsl_pool_user_hold_create_obj(dp, tx); 1021 zapobj = dp->dp_tmp_userrefs_obj; 1022 } else { 1023 return (SET_ERROR(ENOENT)); 1024 } 1025 } 1026 1027 name = kmem_asprintf("%llx-%s", (u_longlong_t)dsobj, tag); 1028 if (holding) 1029 error = zap_add(mos, zapobj, name, 8, 1, &now, tx); 1030 else 1031 error = zap_remove(mos, zapobj, name, tx); 1032 strfree(name); 1033 1034 return (error); 1035} 1036 1037/* 1038 * Add a temporary hold for the given dataset object and tag. 1039 */ 1040int 1041dsl_pool_user_hold(dsl_pool_t *dp, uint64_t dsobj, const char *tag, 1042 uint64_t now, dmu_tx_t *tx) 1043{ 1044 return (dsl_pool_user_hold_rele_impl(dp, dsobj, tag, now, tx, B_TRUE)); 1045} 1046 1047/* 1048 * Release a temporary hold for the given dataset object and tag. 1049 */ 1050int 1051dsl_pool_user_release(dsl_pool_t *dp, uint64_t dsobj, const char *tag, 1052 dmu_tx_t *tx) 1053{ 1054 return (dsl_pool_user_hold_rele_impl(dp, dsobj, tag, 0, 1055 tx, B_FALSE)); 1056} 1057 1058/* 1059 * DSL Pool Configuration Lock 1060 * 1061 * The dp_config_rwlock protects against changes to DSL state (e.g. dataset 1062 * creation / destruction / rename / property setting). It must be held for 1063 * read to hold a dataset or dsl_dir. I.e. you must call 1064 * dsl_pool_config_enter() or dsl_pool_hold() before calling 1065 * dsl_{dataset,dir}_hold{_obj}. In most circumstances, the dp_config_rwlock 1066 * must be held continuously until all datasets and dsl_dirs are released. 1067 * 1068 * The only exception to this rule is that if a "long hold" is placed on 1069 * a dataset, then the dp_config_rwlock may be dropped while the dataset 1070 * is still held. The long hold will prevent the dataset from being 1071 * destroyed -- the destroy will fail with EBUSY. A long hold can be 1072 * obtained by calling dsl_dataset_long_hold(), or by "owning" a dataset 1073 * (by calling dsl_{dataset,objset}_{try}own{_obj}). 1074 * 1075 * Legitimate long-holders (including owners) should be long-running, cancelable 1076 * tasks that should cause "zfs destroy" to fail. This includes DMU 1077 * consumers (i.e. a ZPL filesystem being mounted or ZVOL being open), 1078 * "zfs send", and "zfs diff". There are several other long-holders whose 1079 * uses are suboptimal (e.g. "zfs promote", and zil_suspend()). 1080 * 1081 * The usual formula for long-holding would be: 1082 * dsl_pool_hold() 1083 * dsl_dataset_hold() 1084 * ... perform checks ... 1085 * dsl_dataset_long_hold() 1086 * dsl_pool_rele() 1087 * ... perform long-running task ... 1088 * dsl_dataset_long_rele() 1089 * dsl_dataset_rele() 1090 * 1091 * Note that when the long hold is released, the dataset is still held but 1092 * the pool is not held. The dataset may change arbitrarily during this time 1093 * (e.g. it could be destroyed). Therefore you shouldn't do anything to the 1094 * dataset except release it. 1095 * 1096 * User-initiated operations (e.g. ioctls, zfs_ioc_*()) are either read-only 1097 * or modifying operations. 1098 * 1099 * Modifying operations should generally use dsl_sync_task(). The synctask 1100 * infrastructure enforces proper locking strategy with respect to the 1101 * dp_config_rwlock. See the comment above dsl_sync_task() for details. 1102 * 1103 * Read-only operations will manually hold the pool, then the dataset, obtain 1104 * information from the dataset, then release the pool and dataset. 1105 * dmu_objset_{hold,rele}() are convenience routines that also do the pool 1106 * hold/rele. 1107 */ 1108 1109int 1110dsl_pool_hold(const char *name, void *tag, dsl_pool_t **dp) 1111{ 1112 spa_t *spa; 1113 int error; 1114 1115 error = spa_open(name, &spa, tag); 1116 if (error == 0) { 1117 *dp = spa_get_dsl(spa); 1118 dsl_pool_config_enter(*dp, tag); 1119 } 1120 return (error); 1121} 1122 1123void 1124dsl_pool_rele(dsl_pool_t *dp, void *tag) 1125{ 1126 dsl_pool_config_exit(dp, tag); 1127 spa_close(dp->dp_spa, tag); 1128} 1129 1130void 1131dsl_pool_config_enter(dsl_pool_t *dp, void *tag) 1132{ 1133 /* 1134 * We use a "reentrant" reader-writer lock, but not reentrantly. 1135 * 1136 * The rrwlock can (with the track_all flag) track all reading threads, 1137 * which is very useful for debugging which code path failed to release 1138 * the lock, and for verifying that the *current* thread does hold 1139 * the lock. 1140 * 1141 * (Unlike a rwlock, which knows that N threads hold it for 1142 * read, but not *which* threads, so rw_held(RW_READER) returns TRUE 1143 * if any thread holds it for read, even if this thread doesn't). 1144 */ 1145 ASSERT(!rrw_held(&dp->dp_config_rwlock, RW_READER)); 1146 rrw_enter(&dp->dp_config_rwlock, RW_READER, tag); 1147} 1148 1149void 1150dsl_pool_config_enter_prio(dsl_pool_t *dp, void *tag) 1151{ 1152 ASSERT(!rrw_held(&dp->dp_config_rwlock, RW_READER)); 1153 rrw_enter_read_prio(&dp->dp_config_rwlock, tag); 1154} 1155 1156void 1157dsl_pool_config_exit(dsl_pool_t *dp, void *tag) 1158{ 1159 rrw_exit(&dp->dp_config_rwlock, tag); 1160} 1161 1162boolean_t 1163dsl_pool_config_held(dsl_pool_t *dp) 1164{ 1165 return (RRW_LOCK_HELD(&dp->dp_config_rwlock)); 1166} 1167 1168boolean_t 1169dsl_pool_config_held_writer(dsl_pool_t *dp) 1170{ 1171 return (RRW_WRITE_HELD(&dp->dp_config_rwlock)); 1172} 1173