Lines Matching +full:n +full:- +full:mos

1 // SPDX-License-Identifier: CDDL-1.0
10 * or https://opensource.org/licenses/CDDL-1.0.
57 * ------------------
62 * for short periods and would lead to highly lumpy performance. On a per-pool
78 * As buffers are modified dsl_pool_willuse_space() increments both the per-
82 * relevant, the per-txg value is useful for debugging. The tunable
155 * that are pre-populated when the taskq is first created (via the
157 * taskq entries that are cached after an on-demand allocation (via the
161 * already be a taskq entry pre-allocated by the time that it is needed
163 * on-demand allocation of a new taskq entry from failing, which would
180 err = zap_lookup(dp->dp_meta_objset, in dsl_pool_open_special_dir()
181 dsl_dir_phys(dp->dp_root_dir)->dd_child_dir_zapobj, in dsl_pool_open_special_dir()
196 dp->dp_spa = spa; in dsl_pool_open_impl()
197 dp->dp_meta_rootbp = *bp; in dsl_pool_open_impl()
198 rrw_init(&dp->dp_config_rwlock, B_TRUE); in dsl_pool_open_impl()
202 txg_list_create(&dp->dp_dirty_datasets, spa, in dsl_pool_open_impl()
204 txg_list_create(&dp->dp_dirty_zilogs, spa, in dsl_pool_open_impl()
206 txg_list_create(&dp->dp_dirty_dirs, spa, in dsl_pool_open_impl()
208 txg_list_create(&dp->dp_sync_tasks, spa, in dsl_pool_open_impl()
210 txg_list_create(&dp->dp_early_sync_tasks, spa, in dsl_pool_open_impl()
213 dp->dp_sync_taskq = spa_sync_tq_create(spa, "dp_sync_taskq"); in dsl_pool_open_impl()
215 dp->dp_zil_clean_taskq = taskq_create("dp_zil_clean_taskq", in dsl_pool_open_impl()
221 mutex_init(&dp->dp_lock, NULL, MUTEX_DEFAULT, NULL); in dsl_pool_open_impl()
222 cv_init(&dp->dp_spaceavail_cv, NULL, CV_DEFAULT, NULL); in dsl_pool_open_impl()
224 aggsum_init(&dp->dp_wrlog_total, 0); in dsl_pool_open_impl()
226 aggsum_init(&dp->dp_wrlog_pertxg[i], 0); in dsl_pool_open_impl()
229 dp->dp_zrele_taskq = taskq_create("z_zrele", 100, defclsyspri, in dsl_pool_open_impl()
232 dp->dp_unlinked_drain_taskq = taskq_create("z_unlinked_drain", in dsl_pool_open_impl()
247 * the meta objset. This is done because a self-healing write zio may in dsl_pool_init()
253 err = dmu_objset_open_impl(spa, NULL, &dp->dp_meta_rootbp, in dsl_pool_init()
254 &dp->dp_meta_objset); in dsl_pool_init()
271 rrw_enter(&dp->dp_config_rwlock, RW_WRITER, FTAG); in dsl_pool_open()
272 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT, in dsl_pool_open()
274 &dp->dp_root_dir_obj); in dsl_pool_open()
278 err = dsl_dir_hold_obj(dp, dp->dp_root_dir_obj, in dsl_pool_open()
279 NULL, dp, &dp->dp_root_dir); in dsl_pool_open()
283 err = dsl_pool_open_special_dir(dp, MOS_DIR_NAME, &dp->dp_mos_dir); in dsl_pool_open()
287 if (spa_version(dp->dp_spa) >= SPA_VERSION_ORIGIN) { in dsl_pool_open()
292 dsl_dir_phys(dd)->dd_head_dataset_obj, FTAG, &ds); in dsl_pool_open()
295 dsl_dataset_phys(ds)->ds_prev_snap_obj, dp, in dsl_pool_open()
296 &dp->dp_origin_snap); in dsl_pool_open()
304 if (spa_version(dp->dp_spa) >= SPA_VERSION_DEADLISTS) { in dsl_pool_open()
306 &dp->dp_free_dir); in dsl_pool_open()
310 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT, in dsl_pool_open()
314 VERIFY0(bpobj_open(&dp->dp_free_bpobj, in dsl_pool_open()
315 dp->dp_meta_objset, obj)); in dsl_pool_open()
318 if (spa_feature_is_active(dp->dp_spa, SPA_FEATURE_OBSOLETE_COUNTS)) { in dsl_pool_open()
319 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT, in dsl_pool_open()
322 VERIFY0(bpobj_open(&dp->dp_obsolete_bpobj, in dsl_pool_open()
323 dp->dp_meta_objset, obj)); in dsl_pool_open()
338 &dp->dp_leak_dir); in dsl_pool_open()
340 if (spa_feature_is_active(dp->dp_spa, SPA_FEATURE_ASYNC_DESTROY)) { in dsl_pool_open()
341 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT, in dsl_pool_open()
343 &dp->dp_bptree_obj); in dsl_pool_open()
348 if (spa_feature_is_active(dp->dp_spa, SPA_FEATURE_EMPTY_BPOBJ)) { in dsl_pool_open()
349 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT, in dsl_pool_open()
351 &dp->dp_empty_bpobj); in dsl_pool_open()
356 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT, in dsl_pool_open()
358 &dp->dp_tmp_userrefs_obj); in dsl_pool_open()
364 err = dsl_scan_init(dp, dp->dp_tx.tx_open_txg); in dsl_pool_open()
367 rrw_exit(&dp->dp_config_rwlock, FTAG); in dsl_pool_open()
378 * includes pool-opening context), it actually only got a "ref" in dsl_pool_close()
381 if (dp->dp_origin_snap != NULL) in dsl_pool_close()
382 dsl_dataset_rele(dp->dp_origin_snap, dp); in dsl_pool_close()
383 if (dp->dp_mos_dir != NULL) in dsl_pool_close()
384 dsl_dir_rele(dp->dp_mos_dir, dp); in dsl_pool_close()
385 if (dp->dp_free_dir != NULL) in dsl_pool_close()
386 dsl_dir_rele(dp->dp_free_dir, dp); in dsl_pool_close()
387 if (dp->dp_leak_dir != NULL) in dsl_pool_close()
388 dsl_dir_rele(dp->dp_leak_dir, dp); in dsl_pool_close()
389 if (dp->dp_root_dir != NULL) in dsl_pool_close()
390 dsl_dir_rele(dp->dp_root_dir, dp); in dsl_pool_close()
392 bpobj_close(&dp->dp_free_bpobj); in dsl_pool_close()
393 bpobj_close(&dp->dp_obsolete_bpobj); in dsl_pool_close()
395 /* undo the dmu_objset_open_impl(mos) from dsl_pool_open() */ in dsl_pool_close()
396 if (dp->dp_meta_objset != NULL) in dsl_pool_close()
397 dmu_objset_evict(dp->dp_meta_objset); in dsl_pool_close()
399 txg_list_destroy(&dp->dp_dirty_datasets); in dsl_pool_close()
400 txg_list_destroy(&dp->dp_dirty_zilogs); in dsl_pool_close()
401 txg_list_destroy(&dp->dp_sync_tasks); in dsl_pool_close()
402 txg_list_destroy(&dp->dp_early_sync_tasks); in dsl_pool_close()
403 txg_list_destroy(&dp->dp_dirty_dirs); in dsl_pool_close()
405 taskq_destroy(dp->dp_zil_clean_taskq); in dsl_pool_close()
406 spa_sync_tq_destroy(dp->dp_spa); in dsl_pool_close()
408 if (dp->dp_spa->spa_state == POOL_STATE_EXPORTED || in dsl_pool_close()
409 dp->dp_spa->spa_state == POOL_STATE_DESTROYED) { in dsl_pool_close()
413 arc_flush_async(dp->dp_spa); in dsl_pool_close()
421 arc_flush(dp->dp_spa, FALSE); in dsl_pool_close()
424 mmp_fini(dp->dp_spa); in dsl_pool_close()
429 rrw_destroy(&dp->dp_config_rwlock); in dsl_pool_close()
430 mutex_destroy(&dp->dp_lock); in dsl_pool_close()
431 cv_destroy(&dp->dp_spaceavail_cv); in dsl_pool_close()
433 ASSERT0(aggsum_value(&dp->dp_wrlog_total)); in dsl_pool_close()
434 aggsum_fini(&dp->dp_wrlog_total); in dsl_pool_close()
436 ASSERT0(aggsum_value(&dp->dp_wrlog_pertxg[i])); in dsl_pool_close()
437 aggsum_fini(&dp->dp_wrlog_pertxg[i]); in dsl_pool_close()
440 taskq_destroy(dp->dp_unlinked_drain_taskq); in dsl_pool_close()
441 taskq_destroy(dp->dp_zrele_taskq); in dsl_pool_close()
442 if (dp->dp_blkstats != NULL) in dsl_pool_close()
443 vmem_free(dp->dp_blkstats, sizeof (zfs_all_blkstats_t)); in dsl_pool_close()
455 ASSERT(spa_feature_is_active(dp->dp_spa, SPA_FEATURE_DEVICE_REMOVAL)); in dsl_pool_create_obsolete_bpobj()
457 obj = bpobj_alloc(dp->dp_meta_objset, SPA_OLD_MAXBLOCKSIZE, tx); in dsl_pool_create_obsolete_bpobj()
458 VERIFY0(bpobj_open(&dp->dp_obsolete_bpobj, dp->dp_meta_objset, obj)); in dsl_pool_create_obsolete_bpobj()
459 VERIFY0(zap_add(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT, in dsl_pool_create_obsolete_bpobj()
461 spa_feature_incr(dp->dp_spa, SPA_FEATURE_OBSOLETE_COUNTS, tx); in dsl_pool_create_obsolete_bpobj()
467 spa_feature_decr(dp->dp_spa, SPA_FEATURE_OBSOLETE_COUNTS, tx); in dsl_pool_destroy_obsolete_bpobj()
468 VERIFY0(zap_remove(dp->dp_meta_objset, in dsl_pool_destroy_obsolete_bpobj()
471 bpobj_free(dp->dp_meta_objset, in dsl_pool_destroy_obsolete_bpobj()
472 dp->dp_obsolete_bpobj.bpo_object, tx); in dsl_pool_destroy_obsolete_bpobj()
473 bpobj_close(&dp->dp_obsolete_bpobj); in dsl_pool_destroy_obsolete_bpobj()
491 rrw_enter(&dp->dp_config_rwlock, RW_WRITER, FTAG); in dsl_pool_create()
493 /* create and open the MOS (meta-objset) */ in dsl_pool_create()
494 dp->dp_meta_objset = dmu_objset_create_impl(spa, in dsl_pool_create()
495 NULL, &dp->dp_meta_rootbp, DMU_OST_META, tx); in dsl_pool_create()
496 spa->spa_meta_objset = dp->dp_meta_objset; in dsl_pool_create()
499 err = zap_create_claim(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT, in dsl_pool_create()
507 dp->dp_root_dir_obj = dsl_dir_create_sync(dp, NULL, NULL, tx); in dsl_pool_create()
508 VERIFY0(dsl_dir_hold_obj(dp, dp->dp_root_dir_obj, in dsl_pool_create()
509 NULL, dp, &dp->dp_root_dir)); in dsl_pool_create()
511 /* create and open the meta-objset dir */ in dsl_pool_create()
512 (void) dsl_dir_create_sync(dp, dp->dp_root_dir, MOS_DIR_NAME, tx); in dsl_pool_create()
514 MOS_DIR_NAME, &dp->dp_mos_dir)); in dsl_pool_create()
518 (void) dsl_dir_create_sync(dp, dp->dp_root_dir, in dsl_pool_create()
521 FREE_DIR_NAME, &dp->dp_free_dir)); in dsl_pool_create()
524 obj = bpobj_alloc(dp->dp_meta_objset, SPA_OLD_MAXBLOCKSIZE, tx); in dsl_pool_create()
525 VERIFY(zap_add(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT, in dsl_pool_create()
527 VERIFY0(bpobj_open(&dp->dp_free_bpobj, in dsl_pool_create()
528 dp->dp_meta_objset, obj)); in dsl_pool_create()
541 if (dcp != NULL && dcp->cp_crypt != ZIO_CRYPT_OFF && in dsl_pool_create()
542 dcp->cp_crypt != ZIO_CRYPT_INHERIT) in dsl_pool_create()
546 obj = dsl_dataset_create_sync_dd(dp->dp_root_dir, NULL, dcp, 0, tx); in dsl_pool_create()
551 rrw_enter(&ds->ds_bp_rwlock, RW_READER, FTAG); in dsl_pool_create()
552 os = dmu_objset_create_impl(dp->dp_spa, ds, in dsl_pool_create()
554 rrw_exit(&ds->ds_bp_rwlock, FTAG); in dsl_pool_create()
562 rrw_exit(&dp->dp_config_rwlock, FTAG); in dsl_pool_create()
568 * Account for the meta-objset space in its placeholder dsl_dir.
575 mutex_enter(&dp->dp_lock); in dsl_pool_mos_diduse_space()
576 dp->dp_mos_used_delta += used; in dsl_pool_mos_diduse_space()
577 dp->dp_mos_compressed_delta += comp; in dsl_pool_mos_diduse_space()
578 dp->dp_mos_uncompressed_delta += uncomp; in dsl_pool_mos_diduse_space()
579 mutex_exit(&dp->dp_lock); in dsl_pool_mos_diduse_space()
585 zio_t *zio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED); in dsl_pool_sync_mos()
586 dmu_objset_sync(dp->dp_meta_objset, zio, tx); in dsl_pool_sync_mos()
588 dmu_objset_sync_done(dp->dp_meta_objset, tx); in dsl_pool_sync_mos()
589 taskq_wait(dp->dp_sync_taskq); in dsl_pool_sync_mos()
590 multilist_destroy(&dp->dp_meta_objset->os_synced_dnodes); in dsl_pool_sync_mos()
592 dprintf_bp(&dp->dp_meta_rootbp, "meta objset rootbp is %s", ""); in dsl_pool_sync_mos()
593 spa_set_rootblkptr(dp->dp_spa, &dp->dp_meta_rootbp); in dsl_pool_sync_mos()
599 ASSERT(MUTEX_HELD(&dp->dp_lock)); in dsl_pool_dirty_delta()
602 ASSERT3U(-delta, <=, dp->dp_dirty_total); in dsl_pool_dirty_delta()
604 dp->dp_dirty_total += delta; in dsl_pool_dirty_delta()
608 * This ensures forward progress -- each thread wakes the next waiter. in dsl_pool_dirty_delta()
610 if (dp->dp_dirty_total < zfs_dirty_data_max) in dsl_pool_dirty_delta()
611 cv_signal(&dp->dp_spaceavail_cv); in dsl_pool_dirty_delta()
619 aggsum_add(&dp->dp_wrlog_pertxg[txg & TXG_MASK], size); in dsl_pool_wrlog_count()
620 aggsum_add(&dp->dp_wrlog_total, size); in dsl_pool_wrlog_count()
625 if (aggsum_compare(&dp->dp_wrlog_pertxg[txg & TXG_MASK], sync_min) > 0) in dsl_pool_wrlog_count()
635 return (aggsum_compare(&dp->dp_wrlog_total, delay_min_bytes) > 0); in dsl_pool_need_wrlog_delay()
642 delta = -(int64_t)aggsum_value(&dp->dp_wrlog_pertxg[txg & TXG_MASK]); in dsl_pool_wrlog_clear()
643 aggsum_add(&dp->dp_wrlog_pertxg[txg & TXG_MASK], delta); in dsl_pool_wrlog_clear()
644 aggsum_add(&dp->dp_wrlog_total, delta); in dsl_pool_wrlog_clear()
645 /* Compact per-CPU sums after the big change. */ in dsl_pool_wrlog_clear()
646 (void) aggsum_value(&dp->dp_wrlog_pertxg[txg & TXG_MASK]); in dsl_pool_wrlog_clear()
647 (void) aggsum_value(&dp->dp_wrlog_total); in dsl_pool_wrlog_clear()
654 spa_t *spa = dp->dp_spa; in dsl_early_sync_task_verify()
655 vdev_t *rvd = spa->spa_root_vdev; in dsl_early_sync_task_verify()
657 for (uint64_t c = 0; c < rvd->vdev_children; c++) { in dsl_early_sync_task_verify()
658 vdev_t *vd = rvd->vdev_child[c]; in dsl_early_sync_task_verify()
659 txg_list_t *tl = &vd->vdev_ms_list; in dsl_early_sync_task_verify()
664 VERIFY(zfs_range_tree_is_empty(ms->ms_freeing)); in dsl_early_sync_task_verify()
665 VERIFY(zfs_range_tree_is_empty(ms->ms_checkpointing)); in dsl_early_sync_task_verify()
683 objset_t *mos = dp->dp_meta_objset; in dsl_pool_sync() local
696 if (!txg_list_empty(&dp->dp_early_sync_tasks, txg)) { in dsl_pool_sync()
699 ASSERT3U(spa_sync_pass(dp->dp_spa), ==, 1); in dsl_pool_sync()
701 txg_list_remove(&dp->dp_early_sync_tasks, txg)) != NULL) { in dsl_pool_sync()
712 rio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED); in dsl_pool_sync()
713 while ((ds = txg_list_remove(&dp->dp_dirty_datasets, txg)) != NULL) { in dsl_pool_sync()
715 * We must not sync any non-MOS datasets twice, because in dsl_pool_sync()
717 * may sync newly-created datasets on pass 2. in dsl_pool_sync()
719 ASSERT(!list_link_active(&ds->ds_synced_link)); in dsl_pool_sync()
729 mutex_enter(&dp->dp_lock); in dsl_pool_sync()
730 ASSERT(spa_sync_pass(dp->dp_spa) == 1 || in dsl_pool_sync()
731 dp->dp_long_free_dirty_pertxg[txg & TXG_MASK] == 0); in dsl_pool_sync()
732 dp->dp_long_free_dirty_pertxg[txg & TXG_MASK] = 0; in dsl_pool_sync()
733 mutex_exit(&dp->dp_lock); in dsl_pool_sync()
743 dmu_objset_sync_done(ds->ds_objset, tx); in dsl_pool_sync()
745 taskq_wait(dp->dp_sync_taskq); in dsl_pool_sync()
754 rio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED); in dsl_pool_sync()
755 while ((ds = txg_list_remove(&dp->dp_dirty_datasets, txg)) != NULL) { in dsl_pool_sync()
756 objset_t *os = ds->ds_objset; in dsl_pool_sync()
758 ASSERT(list_link_active(&ds->ds_synced_link)); in dsl_pool_sync()
759 dmu_buf_rele(ds->ds_dbuf, ds); in dsl_pool_sync()
767 if (os->os_encrypted && !os->os_raw_receive && in dsl_pool_sync()
768 !os->os_next_write_raw[txg & TXG_MASK]) { in dsl_pool_sync()
769 ASSERT3P(ds->ds_key_mapping, !=, NULL); in dsl_pool_sync()
770 key_mapping_rele(dp->dp_spa, ds->ds_key_mapping, ds); in dsl_pool_sync()
777 * clean up our in-memory structures accumulated while syncing: in dsl_pool_sync()
779 * - move dead blocks from the pending deadlist and livelists in dsl_pool_sync()
780 * to the on-disk versions in dsl_pool_sync()
781 * - release hold from dsl_dataset_dirty() in dsl_pool_sync()
782 * - release key mapping hold from dsl_dataset_dirty() in dsl_pool_sync()
785 objset_t *os = ds->ds_objset; in dsl_pool_sync()
787 if (os->os_encrypted && !os->os_raw_receive && in dsl_pool_sync()
788 !os->os_next_write_raw[txg & TXG_MASK]) { in dsl_pool_sync()
789 ASSERT3P(ds->ds_key_mapping, !=, NULL); in dsl_pool_sync()
790 key_mapping_rele(dp->dp_spa, ds->ds_key_mapping, ds); in dsl_pool_sync()
794 dmu_buf_rele(ds->ds_dbuf, ds); in dsl_pool_sync()
797 while ((dd = txg_list_remove(&dp->dp_dirty_dirs, txg)) != NULL) { in dsl_pool_sync()
802 * The MOS's space is accounted for in the pool/$MOS in dsl_pool_sync()
803 * (dp_mos_dir). We can't modify the mos while we're syncing in dsl_pool_sync()
806 if (dp->dp_mos_used_delta != 0 || dp->dp_mos_compressed_delta != 0 || in dsl_pool_sync()
807 dp->dp_mos_uncompressed_delta != 0) { in dsl_pool_sync()
808 dsl_dir_diduse_space(dp->dp_mos_dir, DD_USED_HEAD, in dsl_pool_sync()
809 dp->dp_mos_used_delta, in dsl_pool_sync()
810 dp->dp_mos_compressed_delta, in dsl_pool_sync()
811 dp->dp_mos_uncompressed_delta, tx); in dsl_pool_sync()
812 dp->dp_mos_used_delta = 0; in dsl_pool_sync()
813 dp->dp_mos_compressed_delta = 0; in dsl_pool_sync()
814 dp->dp_mos_uncompressed_delta = 0; in dsl_pool_sync()
817 if (dmu_objset_is_dirty(mos, txg)) { in dsl_pool_sync()
823 * dp_space_towrite should now be zero. However, some seldom-used in dsl_pool_sync()
828 * dirty data in the MOS is also accounted by the pool. Therefore, in dsl_pool_sync()
834 dsl_pool_undirty_space(dp, dp->dp_dirty_pertxg[txg & TXG_MASK], txg); in dsl_pool_sync()
840 * Therefore, we want to sync the MOS (thus syncing the dd_dbuf in dsl_pool_sync()
842 * The MOS data dirtied by the sync_tasks will be synced on the next in dsl_pool_sync()
845 if (!txg_list_empty(&dp->dp_sync_tasks, txg)) { in dsl_pool_sync()
851 ASSERT3U(spa_sync_pass(dp->dp_spa), ==, 1); in dsl_pool_sync()
852 while ((dst = txg_list_remove(&dp->dp_sync_tasks, txg)) != NULL) in dsl_pool_sync()
866 while ((zilog = txg_list_head(&dp->dp_dirty_zilogs, txg))) { in dsl_pool_sync_done()
867 dsl_dataset_t *ds = dmu_objset_ds(zilog->zl_os); in dsl_pool_sync_done()
875 (void) txg_list_remove_this(&dp->dp_dirty_zilogs, zilog, txg); in dsl_pool_sync_done()
876 ASSERT(!dmu_objset_is_dirty(zilog->zl_os, txg)); in dsl_pool_sync_done()
877 dmu_buf_rele(ds->ds_dbuf, zilog); in dsl_pool_sync_done()
882 ASSERT(!dmu_objset_is_dirty(dp->dp_meta_objset, txg)); in dsl_pool_sync_done()
892 return (curthread == dp->dp_tx.tx_sync_thread || in dsl_pool_sync_context()
893 spa_is_initializing(dp->dp_spa) || in dsl_pool_sync_context()
894 taskq_member(dp->dp_sync_taskq, curthread)); in dsl_pool_sync_context()
910 * $MOS, $FREEING, and $LEAKED).
919 spa_t *spa = dp->dp_spa; in dsl_pool_adjustedsize()
922 spa->spa_deferred_bpobj.bpo_phys->bpo_bytes; in dsl_pool_adjustedsize()
925 - spa_get_checkpoint_space(spa) - spa_deferred_frees; in dsl_pool_adjustedsize()
944 adjustedsize = (space >= resv) ? (space - resv) : 0; in dsl_pool_adjustedsize()
954 metaslab_class_get_deferred(spa_normal_class(dp->dp_spa)); in dsl_pool_unreserved_space()
955 uint64_t quota = (poolsize >= deferred) ? (poolsize - deferred) : 0; in dsl_pool_unreserved_space()
962 return (metaslab_class_get_deferred(spa_normal_class(dp->dp_spa))); in dsl_pool_deferred_space()
973 * reads are unlikely: on 64-bit systems due to register size and on in dsl_pool_need_dirty_delay()
974 * 32-bit due to memory constraints. Pool-wide locks in hot path may in dsl_pool_need_dirty_delay()
977 return (dp->dp_dirty_total > delay_min_bytes); in dsl_pool_need_dirty_delay()
985 uint64_t dirty = dp->dp_dirty_pertxg[txg & TXG_MASK]; in dsl_pool_need_dirty_sync()
994 mutex_enter(&dp->dp_lock); in dsl_pool_dirty_space()
995 dp->dp_dirty_pertxg[tx->tx_txg & TXG_MASK] += space; in dsl_pool_dirty_space()
998 dsl_pool_need_dirty_sync(dp, tx->tx_txg); in dsl_pool_dirty_space()
999 mutex_exit(&dp->dp_lock); in dsl_pool_dirty_space()
1002 txg_kick(dp, tx->tx_txg); in dsl_pool_dirty_space()
1013 mutex_enter(&dp->dp_lock); in dsl_pool_undirty_space()
1014 if (dp->dp_dirty_pertxg[txg & TXG_MASK] < space) { in dsl_pool_undirty_space()
1016 space = dp->dp_dirty_pertxg[txg & TXG_MASK]; in dsl_pool_undirty_space()
1018 ASSERT3U(dp->dp_dirty_pertxg[txg & TXG_MASK], >=, space); in dsl_pool_undirty_space()
1019 dp->dp_dirty_pertxg[txg & TXG_MASK] -= space; in dsl_pool_undirty_space()
1020 ASSERT3U(dp->dp_dirty_total, >=, space); in dsl_pool_undirty_space()
1021 dsl_pool_dirty_delta(dp, -space); in dsl_pool_undirty_space()
1022 mutex_exit(&dp->dp_lock); in dsl_pool_undirty_space()
1032 err = dsl_dataset_hold_obj(dp, hds->ds_object, FTAG, &ds); in upgrade_clones_cb()
1036 while (dsl_dataset_phys(ds)->ds_prev_snap_obj != 0) { in upgrade_clones_cb()
1038 dsl_dataset_phys(ds)->ds_prev_snap_obj, FTAG, &prev); in upgrade_clones_cb()
1044 if (dsl_dataset_phys(prev)->ds_next_snap_obj != ds->ds_object) in upgrade_clones_cb()
1052 prev = dp->dp_origin_snap; in upgrade_clones_cb()
1058 rrw_enter(&ds->ds_bp_rwlock, RW_READER, FTAG); in upgrade_clones_cb()
1059 ASSERT0(BP_GET_LOGICAL_BIRTH(&dsl_dataset_phys(prev)->ds_bp)); in upgrade_clones_cb()
1060 rrw_exit(&ds->ds_bp_rwlock, FTAG); in upgrade_clones_cb()
1063 if (ds->ds_object == prev->ds_object) { in upgrade_clones_cb()
1068 dmu_buf_will_dirty(ds->ds_dbuf, tx); in upgrade_clones_cb()
1069 dsl_dataset_phys(ds)->ds_prev_snap_obj = prev->ds_object; in upgrade_clones_cb()
1070 dsl_dataset_phys(ds)->ds_prev_snap_txg = in upgrade_clones_cb()
1071 dsl_dataset_phys(prev)->ds_creation_txg; in upgrade_clones_cb()
1073 dmu_buf_will_dirty(ds->ds_dir->dd_dbuf, tx); in upgrade_clones_cb()
1074 dsl_dir_phys(ds->ds_dir)->dd_origin_obj = prev->ds_object; in upgrade_clones_cb()
1076 dmu_buf_will_dirty(prev->ds_dbuf, tx); in upgrade_clones_cb()
1077 dsl_dataset_phys(prev)->ds_num_children++; in upgrade_clones_cb()
1079 if (dsl_dataset_phys(ds)->ds_next_snap_obj == 0) { in upgrade_clones_cb()
1080 ASSERT(ds->ds_prev == NULL); in upgrade_clones_cb()
1082 dsl_dataset_phys(ds)->ds_prev_snap_obj, in upgrade_clones_cb()
1083 ds, &ds->ds_prev)); in upgrade_clones_cb()
1087 ASSERT3U(dsl_dir_phys(ds->ds_dir)->dd_origin_obj, ==, prev->ds_object); in upgrade_clones_cb()
1088 ASSERT3U(dsl_dataset_phys(ds)->ds_prev_snap_obj, ==, prev->ds_object); in upgrade_clones_cb()
1090 if (dsl_dataset_phys(prev)->ds_next_clones_obj == 0) { in upgrade_clones_cb()
1091 dmu_buf_will_dirty(prev->ds_dbuf, tx); in upgrade_clones_cb()
1092 dsl_dataset_phys(prev)->ds_next_clones_obj = in upgrade_clones_cb()
1093 zap_create(dp->dp_meta_objset, in upgrade_clones_cb()
1096 VERIFY0(zap_add_int(dp->dp_meta_objset, in upgrade_clones_cb()
1097 dsl_dataset_phys(prev)->ds_next_clones_obj, ds->ds_object, tx)); in upgrade_clones_cb()
1100 if (prev != dp->dp_origin_snap) in upgrade_clones_cb()
1109 ASSERT(dp->dp_origin_snap != NULL); in dsl_pool_upgrade_clones()
1111 VERIFY0(dmu_objset_find_dp(dp, dp->dp_root_dir_obj, upgrade_clones_cb, in dsl_pool_upgrade_clones()
1119 objset_t *mos = dp->dp_meta_objset; in upgrade_dir_clones_cb() local
1121 if (dsl_dir_phys(ds->ds_dir)->dd_origin_obj != 0) { in upgrade_dir_clones_cb()
1125 dsl_dir_phys(ds->ds_dir)->dd_origin_obj, FTAG, &origin)); in upgrade_dir_clones_cb()
1127 if (dsl_dir_phys(origin->ds_dir)->dd_clones == 0) { in upgrade_dir_clones_cb()
1128 dmu_buf_will_dirty(origin->ds_dir->dd_dbuf, tx); in upgrade_dir_clones_cb()
1129 dsl_dir_phys(origin->ds_dir)->dd_clones = in upgrade_dir_clones_cb()
1130 zap_create(mos, DMU_OT_DSL_CLONES, DMU_OT_NONE, in upgrade_dir_clones_cb()
1134 VERIFY0(zap_add_int(dp->dp_meta_objset, in upgrade_dir_clones_cb()
1135 dsl_dir_phys(origin->ds_dir)->dd_clones, in upgrade_dir_clones_cb()
1136 ds->ds_object, tx)); in upgrade_dir_clones_cb()
1150 (void) dsl_dir_create_sync(dp, dp->dp_root_dir, FREE_DIR_NAME, tx); in dsl_pool_upgrade_dir_clones()
1152 FREE_DIR_NAME, &dp->dp_free_dir)); in dsl_pool_upgrade_dir_clones()
1156 * returns the old version, and we need a new-version bpobj with in dsl_pool_upgrade_dir_clones()
1159 obj = dmu_object_alloc(dp->dp_meta_objset, DMU_OT_BPOBJ, in dsl_pool_upgrade_dir_clones()
1161 VERIFY0(zap_add(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT, in dsl_pool_upgrade_dir_clones()
1163 VERIFY0(bpobj_open(&dp->dp_free_bpobj, dp->dp_meta_objset, obj)); in dsl_pool_upgrade_dir_clones()
1165 VERIFY0(dmu_objset_find_dp(dp, dp->dp_root_dir_obj, in dsl_pool_upgrade_dir_clones()
1176 ASSERT(dp->dp_origin_snap == NULL); in dsl_pool_create_origin()
1177 ASSERT(rrw_held(&dp->dp_config_rwlock, RW_WRITER)); in dsl_pool_create_origin()
1179 /* create the origin dir, ds, & snap-ds */ in dsl_pool_create_origin()
1180 dsobj = dsl_dataset_create_sync(dp->dp_root_dir, ORIGIN_DIR_NAME, in dsl_pool_create_origin()
1184 VERIFY0(dsl_dataset_hold_obj(dp, dsl_dataset_phys(ds)->ds_prev_snap_obj, in dsl_pool_create_origin()
1185 dp, &dp->dp_origin_snap)); in dsl_pool_create_origin()
1192 return (dp->dp_zrele_taskq); in dsl_pool_zrele_taskq()
1198 return (dp->dp_unlinked_drain_taskq); in dsl_pool_unlinked_drain_taskq()
1202 * Walk through the pool-wide zap object of temporary snapshot user holds
1210 objset_t *mos = dp->dp_meta_objset; in dsl_pool_clean_tmp_userrefs() local
1211 uint64_t zapobj = dp->dp_tmp_userrefs_obj; in dsl_pool_clean_tmp_userrefs()
1216 ASSERT(spa_version(dp->dp_spa) >= SPA_VERSION_USERREFS); in dsl_pool_clean_tmp_userrefs()
1221 for (zap_cursor_init(&zc, mos, zapobj); in dsl_pool_clean_tmp_userrefs()
1227 htag = strchr(za->za_name, '-'); in dsl_pool_clean_tmp_userrefs()
1230 if (nvlist_lookup_nvlist(holds, za->za_name, &tags) != 0) { in dsl_pool_clean_tmp_userrefs()
1233 fnvlist_add_nvlist(holds, za->za_name, tags); in dsl_pool_clean_tmp_userrefs()
1246 * Create the pool-wide zap object for storing temporary snapshot holds.
1251 objset_t *mos = dp->dp_meta_objset; in dsl_pool_user_hold_create_obj() local
1253 ASSERT(dp->dp_tmp_userrefs_obj == 0); in dsl_pool_user_hold_create_obj()
1256 dp->dp_tmp_userrefs_obj = zap_create_link(mos, DMU_OT_USERREFS, in dsl_pool_user_hold_create_obj()
1264 objset_t *mos = dp->dp_meta_objset; in dsl_pool_user_hold_rele_impl() local
1265 uint64_t zapobj = dp->dp_tmp_userrefs_obj; in dsl_pool_user_hold_rele_impl()
1269 ASSERT(spa_version(dp->dp_spa) >= SPA_VERSION_USERREFS); in dsl_pool_user_hold_rele_impl()
1279 zapobj = dp->dp_tmp_userrefs_obj; in dsl_pool_user_hold_rele_impl()
1285 name = kmem_asprintf("%llx-%s", (u_longlong_t)dsobj, tag); in dsl_pool_user_hold_rele_impl()
1287 error = zap_add(mos, zapobj, name, 8, 1, &now, tx); in dsl_pool_user_hold_rele_impl()
1289 error = zap_remove(mos, zapobj, name, tx); in dsl_pool_user_hold_rele_impl()
1329 * destroyed -- the destroy will fail with EBUSY. A long hold can be
1333 * Legitimate long-holders (including owners) should be long-running, cancelable
1336 * "zfs send", and "zfs diff". There are several other long-holders whose
1339 * The usual formula for long-holding would be:
1345 * ... perform long-running task ...
1356 * Read-Only Modifying
1358 * Dataset Layer / MOS zfs get zfs destroy
1369 * Read-only operations will manually hold the pool, then the dataset, obtain
1387 * don’t observe state mid-modification.
1389 * you don’t coordinate with the ZPL to hold ZPL-level locks, you could see an
1412 spa_close(dp->dp_spa, tag); in dsl_pool_rele()
1419 * We use a "reentrant" reader-writer lock, but not reentrantly. in dsl_pool_config_enter()
1426 * (Unlike a rwlock, which knows that N threads hold it for in dsl_pool_config_enter()
1430 ASSERT(!rrw_held(&dp->dp_config_rwlock, RW_READER)); in dsl_pool_config_enter()
1431 rrw_enter(&dp->dp_config_rwlock, RW_READER, tag); in dsl_pool_config_enter()
1437 ASSERT(!rrw_held(&dp->dp_config_rwlock, RW_READER)); in dsl_pool_config_enter_prio()
1438 rrw_enter_read_prio(&dp->dp_config_rwlock, tag); in dsl_pool_config_enter_prio()
1444 rrw_exit(&dp->dp_config_rwlock, tag); in dsl_pool_config_exit()
1450 return (RRW_LOCK_HELD(&dp->dp_config_rwlock)); in dsl_pool_config_held()
1456 return (RRW_WRITE_HELD(&dp->dp_config_rwlock)); in dsl_pool_config_held_writer()
1477 "The size limit of write-transaction zil log data");
1493 "Number of taskq entries that are pre-populated");