Lines Matching refs:dp

174 dsl_pool_open_special_dir(dsl_pool_t *dp, const char *name, dsl_dir_t **ddp)
179 err = zap_lookup(dp->dp_meta_objset,
180 dsl_dir_phys(dp->dp_root_dir)->dd_child_dir_zapobj,
185 return (dsl_dir_hold_obj(dp, obj, name, dp, ddp));
191 dsl_pool_t *dp;
194 dp = kmem_zalloc(sizeof (dsl_pool_t), KM_SLEEP);
195 dp->dp_spa = spa;
196 dp->dp_meta_rootbp = *bp;
197 rrw_init(&dp->dp_config_rwlock, B_TRUE);
198 txg_init(dp, txg);
201 txg_list_create(&dp->dp_dirty_datasets, spa,
203 txg_list_create(&dp->dp_dirty_zilogs, spa,
205 txg_list_create(&dp->dp_dirty_dirs, spa,
207 txg_list_create(&dp->dp_sync_tasks, spa,
209 txg_list_create(&dp->dp_early_sync_tasks, spa,
212 dp->dp_sync_taskq = spa_sync_tq_create(spa, "dp_sync_taskq");
214 dp->dp_zil_clean_taskq = taskq_create("dp_zil_clean_taskq",
220 mutex_init(&dp->dp_lock, NULL, MUTEX_DEFAULT, NULL);
221 cv_init(&dp->dp_spaceavail_cv, NULL, CV_DEFAULT, NULL);
223 aggsum_init(&dp->dp_wrlog_total, 0);
225 aggsum_init(&dp->dp_wrlog_pertxg[i], 0);
228 dp->dp_zrele_taskq = taskq_create("z_zrele", 100, defclsyspri,
231 dp->dp_unlinked_drain_taskq = taskq_create("z_unlinked_drain",
235 return (dp);
242 dsl_pool_t *dp = dsl_pool_open_impl(spa, txg);
250 *dpp = dp;
252 err = dmu_objset_open_impl(spa, NULL, &dp->dp_meta_rootbp,
253 &dp->dp_meta_objset);
255 dsl_pool_close(dp);
263 dsl_pool_open(dsl_pool_t *dp)
270 rrw_enter(&dp->dp_config_rwlock, RW_WRITER, FTAG);
271 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
273 &dp->dp_root_dir_obj);
277 err = dsl_dir_hold_obj(dp, dp->dp_root_dir_obj,
278 NULL, dp, &dp->dp_root_dir);
282 err = dsl_pool_open_special_dir(dp, MOS_DIR_NAME, &dp->dp_mos_dir);
286 if (spa_version(dp->dp_spa) >= SPA_VERSION_ORIGIN) {
287 err = dsl_pool_open_special_dir(dp, ORIGIN_DIR_NAME, &dd);
290 err = dsl_dataset_hold_obj(dp,
293 err = dsl_dataset_hold_obj(dp,
294 dsl_dataset_phys(ds)->ds_prev_snap_obj, dp,
295 &dp->dp_origin_snap);
298 dsl_dir_rele(dd, dp);
303 if (spa_version(dp->dp_spa) >= SPA_VERSION_DEADLISTS) {
304 err = dsl_pool_open_special_dir(dp, FREE_DIR_NAME,
305 &dp->dp_free_dir);
309 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
313 VERIFY0(bpobj_open(&dp->dp_free_bpobj,
314 dp->dp_meta_objset, obj));
317 if (spa_feature_is_active(dp->dp_spa, SPA_FEATURE_OBSOLETE_COUNTS)) {
318 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
321 VERIFY0(bpobj_open(&dp->dp_obsolete_bpobj,
322 dp->dp_meta_objset, obj));
336 (void) dsl_pool_open_special_dir(dp, LEAK_DIR_NAME,
337 &dp->dp_leak_dir);
339 if (spa_feature_is_active(dp->dp_spa, SPA_FEATURE_ASYNC_DESTROY)) {
340 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
342 &dp->dp_bptree_obj);
347 if (spa_feature_is_active(dp->dp_spa, SPA_FEATURE_EMPTY_BPOBJ)) {
348 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
350 &dp->dp_empty_bpobj);
355 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
357 &dp->dp_tmp_userrefs_obj);
363 err = dsl_scan_init(dp, dp->dp_tx.tx_open_txg);
366 rrw_exit(&dp->dp_config_rwlock, FTAG);
371 dsl_pool_close(dsl_pool_t *dp)
380 if (dp->dp_origin_snap != NULL)
381 dsl_dataset_rele(dp->dp_origin_snap, dp);
382 if (dp->dp_mos_dir != NULL)
383 dsl_dir_rele(dp->dp_mos_dir, dp);
384 if (dp->dp_free_dir != NULL)
385 dsl_dir_rele(dp->dp_free_dir, dp);
386 if (dp->dp_leak_dir != NULL)
387 dsl_dir_rele(dp->dp_leak_dir, dp);
388 if (dp->dp_root_dir != NULL)
389 dsl_dir_rele(dp->dp_root_dir, dp);
391 bpobj_close(&dp->dp_free_bpobj);
392 bpobj_close(&dp->dp_obsolete_bpobj);
395 if (dp->dp_meta_objset != NULL)
396 dmu_objset_evict(dp->dp_meta_objset);
398 txg_list_destroy(&dp->dp_dirty_datasets);
399 txg_list_destroy(&dp->dp_dirty_zilogs);
400 txg_list_destroy(&dp->dp_sync_tasks);
401 txg_list_destroy(&dp->dp_early_sync_tasks);
402 txg_list_destroy(&dp->dp_dirty_dirs);
404 taskq_destroy(dp->dp_zil_clean_taskq);
405 spa_sync_tq_destroy(dp->dp_spa);
413 arc_flush(dp->dp_spa, FALSE);
415 mmp_fini(dp->dp_spa);
416 txg_fini(dp);
417 dsl_scan_fini(dp);
420 rrw_destroy(&dp->dp_config_rwlock);
421 mutex_destroy(&dp->dp_lock);
422 cv_destroy(&dp->dp_spaceavail_cv);
424 ASSERT0(aggsum_value(&dp->dp_wrlog_total));
425 aggsum_fini(&dp->dp_wrlog_total);
427 ASSERT0(aggsum_value(&dp->dp_wrlog_pertxg[i]));
428 aggsum_fini(&dp->dp_wrlog_pertxg[i]);
431 taskq_destroy(dp->dp_unlinked_drain_taskq);
432 taskq_destroy(dp->dp_zrele_taskq);
433 if (dp->dp_blkstats != NULL)
434 vmem_free(dp->dp_blkstats, sizeof (zfs_all_blkstats_t));
435 kmem_free(dp, sizeof (dsl_pool_t));
439 dsl_pool_create_obsolete_bpobj(dsl_pool_t *dp, dmu_tx_t *tx)
446 ASSERT(spa_feature_is_active(dp->dp_spa, SPA_FEATURE_DEVICE_REMOVAL));
448 obj = bpobj_alloc(dp->dp_meta_objset, SPA_OLD_MAXBLOCKSIZE, tx);
449 VERIFY0(bpobj_open(&dp->dp_obsolete_bpobj, dp->dp_meta_objset, obj));
450 VERIFY0(zap_add(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
452 spa_feature_incr(dp->dp_spa, SPA_FEATURE_OBSOLETE_COUNTS, tx);
456 dsl_pool_destroy_obsolete_bpobj(dsl_pool_t *dp, dmu_tx_t *tx)
458 spa_feature_decr(dp->dp_spa, SPA_FEATURE_OBSOLETE_COUNTS, tx);
459 VERIFY0(zap_remove(dp->dp_meta_objset,
462 bpobj_free(dp->dp_meta_objset,
463 dp->dp_obsolete_bpobj.bpo_object, tx);
464 bpobj_close(&dp->dp_obsolete_bpobj);
472 dsl_pool_t *dp = dsl_pool_open_impl(spa, txg);
473 dmu_tx_t *tx = dmu_tx_create_assigned(dp, txg);
482 rrw_enter(&dp->dp_config_rwlock, RW_WRITER, FTAG);
485 dp->dp_meta_objset = dmu_objset_create_impl(spa,
486 NULL, &dp->dp_meta_rootbp, DMU_OST_META, tx);
487 spa->spa_meta_objset = dp->dp_meta_objset;
490 err = zap_create_claim(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
495 VERIFY0(dsl_scan_init(dp, txg));
498 dp->dp_root_dir_obj = dsl_dir_create_sync(dp, NULL, NULL, tx);
499 VERIFY0(dsl_dir_hold_obj(dp, dp->dp_root_dir_obj,
500 NULL, dp, &dp->dp_root_dir));
503 (void) dsl_dir_create_sync(dp, dp->dp_root_dir, MOS_DIR_NAME, tx);
504 VERIFY0(dsl_pool_open_special_dir(dp,
505 MOS_DIR_NAME, &dp->dp_mos_dir));
509 (void) dsl_dir_create_sync(dp, dp->dp_root_dir,
511 VERIFY0(dsl_pool_open_special_dir(dp,
512 FREE_DIR_NAME, &dp->dp_free_dir));
515 obj = bpobj_alloc(dp->dp_meta_objset, SPA_OLD_MAXBLOCKSIZE, tx);
516 VERIFY(zap_add(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
518 VERIFY0(bpobj_open(&dp->dp_free_bpobj,
519 dp->dp_meta_objset, obj));
523 dsl_pool_create_origin(dp, tx);
537 obj = dsl_dataset_create_sync_dd(dp->dp_root_dir, NULL, dcp, 0, tx);
540 VERIFY0(dsl_dataset_hold_obj_flags(dp, obj,
543 os = dmu_objset_create_impl(dp->dp_spa, ds,
553 rrw_exit(&dp->dp_config_rwlock, FTAG);
555 return (dp);
562 dsl_pool_mos_diduse_space(dsl_pool_t *dp,
566 mutex_enter(&dp->dp_lock);
567 dp->dp_mos_used_delta += used;
568 dp->dp_mos_compressed_delta += comp;
569 dp->dp_mos_uncompressed_delta += uncomp;
570 mutex_exit(&dp->dp_lock);
574 dsl_pool_sync_mos(dsl_pool_t *dp, dmu_tx_t *tx)
576 zio_t *zio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED);
577 dmu_objset_sync(dp->dp_meta_objset, zio, tx);
579 dmu_objset_sync_done(dp->dp_meta_objset, tx);
580 taskq_wait(dp->dp_sync_taskq);
581 multilist_destroy(&dp->dp_meta_objset->os_synced_dnodes);
583 dprintf_bp(&dp->dp_meta_rootbp, "meta objset rootbp is %s", "");
584 spa_set_rootblkptr(dp->dp_spa, &dp->dp_meta_rootbp);
588 dsl_pool_dirty_delta(dsl_pool_t *dp, int64_t delta)
590 ASSERT(MUTEX_HELD(&dp->dp_lock));
593 ASSERT3U(-delta, <=, dp->dp_dirty_total);
595 dp->dp_dirty_total += delta;
601 if (dp->dp_dirty_total < zfs_dirty_data_max)
602 cv_signal(&dp->dp_spaceavail_cv);
606 dsl_pool_wrlog_count(dsl_pool_t *dp, int64_t size, uint64_t txg)
610 aggsum_add(&dp->dp_wrlog_pertxg[txg & TXG_MASK], size);
611 aggsum_add(&dp->dp_wrlog_total, size);
616 if (aggsum_compare(&dp->dp_wrlog_pertxg[txg & TXG_MASK], sync_min) > 0)
617 txg_kick(dp, txg);
621 dsl_pool_need_wrlog_delay(dsl_pool_t *dp)
626 return (aggsum_compare(&dp->dp_wrlog_total, delay_min_bytes) > 0);
630 dsl_pool_wrlog_clear(dsl_pool_t *dp, uint64_t txg)
633 delta = -(int64_t)aggsum_value(&dp->dp_wrlog_pertxg[txg & TXG_MASK]);
634 aggsum_add(&dp->dp_wrlog_pertxg[txg & TXG_MASK], delta);
635 aggsum_add(&dp->dp_wrlog_total, delta);
637 (void) aggsum_value(&dp->dp_wrlog_pertxg[txg & TXG_MASK]);
638 (void) aggsum_value(&dp->dp_wrlog_total);
643 dsl_early_sync_task_verify(dsl_pool_t *dp, uint64_t txg)
645 spa_t *spa = dp->dp_spa;
663 #define dsl_early_sync_task_verify(dp, txg) \
664 ((void) sizeof (dp), (void) sizeof (txg), B_TRUE)
668 dsl_pool_sync(dsl_pool_t *dp, uint64_t txg)
674 objset_t *mos = dp->dp_meta_objset;
680 tx = dmu_tx_create_assigned(dp, txg);
687 if (!txg_list_empty(&dp->dp_early_sync_tasks, txg)) {
690 ASSERT3U(spa_sync_pass(dp->dp_spa), ==, 1);
692 txg_list_remove(&dp->dp_early_sync_tasks, txg)) != NULL) {
693 ASSERT(dsl_early_sync_task_verify(dp, txg));
696 ASSERT(dsl_early_sync_task_verify(dp, txg));
703 rio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED);
704 while ((ds = txg_list_remove(&dp->dp_dirty_datasets, txg)) != NULL) {
720 mutex_enter(&dp->dp_lock);
721 ASSERT(spa_sync_pass(dp->dp_spa) == 1 ||
722 dp->dp_long_free_dirty_pertxg[txg & TXG_MASK] == 0);
723 dp->dp_long_free_dirty_pertxg[txg & TXG_MASK] = 0;
724 mutex_exit(&dp->dp_lock);
736 taskq_wait(dp->dp_sync_taskq);
745 rio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED);
746 while ((ds = txg_list_remove(&dp->dp_dirty_datasets, txg)) != NULL) {
761 key_mapping_rele(dp->dp_spa, ds->ds_key_mapping, ds);
781 key_mapping_rele(dp->dp_spa, ds->ds_key_mapping, ds);
788 while ((dd = txg_list_remove(&dp->dp_dirty_dirs, txg)) != NULL) {
797 if (dp->dp_mos_used_delta != 0 || dp->dp_mos_compressed_delta != 0 ||
798 dp->dp_mos_uncompressed_delta != 0) {
799 dsl_dir_diduse_space(dp->dp_mos_dir, DD_USED_HEAD,
800 dp->dp_mos_used_delta,
801 dp->dp_mos_compressed_delta,
802 dp->dp_mos_uncompressed_delta, tx);
803 dp->dp_mos_used_delta = 0;
804 dp->dp_mos_compressed_delta = 0;
805 dp->dp_mos_uncompressed_delta = 0;
809 dsl_pool_sync_mos(dp, tx);
825 dsl_pool_undirty_space(dp, dp->dp_dirty_pertxg[txg & TXG_MASK], txg);
836 if (!txg_list_empty(&dp->dp_sync_tasks, txg)) {
842 ASSERT3U(spa_sync_pass(dp->dp_spa), ==, 1);
843 while ((dst = txg_list_remove(&dp->dp_sync_tasks, txg)) != NULL)
849 DTRACE_PROBE2(dsl_pool_sync__done, dsl_pool_t *dp, dp, uint64_t, txg);
853 dsl_pool_sync_done(dsl_pool_t *dp, uint64_t txg)
857 while ((zilog = txg_list_head(&dp->dp_dirty_zilogs, txg))) {
866 (void) txg_list_remove_this(&dp->dp_dirty_zilogs, zilog, txg);
871 dsl_pool_wrlog_clear(dp, txg);
873 ASSERT(!dmu_objset_is_dirty(dp->dp_meta_objset, txg));
881 dsl_pool_sync_context(dsl_pool_t *dp)
883 return (curthread == dp->dp_tx.tx_sync_thread ||
884 spa_is_initializing(dp->dp_spa) ||
885 taskq_member(dp->dp_sync_taskq, curthread));
908 dsl_pool_adjustedsize(dsl_pool_t *dp, zfs_space_check_t slop_policy)
910 spa_t *spa = dp->dp_spa;
941 dsl_pool_unreserved_space(dsl_pool_t *dp, zfs_space_check_t slop_policy)
943 uint64_t poolsize = dsl_pool_adjustedsize(dp, slop_policy);
945 metaslab_class_get_deferred(spa_normal_class(dp->dp_spa));
951 dsl_pool_deferred_space(dsl_pool_t *dp)
953 return (metaslab_class_get_deferred(spa_normal_class(dp->dp_spa)));
957 dsl_pool_need_dirty_delay(dsl_pool_t *dp)
968 return (dp->dp_dirty_total > delay_min_bytes);
972 dsl_pool_need_dirty_sync(dsl_pool_t *dp, uint64_t txg)
976 uint64_t dirty = dp->dp_dirty_pertxg[txg & TXG_MASK];
982 dsl_pool_dirty_space(dsl_pool_t *dp, int64_t space, dmu_tx_t *tx)
985 mutex_enter(&dp->dp_lock);
986 dp->dp_dirty_pertxg[tx->tx_txg & TXG_MASK] += space;
987 dsl_pool_dirty_delta(dp, space);
989 dsl_pool_need_dirty_sync(dp, tx->tx_txg);
990 mutex_exit(&dp->dp_lock);
993 txg_kick(dp, tx->tx_txg);
998 dsl_pool_undirty_space(dsl_pool_t *dp, int64_t space, uint64_t txg)
1004 mutex_enter(&dp->dp_lock);
1005 if (dp->dp_dirty_pertxg[txg & TXG_MASK] < space) {
1007 space = dp->dp_dirty_pertxg[txg & TXG_MASK];
1009 ASSERT3U(dp->dp_dirty_pertxg[txg & TXG_MASK], >=, space);
1010 dp->dp_dirty_pertxg[txg & TXG_MASK] -= space;
1011 ASSERT3U(dp->dp_dirty_total, >=, space);
1012 dsl_pool_dirty_delta(dp, -space);
1013 mutex_exit(&dp->dp_lock);
1017 upgrade_clones_cb(dsl_pool_t *dp, dsl_dataset_t *hds, void *arg)
1023 err = dsl_dataset_hold_obj(dp, hds->ds_object, FTAG, &ds);
1028 err = dsl_dataset_hold_obj(dp,
1043 prev = dp->dp_origin_snap;
1072 VERIFY0(dsl_dataset_hold_obj(dp,
1084 zap_create(dp->dp_meta_objset,
1087 VERIFY0(zap_add_int(dp->dp_meta_objset,
1091 if (prev != dp->dp_origin_snap)
1097 dsl_pool_upgrade_clones(dsl_pool_t *dp, dmu_tx_t *tx)
1100 ASSERT(dp->dp_origin_snap != NULL);
1102 VERIFY0(dmu_objset_find_dp(dp, dp->dp_root_dir_obj, upgrade_clones_cb,
1107 upgrade_dir_clones_cb(dsl_pool_t *dp, dsl_dataset_t *ds, void *arg)
1110 objset_t *mos = dp->dp_meta_objset;
1115 VERIFY0(dsl_dataset_hold_obj(dp,
1125 VERIFY0(zap_add_int(dp->dp_meta_objset,
1135 dsl_pool_upgrade_dir_clones(dsl_pool_t *dp, dmu_tx_t *tx)
1141 (void) dsl_dir_create_sync(dp, dp->dp_root_dir, FREE_DIR_NAME, tx);
1142 VERIFY0(dsl_pool_open_special_dir(dp,
1143 FREE_DIR_NAME, &dp->dp_free_dir));
1150 obj = dmu_object_alloc(dp->dp_meta_objset, DMU_OT_BPOBJ,
1152 VERIFY0(zap_add(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
1154 VERIFY0(bpobj_open(&dp->dp_free_bpobj, dp->dp_meta_objset, obj));
1156 VERIFY0(dmu_objset_find_dp(dp, dp->dp_root_dir_obj,
1161 dsl_pool_create_origin(dsl_pool_t *dp, dmu_tx_t *tx)
1167 ASSERT(dp->dp_origin_snap == NULL);
1168 ASSERT(rrw_held(&dp->dp_config_rwlock, RW_WRITER));
1171 dsobj = dsl_dataset_create_sync(dp->dp_root_dir, ORIGIN_DIR_NAME,
1173 VERIFY0(dsl_dataset_hold_obj(dp, dsobj, FTAG, &ds));
1175 VERIFY0(dsl_dataset_hold_obj(dp, dsl_dataset_phys(ds)->ds_prev_snap_obj,
1176 dp, &dp->dp_origin_snap));
1181 dsl_pool_zrele_taskq(dsl_pool_t *dp)
1183 return (dp->dp_zrele_taskq);
1187 dsl_pool_unlinked_drain_taskq(dsl_pool_t *dp)
1189 return (dp->dp_unlinked_drain_taskq);
1197 dsl_pool_clean_tmp_userrefs(dsl_pool_t *dp)
1201 objset_t *mos = dp->dp_meta_objset;
1202 uint64_t zapobj = dp->dp_tmp_userrefs_obj;
1207 ASSERT(spa_version(dp->dp_spa) >= SPA_VERSION_USERREFS);
1229 dsl_dataset_user_release_tmp(dp, holds);
1238 dsl_pool_user_hold_create_obj(dsl_pool_t *dp, dmu_tx_t *tx)
1240 objset_t *mos = dp->dp_meta_objset;
1242 ASSERT(dp->dp_tmp_userrefs_obj == 0);
1245 dp->dp_tmp_userrefs_obj = zap_create_link(mos, DMU_OT_USERREFS,
1250 dsl_pool_user_hold_rele_impl(dsl_pool_t *dp, uint64_t dsobj,
1253 objset_t *mos = dp->dp_meta_objset;
1254 uint64_t zapobj = dp->dp_tmp_userrefs_obj;
1258 ASSERT(spa_version(dp->dp_spa) >= SPA_VERSION_USERREFS);
1267 dsl_pool_user_hold_create_obj(dp, tx);
1268 zapobj = dp->dp_tmp_userrefs_obj;
1288 dsl_pool_user_hold(dsl_pool_t *dp, uint64_t dsobj, const char *tag,
1291 return (dsl_pool_user_hold_rele_impl(dp, dsobj, tag, now, tx, B_TRUE));
1298 dsl_pool_user_release(dsl_pool_t *dp, uint64_t dsobj, const char *tag,
1301 return (dsl_pool_user_hold_rele_impl(dp, dsobj, tag, 0,
1384 dsl_pool_hold(const char *name, const void *tag, dsl_pool_t **dp)
1391 *dp = spa_get_dsl(spa);
1392 dsl_pool_config_enter(*dp, tag);
1398 dsl_pool_rele(dsl_pool_t *dp, const void *tag)
1400 dsl_pool_config_exit(dp, tag);
1401 spa_close(dp->dp_spa, tag);
1405 dsl_pool_config_enter(dsl_pool_t *dp, const void *tag)
1419 ASSERT(!rrw_held(&dp->dp_config_rwlock, RW_READER));
1420 rrw_enter(&dp->dp_config_rwlock, RW_READER, tag);
1424 dsl_pool_config_enter_prio(dsl_pool_t *dp, const void *tag)
1426 ASSERT(!rrw_held(&dp->dp_config_rwlock, RW_READER));
1427 rrw_enter_read_prio(&dp->dp_config_rwlock, tag);
1431 dsl_pool_config_exit(dsl_pool_t *dp, const void *tag)
1433 rrw_exit(&dp->dp_config_rwlock, tag);
1437 dsl_pool_config_held(dsl_pool_t *dp)
1439 return (RRW_LOCK_HELD(&dp->dp_config_rwlock));
1443 dsl_pool_config_held_writer(dsl_pool_t *dp)
1445 return (RRW_WRITE_HELD(&dp->dp_config_rwlock));