Changeset 4d42a1b in mainline
- Timestamp:
- 2025-03-06T20:13:11Z (2 months ago)
- Children:
- 10005fd
- Parents:
- 6123753
- Location:
- uspace/srv/bd/hr
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/bd/hr/hr.c
r6123753 r4d42a1b 260 260 fibril_mutex_initialize(&new_volume->range_lock_list_lock); 261 261 262 fibril_mutex_initialize(&new_volume->deferred_list_lock);263 list_initialize(&new_volume->deferred_invalidations_list);264 265 262 atomic_init(&new_volume->rebuild_blk, 0); 266 263 atomic_init(&new_volume->state_changed, false); 267 atomic_init(&new_volume->pending_invalidation, false);268 264 269 265 rc = new_volume->hr_ops.create(new_volume); -
uspace/srv/bd/hr/raid1.c
r6123753 r4d42a1b 228 228 return; 229 229 230 if (atomic_compare_exchange_strong(&vol->pending_invalidation, &exp,231 false)) {232 fibril_mutex_lock(&vol->deferred_list_lock);233 hr_process_deferred_invalidations(vol);234 fibril_mutex_unlock(&vol->deferred_list_lock);235 }236 237 230 fibril_rwlock_read_lock(&vol->extents_lock); 238 231 fibril_rwlock_read_lock(&vol->states_lock); … … 289 282 switch (rc) { 290 283 case ENOMEM: 291 fibril_mutex_lock(&vol->deferred_list_lock);292 293 service_id_t invalid_svc_id = vol->extents[extent].svc_id;294 295 list_foreach(vol->deferred_invalidations_list, link,296 hr_deferred_invalidation_t, di) {297 if (di->svc_id == invalid_svc_id) {298 assert(vol->extents[extent].status ==299 HR_EXT_INVALID);300 goto deferring_end;301 }302 }303 304 assert(vol->extents[extent].svc_id != HR_EXT_INVALID);305 306 284 hr_update_ext_status(vol, extent, HR_EXT_INVALID); 307 308 size_t i = list_count(&vol->deferred_invalidations_list);309 vol->deferred_inval[i].svc_id = invalid_svc_id;310 vol->deferred_inval[i].index = extent;311 312 list_append(&vol->deferred_inval[i].link,313 &vol->deferred_invalidations_list);314 315 atomic_store(&vol->pending_invalidation, true);316 deferring_end:317 318 fibril_mutex_unlock(&vol->deferred_list_lock);319 285 break; 320 286 case ENOENT: -
uspace/srv/bd/hr/util.c
r6123753 r4d42a1b 410 410 } 411 411 412 void hr_process_deferred_invalidations(hr_volume_t *vol)413 {414 HR_DEBUG("hr_raid1_update_vol_status(): deferred invalidations\n");415 416 fibril_mutex_lock(&vol->halt_lock);417 vol->halt_please = true;418 fibril_rwlock_write_lock(&vol->extents_lock);419 fibril_rwlock_write_lock(&vol->states_lock);420 fibril_mutex_lock(&vol->hotspare_lock);421 422 list_foreach(vol->deferred_invalidations_list, link,423 hr_deferred_invalidation_t, di) {424 assert(vol->extents[di->index].status == HR_EXT_INVALID);425 426 HR_DEBUG("moving invalidated extent no. %lu to hotspares\n",427 di->index);428 429 block_fini(di->svc_id);430 431 size_t hs_idx = vol->hotspare_no;432 433 vol->hotspare_no++;434 435 hr_update_hotspare_svc_id(vol, hs_idx, di->svc_id);436 hr_update_hotspare_status(vol, hs_idx, HR_EXT_HOTSPARE);437 438 hr_update_ext_svc_id(vol, di->index, 0);439 hr_update_ext_status(vol, di->index, HR_EXT_MISSING);440 441 assert(vol->hotspare_no < HR_MAX_HOTSPARES + HR_MAX_EXTENTS);442 }443 444 for (size_t i = 0; i < HR_MAX_EXTENTS; i++) {445 hr_deferred_invalidation_t *di = &vol->deferred_inval[i];446 if (di->svc_id != 0) {447 list_remove(&di->link);448 di->svc_id = 0;449 }450 }451 452 fibril_mutex_unlock(&vol->hotspare_lock);453 fibril_rwlock_write_unlock(&vol->states_lock);454 fibril_rwlock_write_unlock(&vol->extents_lock);455 vol->halt_please = false;456 fibril_mutex_unlock(&vol->halt_lock);457 }458 459 412 /** @} 460 413 */ -
uspace/srv/bd/hr/util.h
r6123753 r4d42a1b 67 67 uint64_t); 68 68 extern void hr_range_lock_release(hr_range_lock_t *rl); 69 extern void hr_process_deferred_invalidations(hr_volume_t *);70 69 71 70 #endif -
uspace/srv/bd/hr/var.h
r6123753 r4d42a1b 110 110 fibril_mutex_t halt_lock; 111 111 112 /*113 * For deferring invalidations of extents. Used when114 * an extent has to be invalidated (got ENOMEM on a WRITE),115 * but workers - therefore state callbacks cannot lock116 * extents for writing (they are readers), so invalidations117 * are harvested later when we are able to.118 */119 _Atomic bool pending_invalidation;120 fibril_mutex_t deferred_list_lock;121 list_t deferred_invalidations_list;122 hr_deferred_invalidation_t deferred_inval[HR_MAX_EXTENTS];123 124 112 _Atomic bool state_changed; 125 113 _Atomic uint64_t rebuild_blk;
Note:
See TracChangeset
for help on using the changeset viewer.