Lines Matching refs:dd
126 extern inline dsl_dir_phys_t *dsl_dir_phys(dsl_dir_t *dd);
128 static uint64_t dsl_dir_space_towrite(dsl_dir_t *dd);
133 dsl_dir_t *dd = dbu;
134 dsl_pool_t *dp = dd->dd_pool;
137 dd->dd_dbuf = NULL;
140 ASSERT(!txg_list_member(&dp->dp_dirty_dirs, dd, t));
141 ASSERT(dd->dd_tempreserved[t] == 0);
142 ASSERT(dd->dd_space_towrite[t] == 0);
145 if (dd->dd_parent)
146 dsl_dir_async_rele(dd->dd_parent, dd);
148 spa_async_close(dd->dd_pool->dp_spa, dd);
150 dsl_prop_fini(dd);
151 mutex_destroy(&dd->dd_lock);
152 kmem_free(dd, sizeof (dsl_dir_t));
160 dsl_dir_t *dd;
168 dd = dmu_buf_get_user(dbuf);
177 if (dd == NULL) {
180 dd = kmem_zalloc(sizeof (dsl_dir_t), KM_SLEEP);
181 dd->dd_object = ddobj;
182 dd->dd_dbuf = dbuf;
183 dd->dd_pool = dp;
184 mutex_init(&dd->dd_lock, NULL, MUTEX_DEFAULT, NULL);
185 dsl_prop_init(dd);
187 dsl_dir_snap_cmtime_update(dd);
189 if (dsl_dir_phys(dd)->dd_parent_obj) {
191 dsl_dir_phys(dd)->dd_parent_obj, NULL, dd,
192 &dd->dd_parent);
200 dsl_dir_phys(dd->dd_parent)->
205 (void) strcpy(dd->dd_myname, tail);
208 dsl_dir_phys(dd->dd_parent)->
210 ddobj, 0, dd->dd_myname);
215 (void) strcpy(dd->dd_myname, spa_name(dp->dp_spa));
218 if (dsl_dir_is_clone(dd)) {
228 dsl_dir_phys(dd)->dd_origin_obj, FTAG,
233 dd->dd_origin_txg =
238 dmu_buf_init_user(&dd->dd_dbu, NULL, dsl_dir_evict_async,
239 &dd->dd_dbuf);
240 winner = dmu_buf_set_user_ie(dbuf, &dd->dd_dbu);
242 if (dd->dd_parent)
243 dsl_dir_rele(dd->dd_parent, dd);
244 dsl_prop_fini(dd);
245 mutex_destroy(&dd->dd_lock);
246 kmem_free(dd, sizeof (dsl_dir_t));
247 dd = winner;
249 spa_open_ref(dp->dp_spa, dd);
263 ASSERT3P(dd->dd_pool, ==, dp);
264 ASSERT3U(dd->dd_object, ==, ddobj);
265 ASSERT3P(dd->dd_dbuf, ==, dbuf);
266 *ddp = dd;
270 if (dd->dd_parent)
271 dsl_dir_rele(dd->dd_parent, dd);
272 dsl_prop_fini(dd);
273 mutex_destroy(&dd->dd_lock);
274 kmem_free(dd, sizeof (dsl_dir_t));
280 dsl_dir_rele(dsl_dir_t *dd, void *tag)
282 dprintf_dd(dd, "%s\n", "");
283 spa_close(dd->dd_pool->dp_spa, tag);
284 dmu_buf_rele(dd->dd_dbuf, tag);
295 dsl_dir_async_rele(dsl_dir_t *dd, void *tag)
297 dprintf_dd(dd, "%s\n", "");
298 spa_async_close(dd->dd_pool->dp_spa, tag);
299 dmu_buf_rele(dd->dd_dbuf, tag);
304 dsl_dir_name(dsl_dir_t *dd, char *buf)
306 if (dd->dd_parent) {
307 dsl_dir_name(dd->dd_parent, buf);
313 if (!MUTEX_HELD(&dd->dd_lock)) {
318 mutex_enter(&dd->dd_lock);
319 VERIFY3U(strlcat(buf, dd->dd_myname, ZFS_MAX_DATASET_NAME_LEN),
321 mutex_exit(&dd->dd_lock);
323 VERIFY3U(strlcat(buf, dd->dd_myname, ZFS_MAX_DATASET_NAME_LEN),
330 dsl_dir_namelen(dsl_dir_t *dd)
334 if (dd->dd_parent) {
336 result = dsl_dir_namelen(dd->dd_parent) + 1;
339 if (!MUTEX_HELD(&dd->dd_lock)) {
341 mutex_enter(&dd->dd_lock);
342 result += strlen(dd->dd_myname);
343 mutex_exit(&dd->dd_lock);
345 result += strlen(dd->dd_myname);
415 dsl_dir_t *dd;
429 err = dsl_dir_hold_obj(dp, dp->dp_root_dir_obj, NULL, tag, &dd);
443 buf, dsl_dir_phys(dd)->dd_child_dir_zapobj);
446 dsl_dir_phys(dd)->dd_child_dir_zapobj,
457 dsl_dir_rele(dd, tag);
458 dd = child_dd;
463 dsl_dir_rele(dd, tag);
474 dsl_dir_rele(dd, tag);
480 *ddp = dd;
500 dsl_dir_init_fs_ss_count(dsl_dir_t *dd, dmu_tx_t *tx)
504 dsl_pool_t *dp = dd->dd_pool;
514 dsl_dir_zapify(dd, tx);
520 if (zap_contains(os, dd->dd_object, DD_FIELD_FILESYSTEM_COUNT) == 0)
527 for (zap_cursor_init(zc, os, dsl_dir_phys(dd)->dd_child_dir_zapobj);
560 VERIFY0(dsl_dataset_hold_obj(dd->dd_pool,
561 dsl_dir_phys(dd)->dd_head_dataset_obj, FTAG, &ds));
578 dmu_buf_will_dirty(dd->dd_dbuf, tx);
579 VERIFY0(zap_add(os, dd->dd_object, DD_FIELD_FILESYSTEM_COUNT,
581 VERIFY0(zap_add(os, dd->dd_object, DD_FIELD_SNAPSHOT_COUNT,
591 dsl_dir_t *dd;
603 dd = ds->ds_dir;
605 dsl_dir_is_zapified(dd) &&
606 zap_contains(dp->dp_meta_objset, dd->dd_object,
683 * In addition, we already have the dd and dealing with snapshots is simplified
694 dsl_enforce_ds_ss_limits(dsl_dir_t *dd, zfs_prop_t prop, cred_t *cr)
712 if ((obj = dsl_dir_phys(dd)->dd_head_dataset_obj) == 0)
715 ASSERT(dsl_pool_config_held(dd->dd_pool));
717 if (dsl_dataset_hold_obj(dd->dd_pool, obj, FTAG, &ds) != 0)
741 dsl_fs_ss_limit_check(dsl_dir_t *dd, uint64_t delta, zfs_prop_t prop,
744 objset_t *os = dd->dd_pool->dp_meta_objset;
750 ASSERT(dsl_pool_config_held(dd->dd_pool));
762 enforce = dsl_enforce_ds_ss_limits(dd, prop, cr);
791 if (ancestor == dd)
799 if (!dsl_dir_is_zapified(dd) || zap_lookup(os, dd->dd_object,
803 err = dsl_prop_get_dd(dd, zfs_prop_to_name(prop), 8, 1, &limit, NULL,
812 if (dd->dd_parent != NULL)
813 err = dsl_fs_ss_limit_check(dd->dd_parent, delta, prop,
826 dsl_fs_ss_count_adjust(dsl_dir_t *dd, int64_t delta, const char *prop,
830 objset_t *os = dd->dd_pool->dp_meta_objset;
833 ASSERT(dsl_pool_config_held(dd->dd_pool));
844 if ((dd->dd_myname[0] == '%' || dd->dd_myname[0] == '$') &&
861 if (!dsl_dir_is_zapified(dd) || (err = zap_lookup(os, dd->dd_object,
870 VERIFY0(zap_update(os, dd->dd_object, prop, sizeof (count), 1, &count,
874 if (dd->dd_parent != NULL)
875 dsl_fs_ss_count_adjust(dd->dd_parent, delta, prop, tx);
920 dsl_dir_is_clone(dsl_dir_t *dd)
922 return (dsl_dir_phys(dd)->dd_origin_obj &&
923 (dd->dd_pool->dp_origin_snap == NULL ||
924 dsl_dir_phys(dd)->dd_origin_obj !=
925 dd->dd_pool->dp_origin_snap->ds_object));
929 dsl_dir_stats(dsl_dir_t *dd, nvlist_t *nv)
931 mutex_enter(&dd->dd_lock);
933 dsl_dir_phys(dd)->dd_used_bytes);
935 dsl_dir_phys(dd)->dd_quota);
937 dsl_dir_phys(dd)->dd_reserved);
939 dsl_dir_phys(dd)->dd_compressed_bytes == 0 ? 100 :
940 (dsl_dir_phys(dd)->dd_uncompressed_bytes * 100 /
941 dsl_dir_phys(dd)->dd_compressed_bytes));
943 dsl_dir_phys(dd)->dd_uncompressed_bytes);
944 if (dsl_dir_phys(dd)->dd_flags & DD_FLAG_USED_BREAKDOWN) {
946 dsl_dir_phys(dd)->dd_used_breakdown[DD_USED_SNAP]);
948 dsl_dir_phys(dd)->dd_used_breakdown[DD_USED_HEAD]);
950 dsl_dir_phys(dd)->dd_used_breakdown[DD_USED_REFRSRV]);
952 dsl_dir_phys(dd)->dd_used_breakdown[DD_USED_CHILD] +
953 dsl_dir_phys(dd)->dd_used_breakdown[DD_USED_CHILD_RSRV]);
955 mutex_exit(&dd->dd_lock);
957 if (dsl_dir_is_zapified(dd)) {
959 objset_t *os = dd->dd_pool->dp_meta_objset;
961 if (zap_lookup(os, dd->dd_object, DD_FIELD_FILESYSTEM_COUNT,
966 if (zap_lookup(os, dd->dd_object, DD_FIELD_SNAPSHOT_COUNT,
973 if (dsl_dir_is_clone(dd)) {
977 VERIFY0(dsl_dataset_hold_obj(dd->dd_pool,
978 dsl_dir_phys(dd)->dd_origin_obj, FTAG, &ds));
986 dsl_dir_dirty(dsl_dir_t *dd, dmu_tx_t *tx)
988 dsl_pool_t *dp = dd->dd_pool;
990 ASSERT(dsl_dir_phys(dd));
992 if (txg_list_add(&dp->dp_dirty_dirs, dd, tx->tx_txg)) {
994 dmu_buf_add_ref(dd->dd_dbuf, dd);
999 parent_delta(dsl_dir_t *dd, uint64_t used, int64_t delta)
1001 uint64_t old_accounted = MAX(used, dsl_dir_phys(dd)->dd_reserved);
1003 MAX(used + delta, dsl_dir_phys(dd)->dd_reserved);
1008 dsl_dir_sync(dsl_dir_t *dd, dmu_tx_t *tx)
1012 mutex_enter(&dd->dd_lock);
1013 ASSERT0(dd->dd_tempreserved[tx->tx_txg&TXG_MASK]);
1014 dprintf_dd(dd, "txg=%llu towrite=%lluK\n", tx->tx_txg,
1015 dd->dd_space_towrite[tx->tx_txg&TXG_MASK] / 1024);
1016 dd->dd_space_towrite[tx->tx_txg&TXG_MASK] = 0;
1017 mutex_exit(&dd->dd_lock);
1020 dmu_buf_rele(dd->dd_dbuf, dd);
1024 dsl_dir_space_towrite(dsl_dir_t *dd)
1029 ASSERT(MUTEX_HELD(&dd->dd_lock));
1032 space += dd->dd_space_towrite[i&TXG_MASK];
1033 ASSERT3U(dd->dd_space_towrite[i&TXG_MASK], >=, 0);
1039 * How much space would dd have available if ancestor had delta applied
1044 dsl_dir_space_available(dsl_dir_t *dd,
1056 if (dd->dd_parent != NULL) {
1057 parentspace = dsl_dir_space_available(dd->dd_parent,
1061 mutex_enter(&dd->dd_lock);
1062 if (dsl_dir_phys(dd)->dd_quota != 0)
1063 quota = dsl_dir_phys(dd)->dd_quota;
1064 used = dsl_dir_phys(dd)->dd_used_bytes;
1066 used += dsl_dir_space_towrite(dd);
1068 if (dd->dd_parent == NULL) {
1069 uint64_t poolsize = dsl_pool_adjustedsize(dd->dd_pool, FALSE);
1073 if (dsl_dir_phys(dd)->dd_reserved > used && parentspace != UINT64_MAX) {
1078 parentspace += dsl_dir_phys(dd)->dd_reserved - used;
1081 if (dd == ancestor) {
1100 mutex_exit(&dd->dd_lock);
1112 dsl_dir_tempreserve_impl(dsl_dir_t *dd, uint64_t asize, boolean_t netfree,
1128 mutex_enter(&dd->dd_lock);
1134 est_inflight = dsl_dir_space_towrite(dd);
1136 est_inflight += dd->dd_tempreserved[i];
1137 used_on_disk = dsl_dir_phys(dd)->dd_used_bytes;
1151 mutex_exit(&dd->dd_lock);
1160 if (ignorequota || netfree || dsl_dir_phys(dd)->dd_quota == 0)
1163 quota = dsl_dir_phys(dd)->dd_quota;
1175 if (dd->dd_parent == NULL) {
1176 spa_t *spa = dd->dd_pool->dp_spa;
1177 uint64_t poolsize = dsl_pool_adjustedsize(dd->dd_pool, netfree);
1195 dprintf_dd(dd, "failing: used=%lluK inflight = %lluK "
1199 mutex_exit(&dd->dd_lock);
1204 dd->dd_tempreserved[txgidx] += asize;
1206 parent_rsrv = parent_delta(dd, used_on_disk + est_inflight,
1208 mutex_exit(&dd->dd_lock);
1211 tr->tr_ds = dd;
1216 if (dd->dd_parent && parent_rsrv) {
1217 boolean_t ismos = (dsl_dir_phys(dd)->dd_head_dataset_obj == 0);
1219 return (dsl_dir_tempreserve_impl(dd->dd_parent,
1233 dsl_dir_tempreserve_space(dsl_dir_t *dd, uint64_t lsize, uint64_t asize,
1268 txg_delay(dd->dd_pool, tx->tx_txg,
1275 err = dsl_dir_tempreserve_impl(dd, asize, fsize >= asize,
1327 dsl_dir_willuse_space(dsl_dir_t *dd, int64_t space, dmu_tx_t *tx)
1332 mutex_enter(&dd->dd_lock);
1334 dd->dd_space_towrite[tx->tx_txg & TXG_MASK] += space;
1336 est_used = dsl_dir_space_towrite(dd) + dsl_dir_phys(dd)->dd_used_bytes;
1337 parent_space = parent_delta(dd, est_used, space);
1338 mutex_exit(&dd->dd_lock);
1341 dsl_dir_dirty(dd, tx);
1344 if (parent_space && dd->dd_parent)
1345 dsl_dir_willuse_space(dd->dd_parent, parent_space, tx);
1348 /* call from syncing context when we actually write/free space for this dd */
1350 dsl_dir_diduse_space(dsl_dir_t *dd, dd_used_t type,
1362 boolean_t needlock = !MUTEX_HELD(&dd->dd_lock);
1367 dmu_buf_will_dirty(dd->dd_dbuf, tx);
1370 mutex_enter(&dd->dd_lock);
1372 parent_delta(dd, dsl_dir_phys(dd)->dd_used_bytes, used);
1373 ASSERT(used >= 0 || dsl_dir_phys(dd)->dd_used_bytes >= -used);
1375 dsl_dir_phys(dd)->dd_compressed_bytes >= -compressed);
1377 dsl_dir_phys(dd)->dd_uncompressed_bytes >= -uncompressed);
1378 dsl_dir_phys(dd)->dd_used_bytes += used;
1379 dsl_dir_phys(dd)->dd_uncompressed_bytes += uncompressed;
1380 dsl_dir_phys(dd)->dd_compressed_bytes += compressed;
1382 if (dsl_dir_phys(dd)->dd_flags & DD_FLAG_USED_BREAKDOWN) {
1384 dsl_dir_phys(dd)->dd_used_breakdown[type] >= -used);
1385 dsl_dir_phys(dd)->dd_used_breakdown[type] += used;
1390 u += dsl_dir_phys(dd)->dd_used_breakdown[t];
1391 ASSERT3U(u, ==, dsl_dir_phys(dd)->dd_used_bytes);
1395 mutex_exit(&dd->dd_lock);
1397 if (dd->dd_parent != NULL) {
1398 dsl_dir_diduse_space(dd->dd_parent, DD_USED_CHILD,
1400 dsl_dir_transfer_space(dd->dd_parent,
1407 dsl_dir_transfer_space(dsl_dir_t *dd, int64_t delta,
1415 !(dsl_dir_phys(dd)->dd_flags & DD_FLAG_USED_BREAKDOWN))
1418 dmu_buf_will_dirty(dd->dd_dbuf, tx);
1419 mutex_enter(&dd->dd_lock);
1421 dsl_dir_phys(dd)->dd_used_breakdown[oldtype] >= delta :
1422 dsl_dir_phys(dd)->dd_used_breakdown[newtype] >= -delta);
1423 ASSERT(dsl_dir_phys(dd)->dd_used_bytes >= ABS(delta));
1424 dsl_dir_phys(dd)->dd_used_breakdown[oldtype] -= delta;
1425 dsl_dir_phys(dd)->dd_used_breakdown[newtype] += delta;
1426 mutex_exit(&dd->dd_lock);
1527 dsl_dir_t *dd;
1534 dd = ds->ds_dir;
1553 mutex_enter(&dd->dd_lock);
1554 used = dsl_dir_phys(dd)->dd_used_bytes;
1555 mutex_exit(&dd->dd_lock);
1557 if (dd->dd_parent) {
1558 avail = dsl_dir_space_available(dd->dd_parent,
1561 avail = dsl_pool_adjustedsize(dd->dd_pool, B_FALSE) - used;
1564 if (MAX(used, newval) > MAX(used, dsl_dir_phys(dd)->dd_reserved)) {
1566 MAX(used, dsl_dir_phys(dd)->dd_reserved);
1569 (dsl_dir_phys(dd)->dd_quota > 0 &&
1570 newval > dsl_dir_phys(dd)->dd_quota))
1579 dsl_dir_set_reservation_sync_impl(dsl_dir_t *dd, uint64_t value, dmu_tx_t *tx)
1584 dmu_buf_will_dirty(dd->dd_dbuf, tx);
1586 mutex_enter(&dd->dd_lock);
1587 used = dsl_dir_phys(dd)->dd_used_bytes;
1588 delta = MAX(used, value) - MAX(used, dsl_dir_phys(dd)->dd_reserved);
1589 dsl_dir_phys(dd)->dd_reserved = value;
1591 if (dd->dd_parent != NULL) {
1593 dsl_dir_diduse_space(dd->dd_parent, DD_USED_CHILD_RSRV,
1596 mutex_exit(&dd->dd_lock);
1647 dsl_dir_t *dd;
1648 for (dd = ds2; dd; dd = dd->dd_parent) {
1649 if (ds1 == dd)
1650 return (dd);
1657 * If delta is applied to dd, how much of that delta would be applied to
1661 would_change(dsl_dir_t *dd, int64_t delta, dsl_dir_t *ancestor)
1663 if (dd == ancestor)
1666 mutex_enter(&dd->dd_lock);
1667 delta = parent_delta(dd, dsl_dir_phys(dd)->dd_used_bytes, delta);
1668 mutex_exit(&dd->dd_lock);
1669 return (would_change(dd->dd_parent, delta, ancestor));
1697 dsl_dir_t *dd, *newparent;
1703 error = dsl_dir_hold(dp, ddra->ddra_oldname, FTAG, &dd, NULL);
1711 dsl_dir_rele(dd, FTAG);
1716 if (dd->dd_pool != newparent->dd_pool) {
1718 dsl_dir_rele(dd, FTAG);
1725 dsl_dir_rele(dd, FTAG);
1731 error = dmu_objset_find_dp(dp, dd->dd_object, dsl_valid_rename,
1735 dsl_dir_rele(dd, FTAG);
1751 dsl_dir_init_fs_ss_count(dd, tx);
1755 if (newparent != dd->dd_parent) {
1758 MAX(dsl_dir_phys(dd)->dd_used_bytes,
1759 dsl_dir_phys(dd)->dd_reserved);
1760 objset_t *os = dd->dd_pool->dp_meta_objset;
1764 if (dsl_dir_is_zapified(dd)) {
1767 err = zap_lookup(os, dd->dd_object,
1772 dsl_dir_rele(dd, FTAG);
1782 err = zap_lookup(os, dd->dd_object,
1787 dsl_dir_rele(dd, FTAG);
1793 if (closest_common_ancestor(dd, newparent) == dd) {
1795 dsl_dir_rele(dd, FTAG);
1799 error = dsl_dir_transfer_possible(dd->dd_parent,
1803 dsl_dir_rele(dd, FTAG);
1809 dsl_dir_rele(dd, FTAG);
1818 dsl_dir_t *dd, *newparent;
1823 VERIFY0(dsl_dir_hold(dp, ddra->ddra_oldname, FTAG, &dd, NULL));
1828 spa_history_log_internal_dd(dd, "rename", tx,
1831 if (newparent != dd->dd_parent) {
1832 objset_t *os = dd->dd_pool->dp_meta_objset;
1837 * We already made sure the dd counts were initialized in the
1842 VERIFY0(zap_lookup(os, dd->dd_object,
1848 VERIFY0(zap_lookup(os, dd->dd_object,
1853 dsl_fs_ss_count_adjust(dd->dd_parent, -fs_cnt,
1858 dsl_fs_ss_count_adjust(dd->dd_parent, -ss_cnt,
1863 dsl_dir_diduse_space(dd->dd_parent, DD_USED_CHILD,
1864 -dsl_dir_phys(dd)->dd_used_bytes,
1865 -dsl_dir_phys(dd)->dd_compressed_bytes,
1866 -dsl_dir_phys(dd)->dd_uncompressed_bytes, tx);
1868 dsl_dir_phys(dd)->dd_used_bytes,
1869 dsl_dir_phys(dd)->dd_compressed_bytes,
1870 dsl_dir_phys(dd)->dd_uncompressed_bytes, tx);
1872 if (dsl_dir_phys(dd)->dd_reserved >
1873 dsl_dir_phys(dd)->dd_used_bytes) {
1874 uint64_t unused_rsrv = dsl_dir_phys(dd)->dd_reserved -
1875 dsl_dir_phys(dd)->dd_used_bytes;
1877 dsl_dir_diduse_space(dd->dd_parent, DD_USED_CHILD_RSRV,
1884 dmu_buf_will_dirty(dd->dd_dbuf, tx);
1888 dsl_dir_phys(dd->dd_parent)->dd_child_dir_zapobj,
1889 dd->dd_myname, tx);
1892 (void) strcpy(dd->dd_myname, mynewname);
1893 dsl_dir_rele(dd->dd_parent, dd);
1894 dsl_dir_phys(dd)->dd_parent_obj = newparent->dd_object;
1896 newparent->dd_object, NULL, dd, &dd->dd_parent));
1900 dd->dd_myname, 8, 1, &dd->dd_object, tx));
1902 dsl_prop_notify_all(dd);
1905 dsl_dir_rele(dd, FTAG);
1950 dsl_dir_snap_cmtime(dsl_dir_t *dd)
1954 mutex_enter(&dd->dd_lock);
1955 t = dd->dd_snap_cmtime;
1956 mutex_exit(&dd->dd_lock);
1962 dsl_dir_snap_cmtime_update(dsl_dir_t *dd)
1967 mutex_enter(&dd->dd_lock);
1968 dd->dd_snap_cmtime = t;
1969 mutex_exit(&dd->dd_lock);
1973 dsl_dir_zapify(dsl_dir_t *dd, dmu_tx_t *tx)
1975 objset_t *mos = dd->dd_pool->dp_meta_objset;
1976 dmu_object_zapify(mos, dd->dd_object, DMU_OT_DSL_DIR, tx);
1980 dsl_dir_is_zapified(dsl_dir_t *dd)
1984 dmu_object_info_from_db(dd->dd_dbuf, &doi);