mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-25 18:59:33 +03:00
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 <behlendorf1@llnl.gov> Signed-off-by: Andrew Innes <andrew.c12@gmail.com> Co-authored-by: Jorgen Lundman <lundman@lundman.net> Closes #13807
This commit is contained in:
parent
2d5622f5be
commit
58e8054bce
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user