Changeset 09c195e8 in mainline for uspace/srv/bd/hr/raid1.c


Ignore:
Timestamp:
2025-06-23T13:32:13Z (9 months ago)
Author:
Miroslav Cimerman <mc@…>
Children:
cdfcaea
Parents:
f6590c4
Message:

hr: move rebuild init to util.c

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/bd/hr/raid1.c

    rf6590c4 r09c195e8  
    6262    void *, const void *, size_t);
    6363static errno_t hr_raid1_rebuild(void *);
    64 static errno_t init_rebuild(hr_volume_t *, size_t *);
    65 static errno_t swap_hs(hr_volume_t *, size_t, size_t);
    6664
    6765/* bdops */
     
    459457        errno_t rc;
    460458
    461         rc = init_rebuild(vol, &rebuild_idx);
     459        rc = hr_init_rebuild(vol, &rebuild_idx);
    462460        if (rc != EOK)
    463461                return rc;
     
    550548}
    551549
    552 static errno_t init_rebuild(hr_volume_t *vol, size_t *rebuild_idx)
    553 {
    554         errno_t rc = EOK;
    555 
    556         fibril_rwlock_write_lock(&vol->extents_lock);
    557         fibril_rwlock_write_lock(&vol->states_lock);
    558         fibril_mutex_lock(&vol->hotspare_lock);
    559 
    560         size_t bad = vol->extent_no;
    561         for (size_t i = 0; i < vol->extent_no; i++) {
    562                 if (vol->extents[i].state != HR_EXT_ONLINE) {
    563                         bad = i;
    564                         break;
    565                 }
    566         }
    567 
    568         if (bad == vol->extent_no)
    569                 rc = EINVAL;
    570         else if (vol->state != HR_VOL_DEGRADED)
    571                 rc = EINVAL;
    572 
    573         size_t invalid = vol->extent_no;
    574         for (size_t i = 0; i < vol->extent_no; i++) {
    575                 if (vol->extents[i].state == HR_EXT_INVALID) {
    576                         invalid = i;
    577                         break;
    578                 }
    579         }
    580 
    581         if (invalid < vol->extent_no)
    582                 bad = invalid;
    583 
    584         if (bad != invalid && vol->hotspare_no == 0)
    585                 rc = EINVAL;
    586 
    587         if (rc != EOK)
    588                 goto error;
    589 
    590         if (bad != invalid) {
    591                 size_t hotspare_idx = vol->hotspare_no - 1;
    592 
    593                 hr_ext_state_t hs_state = vol->hotspares[hotspare_idx].state;
    594                 if (hs_state != HR_EXT_HOTSPARE) {
    595                         HR_ERROR("hr_raid1_rebuild(): invalid hotspare"
    596                             "state \"%s\", aborting rebuild\n",
    597                             hr_get_ext_state_str(hs_state));
    598                         rc = EINVAL;
    599                         goto error;
    600                 }
    601 
    602                 rc = swap_hs(vol, bad, hotspare_idx);
    603                 if (rc != EOK) {
    604                         HR_ERROR("hr_raid1_rebuild(): swapping "
    605                             "hotspare failed, aborting rebuild\n");
    606                         goto error;
    607                 }
    608         }
    609 
    610         hr_extent_t *rebuild_ext = &vol->extents[bad];
    611 
    612         HR_DEBUG("hr_raid1_rebuild(): starting REBUILD on extent no. %zu "
    613             "(%"  PRIun  ")\n", bad, rebuild_ext->svc_id);
    614 
    615         atomic_store_explicit(&vol->rebuild_blk, 0, memory_order_relaxed);
    616 
    617         hr_update_ext_state(vol, bad, HR_EXT_REBUILD);
    618         hr_update_vol_state(vol, HR_VOL_REBUILD);
    619 
    620         *rebuild_idx = bad;
    621 error:
    622         fibril_mutex_unlock(&vol->hotspare_lock);
    623         fibril_rwlock_write_unlock(&vol->states_lock);
    624         fibril_rwlock_write_unlock(&vol->extents_lock);
    625 
    626         return rc;
    627 }
    628 
    629 static errno_t swap_hs(hr_volume_t *vol, size_t bad, size_t hs)
    630 {
    631         HR_DEBUG("%s()", __func__);
    632 
    633         service_id_t faulty_svc_id = vol->extents[bad].svc_id;
    634         service_id_t hs_svc_id = vol->hotspares[hs].svc_id;
    635 
    636         hr_update_ext_svc_id(vol, bad, hs_svc_id);
    637         hr_update_ext_state(vol, bad, HR_EXT_HOTSPARE);
    638 
    639         hr_update_hotspare_svc_id(vol, hs, 0);
    640         hr_update_hotspare_state(vol, hs, HR_EXT_MISSING);
    641 
    642         vol->hotspare_no--;
    643 
    644         if (faulty_svc_id != 0)
    645                 block_fini(faulty_svc_id);
    646 
    647         return EOK;
    648 }
    649 
    650550/** @}
    651551 */
Note: See TracChangeset for help on using the changeset viewer.