Print this page
10592 misc. metaslab and vdev related ZoL bug fixes
Portions contributed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed by: Giuseppe Di Natale <guss80@gmail.com>
Reviewed by: George Melikov <mail@gmelikov.ru>
Reviewed by: Paul Dagnelie <pcd@delphix.com>
Reviewed by: Matt Ahrens <mahrens@delphix.com>
Reviewed by: Pavel Zakharov <pavel.zakharov@delphix.com>
Reviewed by: Tony Hutter <hutter2@llnl.gov>
Reviewed by: Kody Kantor <kody.kantor@joyent.com>
Approved by: Dan McDonald <danmcd@joyent.com>


 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) {