Lines Matching full:dd
136 static uint64_t dsl_dir_space_towrite(dsl_dir_t *dd);
146 dsl_dir_t *dd = dbu; in dsl_dir_evict_async() local
148 dsl_pool_t *dp __maybe_unused = dd->dd_pool; in dsl_dir_evict_async()
150 dd->dd_dbuf = NULL; in dsl_dir_evict_async()
153 ASSERT(!txg_list_member(&dp->dp_dirty_dirs, dd, t)); in dsl_dir_evict_async()
154 ASSERT0(dd->dd_tempreserved[t]); in dsl_dir_evict_async()
155 ASSERT0(dd->dd_space_towrite[t]); in dsl_dir_evict_async()
158 if (dd->dd_parent) in dsl_dir_evict_async()
159 dsl_dir_async_rele(dd->dd_parent, dd); in dsl_dir_evict_async()
161 spa_async_close(dd->dd_pool->dp_spa, dd); in dsl_dir_evict_async()
163 if (dsl_deadlist_is_open(&dd->dd_livelist)) in dsl_dir_evict_async()
164 dsl_dir_livelist_close(dd); in dsl_dir_evict_async()
166 dsl_prop_fini(dd); in dsl_dir_evict_async()
167 cv_destroy(&dd->dd_activity_cv); in dsl_dir_evict_async()
168 mutex_destroy(&dd->dd_activity_lock); in dsl_dir_evict_async()
169 mutex_destroy(&dd->dd_lock); in dsl_dir_evict_async()
170 kmem_free(dd, sizeof (dsl_dir_t)); in dsl_dir_evict_async()
178 dsl_dir_t *dd; in dsl_dir_hold_obj() local
187 dd = dmu_buf_get_user(dbuf); in dsl_dir_hold_obj()
193 if (dd == NULL) { in dsl_dir_hold_obj()
196 dd = kmem_zalloc(sizeof (dsl_dir_t), KM_SLEEP); in dsl_dir_hold_obj()
197 dd->dd_object = ddobj; in dsl_dir_hold_obj()
198 dd->dd_dbuf = dbuf; in dsl_dir_hold_obj()
199 dd->dd_pool = dp; in dsl_dir_hold_obj()
201 mutex_init(&dd->dd_lock, NULL, MUTEX_DEFAULT, NULL); in dsl_dir_hold_obj()
202 mutex_init(&dd->dd_activity_lock, NULL, MUTEX_DEFAULT, NULL); in dsl_dir_hold_obj()
203 cv_init(&dd->dd_activity_cv, NULL, CV_DEFAULT, NULL); in dsl_dir_hold_obj()
204 dsl_prop_init(dd); in dsl_dir_hold_obj()
206 if (dsl_dir_is_zapified(dd)) { in dsl_dir_hold_obj()
209 sizeof (uint64_t), 1, &dd->dd_crypto_obj); in dsl_dir_hold_obj()
213 dd)) { in dsl_dir_hold_obj()
222 if (dsl_dir_phys(dd)->dd_parent_obj) { in dsl_dir_hold_obj()
224 dsl_dir_phys(dd)->dd_parent_obj, NULL, dd, in dsl_dir_hold_obj()
225 &dd->dd_parent); in dsl_dir_hold_obj()
233 dsl_dir_phys(dd->dd_parent)-> in dsl_dir_hold_obj()
238 (void) strlcpy(dd->dd_myname, tail, in dsl_dir_hold_obj()
239 sizeof (dd->dd_myname)); in dsl_dir_hold_obj()
242 dsl_dir_phys(dd->dd_parent)-> in dsl_dir_hold_obj()
244 ddobj, 0, dd->dd_myname, in dsl_dir_hold_obj()
245 sizeof (dd->dd_myname)); in dsl_dir_hold_obj()
250 (void) strlcpy(dd->dd_myname, spa_name(dp->dp_spa), in dsl_dir_hold_obj()
251 sizeof (dd->dd_myname)); in dsl_dir_hold_obj()
254 if (dsl_dir_is_clone(dd)) { in dsl_dir_hold_obj()
264 dsl_dir_phys(dd)->dd_origin_obj, FTAG, in dsl_dir_hold_obj()
269 dd->dd_origin_txg = in dsl_dir_hold_obj()
272 if (dsl_dir_is_zapified(dd)) { in dsl_dir_hold_obj()
275 dd->dd_object, DD_FIELD_LIVELIST, in dsl_dir_hold_obj()
278 err = dsl_dir_livelist_open(dd, obj); in dsl_dir_hold_obj()
286 if (dsl_dir_is_zapified(dd)) { in dsl_dir_hold_obj()
293 dd->dd_snap_cmtime = t; in dsl_dir_hold_obj()
296 dmu_buf_init_user(&dd->dd_dbu, NULL, dsl_dir_evict_async, in dsl_dir_hold_obj()
297 &dd->dd_dbuf); in dsl_dir_hold_obj()
298 winner = dmu_buf_set_user_ie(dbuf, &dd->dd_dbu); in dsl_dir_hold_obj()
300 if (dd->dd_parent) in dsl_dir_hold_obj()
301 dsl_dir_rele(dd->dd_parent, dd); in dsl_dir_hold_obj()
302 if (dsl_deadlist_is_open(&dd->dd_livelist)) in dsl_dir_hold_obj()
303 dsl_dir_livelist_close(dd); in dsl_dir_hold_obj()
304 dsl_prop_fini(dd); in dsl_dir_hold_obj()
305 cv_destroy(&dd->dd_activity_cv); in dsl_dir_hold_obj()
306 mutex_destroy(&dd->dd_activity_lock); in dsl_dir_hold_obj()
307 mutex_destroy(&dd->dd_lock); in dsl_dir_hold_obj()
308 kmem_free(dd, sizeof (dsl_dir_t)); in dsl_dir_hold_obj()
309 dd = winner; in dsl_dir_hold_obj()
311 spa_open_ref(dp->dp_spa, dd); in dsl_dir_hold_obj()
325 ASSERT3P(dd->dd_pool, ==, dp); in dsl_dir_hold_obj()
326 ASSERT3U(dd->dd_object, ==, ddobj); in dsl_dir_hold_obj()
327 ASSERT3P(dd->dd_dbuf, ==, dbuf); in dsl_dir_hold_obj()
328 *ddp = dd; in dsl_dir_hold_obj()
332 if (dd->dd_parent) in dsl_dir_hold_obj()
333 dsl_dir_rele(dd->dd_parent, dd); in dsl_dir_hold_obj()
334 if (dsl_deadlist_is_open(&dd->dd_livelist)) in dsl_dir_hold_obj()
335 dsl_dir_livelist_close(dd); in dsl_dir_hold_obj()
336 dsl_prop_fini(dd); in dsl_dir_hold_obj()
337 cv_destroy(&dd->dd_activity_cv); in dsl_dir_hold_obj()
338 mutex_destroy(&dd->dd_activity_lock); in dsl_dir_hold_obj()
339 mutex_destroy(&dd->dd_lock); in dsl_dir_hold_obj()
340 kmem_free(dd, sizeof (dsl_dir_t)); in dsl_dir_hold_obj()
346 dsl_dir_rele(dsl_dir_t *dd, const void *tag) in dsl_dir_rele() argument
348 dprintf_dd(dd, "%s\n", ""); in dsl_dir_rele()
349 spa_close(dd->dd_pool->dp_spa, tag); in dsl_dir_rele()
350 dmu_buf_rele(dd->dd_dbuf, tag); in dsl_dir_rele()
361 dsl_dir_async_rele(dsl_dir_t *dd, const void *tag) in dsl_dir_async_rele() argument
363 dprintf_dd(dd, "%s\n", ""); in dsl_dir_async_rele()
364 spa_async_close(dd->dd_pool->dp_spa, tag); in dsl_dir_async_rele()
365 dmu_buf_rele(dd->dd_dbuf, tag); in dsl_dir_async_rele()
370 dsl_dir_name(dsl_dir_t *dd, char *buf) in dsl_dir_name() argument
372 if (dd->dd_parent) { in dsl_dir_name()
373 dsl_dir_name(dd->dd_parent, buf); in dsl_dir_name()
379 if (!MUTEX_HELD(&dd->dd_lock)) { in dsl_dir_name()
384 mutex_enter(&dd->dd_lock); in dsl_dir_name()
385 VERIFY3U(strlcat(buf, dd->dd_myname, ZFS_MAX_DATASET_NAME_LEN), in dsl_dir_name()
387 mutex_exit(&dd->dd_lock); in dsl_dir_name()
389 VERIFY3U(strlcat(buf, dd->dd_myname, ZFS_MAX_DATASET_NAME_LEN), in dsl_dir_name()
396 dsl_dir_namelen(dsl_dir_t *dd) in dsl_dir_namelen() argument
400 if (dd->dd_parent) { in dsl_dir_namelen()
402 result = dsl_dir_namelen(dd->dd_parent) + 1; in dsl_dir_namelen()
405 if (!MUTEX_HELD(&dd->dd_lock)) { in dsl_dir_namelen()
407 mutex_enter(&dd->dd_lock); in dsl_dir_namelen()
408 result += strlen(dd->dd_myname); in dsl_dir_namelen()
409 mutex_exit(&dd->dd_lock); in dsl_dir_namelen()
411 result += strlen(dd->dd_myname); in dsl_dir_namelen()
479 dsl_dir_t *dd; in dsl_dir_hold() local
496 err = dsl_dir_hold_obj(dp, dp->dp_root_dir_obj, NULL, tag, &dd); in dsl_dir_hold()
510 buf, (longlong_t)dsl_dir_phys(dd)->dd_child_dir_zapobj); in dsl_dir_hold()
513 dsl_dir_phys(dd)->dd_child_dir_zapobj, in dsl_dir_hold()
524 dsl_dir_rele(dd, tag); in dsl_dir_hold()
525 dd = child_dd; in dsl_dir_hold()
530 dsl_dir_rele(dd, tag); in dsl_dir_hold()
541 dsl_dir_rele(dd, tag); in dsl_dir_hold()
548 *ddp = dd; in dsl_dir_hold()
570 dsl_dir_init_fs_ss_count(dsl_dir_t *dd, dmu_tx_t *tx) in dsl_dir_init_fs_ss_count() argument
574 dsl_pool_t *dp = dd->dd_pool; in dsl_dir_init_fs_ss_count()
584 dsl_dir_zapify(dd, tx); in dsl_dir_init_fs_ss_count()
590 if (zap_contains(os, dd->dd_object, DD_FIELD_FILESYSTEM_COUNT) == 0) in dsl_dir_init_fs_ss_count()
597 for (zap_cursor_init(zc, os, dsl_dir_phys(dd)->dd_child_dir_zapobj); in dsl_dir_init_fs_ss_count()
628 VERIFY0(dsl_dataset_hold_obj(dd->dd_pool, in dsl_dir_init_fs_ss_count()
629 dsl_dir_phys(dd)->dd_head_dataset_obj, FTAG, &ds)); in dsl_dir_init_fs_ss_count()
646 dmu_buf_will_dirty(dd->dd_dbuf, tx); in dsl_dir_init_fs_ss_count()
647 VERIFY0(zap_add(os, dd->dd_object, DD_FIELD_FILESYSTEM_COUNT, in dsl_dir_init_fs_ss_count()
649 VERIFY0(zap_add(os, dd->dd_object, DD_FIELD_SNAPSHOT_COUNT, in dsl_dir_init_fs_ss_count()
659 dsl_dir_t *dd; in dsl_dir_actv_fs_ss_limit_check() local
671 dd = ds->ds_dir; in dsl_dir_actv_fs_ss_limit_check()
673 dsl_dir_is_zapified(dd) && in dsl_dir_actv_fs_ss_limit_check()
674 zap_contains(dp->dp_meta_objset, dd->dd_object, in dsl_dir_actv_fs_ss_limit_check()
751 * In addition, we already have the dd and dealing with snapshots is simplified
762 dsl_enforce_ds_ss_limits(dsl_dir_t *dd, zfs_prop_t prop, in dsl_enforce_ds_ss_limits() argument
782 if ((obj = dsl_dir_phys(dd)->dd_head_dataset_obj) == 0) in dsl_enforce_ds_ss_limits()
785 ASSERT(dsl_pool_config_held(dd->dd_pool)); in dsl_enforce_ds_ss_limits()
787 if (dsl_dataset_hold_obj(dd->dd_pool, obj, FTAG, &ds) != 0) in dsl_enforce_ds_ss_limits()
812 dsl_fs_ss_limit_check(dsl_dir_t *dd, uint64_t delta, zfs_prop_t prop, in dsl_fs_ss_limit_check() argument
815 objset_t *os = dd->dd_pool->dp_meta_objset; in dsl_fs_ss_limit_check()
821 ASSERT(dsl_pool_config_held(dd->dd_pool)); in dsl_fs_ss_limit_check()
845 enforce = dsl_enforce_ds_ss_limits(dd, prop, cr); in dsl_fs_ss_limit_check()
861 if (ancestor == dd) in dsl_fs_ss_limit_check()
869 if (!dsl_dir_is_zapified(dd)) in dsl_fs_ss_limit_check()
871 err = zap_lookup(os, dd->dd_object, in dsl_fs_ss_limit_check()
878 err = dsl_prop_get_dd(dd, zfs_prop_to_name(prop), 8, 1, &limit, NULL, in dsl_fs_ss_limit_check()
887 if (dd->dd_parent != NULL) in dsl_fs_ss_limit_check()
888 err = dsl_fs_ss_limit_check(dd->dd_parent, delta, prop, in dsl_fs_ss_limit_check()
901 dsl_fs_ss_count_adjust(dsl_dir_t *dd, int64_t delta, const char *prop, in dsl_fs_ss_count_adjust() argument
905 objset_t *os = dd->dd_pool->dp_meta_objset; in dsl_fs_ss_count_adjust()
908 ASSERT(dsl_pool_config_held(dd->dd_pool)); in dsl_fs_ss_count_adjust()
916 if (dd->dd_myname[0] == '$' && strcmp(prop, in dsl_fs_ss_count_adjust()
934 if (!dsl_dir_is_zapified(dd) || (err = zap_lookup(os, dd->dd_object, in dsl_fs_ss_count_adjust()
943 VERIFY0(zap_update(os, dd->dd_object, prop, sizeof (count), 1, &count, in dsl_fs_ss_count_adjust()
947 if (dd->dd_parent != NULL) in dsl_fs_ss_count_adjust()
948 dsl_fs_ss_count_adjust(dd->dd_parent, delta, prop, tx); in dsl_fs_ss_count_adjust()
994 dsl_dir_is_clone(dsl_dir_t *dd) in dsl_dir_is_clone() argument
996 return (dsl_dir_phys(dd)->dd_origin_obj && in dsl_dir_is_clone()
997 (dd->dd_pool->dp_origin_snap == NULL || in dsl_dir_is_clone()
998 dsl_dir_phys(dd)->dd_origin_obj != in dsl_dir_is_clone()
999 dd->dd_pool->dp_origin_snap->ds_object)); in dsl_dir_is_clone()
1003 dsl_dir_get_used(dsl_dir_t *dd) in dsl_dir_get_used() argument
1005 return (dsl_dir_phys(dd)->dd_used_bytes); in dsl_dir_get_used()
1009 dsl_dir_get_compressed(dsl_dir_t *dd) in dsl_dir_get_compressed() argument
1011 return (dsl_dir_phys(dd)->dd_compressed_bytes); in dsl_dir_get_compressed()
1015 dsl_dir_get_quota(dsl_dir_t *dd) in dsl_dir_get_quota() argument
1017 return (dsl_dir_phys(dd)->dd_quota); in dsl_dir_get_quota()
1021 dsl_dir_get_reservation(dsl_dir_t *dd) in dsl_dir_get_reservation() argument
1023 return (dsl_dir_phys(dd)->dd_reserved); in dsl_dir_get_reservation()
1027 dsl_dir_get_compressratio(dsl_dir_t *dd) in dsl_dir_get_compressratio() argument
1030 return (dsl_dir_phys(dd)->dd_compressed_bytes == 0 ? 100 : in dsl_dir_get_compressratio()
1031 (dsl_dir_phys(dd)->dd_uncompressed_bytes * 100 / in dsl_dir_get_compressratio()
1032 dsl_dir_phys(dd)->dd_compressed_bytes)); in dsl_dir_get_compressratio()
1036 dsl_dir_get_logicalused(dsl_dir_t *dd) in dsl_dir_get_logicalused() argument
1038 return (dsl_dir_phys(dd)->dd_uncompressed_bytes); in dsl_dir_get_logicalused()
1042 dsl_dir_get_usedsnap(dsl_dir_t *dd) in dsl_dir_get_usedsnap() argument
1044 return (dsl_dir_phys(dd)->dd_used_breakdown[DD_USED_SNAP]); in dsl_dir_get_usedsnap()
1048 dsl_dir_get_usedds(dsl_dir_t *dd) in dsl_dir_get_usedds() argument
1050 return (dsl_dir_phys(dd)->dd_used_breakdown[DD_USED_HEAD]); in dsl_dir_get_usedds()
1054 dsl_dir_get_usedrefreserv(dsl_dir_t *dd) in dsl_dir_get_usedrefreserv() argument
1056 return (dsl_dir_phys(dd)->dd_used_breakdown[DD_USED_REFRSRV]); in dsl_dir_get_usedrefreserv()
1060 dsl_dir_get_usedchild(dsl_dir_t *dd) in dsl_dir_get_usedchild() argument
1062 return (dsl_dir_phys(dd)->dd_used_breakdown[DD_USED_CHILD] + in dsl_dir_get_usedchild()
1063 dsl_dir_phys(dd)->dd_used_breakdown[DD_USED_CHILD_RSRV]); in dsl_dir_get_usedchild()
1067 dsl_dir_get_origin(dsl_dir_t *dd, char *buf) in dsl_dir_get_origin() argument
1070 VERIFY0(dsl_dataset_hold_obj(dd->dd_pool, in dsl_dir_get_origin()
1071 dsl_dir_phys(dd)->dd_origin_obj, FTAG, &ds)); in dsl_dir_get_origin()
1079 dsl_dir_get_filesystem_count(dsl_dir_t *dd, uint64_t *count) in dsl_dir_get_filesystem_count() argument
1081 if (dsl_dir_is_zapified(dd)) { in dsl_dir_get_filesystem_count()
1082 objset_t *os = dd->dd_pool->dp_meta_objset; in dsl_dir_get_filesystem_count()
1083 return (zap_lookup(os, dd->dd_object, DD_FIELD_FILESYSTEM_COUNT, in dsl_dir_get_filesystem_count()
1091 dsl_dir_get_snapshot_count(dsl_dir_t *dd, uint64_t *count) in dsl_dir_get_snapshot_count() argument
1093 if (dsl_dir_is_zapified(dd)) { in dsl_dir_get_snapshot_count()
1094 objset_t *os = dd->dd_pool->dp_meta_objset; in dsl_dir_get_snapshot_count()
1095 return (zap_lookup(os, dd->dd_object, DD_FIELD_SNAPSHOT_COUNT, in dsl_dir_get_snapshot_count()
1103 dsl_dir_stats(dsl_dir_t *dd, nvlist_t *nv) in dsl_dir_stats() argument
1105 mutex_enter(&dd->dd_lock); in dsl_dir_stats()
1107 dsl_dir_get_quota(dd)); in dsl_dir_stats()
1109 dsl_dir_get_reservation(dd)); in dsl_dir_stats()
1111 dsl_dir_get_logicalused(dd)); in dsl_dir_stats()
1112 if (dsl_dir_phys(dd)->dd_flags & DD_FLAG_USED_BREAKDOWN) { in dsl_dir_stats()
1114 dsl_dir_get_usedsnap(dd)); in dsl_dir_stats()
1116 dsl_dir_get_usedds(dd)); in dsl_dir_stats()
1118 dsl_dir_get_usedrefreserv(dd)); in dsl_dir_stats()
1120 dsl_dir_get_usedchild(dd)); in dsl_dir_stats()
1122 mutex_exit(&dd->dd_lock); in dsl_dir_stats()
1125 if (dsl_dir_get_filesystem_count(dd, &count) == 0) { in dsl_dir_stats()
1129 if (dsl_dir_get_snapshot_count(dd, &count) == 0) { in dsl_dir_stats()
1134 if (dsl_dir_is_clone(dd)) { in dsl_dir_stats()
1136 dsl_dir_get_origin(dd, buf); in dsl_dir_stats()
1143 dsl_dir_dirty(dsl_dir_t *dd, dmu_tx_t *tx) in dsl_dir_dirty() argument
1145 dsl_pool_t *dp = dd->dd_pool; in dsl_dir_dirty()
1147 ASSERT(dsl_dir_phys(dd)); in dsl_dir_dirty()
1149 if (txg_list_add(&dp->dp_dirty_dirs, dd, tx->tx_txg)) { in dsl_dir_dirty()
1151 dmu_buf_add_ref(dd->dd_dbuf, dd); in dsl_dir_dirty()
1156 parent_delta(dsl_dir_t *dd, uint64_t used, int64_t delta) in parent_delta() argument
1158 uint64_t old_accounted = MAX(used, dsl_dir_phys(dd)->dd_reserved); in parent_delta()
1160 MAX(used + delta, dsl_dir_phys(dd)->dd_reserved); in parent_delta()
1165 dsl_dir_sync(dsl_dir_t *dd, dmu_tx_t *tx) in dsl_dir_sync() argument
1169 mutex_enter(&dd->dd_lock); in dsl_dir_sync()
1170 ASSERT0(dd->dd_tempreserved[tx->tx_txg & TXG_MASK]); in dsl_dir_sync()
1171 dprintf_dd(dd, "txg=%llu towrite=%lluK\n", (u_longlong_t)tx->tx_txg, in dsl_dir_sync()
1172 (u_longlong_t)dd->dd_space_towrite[tx->tx_txg & TXG_MASK] / 1024); in dsl_dir_sync()
1173 dd->dd_space_towrite[tx->tx_txg & TXG_MASK] = 0; in dsl_dir_sync()
1174 mutex_exit(&dd->dd_lock); in dsl_dir_sync()
1177 dmu_buf_rele(dd->dd_dbuf, dd); in dsl_dir_sync()
1181 dsl_dir_space_towrite(dsl_dir_t *dd) in dsl_dir_space_towrite() argument
1185 ASSERT(MUTEX_HELD(&dd->dd_lock)); in dsl_dir_space_towrite()
1188 space += dd->dd_space_towrite[i & TXG_MASK]; in dsl_dir_space_towrite()
1194 * How much space would dd have available if ancestor had delta applied
1199 dsl_dir_space_available(dsl_dir_t *dd, in dsl_dir_space_available() argument
1211 if (dd->dd_parent != NULL) { in dsl_dir_space_available()
1212 parentspace = dsl_dir_space_available(dd->dd_parent, in dsl_dir_space_available()
1216 mutex_enter(&dd->dd_lock); in dsl_dir_space_available()
1217 if (dsl_dir_phys(dd)->dd_quota != 0) in dsl_dir_space_available()
1218 quota = dsl_dir_phys(dd)->dd_quota; in dsl_dir_space_available()
1219 used = dsl_dir_phys(dd)->dd_used_bytes; in dsl_dir_space_available()
1221 used += dsl_dir_space_towrite(dd); in dsl_dir_space_available()
1223 if (dd->dd_parent == NULL) { in dsl_dir_space_available()
1224 uint64_t poolsize = dsl_pool_adjustedsize(dd->dd_pool, in dsl_dir_space_available()
1229 if (dsl_dir_phys(dd)->dd_reserved > used && parentspace != UINT64_MAX) { in dsl_dir_space_available()
1234 parentspace += dsl_dir_phys(dd)->dd_reserved - used; in dsl_dir_space_available()
1237 if (dd == ancestor) { in dsl_dir_space_available()
1256 mutex_exit(&dd->dd_lock); in dsl_dir_space_available()
1268 dsl_dir_tempreserve_impl(dsl_dir_t *dd, uint64_t asize, boolean_t netfree, in dsl_dir_tempreserve_impl() argument
1287 mutex_enter(&dd->dd_lock); in dsl_dir_tempreserve_impl()
1293 uint64_t est_inflight = dsl_dir_space_towrite(dd); in dsl_dir_tempreserve_impl()
1295 est_inflight += dd->dd_tempreserved[i]; in dsl_dir_tempreserve_impl()
1296 uint64_t used_on_disk = dsl_dir_phys(dd)->dd_used_bytes; in dsl_dir_tempreserve_impl()
1310 mutex_exit(&dd->dd_lock); in dsl_dir_tempreserve_impl()
1320 if (ignorequota || netfree || dsl_dir_phys(dd)->dd_quota == 0 || in dsl_dir_tempreserve_impl()
1325 quota = dsl_dir_phys(dd)->dd_quota; in dsl_dir_tempreserve_impl()
1337 if (dd->dd_parent == NULL) { in dsl_dir_tempreserve_impl()
1338 uint64_t avail = dsl_pool_unreserved_space(dd->dd_pool, in dsl_dir_tempreserve_impl()
1360 dsl_pool_deferred_space(dd->dd_pool)) { in dsl_dir_tempreserve_impl()
1364 mutex_exit(&dd->dd_lock); in dsl_dir_tempreserve_impl()
1368 dprintf_dd(dd, "failing: used=%lluK inflight = %lluK " in dsl_dir_tempreserve_impl()
1373 mutex_exit(&dd->dd_lock); in dsl_dir_tempreserve_impl()
1379 dd->dd_tempreserved[txg & TXG_MASK] += asize; in dsl_dir_tempreserve_impl()
1381 uint64_t parent_rsrv = parent_delta(dd, used_on_disk + est_inflight, in dsl_dir_tempreserve_impl()
1383 mutex_exit(&dd->dd_lock); in dsl_dir_tempreserve_impl()
1386 tr->tr_ds = dd; in dsl_dir_tempreserve_impl()
1391 if (dd->dd_parent != NULL && parent_rsrv != 0) { in dsl_dir_tempreserve_impl()
1398 dd = dd->dd_parent; in dsl_dir_tempreserve_impl()
1400 ignorequota = (dsl_dir_phys(dd)->dd_head_dataset_obj == 0); in dsl_dir_tempreserve_impl()
1415 dsl_dir_tempreserve_space(dsl_dir_t *dd, uint64_t lsize, uint64_t asize, in dsl_dir_tempreserve_space() argument
1431 err = arc_tempreserve_space(dd->dd_pool->dp_spa, lsize, tx->tx_txg); in dsl_dir_tempreserve_space()
1449 txg_delay(dd->dd_pool, tx->tx_txg, in dsl_dir_tempreserve_space()
1458 err = dsl_dir_tempreserve_impl(dd, asize, netfree, in dsl_dir_tempreserve_space()
1513 dsl_dir_willuse_space(dsl_dir_t *dd, int64_t space, dmu_tx_t *tx) in dsl_dir_willuse_space() argument
1519 mutex_enter(&dd->dd_lock); in dsl_dir_willuse_space()
1521 dd->dd_space_towrite[tx->tx_txg & TXG_MASK] += space; in dsl_dir_willuse_space()
1523 est_used = dsl_dir_space_towrite(dd) + in dsl_dir_willuse_space()
1524 dsl_dir_phys(dd)->dd_used_bytes; in dsl_dir_willuse_space()
1525 parent_space = parent_delta(dd, est_used, space); in dsl_dir_willuse_space()
1526 mutex_exit(&dd->dd_lock); in dsl_dir_willuse_space()
1529 dsl_dir_dirty(dd, tx); in dsl_dir_willuse_space()
1531 dd = dd->dd_parent; in dsl_dir_willuse_space()
1533 } while (space && dd); in dsl_dir_willuse_space()
1536 /* call from syncing context when we actually write/free space for this dd */
1538 dsl_dir_diduse_space(dsl_dir_t *dd, dd_used_t type, in dsl_dir_diduse_space() argument
1546 dmu_buf_will_dirty(dd->dd_dbuf, tx); in dsl_dir_diduse_space()
1555 boolean_t needlock = !MUTEX_HELD(&dd->dd_lock); in dsl_dir_diduse_space()
1557 mutex_enter(&dd->dd_lock); in dsl_dir_diduse_space()
1558 dsl_dir_phys_t *ddp = dsl_dir_phys(dd); in dsl_dir_diduse_space()
1559 accounted_delta = parent_delta(dd, ddp->dd_used_bytes, used); in dsl_dir_diduse_space()
1582 mutex_exit(&dd->dd_lock); in dsl_dir_diduse_space()
1584 if (dd->dd_parent != NULL) { in dsl_dir_diduse_space()
1585 dsl_dir_diduse_transfer_space(dd->dd_parent, in dsl_dir_diduse_space()
1592 dsl_dir_transfer_space(dsl_dir_t *dd, int64_t delta, in dsl_dir_transfer_space() argument
1599 dsl_dir_phys_t *ddp = dsl_dir_phys(dd); in dsl_dir_transfer_space()
1604 dmu_buf_will_dirty(dd->dd_dbuf, tx); in dsl_dir_transfer_space()
1605 mutex_enter(&dd->dd_lock); in dsl_dir_transfer_space()
1612 mutex_exit(&dd->dd_lock); in dsl_dir_transfer_space()
1616 dsl_dir_diduse_transfer_space(dsl_dir_t *dd, int64_t used, in dsl_dir_diduse_transfer_space() argument
1626 dmu_buf_will_dirty(dd->dd_dbuf, tx); in dsl_dir_diduse_transfer_space()
1628 mutex_enter(&dd->dd_lock); in dsl_dir_diduse_transfer_space()
1629 dsl_dir_phys_t *ddp = dsl_dir_phys(dd); in dsl_dir_diduse_transfer_space()
1630 accounted_delta = parent_delta(dd, ddp->dd_used_bytes, used); in dsl_dir_diduse_transfer_space()
1656 mutex_exit(&dd->dd_lock); in dsl_dir_diduse_transfer_space()
1658 if (dd->dd_parent != NULL) { in dsl_dir_diduse_transfer_space()
1659 dsl_dir_diduse_transfer_space(dd->dd_parent, in dsl_dir_diduse_transfer_space()
1764 dsl_dir_t *dd; in dsl_dir_set_reservation_check() local
1771 dd = ds->ds_dir; in dsl_dir_set_reservation_check()
1790 mutex_enter(&dd->dd_lock); in dsl_dir_set_reservation_check()
1791 used = dsl_dir_phys(dd)->dd_used_bytes; in dsl_dir_set_reservation_check()
1792 mutex_exit(&dd->dd_lock); in dsl_dir_set_reservation_check()
1794 if (dd->dd_parent) { in dsl_dir_set_reservation_check()
1795 avail = dsl_dir_space_available(dd->dd_parent, in dsl_dir_set_reservation_check()
1798 avail = dsl_pool_adjustedsize(dd->dd_pool, in dsl_dir_set_reservation_check()
1802 if (MAX(used, newval) > MAX(used, dsl_dir_phys(dd)->dd_reserved)) { in dsl_dir_set_reservation_check()
1804 MAX(used, dsl_dir_phys(dd)->dd_reserved); in dsl_dir_set_reservation_check()
1807 (dsl_dir_phys(dd)->dd_quota > 0 && in dsl_dir_set_reservation_check()
1808 newval > dsl_dir_phys(dd)->dd_quota)) in dsl_dir_set_reservation_check()
1817 dsl_dir_set_reservation_sync_impl(dsl_dir_t *dd, uint64_t value, dmu_tx_t *tx) in dsl_dir_set_reservation_sync_impl() argument
1822 dmu_buf_will_dirty(dd->dd_dbuf, tx); in dsl_dir_set_reservation_sync_impl()
1824 mutex_enter(&dd->dd_lock); in dsl_dir_set_reservation_sync_impl()
1825 used = dsl_dir_phys(dd)->dd_used_bytes; in dsl_dir_set_reservation_sync_impl()
1826 delta = MAX(used, value) - MAX(used, dsl_dir_phys(dd)->dd_reserved); in dsl_dir_set_reservation_sync_impl()
1827 dsl_dir_phys(dd)->dd_reserved = value; in dsl_dir_set_reservation_sync_impl()
1829 if (dd->dd_parent != NULL) { in dsl_dir_set_reservation_sync_impl()
1831 dsl_dir_diduse_space(dd->dd_parent, DD_USED_CHILD_RSRV, in dsl_dir_set_reservation_sync_impl()
1834 mutex_exit(&dd->dd_lock); in dsl_dir_set_reservation_sync_impl()
1885 dsl_dir_t *dd; in closest_common_ancestor() local
1886 for (dd = ds2; dd; dd = dd->dd_parent) { in closest_common_ancestor()
1887 if (ds1 == dd) in closest_common_ancestor()
1888 return (dd); in closest_common_ancestor()
1895 * If delta is applied to dd, how much of that delta would be applied to
1899 would_change(dsl_dir_t *dd, int64_t delta, dsl_dir_t *ancestor) in would_change() argument
1901 if (dd == ancestor) in would_change()
1904 mutex_enter(&dd->dd_lock); in would_change()
1905 delta = parent_delta(dd, dsl_dir_phys(dd)->dd_used_bytes, delta); in would_change()
1906 mutex_exit(&dd->dd_lock); in would_change()
1907 return (would_change(dd->dd_parent, delta, ancestor)); in would_change()
1947 dsl_dir_t *dd, *newparent; in dsl_dir_rename_check() local
1955 error = dsl_dir_hold(dp, ddra->ddra_oldname, FTAG, &dd, NULL); in dsl_dir_rename_check()
1963 dsl_dir_rele(dd, FTAG); in dsl_dir_rename_check()
1968 if (dd->dd_pool != newparent->dd_pool) { in dsl_dir_rename_check()
1970 dsl_dir_rele(dd, FTAG); in dsl_dir_rename_check()
1977 dsl_dir_rele(dd, FTAG); in dsl_dir_rename_check()
1986 dsl_dir_rele(dd, FTAG); in dsl_dir_rename_check()
1993 dsl_dir_rele(dd, FTAG); in dsl_dir_rename_check()
1999 dsl_dir_rele(dd, FTAG); in dsl_dir_rename_check()
2015 error = dmu_objset_find_dp(dp, dd->dd_object, dsl_valid_rename, in dsl_dir_rename_check()
2019 dsl_dir_rele(dd, FTAG); in dsl_dir_rename_check()
2035 dsl_dir_init_fs_ss_count(dd, tx); in dsl_dir_rename_check()
2039 if (newparent != dd->dd_parent) { in dsl_dir_rename_check()
2042 MAX(dsl_dir_phys(dd)->dd_used_bytes, in dsl_dir_rename_check()
2043 dsl_dir_phys(dd)->dd_reserved); in dsl_dir_rename_check()
2044 objset_t *os = dd->dd_pool->dp_meta_objset; in dsl_dir_rename_check()
2048 if (dsl_dir_is_zapified(dd)) { in dsl_dir_rename_check()
2051 err = zap_lookup(os, dd->dd_object, in dsl_dir_rename_check()
2056 dsl_dir_rele(dd, FTAG); in dsl_dir_rename_check()
2066 err = zap_lookup(os, dd->dd_object, in dsl_dir_rename_check()
2071 dsl_dir_rele(dd, FTAG); in dsl_dir_rename_check()
2077 error = dsl_dir_rename_crypt_check(dd, newparent); in dsl_dir_rename_check()
2080 dsl_dir_rele(dd, FTAG); in dsl_dir_rename_check()
2085 if (closest_common_ancestor(dd, newparent) == dd) { in dsl_dir_rename_check()
2087 dsl_dir_rele(dd, FTAG); in dsl_dir_rename_check()
2091 error = dsl_dir_transfer_possible(dd->dd_parent, in dsl_dir_rename_check()
2095 dsl_dir_rele(dd, FTAG); in dsl_dir_rename_check()
2101 dsl_dir_rele(dd, FTAG); in dsl_dir_rename_check()
2110 dsl_dir_t *dd, *newparent; in dsl_dir_rename_sync() local
2114 VERIFY0(dsl_dir_hold(dp, ddra->ddra_oldname, FTAG, &dd, NULL)); in dsl_dir_rename_sync()
2121 spa_history_log_internal_dd(dd, "rename", tx, in dsl_dir_rename_sync()
2124 if (newparent != dd->dd_parent) { in dsl_dir_rename_sync()
2125 objset_t *os = dd->dd_pool->dp_meta_objset; in dsl_dir_rename_sync()
2130 * We already made sure the dd counts were initialized in the in dsl_dir_rename_sync()
2135 VERIFY0(zap_lookup(os, dd->dd_object, in dsl_dir_rename_sync()
2141 VERIFY0(zap_lookup(os, dd->dd_object, in dsl_dir_rename_sync()
2146 dsl_fs_ss_count_adjust(dd->dd_parent, -fs_cnt, in dsl_dir_rename_sync()
2151 dsl_fs_ss_count_adjust(dd->dd_parent, -ss_cnt, in dsl_dir_rename_sync()
2156 dsl_dir_diduse_space(dd->dd_parent, DD_USED_CHILD, in dsl_dir_rename_sync()
2157 -dsl_dir_phys(dd)->dd_used_bytes, in dsl_dir_rename_sync()
2158 -dsl_dir_phys(dd)->dd_compressed_bytes, in dsl_dir_rename_sync()
2159 -dsl_dir_phys(dd)->dd_uncompressed_bytes, tx); in dsl_dir_rename_sync()
2161 dsl_dir_phys(dd)->dd_used_bytes, in dsl_dir_rename_sync()
2162 dsl_dir_phys(dd)->dd_compressed_bytes, in dsl_dir_rename_sync()
2163 dsl_dir_phys(dd)->dd_uncompressed_bytes, tx); in dsl_dir_rename_sync()
2165 if (dsl_dir_phys(dd)->dd_reserved > in dsl_dir_rename_sync()
2166 dsl_dir_phys(dd)->dd_used_bytes) { in dsl_dir_rename_sync()
2167 uint64_t unused_rsrv = dsl_dir_phys(dd)->dd_reserved - in dsl_dir_rename_sync()
2168 dsl_dir_phys(dd)->dd_used_bytes; in dsl_dir_rename_sync()
2170 dsl_dir_diduse_space(dd->dd_parent, DD_USED_CHILD_RSRV, in dsl_dir_rename_sync()
2177 dmu_buf_will_dirty(dd->dd_dbuf, tx); in dsl_dir_rename_sync()
2181 dsl_dir_phys(dd->dd_parent)->dd_child_dir_zapobj, in dsl_dir_rename_sync()
2182 dd->dd_myname, tx)); in dsl_dir_rename_sync()
2184 (void) strlcpy(dd->dd_myname, mynewname, in dsl_dir_rename_sync()
2185 sizeof (dd->dd_myname)); in dsl_dir_rename_sync()
2186 dsl_dir_rele(dd->dd_parent, dd); in dsl_dir_rename_sync()
2187 dsl_dir_phys(dd)->dd_parent_obj = newparent->dd_object; in dsl_dir_rename_sync()
2189 newparent->dd_object, NULL, dd, &dd->dd_parent)); in dsl_dir_rename_sync()
2193 dd->dd_myname, 8, 1, &dd->dd_object, tx)); in dsl_dir_rename_sync()
2200 dsl_prop_notify_all(dd); in dsl_dir_rename_sync()
2203 dsl_dir_rele(dd, FTAG); in dsl_dir_rename_sync()
2255 dsl_dir_snap_cmtime(dsl_dir_t *dd) in dsl_dir_snap_cmtime() argument
2259 mutex_enter(&dd->dd_lock); in dsl_dir_snap_cmtime()
2260 t = dd->dd_snap_cmtime; in dsl_dir_snap_cmtime()
2261 mutex_exit(&dd->dd_lock); in dsl_dir_snap_cmtime()
2267 dsl_dir_snap_cmtime_update(dsl_dir_t *dd, dmu_tx_t *tx) in dsl_dir_snap_cmtime_update() argument
2273 mutex_enter(&dd->dd_lock); in dsl_dir_snap_cmtime_update()
2274 dd->dd_snap_cmtime = t; in dsl_dir_snap_cmtime_update()
2277 objset_t *mos = dd->dd_pool->dp_meta_objset; in dsl_dir_snap_cmtime_update()
2278 uint64_t ddobj = dd->dd_object; in dsl_dir_snap_cmtime_update()
2279 dsl_dir_zapify(dd, tx); in dsl_dir_snap_cmtime_update()
2286 mutex_exit(&dd->dd_lock); in dsl_dir_snap_cmtime_update()
2290 dsl_dir_zapify(dsl_dir_t *dd, dmu_tx_t *tx) in dsl_dir_zapify() argument
2292 objset_t *mos = dd->dd_pool->dp_meta_objset; in dsl_dir_zapify()
2293 dmu_object_zapify(mos, dd->dd_object, DMU_OT_DSL_DIR, tx); in dsl_dir_zapify()
2297 dsl_dir_is_zapified(dsl_dir_t *dd) in dsl_dir_is_zapified() argument
2301 dmu_object_info_from_db(dd->dd_dbuf, &doi); in dsl_dir_is_zapified()
2306 dsl_dir_livelist_open(dsl_dir_t *dd, uint64_t obj) in dsl_dir_livelist_open() argument
2308 objset_t *mos = dd->dd_pool->dp_meta_objset; in dsl_dir_livelist_open()
2309 ASSERT(spa_feature_is_active(dd->dd_pool->dp_spa, in dsl_dir_livelist_open()
2311 int err = dsl_deadlist_open(&dd->dd_livelist, mos, obj); in dsl_dir_livelist_open()
2314 bplist_create(&dd->dd_pending_allocs); in dsl_dir_livelist_open()
2315 bplist_create(&dd->dd_pending_frees); in dsl_dir_livelist_open()
2320 dsl_dir_livelist_close(dsl_dir_t *dd) in dsl_dir_livelist_close() argument
2322 dsl_deadlist_close(&dd->dd_livelist); in dsl_dir_livelist_close()
2323 bplist_destroy(&dd->dd_pending_allocs); in dsl_dir_livelist_close()
2324 bplist_destroy(&dd->dd_pending_frees); in dsl_dir_livelist_close()
2328 dsl_dir_remove_livelist(dsl_dir_t *dd, dmu_tx_t *tx, boolean_t total) in dsl_dir_remove_livelist() argument
2335 if (!dsl_deadlist_is_open(&dd->dd_livelist)) in dsl_dir_remove_livelist()
2345 (to_condense.ds != NULL) && (to_condense.ds->ds_dir == dd)) { in dsl_dir_remove_livelist()
2377 dsl_dir_livelist_close(dd); in dsl_dir_remove_livelist()
2378 VERIFY0(zap_lookup(dp->dp_meta_objset, dd->dd_object, in dsl_dir_remove_livelist()
2380 VERIFY0(zap_remove(dp->dp_meta_objset, dd->dd_object, in dsl_dir_remove_livelist()
2389 dsl_dir_activity_in_progress(dsl_dir_t *dd, dsl_dataset_t *ds, in dsl_dir_activity_in_progress() argument
2394 ASSERT(MUTEX_HELD(&dd->dd_activity_lock)); in dsl_dir_activity_in_progress()
2420 if (readonly || !spa_writeable(dd->dd_pool->dp_spa)) { in dsl_dir_activity_in_progress()
2455 dsl_dir_wait(dsl_dir_t *dd, dsl_dataset_t *ds, zfs_wait_activity_t activity, in dsl_dir_wait() argument
2460 dsl_pool_t *dp = dd->dd_pool; in dsl_dir_wait()
2463 error = dsl_dir_activity_in_progress(dd, ds, activity, in dsl_dir_wait()
2471 if (cv_wait_sig(&dd->dd_activity_cv, &dd->dd_activity_lock) == in dsl_dir_wait()
2472 0 || dd->dd_activity_cancelled) { in dsl_dir_wait()
2481 dsl_dir_cancel_waiters(dsl_dir_t *dd) in dsl_dir_cancel_waiters() argument
2483 mutex_enter(&dd->dd_activity_lock); in dsl_dir_cancel_waiters()
2484 dd->dd_activity_cancelled = B_TRUE; in dsl_dir_cancel_waiters()
2485 cv_broadcast(&dd->dd_activity_cv); in dsl_dir_cancel_waiters()
2486 while (dd->dd_activity_waiters > 0) in dsl_dir_cancel_waiters()
2487 cv_wait(&dd->dd_activity_cv, &dd->dd_activity_lock); in dsl_dir_cancel_waiters()
2488 mutex_exit(&dd->dd_activity_lock); in dsl_dir_cancel_waiters()