Changeset 09c195e8 in mainline for uspace/srv/bd/hr/raid1.c
- Timestamp:
- 2025-06-23T13:32:13Z (9 months ago)
- Children:
- cdfcaea
- Parents:
- f6590c4
- File:
-
- 1 edited
-
uspace/srv/bd/hr/raid1.c (modified) (3 diffs)
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 */
Note:
See TracChangeset
for help on using the changeset viewer.
