Changeset 5ee041e in mainline for uspace/srv/bd/hr/raid1.c
- Timestamp:
- 2025-01-12T17:02:39Z (6 months ago)
- Children:
- 3a68baa
- Parents:
- 58d82fa
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/bd/hr/raid1.c
r58d82fa r5ee041e 56 56 extern loc_srv_t *hr_srv; 57 57 58 static void process_deferred_invalidations(hr_volume_t *); 58 59 static void hr_raid1_update_vol_status(hr_volume_t *); 59 60 static void hr_raid1_ext_state_callback(hr_volume_t *, size_t, errno_t); … … 225 226 } 226 227 228 static void process_deferred_invalidations(hr_volume_t *vol) 229 { 230 HR_DEBUG("hr_raid1_update_vol_status(): deferred invalidations\n"); 231 232 fibril_mutex_lock(&vol->halt_lock); 233 vol->halt_please = true; 234 fibril_rwlock_write_lock(&vol->extents_lock); 235 fibril_rwlock_write_lock(&vol->states_lock); 236 fibril_mutex_lock(&vol->hotspare_lock); 237 238 list_foreach(vol->deferred_invalidations_list, link, 239 hr_deferred_invalidation_t, di) { 240 assert(vol->extents[di->index].status == HR_EXT_INVALID); 241 242 HR_DEBUG("moving invalidated extent no. %lu to hotspares\n", 243 di->index); 244 245 block_fini(di->svc_id); 246 247 size_t hs_idx = vol->hotspare_no; 248 249 vol->hotspare_no++; 250 251 vol->hotspares[hs_idx].svc_id = di->svc_id; 252 hr_update_hotspare_status(vol, hs_idx, HR_EXT_HOTSPARE); 253 254 vol->extents[di->index].svc_id = 0; 255 hr_update_ext_status(vol, di->index, HR_EXT_MISSING); 256 257 assert(vol->hotspare_no < HR_MAX_HOTSPARES + HR_MAX_EXTENTS); 258 } 259 260 for (size_t i = 0; i < HR_MAX_EXTENTS; i++) { 261 hr_deferred_invalidation_t *di = &vol->deferred_inval[i]; 262 if (di->svc_id != 0) { 263 list_remove(&di->link); 264 di->svc_id = 0; 265 } 266 } 267 268 fibril_mutex_unlock(&vol->hotspare_lock); 269 fibril_rwlock_write_unlock(&vol->states_lock); 270 fibril_rwlock_write_unlock(&vol->extents_lock); 271 vol->halt_please = false; 272 fibril_mutex_unlock(&vol->halt_lock); 273 } 274 227 275 static void hr_raid1_update_vol_status(hr_volume_t *vol) 228 276 { 277 fibril_mutex_lock(&vol->deferred_list_lock); 278 279 if (list_count(&vol->deferred_invalidations_list) > 0) 280 process_deferred_invalidations(vol); 281 282 fibril_mutex_unlock(&vol->deferred_list_lock); 283 229 284 fibril_rwlock_read_lock(&vol->extents_lock); 230 285 fibril_rwlock_read_lock(&vol->states_lock); … … 279 334 280 335 switch (rc) { 336 case ENOMEM: 337 fibril_mutex_lock(&vol->deferred_list_lock); 338 339 service_id_t invalid_svc_id = vol->extents[extent].svc_id; 340 341 list_foreach(vol->deferred_invalidations_list, link, 342 hr_deferred_invalidation_t, di) { 343 if (di->svc_id == invalid_svc_id) { 344 assert(vol->extents[extent].status == 345 HR_EXT_INVALID); 346 goto done; 347 } 348 } 349 350 assert(vol->extents[extent].svc_id != HR_EXT_INVALID); 351 352 hr_update_ext_status(vol, extent, HR_EXT_INVALID); 353 354 size_t i = list_count(&vol->deferred_invalidations_list); 355 vol->deferred_inval[i].svc_id = invalid_svc_id; 356 vol->deferred_inval[i].index = extent; 357 358 list_append(&vol->deferred_inval[i].link, 359 &vol->deferred_invalidations_list); 360 done: 361 fibril_mutex_unlock(&vol->deferred_list_lock); 362 break; 281 363 case ENOENT: 282 364 hr_update_ext_status(vol, extent, HR_EXT_MISSING);
Note:
See TracChangeset
for help on using the changeset viewer.