Changeset 23df41b in mainline


Ignore:
Timestamp:
2025-01-13T22:18:22Z (5 months ago)
Author:
Miroslav Cimerman <mc@…>
Children:
a6fb937
Parents:
35f2a877
Message:

hr: move hr_process_deferred_invalidations() to util

Location:
uspace/srv/bd/hr
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/bd/hr/raid1.c

    r35f2a877 r23df41b  
    6767static errno_t hr_raid1_restore_blocks(hr_volume_t *, size_t, uint64_t, size_t,
    6868    void *);
    69 static void hr_process_deferred_invalidations(hr_volume_t *);
    7069
    7170/* bdops */
     
    108107        atomic_store(&new_volume->state_changed, true);
    109108        hr_raid1_update_vol_status(new_volume);
    110         if (new_volume->status == HR_VOL_FAULTY)
     109
     110        fibril_rwlock_read_lock(&new_volume->states_lock);
     111        hr_vol_status_t state = new_volume->status;
     112        fibril_rwlock_read_unlock(&new_volume->states_lock);
     113        if (state == HR_VOL_FAULTY || state == HR_VOL_INVALID)
    111114                return EINVAL;
    112115
     
    359362        fibril_rwlock_read_unlock(&vol->states_lock);
    360363
    361         if (vol_state == HR_VOL_FAULTY)
     364        if (vol_state == HR_VOL_FAULTY || vol_state == HR_VOL_INVALID)
    362365                return EIO;
    363366
     
    779782}
    780783
    781 static void hr_process_deferred_invalidations(hr_volume_t *vol)
    782 {
    783         HR_DEBUG("hr_raid1_update_vol_status(): deferred invalidations\n");
    784 
    785         fibril_mutex_lock(&vol->halt_lock);
    786         vol->halt_please = true;
    787         fibril_rwlock_write_lock(&vol->extents_lock);
    788         fibril_rwlock_write_lock(&vol->states_lock);
    789         fibril_mutex_lock(&vol->hotspare_lock);
    790 
    791         list_foreach(vol->deferred_invalidations_list, link,
    792             hr_deferred_invalidation_t, di) {
    793                 assert(vol->extents[di->index].status == HR_EXT_INVALID);
    794 
    795                 HR_DEBUG("moving invalidated extent no. %lu to hotspares\n",
    796                     di->index);
    797 
    798                 block_fini(di->svc_id);
    799 
    800                 size_t hs_idx = vol->hotspare_no;
    801 
    802                 vol->hotspare_no++;
    803 
    804                 hr_update_hotspare_svc_id(vol, hs_idx, di->svc_id);
    805                 hr_update_hotspare_status(vol, hs_idx, HR_EXT_HOTSPARE);
    806 
    807                 hr_update_ext_svc_id(vol, di->index, 0);
    808                 hr_update_ext_status(vol, di->index, HR_EXT_MISSING);
    809 
    810                 assert(vol->hotspare_no < HR_MAX_HOTSPARES + HR_MAX_EXTENTS);
    811         }
    812 
    813         for (size_t i = 0; i < HR_MAX_EXTENTS; i++) {
    814                 hr_deferred_invalidation_t *di = &vol->deferred_inval[i];
    815                 if (di->svc_id != 0) {
    816                         list_remove(&di->link);
    817                         di->svc_id = 0;
    818                 }
    819         }
    820 
    821         fibril_mutex_unlock(&vol->hotspare_lock);
    822         fibril_rwlock_write_unlock(&vol->states_lock);
    823         fibril_rwlock_write_unlock(&vol->extents_lock);
    824         vol->halt_please = false;
    825         fibril_mutex_unlock(&vol->halt_lock);
    826 }
    827 
    828784/** @}
    829785 */
  • uspace/srv/bd/hr/util.c

    r35f2a877 r23df41b  
    410410}
    411411
     412void 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
    412459/** @}
    413460 */
  • uspace/srv/bd/hr/util.h

    r35f2a877 r23df41b  
    6767    uint64_t);
    6868extern void hr_range_lock_release(hr_range_lock_t *rl);
     69extern void hr_process_deferred_invalidations(hr_volume_t *);
    6970
    7071#endif
Note: See TracChangeset for help on using the changeset viewer.