Changeset 7fba146 in mainline for uspace/srv/bd/hr/raid1.c


Ignore:
Timestamp:
2025-06-09T23:41:50Z (2 weeks ago)
Author:
Miroslav Cimerman <mc@…>
Children:
6791fbf
Parents:
83ff12f
Message:

hr: RAID 1: inc meta counter on first write

File:
1 edited

Legend:

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

    r83ff12f r7fba146  
    5656#include "var.h"
    5757
     58static void hr_raid1_vol_state_eval_forced(hr_volume_t *);
    5859static size_t hr_raid1_count_good_extents(hr_volume_t *, uint64_t, size_t,
    5960    uint64_t);
     
    105106        new_volume->hr_bds.sarg = new_volume;
    106107
    107         /* force volume state update */
    108         hr_mark_vol_state_dirty(new_volume);
    109         hr_raid1_vol_state_eval(new_volume);
     108        hr_raid1_vol_state_eval_forced(new_volume);
    110109
    111110        fibril_rwlock_read_lock(&new_volume->states_lock);
     
    155154        bool exp = true;
    156155
    157         /* TODO: could also wrap this */
    158156        if (!atomic_compare_exchange_strong(&vol->state_dirty, &exp, false))
    159157                return;
    160158
    161         fibril_mutex_lock(&vol->md_lock);
    162 
    163         vol->meta_ops->inc_counter(vol->in_mem_md);
    164         /* XXX: save right away */
    165 
    166         fibril_mutex_unlock(&vol->md_lock);
     159        vol->meta_ops->inc_counter(vol);
     160        (void)vol->meta_ops->save(vol, WITH_STATE_CALLBACK);
     161
     162        hr_raid1_vol_state_eval_forced(vol);
     163}
     164
     165void hr_raid1_ext_state_cb(hr_volume_t *vol, size_t extent,
     166    errno_t rc)
     167{
     168        HR_DEBUG("%s()", __func__);
     169
     170        if (rc == EOK)
     171                return;
     172
     173        assert(fibril_rwlock_is_locked(&vol->extents_lock));
     174
     175        fibril_rwlock_write_lock(&vol->states_lock);
     176
     177        switch (rc) {
     178        case ENOMEM:
     179                hr_update_ext_state(vol, extent, HR_EXT_INVALID);
     180                break;
     181        case ENOENT:
     182                hr_update_ext_state(vol, extent, HR_EXT_MISSING);
     183                break;
     184        default:
     185                hr_update_ext_state(vol, extent, HR_EXT_FAILED);
     186        }
     187
     188        hr_mark_vol_state_dirty(vol);
     189
     190        fibril_rwlock_write_unlock(&vol->states_lock);
     191}
     192
     193static void hr_raid1_vol_state_eval_forced(hr_volume_t *vol)
     194{
     195        HR_DEBUG("%s()", __func__);
    167196
    168197        fibril_rwlock_read_lock(&vol->extents_lock);
     
    209238}
    210239
    211 void hr_raid1_ext_state_cb(hr_volume_t *vol, size_t extent,
    212     errno_t rc)
    213 {
    214         HR_DEBUG("%s()", __func__);
    215 
    216         if (rc == EOK)
    217                 return;
    218 
    219         assert(fibril_rwlock_is_locked(&vol->extents_lock));
    220 
    221         fibril_rwlock_write_lock(&vol->states_lock);
    222 
    223         switch (rc) {
    224         case ENOMEM:
    225                 hr_update_ext_state(vol, extent, HR_EXT_INVALID);
    226                 break;
    227         case ENOENT:
    228                 hr_update_ext_state(vol, extent, HR_EXT_MISSING);
    229                 break;
    230         default:
    231                 hr_update_ext_state(vol, extent, HR_EXT_FAILED);
    232         }
    233 
    234         hr_mark_vol_state_dirty(vol);
    235 
    236         fibril_rwlock_write_unlock(&vol->states_lock);
    237 }
    238 
    239240static errno_t hr_raid1_bd_open(bd_srvs_t *bds, bd_srv_t *bd)
    240241{
     
    328329        if (vol_state == HR_VOL_FAULTY || vol_state == HR_VOL_NONE)
    329330                return EIO;
     331
     332        if (!vol->data_dirty && type == HR_BD_WRITE) {
     333                vol->meta_ops->inc_counter(vol);
     334                vol->data_dirty = true;
     335        }
    330336
    331337        if (type == HR_BD_READ || type == HR_BD_WRITE)
     
    543549        fibril_rwlock_write_unlock(&vol->states_lock);
    544550
    545         rc = vol->meta_ops->save(vol, WITH_STATE_CALLBACK);
     551        (void)vol->meta_ops->save(vol, WITH_STATE_CALLBACK);
    546552
    547553end:
Note: See TracChangeset for help on using the changeset viewer.