diff options
author | Andrew Innes <[email protected]> | 2022-09-03 04:15:18 +0800 |
---|---|---|
committer | GitHub <[email protected]> | 2022-09-02 13:15:18 -0700 |
commit | 58e8054bce3f493cc1f38f7177cfdb942fa4deb9 (patch) | |
tree | 53d75b690e4038360fc79efff8f05123c0af2694 /cmd | |
parent | 2d5622f5be15e9e977a4c8fe5d24baaf487b0432 (diff) |
Alloc zdb_cd_t to fix stack issue
Alloc zdb_cd_t since it is too large for the stack on windows
which results in `zdb` crashing immediately.
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: Andrew Innes <[email protected]>
Co-authored-by: Jorgen Lundman <[email protected]>
Closes #13807
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/zdb/zdb.c | 81 |
1 files changed, 45 insertions, 36 deletions
diff --git a/cmd/zdb/zdb.c b/cmd/zdb/zdb.c index fdf569691..5389520e8 100644 --- a/cmd/zdb/zdb.c +++ b/cmd/zdb/zdb.c @@ -6415,7 +6415,7 @@ deleted_livelists_dump_mos(spa_t *spa) static int dump_block_stats(spa_t *spa) { - zdb_cb_t zcb = {{{{0}}}}; + zdb_cb_t *zcb; zdb_blkstats_t *zb, *tzb; uint64_t norm_alloc, norm_space, total_alloc, total_found; int flags = TRAVERSE_PRE | TRAVERSE_PREFETCH_METADATA | @@ -6424,6 +6424,8 @@ dump_block_stats(spa_t *spa) int e, c, err; bp_embedded_type_t i; + zcb = umem_zalloc(sizeof (zdb_cb_t), UMEM_NOFAIL); + (void) printf("\nTraversing all blocks %s%s%s%s%s...\n\n", (dump_opt['c'] || !dump_opt['L']) ? "to verify " : "", (dump_opt['c'] == 1) ? "metadata " : "", @@ -6443,39 +6445,39 @@ dump_block_stats(spa_t *spa) * pool claiming each block we discover, but we skip opening any space * maps. */ - zdb_leak_init(spa, &zcb); + zdb_leak_init(spa, zcb); /* * If there's a deferred-free bplist, process that first. */ (void) bpobj_iterate_nofree(&spa->spa_deferred_bpobj, - bpobj_count_block_cb, &zcb, NULL); + bpobj_count_block_cb, zcb, NULL); if (spa_version(spa) >= SPA_VERSION_DEADLISTS) { (void) bpobj_iterate_nofree(&spa->spa_dsl_pool->dp_free_bpobj, - bpobj_count_block_cb, &zcb, NULL); + bpobj_count_block_cb, zcb, NULL); } - zdb_claim_removing(spa, &zcb); + zdb_claim_removing(spa, zcb); if (spa_feature_is_active(spa, SPA_FEATURE_ASYNC_DESTROY)) { VERIFY3U(0, ==, bptree_iterate(spa->spa_meta_objset, spa->spa_dsl_pool->dp_bptree_obj, B_FALSE, count_block_cb, - &zcb, NULL)); + zcb, NULL)); } - deleted_livelists_count_blocks(spa, &zcb); + deleted_livelists_count_blocks(spa, zcb); if (dump_opt['c'] > 1) flags |= TRAVERSE_PREFETCH_DATA; - zcb.zcb_totalasize = metaslab_class_get_alloc(spa_normal_class(spa)); - zcb.zcb_totalasize += metaslab_class_get_alloc(spa_special_class(spa)); - zcb.zcb_totalasize += metaslab_class_get_alloc(spa_dedup_class(spa)); - zcb.zcb_totalasize += + zcb->zcb_totalasize = metaslab_class_get_alloc(spa_normal_class(spa)); + zcb->zcb_totalasize += metaslab_class_get_alloc(spa_special_class(spa)); + zcb->zcb_totalasize += metaslab_class_get_alloc(spa_dedup_class(spa)); + zcb->zcb_totalasize += metaslab_class_get_alloc(spa_embedded_log_class(spa)); - zcb.zcb_start = zcb.zcb_lastprint = gethrtime(); - err = traverse_pool(spa, 0, flags, zdb_blkptr_cb, &zcb); + zcb->zcb_start = zcb->zcb_lastprint = gethrtime(); + err = traverse_pool(spa, 0, flags, zdb_blkptr_cb, zcb); /* * If we've traversed the data blocks then we need to wait for those @@ -6496,15 +6498,15 @@ dump_block_stats(spa_t *spa) * Done after zio_wait() since zcb_haderrors is modified in * zdb_blkptr_done() */ - zcb.zcb_haderrors |= err; + zcb->zcb_haderrors |= err; - if (zcb.zcb_haderrors) { + if (zcb->zcb_haderrors) { (void) printf("\nError counts:\n\n"); (void) printf("\t%5s %s\n", "errno", "count"); for (e = 0; e < 256; e++) { - if (zcb.zcb_errors[e] != 0) { + if (zcb->zcb_errors[e] != 0) { (void) printf("\t%5d %llu\n", - e, (u_longlong_t)zcb.zcb_errors[e]); + e, (u_longlong_t)zcb->zcb_errors[e]); } } } @@ -6512,9 +6514,9 @@ dump_block_stats(spa_t *spa) /* * Report any leaked segments. */ - leaks |= zdb_leak_fini(spa, &zcb); + leaks |= zdb_leak_fini(spa, zcb); - tzb = &zcb.zcb_type[ZB_TOTAL][ZDB_OT_TOTAL]; + tzb = &zcb->zcb_type[ZB_TOTAL][ZDB_OT_TOTAL]; norm_alloc = metaslab_class_get_alloc(spa_normal_class(spa)); norm_space = metaslab_class_get_space(spa_normal_class(spa)); @@ -6525,8 +6527,8 @@ dump_block_stats(spa_t *spa) metaslab_class_get_alloc(spa_special_class(spa)) + metaslab_class_get_alloc(spa_dedup_class(spa)) + get_unflushed_alloc_space(spa); - total_found = tzb->zb_asize - zcb.zcb_dedup_asize + - zcb.zcb_removing_size + zcb.zcb_checkpoint_size; + total_found = tzb->zb_asize - zcb->zcb_dedup_asize + + zcb->zcb_removing_size + zcb->zcb_checkpoint_size; if (total_found == total_alloc && !dump_opt['L']) { (void) printf("\n\tNo leaks (block sum matches space" @@ -6541,8 +6543,10 @@ dump_block_stats(spa_t *spa) leaks = B_TRUE; } - if (tzb->zb_count == 0) + if (tzb->zb_count == 0) { + umem_free(zcb, sizeof (zdb_cb_t)); return (2); + } (void) printf("\n"); (void) printf("\t%-16s %14llu\n", "bp count:", @@ -6561,9 +6565,9 @@ dump_block_stats(spa_t *spa) (u_longlong_t)(tzb->zb_asize / tzb->zb_count), (double)tzb->zb_lsize / tzb->zb_asize); (void) printf("\t%-16s %14llu ref>1: %6llu deduplication: %6.2f\n", - "bp deduped:", (u_longlong_t)zcb.zcb_dedup_asize, - (u_longlong_t)zcb.zcb_dedup_blocks, - (double)zcb.zcb_dedup_asize / tzb->zb_asize + 1.0); + "bp deduped:", (u_longlong_t)zcb->zcb_dedup_asize, + (u_longlong_t)zcb->zcb_dedup_blocks, + (double)zcb->zcb_dedup_asize / tzb->zb_asize + 1.0); (void) printf("\t%-16s %14llu used: %5.2f%%\n", "Normal class:", (u_longlong_t)norm_alloc, 100.0 * norm_alloc / norm_space); @@ -6601,19 +6605,19 @@ dump_block_stats(spa_t *spa) } for (i = 0; i < NUM_BP_EMBEDDED_TYPES; i++) { - if (zcb.zcb_embedded_blocks[i] == 0) + if (zcb->zcb_embedded_blocks[i] == 0) continue; (void) printf("\n"); (void) printf("\tadditional, non-pointer bps of type %u: " "%10llu\n", - i, (u_longlong_t)zcb.zcb_embedded_blocks[i]); + i, (u_longlong_t)zcb->zcb_embedded_blocks[i]); if (dump_opt['b'] >= 3) { (void) printf("\t number of (compressed) bytes: " "number of bps\n"); - dump_histogram(zcb.zcb_embedded_histogram[i], - sizeof (zcb.zcb_embedded_histogram[i]) / - sizeof (zcb.zcb_embedded_histogram[i][0]), 0); + dump_histogram(zcb->zcb_embedded_histogram[i], + sizeof (zcb->zcb_embedded_histogram[i]) / + sizeof (zcb->zcb_embedded_histogram[i][0]), 0); } } @@ -6673,7 +6677,7 @@ dump_block_stats(spa_t *spa) else typename = zdb_ot_extname[t - DMU_OT_NUMTYPES]; - if (zcb.zcb_type[ZB_TOTAL][t].zb_asize == 0) { + if (zcb->zcb_type[ZB_TOTAL][t].zb_asize == 0) { (void) printf("%6s\t%5s\t%5s\t%5s" "\t%5s\t%5s\t%6s\t%s\n", "-", @@ -6689,7 +6693,7 @@ dump_block_stats(spa_t *spa) for (l = ZB_TOTAL - 1; l >= -1; l--) { level = (l == -1 ? ZB_TOTAL : l); - zb = &zcb.zcb_type[level][t]; + zb = &zcb->zcb_type[level][t]; if (zb->zb_asize == 0) continue; @@ -6698,7 +6702,7 @@ dump_block_stats(spa_t *spa) continue; if (level == 0 && zb->zb_asize == - zcb.zcb_type[ZB_TOTAL][t].zb_asize) + zcb->zcb_type[ZB_TOTAL][t].zb_asize) continue; zdb_nicenum(zb->zb_count, csize, @@ -6742,18 +6746,23 @@ dump_block_stats(spa_t *spa) /* Output a table summarizing block sizes in the pool */ if (dump_opt['b'] >= 2) { - dump_size_histograms(&zcb); + dump_size_histograms(zcb); } } (void) printf("\n"); - if (leaks) + if (leaks) { + umem_free(zcb, sizeof (zdb_cb_t)); return (2); + } - if (zcb.zcb_haderrors) + if (zcb->zcb_haderrors) { + umem_free(zcb, sizeof (zdb_cb_t)); return (3); + } + umem_free(zcb, sizeof (zdb_cb_t)); return (0); } |