Lines Matching refs:dp

134 dsl_pool_open_special_dir(dsl_pool_t *dp, const char *name, dsl_dir_t **ddp)
139 err = zap_lookup(dp->dp_meta_objset,
140 dsl_dir_phys(dp->dp_root_dir)->dd_child_dir_zapobj,
145 return (dsl_dir_hold_obj(dp, obj, name, dp, ddp));
151 dsl_pool_t *dp;
154 dp = kmem_zalloc(sizeof (dsl_pool_t), KM_SLEEP);
155 dp->dp_spa = spa;
156 dp->dp_meta_rootbp = *bp;
157 rrw_init(&dp->dp_config_rwlock, B_TRUE);
158 txg_init(dp, txg);
160 txg_list_create(&dp->dp_dirty_datasets,
162 txg_list_create(&dp->dp_dirty_zilogs,
164 txg_list_create(&dp->dp_dirty_dirs,
166 txg_list_create(&dp->dp_sync_tasks,
169 mutex_init(&dp->dp_lock, NULL, MUTEX_DEFAULT, NULL);
170 cv_init(&dp->dp_spaceavail_cv, NULL, CV_DEFAULT, NULL);
172 dp->dp_vnrele_taskq = taskq_create("zfs_vn_rele_taskq", 1, minclsyspri,
175 return (dp);
182 dsl_pool_t *dp = dsl_pool_open_impl(spa, txg);
184 err = dmu_objset_open_impl(spa, NULL, &dp->dp_meta_rootbp,
185 &dp->dp_meta_objset);
187 dsl_pool_close(dp);
189 *dpp = dp;
195 dsl_pool_open(dsl_pool_t *dp)
202 rrw_enter(&dp->dp_config_rwlock, RW_WRITER, FTAG);
203 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
205 &dp->dp_root_dir_obj);
209 err = dsl_dir_hold_obj(dp, dp->dp_root_dir_obj,
210 NULL, dp, &dp->dp_root_dir);
214 err = dsl_pool_open_special_dir(dp, MOS_DIR_NAME, &dp->dp_mos_dir);
218 if (spa_version(dp->dp_spa) >= SPA_VERSION_ORIGIN) {
219 err = dsl_pool_open_special_dir(dp, ORIGIN_DIR_NAME, &dd);
222 err = dsl_dataset_hold_obj(dp,
225 err = dsl_dataset_hold_obj(dp,
226 dsl_dataset_phys(ds)->ds_prev_snap_obj, dp,
227 &dp->dp_origin_snap);
230 dsl_dir_rele(dd, dp);
235 if (spa_version(dp->dp_spa) >= SPA_VERSION_DEADLISTS) {
236 err = dsl_pool_open_special_dir(dp, FREE_DIR_NAME,
237 &dp->dp_free_dir);
241 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
245 VERIFY0(bpobj_open(&dp->dp_free_bpobj,
246 dp->dp_meta_objset, obj));
253 (void) dsl_pool_open_special_dir(dp, LEAK_DIR_NAME,
254 &dp->dp_leak_dir);
256 if (spa_feature_is_active(dp->dp_spa, SPA_FEATURE_ASYNC_DESTROY)) {
257 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
259 &dp->dp_bptree_obj);
264 if (spa_feature_is_active(dp->dp_spa, SPA_FEATURE_EMPTY_BPOBJ)) {
265 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
267 &dp->dp_empty_bpobj);
272 err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
274 &dp->dp_tmp_userrefs_obj);
280 err = dsl_scan_init(dp, dp->dp_tx.tx_open_txg);
283 rrw_exit(&dp->dp_config_rwlock, FTAG);
288 dsl_pool_close(dsl_pool_t *dp)
297 if (dp->dp_origin_snap)
298 dsl_dataset_rele(dp->dp_origin_snap, dp);
299 if (dp->dp_mos_dir)
300 dsl_dir_rele(dp->dp_mos_dir, dp);
301 if (dp->dp_free_dir)
302 dsl_dir_rele(dp->dp_free_dir, dp);
303 if (dp->dp_leak_dir)
304 dsl_dir_rele(dp->dp_leak_dir, dp);
305 if (dp->dp_root_dir)
306 dsl_dir_rele(dp->dp_root_dir, dp);
308 bpobj_close(&dp->dp_free_bpobj);
311 if (dp->dp_meta_objset)
312 dmu_objset_evict(dp->dp_meta_objset);
314 txg_list_destroy(&dp->dp_dirty_datasets);
315 txg_list_destroy(&dp->dp_dirty_zilogs);
316 txg_list_destroy(&dp->dp_sync_tasks);
317 txg_list_destroy(&dp->dp_dirty_dirs);
325 arc_flush(dp->dp_spa, FALSE);
327 txg_fini(dp);
328 dsl_scan_fini(dp);
331 rrw_destroy(&dp->dp_config_rwlock);
332 mutex_destroy(&dp->dp_lock);
333 taskq_destroy(dp->dp_vnrele_taskq);
334 if (dp->dp_blkstats)
335 kmem_free(dp->dp_blkstats, sizeof (zfs_all_blkstats_t));
336 kmem_free(dp, sizeof (dsl_pool_t));
343 dsl_pool_t *dp = dsl_pool_open_impl(spa, txg);
344 dmu_tx_t *tx = dmu_tx_create_assigned(dp, txg);
349 rrw_enter(&dp->dp_config_rwlock, RW_WRITER, FTAG);
352 dp->dp_meta_objset = dmu_objset_create_impl(spa,
353 NULL, &dp->dp_meta_rootbp, DMU_OST_META, tx);
356 err = zap_create_claim(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
361 VERIFY0(dsl_scan_init(dp, txg));
364 dp->dp_root_dir_obj = dsl_dir_create_sync(dp, NULL, NULL, tx);
365 VERIFY0(dsl_dir_hold_obj(dp, dp->dp_root_dir_obj,
366 NULL, dp, &dp->dp_root_dir));
369 (void) dsl_dir_create_sync(dp, dp->dp_root_dir, MOS_DIR_NAME, tx);
370 VERIFY0(dsl_pool_open_special_dir(dp,
371 MOS_DIR_NAME, &dp->dp_mos_dir));
375 (void) dsl_dir_create_sync(dp, dp->dp_root_dir,
377 VERIFY0(dsl_pool_open_special_dir(dp,
378 FREE_DIR_NAME, &dp->dp_free_dir));
381 obj = bpobj_alloc(dp->dp_meta_objset, SPA_OLD_MAXBLOCKSIZE, tx);
382 VERIFY(zap_add(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
384 VERIFY0(bpobj_open(&dp->dp_free_bpobj,
385 dp->dp_meta_objset, obj));
389 dsl_pool_create_origin(dp, tx);
392 obj = dsl_dataset_create_sync_dd(dp->dp_root_dir, NULL, 0, tx);
395 VERIFY0(dsl_dataset_hold_obj(dp, obj, FTAG, &ds));
397 os = dmu_objset_create_impl(dp->dp_spa, ds,
407 rrw_exit(&dp->dp_config_rwlock, FTAG);
409 return (dp);
416 dsl_pool_mos_diduse_space(dsl_pool_t *dp,
420 mutex_enter(&dp->dp_lock);
421 dp->dp_mos_used_delta += used;
422 dp->dp_mos_compressed_delta += comp;
423 dp->dp_mos_uncompressed_delta += uncomp;
424 mutex_exit(&dp->dp_lock);
428 dsl_pool_sync_mos(dsl_pool_t *dp, dmu_tx_t *tx)
430 zio_t *zio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED);
431 dmu_objset_sync(dp->dp_meta_objset, zio, tx);
433 dprintf_bp(&dp->dp_meta_rootbp, "meta objset rootbp is %s", "");
434 spa_set_rootblkptr(dp->dp_spa, &dp->dp_meta_rootbp);
438 dsl_pool_dirty_delta(dsl_pool_t *dp, int64_t delta)
440 ASSERT(MUTEX_HELD(&dp->dp_lock));
443 ASSERT3U(-delta, <=, dp->dp_dirty_total);
445 dp->dp_dirty_total += delta;
451 if (dp->dp_dirty_total <= zfs_dirty_data_max)
452 cv_signal(&dp->dp_spaceavail_cv);
456 dsl_pool_sync(dsl_pool_t *dp, uint64_t txg)
462 objset_t *mos = dp->dp_meta_objset;
468 tx = dmu_tx_create_assigned(dp, txg);
473 zio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED);
474 while ((ds = txg_list_remove(&dp->dp_dirty_datasets, txg)) != NULL) {
493 dsl_pool_undirty_space(dp, dp->dp_dirty_pertxg[txg & TXG_MASK], txg);
511 zio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED);
512 while ((ds = txg_list_remove(&dp->dp_dirty_datasets, txg)) != NULL) {
529 while ((dd = txg_list_remove(&dp->dp_dirty_dirs, txg)) != NULL) {
538 if (dp->dp_mos_used_delta != 0 || dp->dp_mos_compressed_delta != 0 ||
539 dp->dp_mos_uncompressed_delta != 0) {
540 dsl_dir_diduse_space(dp->dp_mos_dir, DD_USED_HEAD,
541 dp->dp_mos_used_delta,
542 dp->dp_mos_compressed_delta,
543 dp->dp_mos_uncompressed_delta, tx);
544 dp->dp_mos_used_delta = 0;
545 dp->dp_mos_compressed_delta = 0;
546 dp->dp_mos_uncompressed_delta = 0;
551 dsl_pool_sync_mos(dp, tx);
563 if (!txg_list_empty(&dp->dp_sync_tasks, txg)) {
569 ASSERT3U(spa_sync_pass(dp->dp_spa), ==, 1);
570 while ((dst = txg_list_remove(&dp->dp_sync_tasks, txg)) != NULL)
576 DTRACE_PROBE2(dsl_pool_sync__done, dsl_pool_t *dp, dp, uint64_t, txg);
580 dsl_pool_sync_done(dsl_pool_t *dp, uint64_t txg)
584 while (zilog = txg_list_head(&dp->dp_dirty_zilogs, txg)) {
593 (void) txg_list_remove_this(&dp->dp_dirty_zilogs, zilog, txg);
597 ASSERT(!dmu_objset_is_dirty(dp->dp_meta_objset, txg));
605 dsl_pool_sync_context(dsl_pool_t *dp)
607 return (curthread == dp->dp_tx.tx_sync_thread ||
608 spa_is_initializing(dp->dp_spa));
612 dsl_pool_adjustedsize(dsl_pool_t *dp, boolean_t netfree)
621 space = spa_get_dspace(dp->dp_spa);
622 resv = spa_get_slop_space(dp->dp_spa);
630 dsl_pool_need_dirty_delay(dsl_pool_t *dp)
636 mutex_enter(&dp->dp_lock);
637 if (dp->dp_dirty_total > zfs_dirty_data_sync)
638 txg_kick(dp);
639 rv = (dp->dp_dirty_total > delay_min_bytes);
640 mutex_exit(&dp->dp_lock);
645 dsl_pool_dirty_space(dsl_pool_t *dp, int64_t space, dmu_tx_t *tx)
648 mutex_enter(&dp->dp_lock);
649 dp->dp_dirty_pertxg[tx->tx_txg & TXG_MASK] += space;
650 dsl_pool_dirty_delta(dp, space);
651 mutex_exit(&dp->dp_lock);
656 dsl_pool_undirty_space(dsl_pool_t *dp, int64_t space, uint64_t txg)
661 mutex_enter(&dp->dp_lock);
662 if (dp->dp_dirty_pertxg[txg & TXG_MASK] < space) {
664 space = dp->dp_dirty_pertxg[txg & TXG_MASK];
666 ASSERT3U(dp->dp_dirty_pertxg[txg & TXG_MASK], >=, space);
667 dp->dp_dirty_pertxg[txg & TXG_MASK] -= space;
668 ASSERT3U(dp->dp_dirty_total, >=, space);
669 dsl_pool_dirty_delta(dp, -space);
670 mutex_exit(&dp->dp_lock);
675 upgrade_clones_cb(dsl_pool_t *dp, dsl_dataset_t *hds, void *arg)
681 err = dsl_dataset_hold_obj(dp, hds->ds_object, FTAG, &ds);
686 err = dsl_dataset_hold_obj(dp,
701 prev = dp->dp_origin_snap;
730 VERIFY0(dsl_dataset_hold_obj(dp,
742 zap_create(dp->dp_meta_objset,
745 VERIFY0(zap_add_int(dp->dp_meta_objset,
749 if (prev != dp->dp_origin_snap)
755 dsl_pool_upgrade_clones(dsl_pool_t *dp, dmu_tx_t *tx)
758 ASSERT(dp->dp_origin_snap != NULL);
760 VERIFY0(dmu_objset_find_dp(dp, dp->dp_root_dir_obj, upgrade_clones_cb,
766 upgrade_dir_clones_cb(dsl_pool_t *dp, dsl_dataset_t *ds, void *arg)
769 objset_t *mos = dp->dp_meta_objset;
774 VERIFY0(dsl_dataset_hold_obj(dp,
784 VERIFY0(zap_add_int(dp->dp_meta_objset,
794 dsl_pool_upgrade_dir_clones(dsl_pool_t *dp, dmu_tx_t *tx)
799 (void) dsl_dir_create_sync(dp, dp->dp_root_dir, FREE_DIR_NAME, tx);
800 VERIFY0(dsl_pool_open_special_dir(dp,
801 FREE_DIR_NAME, &dp->dp_free_dir));
808 obj = dmu_object_alloc(dp->dp_meta_objset, DMU_OT_BPOBJ,
810 VERIFY0(zap_add(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
812 VERIFY0(bpobj_open(&dp->dp_free_bpobj, dp->dp_meta_objset, obj));
814 VERIFY0(dmu_objset_find_dp(dp, dp->dp_root_dir_obj,
819 dsl_pool_create_origin(dsl_pool_t *dp, dmu_tx_t *tx)
825 ASSERT(dp->dp_origin_snap == NULL);
826 ASSERT(rrw_held(&dp->dp_config_rwlock, RW_WRITER));
829 dsobj = dsl_dataset_create_sync(dp->dp_root_dir, ORIGIN_DIR_NAME,
831 VERIFY0(dsl_dataset_hold_obj(dp, dsobj, FTAG, &ds));
833 VERIFY0(dsl_dataset_hold_obj(dp, dsl_dataset_phys(ds)->ds_prev_snap_obj,
834 dp, &dp->dp_origin_snap));
839 dsl_pool_vnrele_taskq(dsl_pool_t *dp)
841 return (dp->dp_vnrele_taskq);
849 dsl_pool_clean_tmp_userrefs(dsl_pool_t *dp)
853 objset_t *mos = dp->dp_meta_objset;
854 uint64_t zapobj = dp->dp_tmp_userrefs_obj;
859 ASSERT(spa_version(dp->dp_spa) >= SPA_VERSION_USERREFS);
881 dsl_dataset_user_release_tmp(dp, holds);
890 dsl_pool_user_hold_create_obj(dsl_pool_t *dp, dmu_tx_t *tx)
892 objset_t *mos = dp->dp_meta_objset;
894 ASSERT(dp->dp_tmp_userrefs_obj == 0);
897 dp->dp_tmp_userrefs_obj = zap_create_link(mos, DMU_OT_USERREFS,
902 dsl_pool_user_hold_rele_impl(dsl_pool_t *dp, uint64_t dsobj,
905 objset_t *mos = dp->dp_meta_objset;
906 uint64_t zapobj = dp->dp_tmp_userrefs_obj;
910 ASSERT(spa_version(dp->dp_spa) >= SPA_VERSION_USERREFS);
919 dsl_pool_user_hold_create_obj(dp, tx);
920 zapobj = dp->dp_tmp_userrefs_obj;
940 dsl_pool_user_hold(dsl_pool_t *dp, uint64_t dsobj, const char *tag,
943 return (dsl_pool_user_hold_rele_impl(dp, dsobj, tag, now, tx, B_TRUE));
950 dsl_pool_user_release(dsl_pool_t *dp, uint64_t dsobj, const char *tag,
953 return (dsl_pool_user_hold_rele_impl(dp, dsobj, tag, NULL,
1009 dsl_pool_hold(const char *name, void *tag, dsl_pool_t **dp)
1016 *dp = spa_get_dsl(spa);
1017 dsl_pool_config_enter(*dp, tag);
1023 dsl_pool_rele(dsl_pool_t *dp, void *tag)
1025 dsl_pool_config_exit(dp, tag);
1026 spa_close(dp->dp_spa, tag);
1030 dsl_pool_config_enter(dsl_pool_t *dp, void *tag)
1044 ASSERT(!rrw_held(&dp->dp_config_rwlock, RW_READER));
1045 rrw_enter(&dp->dp_config_rwlock, RW_READER, tag);
1049 dsl_pool_config_enter_prio(dsl_pool_t *dp, void *tag)
1051 ASSERT(!rrw_held(&dp->dp_config_rwlock, RW_READER));
1052 rrw_enter_read_prio(&dp->dp_config_rwlock, tag);
1056 dsl_pool_config_exit(dsl_pool_t *dp, void *tag)
1058 rrw_exit(&dp->dp_config_rwlock, tag);
1062 dsl_pool_config_held(dsl_pool_t *dp)
1064 return (RRW_LOCK_HELD(&dp->dp_config_rwlock));
1068 dsl_pool_config_held_writer(dsl_pool_t *dp)
1070 return (RRW_WRITE_HELD(&dp->dp_config_rwlock));