From d929d650901c7fca6f89d1cb29eac4fbecec9e45 Mon Sep 17 00:00:00 2001 From: Paul Zuchowski <31706010+PaulZ-98@users.noreply.github.com> Date: Tue, 3 Dec 2019 17:37:15 -0500 Subject: [PATCH] Fix zdb_read_block using zio after it is destroyed The checksum display code of zdb_read_block uses a zio to read in the block and then calls zio_checksum_compute. Use a new zio in the call to zio_checksum_compute not the zio from the read which has been destroyed by zio_wait. Reviewed-by: Brian Behlendorf Reviewed-by: Igor Kozhukhov Signed-off-by: Paul Zuchowski Closes #9644 Closes #9657 --- cmd/zdb/zdb.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cmd/zdb/zdb.c b/cmd/zdb/zdb.c index 68122390e059..05891f84a186 100644 --- a/cmd/zdb/zdb.c +++ b/cmd/zdb/zdb.c @@ -5859,13 +5859,18 @@ zdb_read_block(char *thing, spa_t *spa) } error = zio_wait(czio); if (error == 0 || error == ECKSUM) { - zio_checksum_compute(czio, ck, pabd, lsize); + zio_t *ck_zio = zio_root(spa, NULL, NULL, 0); + ck_zio->io_offset = + DVA_GET_OFFSET(&bp->blk_dva[0]); + ck_zio->io_bp = bp; + zio_checksum_compute(ck_zio, ck, pabd, lsize); printf("%12s\tcksum=%llx:%llx:%llx:%llx\n", zio_checksum_table[ck].ci_name, (u_longlong_t)bp->blk_cksum.zc_word[0], (u_longlong_t)bp->blk_cksum.zc_word[1], (u_longlong_t)bp->blk_cksum.zc_word[2], (u_longlong_t)bp->blk_cksum.zc_word[3]); + zio_wait(ck_zio); } else { printf("error %d reading block\n", error); }