Lines Matching refs:dp

268 dsl_pool_open_special_dir(dsl_pool_t *dp, const char *name, dsl_dir_t **ddp)
273 err = zap_lookup(dp->dp_meta_objset,
274 dsl_dir_phys(dp->dp_root_dir)->dd_child_dir_zapobj,
279 return (dsl_dir_hold_obj(dp, obj, name, dp, ddp));
285 dsl_pool_t *dp;
288 dp = kmem_zalloc(sizeof (dsl_pool_t), KM_SLEEP);
289 dp->dp_spa = spa;
290 dp->dp_meta_rootbp = *bp;
291 rrw_init(&dp->dp_config_rwlock, B_TRUE);
292 txg_init(dp, txg);
294 txg_list_create(&dp->dp_dirty_datasets, spa,
296 txg_list_create(&dp->dp_dirty_zilogs, spa,
298 txg_list_create(&dp->dp_dirty_dirs, spa,
300 txg_list_create(&dp->dp_sync_tasks, spa,
302 txg_list_create(&dp->dp_early_sync_tasks, spa,
305 dp->dp_sync_taskq = taskq_create("dp_sync_taskq",
309 dp->dp_zil_clean_taskq = taskq_create("dp_zil_clean_taskq",
315 mutex_init(&dp->dp_lock, NULL, MUTEX_DEFAULT, NULL);
316 cv_init(&dp->dp_spaceavail_cv, NULL, CV_DEFAULT, NULL);
318 dp->dp_vnrele_taskq = taskq_create("zfs_vn_rele_taskq", 1, minclsyspri,
321 return (dp);
328 dsl_pool_t *dp = dsl_pool_open_impl(spa, txg);
330 err = dmu_objset_open_impl(spa, NULL, &dp->dp_meta_rootbp,
331 &dp->dp_meta_objset);
333 dsl_pool_close(dp);
335 *dpp = dp;
341 dsl_pool_open(dsl_pool_t *dp)
348 rrw_enter(&dp->dp_config_rwlock, RW_WRITER, FTAG);
349 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
351 &dp->dp_root_dir_obj);
355 err = dsl_dir_hold_obj(dp, dp->dp_root_dir_obj,
356 NULL, dp, &dp->dp_root_dir);
360 err = dsl_pool_open_special_dir(dp, MOS_DIR_NAME, &dp->dp_mos_dir);
364 if (spa_version(dp->dp_spa) >= SPA_VERSION_ORIGIN) {
365 err = dsl_pool_open_special_dir(dp, ORIGIN_DIR_NAME, &dd);
368 err = dsl_dataset_hold_obj(dp,
371 err = dsl_dataset_hold_obj(dp,
372 dsl_dataset_phys(ds)->ds_prev_snap_obj, dp,
373 &dp->dp_origin_snap);
376 dsl_dir_rele(dd, dp);
381 if (spa_version(dp->dp_spa) >= SPA_VERSION_DEADLISTS) {
382 err = dsl_pool_open_special_dir(dp, FREE_DIR_NAME,
383 &dp->dp_free_dir);
387 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
391 VERIFY0(bpobj_open(&dp->dp_free_bpobj,
392 dp->dp_meta_objset, obj));
395 if (spa_feature_is_active(dp->dp_spa, SPA_FEATURE_OBSOLETE_COUNTS)) {
396 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
399 VERIFY0(bpobj_open(&dp->dp_obsolete_bpobj,
400 dp->dp_meta_objset, obj));
415 (void) dsl_pool_open_special_dir(dp, LEAK_DIR_NAME,
416 &dp->dp_leak_dir);
418 if (spa_feature_is_active(dp->dp_spa, SPA_FEATURE_ASYNC_DESTROY)) {
419 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
421 &dp->dp_bptree_obj);
426 if (spa_feature_is_active(dp->dp_spa, SPA_FEATURE_EMPTY_BPOBJ)) {
427 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
429 &dp->dp_empty_bpobj);
434 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
436 &dp->dp_tmp_userrefs_obj);
442 err = dsl_scan_init(dp, dp->dp_tx.tx_open_txg);
445 rrw_exit(&dp->dp_config_rwlock, FTAG);
450 dsl_pool_close(dsl_pool_t *dp)
459 if (dp->dp_origin_snap != NULL)
460 dsl_dataset_rele(dp->dp_origin_snap, dp);
461 if (dp->dp_mos_dir != NULL)
462 dsl_dir_rele(dp->dp_mos_dir, dp);
463 if (dp->dp_free_dir != NULL)
464 dsl_dir_rele(dp->dp_free_dir, dp);
465 if (dp->dp_leak_dir != NULL)
466 dsl_dir_rele(dp->dp_leak_dir, dp);
467 if (dp->dp_root_dir != NULL)
468 dsl_dir_rele(dp->dp_root_dir, dp);
470 bpobj_close(&dp->dp_free_bpobj);
471 bpobj_close(&dp->dp_obsolete_bpobj);
474 if (dp->dp_meta_objset != NULL)
475 dmu_objset_evict(dp->dp_meta_objset);
477 txg_list_destroy(&dp->dp_dirty_datasets);
478 txg_list_destroy(&dp->dp_dirty_zilogs);
479 txg_list_destroy(&dp->dp_sync_tasks);
480 txg_list_destroy(&dp->dp_early_sync_tasks);
481 txg_list_destroy(&dp->dp_dirty_dirs);
483 taskq_destroy(dp->dp_zil_clean_taskq);
484 taskq_destroy(dp->dp_sync_taskq);
492 arc_flush(dp->dp_spa, FALSE);
494 txg_fini(dp);
495 dsl_scan_fini(dp);
498 rrw_destroy(&dp->dp_config_rwlock);
499 mutex_destroy(&dp->dp_lock);
500 taskq_destroy(dp->dp_vnrele_taskq);
501 if (dp->dp_blkstats != NULL) {
502 mutex_destroy(&dp->dp_blkstats->zab_lock);
503 kmem_free(dp->dp_blkstats, sizeof (zfs_all_blkstats_t));
505 kmem_free(dp, sizeof (dsl_pool_t));
509 dsl_pool_create_obsolete_bpobj(dsl_pool_t *dp, dmu_tx_t *tx)
516 ASSERT(spa_feature_is_active(dp->dp_spa, SPA_FEATURE_DEVICE_REMOVAL));
518 obj = bpobj_alloc(dp->dp_meta_objset, SPA_OLD_MAXBLOCKSIZE, tx);
519 VERIFY0(bpobj_open(&dp->dp_obsolete_bpobj, dp->dp_meta_objset, obj));
520 VERIFY0(zap_add(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
522 spa_feature_incr(dp->dp_spa, SPA_FEATURE_OBSOLETE_COUNTS, tx);
526 dsl_pool_destroy_obsolete_bpobj(dsl_pool_t *dp, dmu_tx_t *tx)
528 spa_feature_decr(dp->dp_spa, SPA_FEATURE_OBSOLETE_COUNTS, tx);
529 VERIFY0(zap_remove(dp->dp_meta_objset,
532 bpobj_free(dp->dp_meta_objset,
533 dp->dp_obsolete_bpobj.bpo_object, tx);
534 bpobj_close(&dp->dp_obsolete_bpobj);
541 dsl_pool_t *dp = dsl_pool_open_impl(spa, txg);
542 dmu_tx_t *tx = dmu_tx_create_assigned(dp, txg);
546 rrw_enter(&dp->dp_config_rwlock, RW_WRITER, FTAG);
549 dp->dp_meta_objset = dmu_objset_create_impl(spa,
550 NULL, &dp->dp_meta_rootbp, DMU_OST_META, tx);
553 err = zap_create_claim(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
558 VERIFY0(dsl_scan_init(dp, txg));
561 dp->dp_root_dir_obj = dsl_dir_create_sync(dp, NULL, NULL, tx);
562 VERIFY0(dsl_dir_hold_obj(dp, dp->dp_root_dir_obj,
563 NULL, dp, &dp->dp_root_dir));
566 (void) dsl_dir_create_sync(dp, dp->dp_root_dir, MOS_DIR_NAME, tx);
567 VERIFY0(dsl_pool_open_special_dir(dp,
568 MOS_DIR_NAME, &dp->dp_mos_dir));
572 (void) dsl_dir_create_sync(dp, dp->dp_root_dir,
574 VERIFY0(dsl_pool_open_special_dir(dp,
575 FREE_DIR_NAME, &dp->dp_free_dir));
578 obj = bpobj_alloc(dp->dp_meta_objset, SPA_OLD_MAXBLOCKSIZE, tx);
579 VERIFY(zap_add(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
581 VERIFY0(bpobj_open(&dp->dp_free_bpobj,
582 dp->dp_meta_objset, obj));
586 dsl_pool_create_origin(dp, tx);
589 obj = dsl_dataset_create_sync_dd(dp->dp_root_dir, NULL, 0, tx);
592 VERIFY0(dsl_dataset_hold_obj(dp, obj, FTAG, &ds));
597 os = dmu_objset_create_impl(dp->dp_spa, ds,
607 rrw_exit(&dp->dp_config_rwlock, FTAG);
609 return (dp);
616 dsl_pool_mos_diduse_space(dsl_pool_t *dp,
620 mutex_enter(&dp->dp_lock);
621 dp->dp_mos_used_delta += used;
622 dp->dp_mos_compressed_delta += comp;
623 dp->dp_mos_uncompressed_delta += uncomp;
624 mutex_exit(&dp->dp_lock);
628 dsl_pool_sync_mos(dsl_pool_t *dp, dmu_tx_t *tx)
630 zio_t *zio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED);
631 dmu_objset_sync(dp->dp_meta_objset, zio, tx);
633 dprintf_bp(&dp->dp_meta_rootbp, "meta objset rootbp is %s", "");
634 spa_set_rootblkptr(dp->dp_spa, &dp->dp_meta_rootbp);
638 dsl_pool_dirty_delta(dsl_pool_t *dp, int64_t delta)
640 ASSERT(MUTEX_HELD(&dp->dp_lock));
643 ASSERT3U(-delta, <=, dp->dp_dirty_total);
645 dp->dp_dirty_total += delta;
651 if (dp->dp_dirty_total < zfs_dirty_data_max)
652 cv_signal(&dp->dp_spaceavail_cv);
656 dsl_early_sync_task_verify(dsl_pool_t *dp, uint64_t txg)
658 spa_t *spa = dp->dp_spa;
677 dsl_pool_sync(dsl_pool_t *dp, uint64_t txg)
683 objset_t *mos = dp->dp_meta_objset;
689 tx = dmu_tx_create_assigned(dp, txg);
696 if (!txg_list_empty(&dp->dp_early_sync_tasks, txg)) {
699 ASSERT3U(spa_sync_pass(dp->dp_spa), ==, 1);
701 txg_list_remove(&dp->dp_early_sync_tasks, txg)) != NULL) {
702 ASSERT(dsl_early_sync_task_verify(dp, txg));
705 ASSERT(dsl_early_sync_task_verify(dp, txg));
711 zio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED);
712 while ((ds = txg_list_remove(&dp->dp_dirty_datasets, txg)) != NULL) {
731 dsl_pool_undirty_space(dp, dp->dp_dirty_pertxg[txg & TXG_MASK], txg);
737 mutex_enter(&dp->dp_lock);
738 ASSERT(spa_sync_pass(dp->dp_spa) == 1 ||
739 dp->dp_long_free_dirty_pertxg[txg & TXG_MASK] == 0);
740 dp->dp_long_free_dirty_pertxg[txg & TXG_MASK] = 0;
741 mutex_exit(&dp->dp_lock);
753 taskq_wait(dp->dp_sync_taskq);
762 zio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED);
763 while ((ds = txg_list_remove(&dp->dp_dirty_datasets, txg)) != NULL) {
780 while ((dd = txg_list_remove(&dp->dp_dirty_dirs, txg)) != NULL) {
789 if (dp->dp_mos_used_delta != 0 || dp->dp_mos_compressed_delta != 0 ||
790 dp->dp_mos_uncompressed_delta != 0) {
791 dsl_dir_diduse_space(dp->dp_mos_dir, DD_USED_HEAD,
792 dp->dp_mos_used_delta,
793 dp->dp_mos_compressed_delta,
794 dp->dp_mos_uncompressed_delta, tx);
795 dp->dp_mos_used_delta = 0;
796 dp->dp_mos_compressed_delta = 0;
797 dp->dp_mos_uncompressed_delta = 0;
801 dsl_pool_sync_mos(dp, tx);
813 if (!txg_list_empty(&dp->dp_sync_tasks, txg)) {
819 ASSERT3U(spa_sync_pass(dp->dp_spa), ==, 1);
820 while ((dst = txg_list_remove(&dp->dp_sync_tasks, txg)) != NULL)
826 DTRACE_PROBE2(dsl_pool_sync__done, dsl_pool_t *dp, dp, uint64_t, txg);
830 dsl_pool_sync_done(dsl_pool_t *dp, uint64_t txg)
834 while (zilog = txg_list_head(&dp->dp_dirty_zilogs, txg)) {
843 (void) txg_list_remove_this(&dp->dp_dirty_zilogs, zilog, txg);
847 ASSERT(!dmu_objset_is_dirty(dp->dp_meta_objset, txg));
855 dsl_pool_sync_context(dsl_pool_t *dp)
857 return (curthread == dp->dp_tx.tx_sync_thread ||
858 spa_is_initializing(dp->dp_spa) ||
859 taskq_member(dp->dp_sync_taskq, curthread));
882 dsl_pool_adjustedsize(dsl_pool_t *dp, zfs_space_check_t slop_policy)
884 spa_t *spa = dp->dp_spa;
915 dsl_pool_unreserved_space(dsl_pool_t *dp, zfs_space_check_t slop_policy)
917 uint64_t poolsize = dsl_pool_adjustedsize(dp, slop_policy);
919 metaslab_class_get_deferred(spa_normal_class(dp->dp_spa));
925 dsl_pool_need_dirty_delay(dsl_pool_t *dp)
931 mutex_enter(&dp->dp_lock);
932 if (dp->dp_dirty_total > zfs_dirty_data_sync)
933 txg_kick(dp);
934 rv = (dp->dp_dirty_total > delay_min_bytes);
935 mutex_exit(&dp->dp_lock);
940 dsl_pool_dirty_space(dsl_pool_t *dp, int64_t space, dmu_tx_t *tx)
943 mutex_enter(&dp->dp_lock);
944 dp->dp_dirty_pertxg[tx->tx_txg & TXG_MASK] += space;
945 dsl_pool_dirty_delta(dp, space);
946 mutex_exit(&dp->dp_lock);
951 dsl_pool_undirty_space(dsl_pool_t *dp, int64_t space, uint64_t txg)
956 mutex_enter(&dp->dp_lock);
957 if (dp->dp_dirty_pertxg[txg & TXG_MASK] < space) {
959 space = dp->dp_dirty_pertxg[txg & TXG_MASK];
961 ASSERT3U(dp->dp_dirty_pertxg[txg & TXG_MASK], >=, space);
962 dp->dp_dirty_pertxg[txg & TXG_MASK] -= space;
963 ASSERT3U(dp->dp_dirty_total, >=, space);
964 dsl_pool_dirty_delta(dp, -space);
965 mutex_exit(&dp->dp_lock);
970 upgrade_clones_cb(dsl_pool_t *dp, dsl_dataset_t *hds, void *arg)
976 err = dsl_dataset_hold_obj(dp, hds->ds_object, FTAG, &ds);
981 err = dsl_dataset_hold_obj(dp,
996 prev = dp->dp_origin_snap;
1025 VERIFY0(dsl_dataset_hold_obj(dp,
1037 zap_create(dp->dp_meta_objset,
1040 VERIFY0(zap_add_int(dp->dp_meta_objset,
1044 if (prev != dp->dp_origin_snap)
1050 dsl_pool_upgrade_clones(dsl_pool_t *dp, dmu_tx_t *tx)
1053 ASSERT(dp->dp_origin_snap != NULL);
1055 VERIFY0(dmu_objset_find_dp(dp, dp->dp_root_dir_obj, upgrade_clones_cb,
1061 upgrade_dir_clones_cb(dsl_pool_t *dp, dsl_dataset_t *ds, void *arg)
1064 objset_t *mos = dp->dp_meta_objset;
1069 VERIFY0(dsl_dataset_hold_obj(dp,
1079 VERIFY0(zap_add_int(dp->dp_meta_objset,
1089 dsl_pool_upgrade_dir_clones(dsl_pool_t *dp, dmu_tx_t *tx)
1094 (void) dsl_dir_create_sync(dp, dp->dp_root_dir, FREE_DIR_NAME, tx);
1095 VERIFY0(dsl_pool_open_special_dir(dp,
1096 FREE_DIR_NAME, &dp->dp_free_dir));
1103 obj = dmu_object_alloc(dp->dp_meta_objset, DMU_OT_BPOBJ,
1105 VERIFY0(zap_add(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
1107 VERIFY0(bpobj_open(&dp->dp_free_bpobj, dp->dp_meta_objset, obj));
1109 VERIFY0(dmu_objset_find_dp(dp, dp->dp_root_dir_obj,
1114 dsl_pool_create_origin(dsl_pool_t *dp, dmu_tx_t *tx)
1120 ASSERT(dp->dp_origin_snap == NULL);
1121 ASSERT(rrw_held(&dp->dp_config_rwlock, RW_WRITER));
1124 dsobj = dsl_dataset_create_sync(dp->dp_root_dir, ORIGIN_DIR_NAME,
1126 VERIFY0(dsl_dataset_hold_obj(dp, dsobj, FTAG, &ds));
1128 VERIFY0(dsl_dataset_hold_obj(dp, dsl_dataset_phys(ds)->ds_prev_snap_obj,
1129 dp, &dp->dp_origin_snap));
1134 dsl_pool_vnrele_taskq(dsl_pool_t *dp)
1136 return (dp->dp_vnrele_taskq);
1144 dsl_pool_clean_tmp_userrefs(dsl_pool_t *dp)
1148 objset_t *mos = dp->dp_meta_objset;
1149 uint64_t zapobj = dp->dp_tmp_userrefs_obj;
1154 ASSERT(spa_version(dp->dp_spa) >= SPA_VERSION_USERREFS);
1176 dsl_dataset_user_release_tmp(dp, holds);
1185 dsl_pool_user_hold_create_obj(dsl_pool_t *dp, dmu_tx_t *tx)
1187 objset_t *mos = dp->dp_meta_objset;
1189 ASSERT(dp->dp_tmp_userrefs_obj == 0);
1192 dp->dp_tmp_userrefs_obj = zap_create_link(mos, DMU_OT_USERREFS,
1197 dsl_pool_user_hold_rele_impl(dsl_pool_t *dp, uint64_t dsobj,
1200 objset_t *mos = dp->dp_meta_objset;
1201 uint64_t zapobj = dp->dp_tmp_userrefs_obj;
1205 ASSERT(spa_version(dp->dp_spa) >= SPA_VERSION_USERREFS);
1214 dsl_pool_user_hold_create_obj(dp, tx);
1215 zapobj = dp->dp_tmp_userrefs_obj;
1235 dsl_pool_user_hold(dsl_pool_t *dp, uint64_t dsobj, const char *tag,
1238 return (dsl_pool_user_hold_rele_impl(dp, dsobj, tag, now, tx, B_TRUE));
1245 dsl_pool_user_release(dsl_pool_t *dp, uint64_t dsobj, const char *tag,
1248 return (dsl_pool_user_hold_rele_impl(dp, dsobj, tag, 0, tx, B_FALSE));
1303 dsl_pool_hold(const char *name, void *tag, dsl_pool_t **dp)
1310 *dp = spa_get_dsl(spa);
1311 dsl_pool_config_enter(*dp, tag);
1317 dsl_pool_rele(dsl_pool_t *dp, void *tag)
1319 dsl_pool_config_exit(dp, tag);
1320 spa_close(dp->dp_spa, tag);
1324 dsl_pool_config_enter(dsl_pool_t *dp, void *tag)
1338 ASSERT(!rrw_held(&dp->dp_config_rwlock, RW_READER));
1339 rrw_enter(&dp->dp_config_rwlock, RW_READER, tag);
1343 dsl_pool_config_enter_prio(dsl_pool_t *dp, void *tag)
1345 ASSERT(!rrw_held(&dp->dp_config_rwlock, RW_READER));
1346 rrw_enter_read_prio(&dp->dp_config_rwlock, tag);
1350 dsl_pool_config_exit(dsl_pool_t *dp, void *tag)
1352 rrw_exit(&dp->dp_config_rwlock, tag);
1356 dsl_pool_config_held(dsl_pool_t *dp)
1358 return (RRW_LOCK_HELD(&dp->dp_config_rwlock));
1362 dsl_pool_config_held_writer(dsl_pool_t *dp)
1364 return (RRW_WRITE_HELD(&dp->dp_config_rwlock));