Changeset 6aafb48 in mainline


Ignore:
Timestamp:
2025-07-04T10:14:23Z (2 weeks ago)
Author:
Miroslav Cimerman <mc@…>
Children:
974f9ba
Parents:
b247c714
Message:

hr: rebuild: fix deadlock on extents_lock

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

Legend:

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

    rb247c714 r6aafb48  
    358358        }
    359359
    360         fibril_rwlock_read_lock(&vol->extents_lock);
     360        fibril_rwlock_write_lock(&vol->extents_lock);
    361361        fibril_rwlock_write_lock(&vol->states_lock);
    362362
     
    368368        case HR_EXT_FAILED:
    369369                fibril_rwlock_write_unlock(&vol->states_lock);
    370                 fibril_rwlock_read_unlock(&vol->extents_lock);
     370                fibril_rwlock_write_unlock(&vol->extents_lock);
    371371                async_answer_0(icall, EINVAL);
    372372                return;
     
    374374                hr_update_ext_state(vol, extent_idx_to_fail, HR_EXT_FAILED);
    375375                (void)vol->meta_ops->erase_block(ext->svc_id);
     376                block_fini(ext->svc_id);
     377                ext->svc_id = 0;
    376378                hr_mark_vol_state_dirty(vol);
    377379        }
    378380
    379381        fibril_rwlock_write_unlock(&vol->states_lock);
    380         fibril_rwlock_read_unlock(&vol->extents_lock);
     382        fibril_rwlock_write_unlock(&vol->extents_lock);
    381383
    382384        vol->hr_ops.vol_state_eval(vol);
  • uspace/srv/bd/hr/raid1.c

    rb247c714 r6aafb48  
    185185        size_t rebuild_no = hr_count_extents(vol, HR_EXT_REBUILD);
    186186
     187        fibril_rwlock_read_unlock(&vol->states_lock);
     188        fibril_rwlock_read_unlock(&vol->extents_lock);
     189
    187190        fibril_mutex_lock(&vol->hotspare_lock);
    188191        size_t hs_no = vol->hotspare_no;
    189192        fibril_mutex_unlock(&vol->hotspare_lock);
    190 
    191         fibril_rwlock_read_unlock(&vol->states_lock);
    192         fibril_rwlock_read_unlock(&vol->extents_lock);
    193193
    194194        if (healthy == 0) {
     
    206206                }
    207207
    208                 if (old_state != HR_VOL_REBUILD) {
    209                         if (hs_no > 0 || invalid_no > 0 || rebuild_no > 0) {
    210                                 fid_t fib = fibril_create(hr_raid1_rebuild,
    211                                     vol);
    212                                 if (fib == 0)
    213                                         return;
    214                                 fibril_start(fib);
    215                                 fibril_detach(fib);
    216                         }
     208                if (hs_no > 0 || invalid_no > 0 || rebuild_no > 0) {
     209                        fid_t fib = fibril_create(hr_raid1_rebuild, vol);
     210                        if (fib == 0)
     211                                return;
     212                        fibril_start(fib);
     213                        fibril_detach(fib);
    217214                }
    218215        } else {
     
    541538        hr_mark_vol_state_dirty(vol);
    542539
     540        hr_update_vol_state(vol, HR_VOL_DEGRADED);
     541
    543542        fibril_rwlock_write_unlock(&vol->states_lock);
    544543end:
  • uspace/srv/bd/hr/raid5.c

    rb247c714 r6aafb48  
    846846        hr_mark_vol_state_dirty(vol);
    847847
     848        hr_update_vol_state(vol, HR_VOL_DEGRADED);
     849
    848850        fibril_rwlock_write_unlock(&vol->states_lock);
    849851end:
  • uspace/srv/bd/hr/util.c

    rb247c714 r6aafb48  
    11101110errno_t hr_init_rebuild(hr_volume_t *vol, size_t *rebuild_idx)
    11111111{
     1112        HR_DEBUG("%s()", __func__);
     1113
    11121114        errno_t rc = EOK;
    11131115        size_t bad = vol->extent_no;
     
    11151117        if (vol->level == HR_LVL_0)
    11161118                return EINVAL;
     1119
     1120        fibril_rwlock_read_lock(&vol->states_lock);
     1121        if (vol->state != HR_VOL_DEGRADED) {
     1122                fibril_rwlock_read_unlock(&vol->states_lock);
     1123                return EINVAL;
     1124        }
     1125        fibril_rwlock_read_unlock(&vol->states_lock);
    11171126
    11181127        fibril_rwlock_write_lock(&vol->extents_lock);
    11191128        fibril_rwlock_write_lock(&vol->states_lock);
    11201129        fibril_mutex_lock(&vol->hotspare_lock);
    1121 
    1122         if (vol->state != HR_VOL_DEGRADED) {
    1123                 rc = EINVAL;
    1124                 goto error;
    1125         }
    11261130
    11271131        size_t rebuild = vol->extent_no;
Note: See TracChangeset for help on using the changeset viewer.