Changeset e0695ce in mainline for uspace/srv/bd/hr/util.c
- Timestamp:
- 2025-06-23T16:50:43Z (9 months ago)
- Children:
- 6a8c1569
- Parents:
- f18e36e
- git-author:
- Miroslav Cimerman <mc@…> (2025-06-23 16:47:52)
- git-committer:
- Miroslav Cimerman <mc@…> (2025-06-23 16:50:43)
- File:
-
- 1 edited
-
uspace/srv/bd/hr/util.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/bd/hr/util.c
rf18e36e re0695ce 281 281 282 282 /* save metadata, but we don't care about states anymore */ 283 (void)vol->meta_ops->save(vol, NO_STATE_CALLBACK);283 vol->meta_ops->save(vol, NO_STATE_CALLBACK); 284 284 285 285 HR_NOTE("deactivating volume \"%s\"\n", vol->devname); … … 1117 1117 { 1118 1118 errno_t rc = EOK; 1119 size_t bad = vol->extent_no; 1119 1120 1120 1121 if (vol->level == HR_LVL_0) … … 1125 1126 fibril_mutex_lock(&vol->hotspare_lock); 1126 1127 1127 size_t bad = vol->extent_no; 1128 if (vol->state != HR_VOL_DEGRADED) { 1129 rc = EINVAL; 1130 goto error; 1131 } 1132 1133 size_t rebuild = vol->extent_no; 1128 1134 for (size_t i = 0; i < vol->extent_no; i++) { 1129 if (vol->extents[i].state != HR_EXT_ONLINE) {1130 bad = i;1135 if (vol->extents[i].state == HR_EXT_REBUILD) { 1136 rebuild = i; 1131 1137 break; 1132 1138 } 1133 1139 } 1134 1140 1135 if ( bad == vol->extent_no)1136 rc = EINVAL;1137 else if (vol->state != HR_VOL_DEGRADED)1138 rc = EINVAL;1141 if (rebuild < vol->extent_no) { 1142 bad = rebuild; 1143 goto init_rebuild; 1144 } 1139 1145 1140 1146 size_t invalid = vol->extent_no; … … 1146 1152 } 1147 1153 1148 if (invalid < vol->extent_no) 1154 if (invalid < vol->extent_no) { 1149 1155 bad = invalid; 1150 1151 if (bad != invalid && vol->hotspare_no == 0) 1156 goto init_rebuild; 1157 } 1158 1159 for (size_t i = 0; i < vol->extent_no; i++) { 1160 if (vol->extents[i].state != HR_EXT_ONLINE) { 1161 bad = i; 1162 break; 1163 } 1164 } 1165 1166 if (bad == vol->extent_no || vol->hotspare_no == 0) { 1152 1167 rc = EINVAL; 1153 1154 if (rc != EOK) 1155 goto error; 1156 1157 if (bad != invalid) { 1158 size_t hotspare_idx = vol->hotspare_no - 1; 1159 1160 hr_ext_state_t hs_state = vol->hotspares[hotspare_idx].state; 1161 if (hs_state != HR_EXT_HOTSPARE) { 1162 HR_ERROR("hr_raid1_rebuild(): invalid hotspare" 1163 "state \"%s\", aborting rebuild\n", 1164 hr_get_ext_state_str(hs_state)); 1165 rc = EINVAL; 1166 goto error; 1167 } 1168 1169 rc = hr_swap_hs(vol, bad, hotspare_idx); 1170 if (rc != EOK) { 1171 HR_ERROR("hr_raid1_rebuild(): swapping " 1172 "hotspare failed, aborting rebuild\n"); 1173 goto error; 1174 } 1168 goto error; 1169 } 1170 1171 size_t hotspare_idx = vol->hotspare_no - 1; 1172 1173 hr_ext_state_t hs_state = vol->hotspares[hotspare_idx].state; 1174 if (hs_state != HR_EXT_HOTSPARE) { 1175 HR_ERROR("hr_raid1_rebuild(): invalid hotspare" 1176 "state \"%s\", aborting rebuild\n", 1177 hr_get_ext_state_str(hs_state)); 1178 rc = EINVAL; 1179 goto error; 1180 } 1181 1182 rc = hr_swap_hs(vol, bad, hotspare_idx); 1183 if (rc != EOK) { 1184 HR_ERROR("hr_raid1_rebuild(): swapping " 1185 "hotspare failed, aborting rebuild\n"); 1186 goto error; 1175 1187 } 1176 1188 … … 1180 1192 "(%" PRIun ")\n", bad, rebuild_ext->svc_id); 1181 1193 1182 atomic_store_explicit(&vol->rebuild_blk, 0, memory_order_relaxed); 1183 1194 init_rebuild: 1184 1195 hr_update_ext_state(vol, bad, HR_EXT_REBUILD); 1185 1196 hr_update_vol_state(vol, HR_VOL_REBUILD);
Note:
See TracChangeset
for help on using the changeset viewer.
