Changeset 09c195e8 in mainline


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

hr: move rebuild init to util.c

Location:
uspace/srv/bd/hr
Files:
3 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 */
  • uspace/srv/bd/hr/util.c

    rf6590c4 r09c195e8  
    6969    hr_metadata_type_t);
    7070static errno_t hr_fill_svcs_list_from_cfg(hr_config_t *, list_t *);
     71static errno_t hr_swap_hs(hr_volume_t *, size_t, size_t);
    7172
    7273#define HR_RL_LIST_LOCK(vol) (fibril_mutex_lock(&(vol)->range_lock_list_lock))
     
    11281129}
    11291130
     1131errno_t hr_init_rebuild(hr_volume_t *vol, size_t *rebuild_idx)
     1132{
     1133        errno_t rc = EOK;
     1134
     1135        if (vol->level == HR_LVL_0)
     1136                return EINVAL;
     1137
     1138        fibril_rwlock_write_lock(&vol->extents_lock);
     1139        fibril_rwlock_write_lock(&vol->states_lock);
     1140        fibril_mutex_lock(&vol->hotspare_lock);
     1141
     1142        size_t bad = vol->extent_no;
     1143        for (size_t i = 0; i < vol->extent_no; i++) {
     1144                if (vol->extents[i].state != HR_EXT_ONLINE) {
     1145                        bad = i;
     1146                        break;
     1147                }
     1148        }
     1149
     1150        if (bad == vol->extent_no)
     1151                rc = EINVAL;
     1152        else if (vol->state != HR_VOL_DEGRADED)
     1153                rc = EINVAL;
     1154
     1155        size_t invalid = vol->extent_no;
     1156        for (size_t i = 0; i < vol->extent_no; i++) {
     1157                if (vol->extents[i].state == HR_EXT_INVALID) {
     1158                        invalid = i;
     1159                        break;
     1160                }
     1161        }
     1162
     1163        if (invalid < vol->extent_no)
     1164                bad = invalid;
     1165
     1166        if (bad != invalid && vol->hotspare_no == 0)
     1167                rc = EINVAL;
     1168
     1169        if (rc != EOK)
     1170                goto error;
     1171
     1172        if (bad != invalid) {
     1173                size_t hotspare_idx = vol->hotspare_no - 1;
     1174
     1175                hr_ext_state_t hs_state = vol->hotspares[hotspare_idx].state;
     1176                if (hs_state != HR_EXT_HOTSPARE) {
     1177                        HR_ERROR("hr_raid1_rebuild(): invalid hotspare"
     1178                            "state \"%s\", aborting rebuild\n",
     1179                            hr_get_ext_state_str(hs_state));
     1180                        rc = EINVAL;
     1181                        goto error;
     1182                }
     1183
     1184                rc = hr_swap_hs(vol, bad, hotspare_idx);
     1185                if (rc != EOK) {
     1186                        HR_ERROR("hr_raid1_rebuild(): swapping "
     1187                            "hotspare failed, aborting rebuild\n");
     1188                        goto error;
     1189                }
     1190        }
     1191
     1192        hr_extent_t *rebuild_ext = &vol->extents[bad];
     1193
     1194        HR_DEBUG("hr_raid1_rebuild(): starting REBUILD on extent no. %zu "
     1195            "(%"  PRIun  ")\n", bad, rebuild_ext->svc_id);
     1196
     1197        atomic_store_explicit(&vol->rebuild_blk, 0, memory_order_relaxed);
     1198
     1199        hr_update_ext_state(vol, bad, HR_EXT_REBUILD);
     1200        hr_update_vol_state(vol, HR_VOL_REBUILD);
     1201
     1202        *rebuild_idx = bad;
     1203error:
     1204        fibril_mutex_unlock(&vol->hotspare_lock);
     1205        fibril_rwlock_write_unlock(&vol->states_lock);
     1206        fibril_rwlock_write_unlock(&vol->extents_lock);
     1207
     1208        return rc;
     1209}
     1210
     1211static errno_t hr_swap_hs(hr_volume_t *vol, size_t bad, size_t hs)
     1212{
     1213        HR_DEBUG("%s()", __func__);
     1214
     1215        service_id_t faulty_svc_id = vol->extents[bad].svc_id;
     1216        service_id_t hs_svc_id = vol->hotspares[hs].svc_id;
     1217
     1218        hr_update_ext_svc_id(vol, bad, hs_svc_id);
     1219        hr_update_ext_state(vol, bad, HR_EXT_HOTSPARE);
     1220
     1221        hr_update_hotspare_svc_id(vol, hs, 0);
     1222        hr_update_hotspare_state(vol, hs, HR_EXT_MISSING);
     1223
     1224        vol->hotspare_no--;
     1225
     1226        if (faulty_svc_id != 0)
     1227                block_fini(faulty_svc_id);
     1228
     1229        return EOK;
     1230}
     1231
    11301232/** @}
    11311233 */
  • uspace/srv/bd/hr/util.h

    rf6590c4 r09c195e8  
    112112extern void hr_raid5_xor(void *, const void *, size_t);
    113113extern errno_t hr_sync_extents(hr_volume_t *);
     114extern errno_t hr_init_rebuild(hr_volume_t *, size_t *);
    114115
    115116#endif
Note: See TracChangeset for help on using the changeset viewer.