425 }
426 mutex_exit(&msp->ms_lock);
427 mutex_exit(&mg->mg_ms_initialize_lock);
428 }
429
430 static void
431 vdev_initialize_calculate_progress(vdev_t *vd)
432 {
433 ASSERT(spa_config_held(vd->vdev_spa, SCL_CONFIG, RW_READER) ||
434 spa_config_held(vd->vdev_spa, SCL_CONFIG, RW_WRITER));
435 ASSERT(vd->vdev_leaf_zap != 0);
436
437 vd->vdev_initialize_bytes_est = 0;
438 vd->vdev_initialize_bytes_done = 0;
439
440 for (uint64_t i = 0; i < vd->vdev_top->vdev_ms_count; i++) {
441 metaslab_t *msp = vd->vdev_top->vdev_ms[i];
442 mutex_enter(&msp->ms_lock);
443
444 uint64_t ms_free = msp->ms_size -
445 space_map_allocated(msp->ms_sm);
446
447 if (vd->vdev_top->vdev_ops == &vdev_raidz_ops)
448 ms_free /= vd->vdev_top->vdev_children;
449
450 /*
451 * Convert the metaslab range to a physical range
452 * on our vdev. We use this to determine if we are
453 * in the middle of this metaslab range.
454 */
455 range_seg_t logical_rs, physical_rs;
456 logical_rs.rs_start = msp->ms_start;
457 logical_rs.rs_end = msp->ms_start + msp->ms_size;
458 vdev_xlate(vd, &logical_rs, &physical_rs);
459
460 if (vd->vdev_initialize_last_offset <= physical_rs.rs_start) {
461 vd->vdev_initialize_bytes_est += ms_free;
462 mutex_exit(&msp->ms_lock);
463 continue;
464 } else if (vd->vdev_initialize_last_offset >
465 physical_rs.rs_end) {
|
425 }
426 mutex_exit(&msp->ms_lock);
427 mutex_exit(&mg->mg_ms_initialize_lock);
428 }
429
430 static void
431 vdev_initialize_calculate_progress(vdev_t *vd)
432 {
433 ASSERT(spa_config_held(vd->vdev_spa, SCL_CONFIG, RW_READER) ||
434 spa_config_held(vd->vdev_spa, SCL_CONFIG, RW_WRITER));
435 ASSERT(vd->vdev_leaf_zap != 0);
436
437 vd->vdev_initialize_bytes_est = 0;
438 vd->vdev_initialize_bytes_done = 0;
439
440 for (uint64_t i = 0; i < vd->vdev_top->vdev_ms_count; i++) {
441 metaslab_t *msp = vd->vdev_top->vdev_ms[i];
442 mutex_enter(&msp->ms_lock);
443
444 uint64_t ms_free = msp->ms_size -
445 metaslab_allocated_space(msp);
446
447 if (vd->vdev_top->vdev_ops == &vdev_raidz_ops)
448 ms_free /= vd->vdev_top->vdev_children;
449
450 /*
451 * Convert the metaslab range to a physical range
452 * on our vdev. We use this to determine if we are
453 * in the middle of this metaslab range.
454 */
455 range_seg_t logical_rs, physical_rs;
456 logical_rs.rs_start = msp->ms_start;
457 logical_rs.rs_end = msp->ms_start + msp->ms_size;
458 vdev_xlate(vd, &logical_rs, &physical_rs);
459
460 if (vd->vdev_initialize_last_offset <= physical_rs.rs_start) {
461 vd->vdev_initialize_bytes_est += ms_free;
462 mutex_exit(&msp->ms_lock);
463 continue;
464 } else if (vd->vdev_initialize_last_offset >
465 physical_rs.rs_end) {
|