Changeset 6a8c1569 in mainline for uspace/srv/bd/hr/metadata/native.c


Ignore:
Timestamp:
2025-06-23T18:31:18Z (9 months ago)
Author:
Miroslav Cimerman <mc@…>
Children:
62a8756
Parents:
e0695ce
Message:

hr: add option to save metadata on single extent

File:
1 edited

Legend:

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

    re0695ce r6a8c1569  
    6565static void meta_native_inc_counter(hr_volume_t *);
    6666static errno_t meta_native_save(hr_volume_t *, bool);
     67static errno_t meta_native_save_ext(hr_volume_t *, size_t, bool);
    6768static const char *meta_native_get_devname(const void *);
    6869static hr_level_t meta_native_get_level(const void *);
     
    8687        .inc_counter = meta_native_inc_counter,
    8788        .save = meta_native_save,
     89        .save_ext = meta_native_save_ext,
    8890        .get_devname = meta_native_get_devname,
    8991        .get_level = meta_native_get_level,
     
    394396        HR_DEBUG("%s()", __func__);
    395397
    396         errno_t rc = EOK;
     398        fibril_rwlock_read_lock(&vol->extents_lock);
     399
     400        for (size_t i = 0; i < vol->extent_no; i++)
     401                meta_native_save_ext(vol, i, with_state_callback);
     402
     403        fibril_rwlock_read_unlock(&vol->extents_lock);
     404
     405        return EOK;
     406}
     407
     408static errno_t meta_native_save_ext(hr_volume_t *vol, size_t ext_idx,
     409    bool with_state_callback)
     410{
     411        HR_DEBUG("%s()", __func__);
     412
     413        assert(fibril_rwlock_is_locked(&vol->extents_lock));
    397414
    398415        void *md_block = hr_calloc_waitok(1, vol->bsize);
     
    400417        hr_metadata_t *md = (hr_metadata_t *)vol->in_mem_md;
    401418
    402         fibril_rwlock_read_lock(&vol->extents_lock);
     419        hr_extent_t *ext = &vol->extents[ext_idx];
     420
     421        fibril_rwlock_read_lock(&vol->states_lock);
     422        hr_ext_state_t s = ext->state;
     423        fibril_rwlock_read_unlock(&vol->states_lock);
     424
     425        if (s != HR_EXT_ONLINE && s != HR_EXT_REBUILD) {
     426                return EINVAL;
     427        }
    403428
    404429        fibril_mutex_lock(&vol->md_lock);
    405430
    406         for (size_t i = 0; i < vol->extent_no; i++) {
    407                 hr_extent_t *ext = &vol->extents[i];
    408 
    409                 fibril_rwlock_read_lock(&vol->states_lock);
    410                 hr_ext_state_t s = ext->state;
    411 
    412                 if (s != HR_EXT_ONLINE && s != HR_EXT_REBUILD) {
    413                         fibril_rwlock_read_unlock(&vol->states_lock);
    414                         continue;
    415                 }
    416 
    417                 fibril_rwlock_read_unlock(&vol->states_lock);
    418 
    419                 md->index = i;
    420                 if (s == HR_EXT_REBUILD)
    421                         md->rebuild_pos = vol->rebuild_blk;
    422                 else
    423                         md->rebuild_pos = 0;
    424                 meta_native_encode(md, md_block);
    425                 rc = meta_native_write_block(ext->svc_id, md_block);
    426                 if (rc != EOK && with_state_callback)
    427                         vol->hr_ops.ext_state_cb(vol, i, rc);
    428         }
     431        md->index = ext_idx;
     432        if (s == HR_EXT_REBUILD)
     433                md->rebuild_pos = vol->rebuild_blk;
     434        else
     435                md->rebuild_pos = 0;
     436        meta_native_encode(md, md_block);
     437        errno_t rc = meta_native_write_block(ext->svc_id, md_block);
     438        if (rc != EOK && with_state_callback)
     439                vol->hr_ops.ext_state_cb(vol, ext_idx, rc);
    429440
    430441        fibril_mutex_unlock(&vol->md_lock);
    431 
    432         fibril_rwlock_read_unlock(&vol->extents_lock);
    433442
    434443        if (with_state_callback)
Note: See TracChangeset for help on using the changeset viewer.