aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Johnston <markj@FreeBSD.org>2023-10-23 15:08:04 +0000
committerMark Johnston <markj@FreeBSD.org>2023-10-25 14:27:27 +0000
commiteb5cbd793e31f9d656999033be54dac1a1107294 (patch)
treebb482c6139f80b3298b17ebea19360710a0ac713
parent731b737107e329cef32efb79847633b03a73cc30 (diff)
downloadsrc-eb5cbd793e31f9d656999033be54dac1a1107294.tar.gz
src-eb5cbd793e31f9d656999033be54dac1a1107294.zip
makefs/zfs: Fill out dd_used_breakdown fields in DSL directories
This is required for the "used", "usedds" and "usedchild" dataset properties to be displayed. PR: 274613 Reported by: Mike Tancsa <mike@sentex.net> MFC after: 1 week Sponsored by: The FreeBSD Foundation
-rw-r--r--usr.sbin/makefs/zfs/dsl.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/usr.sbin/makefs/zfs/dsl.c b/usr.sbin/makefs/zfs/dsl.c
index a9ab93a90c38..f7abebe2e245 100644
--- a/usr.sbin/makefs/zfs/dsl.c
+++ b/usr.sbin/makefs/zfs/dsl.c
@@ -482,7 +482,7 @@ dsl_dir_finalize(zfs_opt_t *zfs, zfs_dsl_dir_t *dir, void *arg __unused)
dnode_phys_t *snapnames;
zfs_dsl_dataset_t *headds;
zfs_objset_t *os;
- uint64_t bytes, snapnamesid;
+ uint64_t bytes, childbytes, snapnamesid;
dsl_dir_finalize_props(dir);
zap_write(zfs, dir->propszap);
@@ -514,6 +514,7 @@ dsl_dir_finalize(zfs_opt_t *zfs, zfs_dsl_dir_t *dir, void *arg __unused)
headds->phys->ds_uncompressed_bytes = bytes;
headds->phys->ds_compressed_bytes = bytes;
+ childbytes = 0;
STAILQ_FOREACH(cdir, &dir->children, next) {
/*
* The root directory needs a special case: the amount of
@@ -523,9 +524,13 @@ dsl_dir_finalize(zfs_opt_t *zfs, zfs_dsl_dir_t *dir, void *arg __unused)
*/
if (dir == zfs->rootdsldir && cdir == zfs->mosdsldir)
continue;
- bytes += cdir->phys->dd_used_bytes;
+ childbytes += cdir->phys->dd_used_bytes;
}
- dsl_dir_size_add(dir, bytes);
+ dsl_dir_size_add(dir, bytes + childbytes);
+
+ dir->phys->dd_flags |= DD_FLAG_USED_BREAKDOWN;
+ dir->phys->dd_used_breakdown[DD_USED_HEAD] = bytes;
+ dir->phys->dd_used_breakdown[DD_USED_CHILD] = childbytes;
}
void