Changeset 800d188 in mainline for uspace/srv/bd/hr/superblock.c


Ignore:
Timestamp:
2025-04-15T07:00:31Z (9 months ago)
Author:
Miroslav Cimerman <mc@…>
Children:
29e7cc7
Parents:
ca7fa5b
git-author:
Miroslav Cimerman <mc@…> (2025-04-15 06:55:25)
git-committer:
Miroslav Cimerman <mc@…> (2025-04-15 07:00:31)
Message:

hr: metadata saving on stop

New bool argument for hr_metadata_save() to indicate if
we want callback too (on array stop we don't, so we won't
init a rebuild).

File:
1 edited

Legend:

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

    rca7fa5b r800d188  
    8888
    8989/*
    90  * TODO: think about thread safety, if hr_metadata_save() can
    91  * be called from multiple threads, and if, maybe will need
    92  * md_lock... or whatever, but dont want to stall I/Os...
    93  */
    94 errno_t hr_metadata_save(hr_volume_t *vol)
     90 * XXX: finish this fcn documentation
     91 *
     92 * Returns ENOMEM else EOK
     93 */
     94errno_t hr_metadata_save(hr_volume_t *vol, bool with_state_callback)
    9595{
    9696        HR_DEBUG("%s()", __func__);
     
    102102                return ENOMEM;
    103103
     104        fibril_rwlock_read_lock(&vol->extents_lock);
     105
     106        fibril_mutex_lock(&vol->md_lock);
     107
    104108        for (size_t i = 0; i < vol->extent_no; i++) {
    105109                hr_extent_t *ext = &vol->extents[i];
     110
     111                fibril_rwlock_read_lock(&vol->states_lock);
    106112
    107113                /* TODO: special case for REBUILD */
     
    109115                        continue;
    110116
     117                fibril_rwlock_read_unlock(&vol->states_lock);
     118
    111119                vol->in_mem_md->index = i;
    112120                hr_encode_metadata_to_block(vol->in_mem_md, md_block);
    113121                rc = hr_write_metadata_block(ext->svc_id, md_block);
    114                 /*
    115                  * XXX: here maybe call vol status event or the state
    116                  * callback inside, same with read_block...
    117                  *
    118                  * also think about using FGE here... maybe a bit more
    119                  * code, but faster and gratis state callback :-)
    120                  */
    121                 if (rc != EOK)
    122                         goto error;
     122                if (with_state_callback && rc != EOK)
     123                        vol->state_callback(vol, i, rc);
    123124        }
    124125
    125 error:
     126        fibril_mutex_unlock(&vol->md_lock);
     127
     128        fibril_rwlock_read_unlock(&vol->extents_lock);
     129
     130        if (with_state_callback)
     131                vol->hr_ops.status_event(vol);
     132
    126133        free(md_block);
    127         return rc;
     134        return EOK;
    128135}
    129136
     
    161168
    162169        rc = block_write_direct(dev, blkno - 1, HR_META_SIZE, block);
    163         /*
    164          * XXX: here maybe call vol status event or the state callback...
    165          *
    166          * but need to pass vol pointer
    167          */
    168170
    169171        return rc;
Note: See TracChangeset for help on using the changeset viewer.