Changeset 09c195e8 in mainline
- Timestamp:
- 2025-06-23T13:32:13Z (4 months ago)
- Children:
- cdfcaea
- Parents:
- f6590c4
- Location:
- uspace/srv/bd/hr
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/bd/hr/raid1.c
rf6590c4 r09c195e8 62 62 void *, const void *, size_t); 63 63 static 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);66 64 67 65 /* bdops */ … … 459 457 errno_t rc; 460 458 461 rc = init_rebuild(vol, &rebuild_idx);459 rc = hr_init_rebuild(vol, &rebuild_idx); 462 460 if (rc != EOK) 463 461 return rc; … … 550 548 } 551 549 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 650 550 /** @} 651 551 */ -
uspace/srv/bd/hr/util.c
rf6590c4 r09c195e8 69 69 hr_metadata_type_t); 70 70 static errno_t hr_fill_svcs_list_from_cfg(hr_config_t *, list_t *); 71 static errno_t hr_swap_hs(hr_volume_t *, size_t, size_t); 71 72 72 73 #define HR_RL_LIST_LOCK(vol) (fibril_mutex_lock(&(vol)->range_lock_list_lock)) … … 1128 1129 } 1129 1130 1131 errno_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; 1203 error: 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 1211 static 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 1130 1232 /** @} 1131 1233 */ -
uspace/srv/bd/hr/util.h
rf6590c4 r09c195e8 112 112 extern void hr_raid5_xor(void *, const void *, size_t); 113 113 extern errno_t hr_sync_extents(hr_volume_t *); 114 extern errno_t hr_init_rebuild(hr_volume_t *, size_t *); 114 115 115 116 #endif
Note:
See TracChangeset
for help on using the changeset viewer.