Changeset 56214383 in mainline


Ignore:
Timestamp:
2025-03-29T12:09:58Z (3 months ago)
Author:
Miroslav Cimerman <mc@…>
Children:
49de61c
Parents:
8a65373
Message:

hr: util: hr_util_add_hotspare()

Location:
uspace/srv/bd/hr
Files:
4 edited

Legend:

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

    r8a65373 r56214383  
    145145        HR_DEBUG("%s()", __func__);
    146146
    147         errno_t rc = EOK;
    148 
    149         fibril_mutex_lock(&vol->hotspare_lock);
    150 
    151         if (vol->hotspare_no >= HR_MAX_HOTSPARES) {
    152                 HR_ERROR("hr_raid1_add_hotspare(): cannot add more hotspares "
    153                     "to \"%s\"\n", vol->devname);
    154                 rc = ELIMIT;
    155                 goto error;
    156         }
    157 
    158         size_t hs_idx = vol->hotspare_no;
    159 
    160         vol->hotspare_no++;
    161 
    162         hr_update_hotspare_svc_id(vol, hs_idx, hotspare);
    163         hr_update_hotspare_status(vol, hs_idx, HR_EXT_HOTSPARE);
    164 
    165         hr_mark_vol_state_dirty(vol);
    166 error:
    167         fibril_mutex_unlock(&vol->hotspare_lock);
     147        errno_t rc = hr_util_add_hotspare(vol, hotspare);
    168148
    169149        hr_raid1_update_vol_status(vol);
     
    656636        service_id_t hs_svc_id = vol->hotspares[hs].svc_id;
    657637
    658         /* TODO: if rc != EOK, try next hotspare */
    659         errno_t rc = block_init(hs_svc_id);
    660         if (rc != EOK) {
    661                 HR_ERROR("hr_raid1_rebuild(): initing hotspare (%lu) failed\n",
    662                     hs_svc_id);
    663                 return rc;
    664         }
    665 
    666638        hr_update_ext_svc_id(vol, bad, hs_svc_id);
    667639        hr_update_ext_status(vol, bad, HR_EXT_HOTSPARE);
  • uspace/srv/bd/hr/raid5.c

    r8a65373 r56214383  
    150150errno_t hr_raid5_add_hotspare(hr_volume_t *vol, service_id_t hotspare)
    151151{
    152         HR_DEBUG("hr_raid5_add_hotspare()\n");
     152        HR_DEBUG("%s()", __func__);
    153153
    154154        fibril_mutex_lock(&vol->lock);
    155         fibril_mutex_lock(&vol->hotspare_lock);
    156 
    157         if (vol->hotspare_no >= HR_MAX_HOTSPARES) {
    158                 HR_ERROR("hr_raid5_add_hotspare(): cannot add more hotspares "
    159                     "to \"%s\"\n", vol->devname);
    160                 fibril_mutex_unlock(&vol->lock);
    161                 return ELIMIT;
    162         }
    163 
    164         vol->hotspares[vol->hotspare_no].svc_id = hotspare;
    165 
    166         vol->hotspare_no++;
    167 
    168         hr_update_hotspare_status(vol, vol->hotspare_no - 1, HR_EXT_HOTSPARE);
     155
     156        errno_t rc = hr_util_add_hotspare(vol, hotspare);
     157        if (rc != EOK)
     158                goto end;
    169159
    170160        /*
     
    184174        }
    185175
    186         fibril_mutex_unlock(&vol->hotspare_lock);
     176end:
    187177        fibril_mutex_unlock(&vol->lock);
    188178
    189         return EOK;
     179        return rc;
    190180}
    191181
     
    770760        hr_extent_t *rebuild_ext = &vol->extents[bad];
    771761
    772         rc = block_init(rebuild_ext->svc_id);
    773         if (rc != EOK) {
    774                 HR_ERROR("hr_raid5_rebuild(): initing (%lu) failed, "
    775                     "aborting rebuild\n", rebuild_ext->svc_id);
    776                 goto end;
    777         }
    778 
    779762        HR_DEBUG("hr_raid5_rebuild(): starting rebuild on (%lu)\n",
    780763            rebuild_ext->svc_id);
  • uspace/srv/bd/hr/util.c

    r8a65373 r56214383  
    983983}
    984984
     985errno_t hr_util_add_hotspare(hr_volume_t *vol, service_id_t hotspare)
     986{
     987        HR_DEBUG("%s()", __func__);
     988
     989        errno_t rc = EOK;
     990
     991        fibril_mutex_lock(&vol->hotspare_lock);
     992
     993        if (vol->hotspare_no >= HR_MAX_HOTSPARES) {
     994                HR_ERROR("%s(): cannot add more hotspares "
     995                    "to \"%s\"\n", __func__, vol->devname);
     996                rc = ELIMIT;
     997                goto end;
     998        }
     999
     1000        rc = block_init(hotspare);
     1001        if (rc != EOK)
     1002                goto end;
     1003
     1004        size_t hs_idx = vol->hotspare_no;
     1005
     1006        vol->hotspare_no++;
     1007
     1008        hr_update_hotspare_svc_id(vol, hs_idx, hotspare);
     1009        hr_update_hotspare_status(vol, hs_idx, HR_EXT_HOTSPARE);
     1010
     1011        hr_mark_vol_state_dirty(vol);
     1012end:
     1013        fibril_mutex_unlock(&vol->hotspare_lock);
     1014        return rc;
     1015}
     1016
    9851017/** @}
    9861018 */
  • uspace/srv/bd/hr/util.h

    r8a65373 r56214383  
    7878    uint64_t);
    7979extern errno_t           hr_util_try_auto_assemble(size_t *);
     80extern errno_t           hr_util_add_hotspare(hr_volume_t *, service_id_t);
    8081
    8182#endif
Note: See TracChangeset for help on using the changeset viewer.