From 25ec9a9034a26d78ce826de2783e01eec93efb04 Mon Sep 17 00:00:00 2001 From: Rob Norris Date: Fri, 19 Jul 2024 03:51:27 +1000 Subject: [PATCH] zdb: fix BRT dump (#16335) BRT refcounts are stored as eight uint8_ts rather than a single uint64_t. This means that za_first_integer is only the first byte, so max 256. This fixes it by doing a lookup for the whole value. Sponsored-by: Klara, Inc. Sponsored-by: Wasabi Technology, Inc. Signed-off-by: Rob Norris Reviewed-by: Tony Hutter Reviewed-by: Alexander Motin --- cmd/zdb/zdb.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/cmd/zdb/zdb.c b/cmd/zdb/zdb.c index 2caa83f5c636..a8a3cd9dc3bc 100644 --- a/cmd/zdb/zdb.c +++ b/cmd/zdb/zdb.c @@ -2208,8 +2208,13 @@ dump_brt(spa_t *spa) for (zap_cursor_init(&zc, brt->brt_mos, brtvd->bv_mos_entries); zap_cursor_retrieve(&zc, &za) == 0; zap_cursor_advance(&zc)) { - uint64_t offset = *(uint64_t *)za.za_name; - uint64_t refcnt = za.za_first_integer; + uint64_t refcnt; + VERIFY0(zap_lookup_uint64(brt->brt_mos, + brtvd->bv_mos_entries, + (const uint64_t *)za.za_name, 1, + za.za_integer_length, za.za_num_integers, &refcnt)); + + uint64_t offset = *(const uint64_t *)za.za_name; snprintf(dva, sizeof (dva), "%" PRIu64 ":%llx", vdevid, (u_longlong_t)offset);