* After accounting for all allocated blocks that are directly referenced, * we might have missed a reference to a block from a partially complete * (and thus unused) indirect mapping object. We perform a secondary pass * through the metaslabs we have already mapped and claim the destination * blocks. */
| 5402 | * blocks. |
| 5403 | */ |
| 5404 | static void |
| 5405 | zdb_claim_removing(spa_t *spa, zdb_cb_t *zcb) |
| 5406 | { |
| 5407 | if (dump_opt['L']) |
| 5408 | return; |
| 5409 | |
| 5410 | if (spa->spa_vdev_removal == NULL) |
| 5411 | return; |
| 5412 | |
| 5413 | spa_config_enter(spa, SCL_CONFIG, FTAG, RW_READER); |
| 5414 | |
| 5415 | spa_vdev_removal_t *svr = spa->spa_vdev_removal; |
| 5416 | vdev_t *vd = vdev_lookup_top(spa, svr->svr_vdev_id); |
| 5417 | vdev_indirect_mapping_t *vim = vd->vdev_indirect_mapping; |
| 5418 | |
| 5419 | ASSERT0(range_tree_space(svr->svr_allocd_segs)); |
| 5420 | |
| 5421 | range_tree_t *allocs = range_tree_create(NULL, RANGE_SEG64, NULL, 0, 0); |
| 5422 | for (uint64_t msi = 0; msi < vd->vdev_ms_count; msi++) { |
| 5423 | metaslab_t *msp = vd->vdev_ms[msi]; |
| 5424 | |
| 5425 | ASSERT0(range_tree_space(allocs)); |
| 5426 | if (msp->ms_sm != NULL) |
| 5427 | VERIFY0(space_map_load(msp->ms_sm, allocs, SM_ALLOC)); |
| 5428 | range_tree_vacate(allocs, range_tree_add, svr->svr_allocd_segs); |
| 5429 | } |
| 5430 | range_tree_destroy(allocs); |
| 5431 | |
| 5432 | iterate_through_spacemap_logs(spa, load_unflushed_svr_segs_cb, svr); |
| 5433 | |
| 5434 | /* |
| 5435 | * Clear everything past what has been synced, |
| 5436 | * because we have not allocated mappings for |
| 5437 | * it yet. |
| 5438 | */ |
| 5439 | range_tree_clear(svr->svr_allocd_segs, |
| 5440 | vdev_indirect_mapping_max_offset(vim), |
| 5441 | vd->vdev_asize - vdev_indirect_mapping_max_offset(vim)); |
| 5442 | |
| 5443 | zcb->zcb_removing_size += range_tree_space(svr->svr_allocd_segs); |
| 5444 | range_tree_vacate(svr->svr_allocd_segs, claim_segment_cb, vd); |
| 5445 | |
| 5446 | spa_config_exit(spa, SCL_CONFIG, FTAG); |
| 5447 | } |
| 5448 | |
| 5449 | /* ARGSUSED */ |
| 5450 | static int |
no test coverage detected