diff --git a/cmd/zdb/zdb.c b/cmd/zdb/zdb.c
index 09e144f66c68..c870b5ce3fab 100644
--- a/cmd/zdb/zdb.c
+++ b/cmd/zdb/zdb.c
@@ -2133,7 +2133,7 @@ dump_ddt_object(ddt_t *ddt, ddt_type_t type, ddt_class_t class)
(void) printf("%s: object=%llu\n", name,
(u_longlong_t)ddt->ddt_object[type][class]);
- zpool_dump_ddt(NULL, &ddt->ddt_histogram[type][class]);
+ zpool_dump_ddt(NULL, &ddt->ddt_histogram[type][class], B_TRUE);
if (dump_opt['D'] < 4)
return;
@@ -2210,7 +2210,7 @@ dump_all_ddts(spa_t *spa)
if (dump_opt['D'] > 1) {
(void) printf("DDT histogram (aggregated over all DDTs):\n");
ddt_get_dedup_histogram(spa, &ddh_total);
- zpool_dump_ddt(&dds_total, &ddh_total);
+ zpool_dump_ddt(&dds_total, &ddh_total, B_TRUE);
}
dump_dedup_ratio(&dds_total);
@@ -7763,7 +7763,7 @@ dump_simulated_ddt(spa_t *spa)
(void) printf("Simulated DDT histogram:\n");
- zpool_dump_ddt(&dds_total, &ddh_total);
+ zpool_dump_ddt(&dds_total, &ddh_total, B_TRUE);
dump_dedup_ratio(&dds_total);
}
diff --git a/cmd/zpool/zpool_main.c b/cmd/zpool/zpool_main.c
index 8c5556c5f30b..61fc7cf15733 100644
--- a/cmd/zpool/zpool_main.c
+++ b/cmd/zpool/zpool_main.c
@@ -10472,7 +10472,7 @@ print_dedup_stats(zpool_handle_t *zhp, nvlist_t *config, boolean_t literal)
(uint64_t **)&dds, &c) == 0);
verify(nvlist_lookup_uint64_array(config, ZPOOL_CONFIG_DDT_HISTOGRAM,
(uint64_t **)&ddh, &c) == 0);
- zpool_dump_ddt(dds, ddh);
+ zpool_dump_ddt(dds, ddh, literal);
}
#define ST_SIZE 4096
diff --git a/include/libzutil.h b/include/libzutil.h
index 59599b0f63f4..2061a845409a 100644
--- a/include/libzutil.h
+++ b/include/libzutil.h
@@ -167,7 +167,8 @@ _LIBZUTIL_H void zfs_niceraw(uint64_t, char *, size_t);
#define nicenum(num, buf, size) zfs_nicenum(num, buf, size)
#define NN_NUMBUF_SZ (6)
-_LIBZUTIL_H void zpool_dump_ddt(const ddt_stat_t *, const ddt_histogram_t *);
+_LIBZUTIL_H void zpool_dump_ddt(const ddt_stat_t *, const ddt_histogram_t *,
+ boolean_t parsable);
_LIBZUTIL_H int zpool_history_unpack(char *, uint64_t, uint64_t *, nvlist_t ***,
uint_t *);
_LIBZUTIL_H void fsleep(float sec);
diff --git a/lib/libzfs/libzfs.abi b/lib/libzfs/libzfs.abi
index f481b6221e4d..9cf7243df880 100644
--- a/lib/libzfs/libzfs.abi
+++ b/lib/libzfs/libzfs.abi
@@ -10207,6 +10207,7 @@
+
diff --git a/lib/libzutil/zutil_pool.c b/lib/libzutil/zutil_pool.c
index 2aacfa53b5e0..f5a722aba18d 100644
--- a/lib/libzutil/zutil_pool.c
+++ b/lib/libzutil/zutil_pool.c
@@ -33,8 +33,27 @@
#include
+
+static inline void
+fmt_num(boolean_t parsable, uint64_t val, char *buf, size_t buflen)
+{
+ if (parsable)
+ (void) snprintf(buf, buflen, "%llu", (u_longlong_t)val);
+ else
+ zfs_nicenum(val, buf, buflen);
+}
+
+static inline void
+fmt_bytes(boolean_t parsable, uint64_t val, char *buf, size_t buflen)
+{
+ if (parsable)
+ (void) snprintf(buf, buflen, "%llu", (u_longlong_t)val);
+ else
+ zfs_nicebytes(val, buf, buflen);
+}
+
static void
-dump_ddt_stat(const ddt_stat_t *dds, int h)
+dump_ddt_stat(const ddt_stat_t *dds, int h, boolean_t parsable)
{
char refcnt[6];
char blocks[6], lsize[6], psize[6], dsize[6];
@@ -48,14 +67,14 @@ dump_ddt_stat(const ddt_stat_t *dds, int h)
else
zfs_nicenum(1ULL << h, refcnt, sizeof (refcnt));
- zfs_nicenum(dds->dds_blocks, blocks, sizeof (blocks));
- zfs_nicebytes(dds->dds_lsize, lsize, sizeof (lsize));
- zfs_nicebytes(dds->dds_psize, psize, sizeof (psize));
- zfs_nicebytes(dds->dds_dsize, dsize, sizeof (dsize));
- zfs_nicenum(dds->dds_ref_blocks, ref_blocks, sizeof (ref_blocks));
- zfs_nicebytes(dds->dds_ref_lsize, ref_lsize, sizeof (ref_lsize));
- zfs_nicebytes(dds->dds_ref_psize, ref_psize, sizeof (ref_psize));
- zfs_nicebytes(dds->dds_ref_dsize, ref_dsize, sizeof (ref_dsize));
+ fmt_num(parsable, dds->dds_blocks, blocks, sizeof (blocks));
+ fmt_bytes(parsable, dds->dds_lsize, lsize, sizeof (lsize));
+ fmt_bytes(parsable, dds->dds_psize, psize, sizeof (psize));
+ fmt_bytes(parsable, dds->dds_dsize, dsize, sizeof (dsize));
+ fmt_num(parsable, dds->dds_ref_blocks, ref_blocks, sizeof (ref_blocks));
+ fmt_bytes(parsable, dds->dds_ref_lsize, ref_lsize, sizeof (ref_lsize));
+ fmt_bytes(parsable, dds->dds_ref_psize, ref_psize, sizeof (ref_psize));
+ fmt_bytes(parsable, dds->dds_ref_dsize, ref_dsize, sizeof (ref_dsize));
(void) printf("%6s %6s %5s %5s %5s %6s %5s %5s %5s\n",
refcnt,
@@ -67,7 +86,8 @@ dump_ddt_stat(const ddt_stat_t *dds, int h)
* Print the DDT histogram and the column totals.
*/
void
-zpool_dump_ddt(const ddt_stat_t *dds_total, const ddt_histogram_t *ddh)
+zpool_dump_ddt(const ddt_stat_t *dds_total, const ddt_histogram_t *ddh,
+ boolean_t parsable)
{
int h;
@@ -91,9 +111,9 @@ zpool_dump_ddt(const ddt_stat_t *dds_total, const ddt_histogram_t *ddh)
"------", "-----", "-----", "-----");
for (h = 0; h < 64; h++)
- dump_ddt_stat(&ddh->ddh_stat[h], h);
+ dump_ddt_stat(&ddh->ddh_stat[h], h, parsable);
- dump_ddt_stat(dds_total, -1);
+ dump_ddt_stat(dds_total, -1, parsable);
(void) printf("\n");
}