aboutsummaryrefslogtreecommitdiffstats
path: root/cmd
diff options
context:
space:
mode:
authorAndrew Innes <[email protected]>2022-09-03 04:15:18 +0800
committerGitHub <[email protected]>2022-09-02 13:15:18 -0700
commit58e8054bce3f493cc1f38f7177cfdb942fa4deb9 (patch)
tree53d75b690e4038360fc79efff8f05123c0af2694 /cmd
parent2d5622f5be15e9e977a4c8fe5d24baaf487b0432 (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.c81
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);
}