From c755aa486d952313180718c1de62fa46f17461f3 Mon Sep 17 00:00:00 2001 From: Chunwei Chen Date: Mon, 8 Sep 2025 14:02:51 -0700 Subject: [PATCH] Fix wrong dedup_table_size for legacy dedup If we call ddt_log_load() for legacy ddt, we will end up going into ddt_log_update_stats() and filling uninitialized value into ddo_dspace. This value will then get added to dedup_table_size during ddt_get_dedup_object_stats(). Reviewed-by: Brian Behlendorf Reviewed-by: Alexander Motin Closes #17019 Closes #17699 Signed-off-by: Chunwei Chen Co-authored-by: Chunwei Chen --- module/zfs/ddt.c | 8 +++++--- module/zfs/ddt_log.c | 12 +++++++----- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/module/zfs/ddt.c b/module/zfs/ddt.c index d6658375f..0dc9adc7f 100644 --- a/module/zfs/ddt.c +++ b/module/zfs/ddt.c @@ -1701,9 +1701,11 @@ ddt_load(spa_t *spa) } } - error = ddt_log_load(ddt); - if (error != 0 && error != ENOENT) - return (error); + if (ddt->ddt_flags & DDT_FLAG_LOG) { + error = ddt_log_load(ddt); + if (error != 0 && error != ENOENT) + return (error); + } DDT_KSTAT_SET(ddt, dds_log_active_entries, avl_numnodes(&ddt->ddt_log_active->ddl_tree)); diff --git a/module/zfs/ddt_log.c b/module/zfs/ddt_log.c index 3d30e244c..c9217cef4 100644 --- a/module/zfs/ddt_log.c +++ b/module/zfs/ddt_log.c @@ -176,11 +176,13 @@ ddt_log_update_stats(ddt_t *ddt) * that's reasonable to expect anyway. */ dmu_object_info_t doi; - uint64_t nblocks; - dmu_object_info(ddt->ddt_os, ddt->ddt_log_active->ddl_object, &doi); - nblocks = doi.doi_physical_blocks_512; - dmu_object_info(ddt->ddt_os, ddt->ddt_log_flushing->ddl_object, &doi); - nblocks += doi.doi_physical_blocks_512; + uint64_t nblocks = 0; + if (dmu_object_info(ddt->ddt_os, ddt->ddt_log_active->ddl_object, + &doi) == 0) + nblocks += doi.doi_physical_blocks_512; + if (dmu_object_info(ddt->ddt_os, ddt->ddt_log_flushing->ddl_object, + &doi) == 0) + nblocks += doi.doi_physical_blocks_512; ddt_object_t *ddo = &ddt->ddt_log_stats; ddo->ddo_count =