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


Ignore:
Timestamp:
2024-09-06T11:37:54Z (16 months ago)
Author:
Miroslav Cimerman <mc@…>
Children:
9c1cf34c
Parents:
ee83e9c
Message:

hr: write persistent metadata, assemble array from metadata

File:
1 edited

Legend:

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

    ree83e9c rb0f1366  
    4747#include <str_error.h>
    4848
     49#include "util.h"
    4950#include "var.h"
    50 #include "util.h"
    5151
    5252extern fibril_mutex_t big_lock;
     
    8585}
    8686
    87 static errno_t hr_raid1_bd_sync_cache(bd_srv_t *bd, aoff64_t ba, size_t size)
     87static errno_t hr_raid1_bd_sync_cache(bd_srv_t *bd, aoff64_t ba, size_t cnt)
    8888{
    8989        fibril_mutex_lock(&big_lock);
     
    9393        size_t i;
    9494
     95        rc = hr_calc_ba(vol, cnt, &ba);
     96        if (rc != EOK) {
     97                fibril_mutex_unlock(&big_lock);
     98                return rc;
     99        }
     100
    95101        for (i = 0; i < vol->dev_no; i++) {
    96                 rc = block_sync_cache(vol->devs[i], ba, size);
     102                rc = block_sync_cache(vol->devs[i], ba, cnt);
    97103                if (rc != EOK)
    98104                        break;
     
    111117        errno_t rc;
    112118        size_t i;
     119
     120        rc = hr_calc_ba(vol, cnt, &ba);
     121        if (rc != EOK) {
     122                fibril_mutex_unlock(&big_lock);
     123                return rc;
     124        }
    113125
    114126        for (i = 0; i < vol->dev_no; i++) {
     
    131143        size_t i;
    132144
     145        rc = hr_calc_ba(vol, cnt, &ba);
     146        if (rc != EOK) {
     147                fibril_mutex_unlock(&big_lock);
     148                return rc;
     149        }
     150
    133151        for (i = 0; i < vol->dev_no; i++) {
    134152                rc = block_write_direct(vol->devs[i], ba, cnt, data);
     
    153171        hr_volume_t *vol = bd->srvs->sarg;
    154172
    155         *rnb = vol->nblocks;
     173        *rnb = vol->data_blkno;
    156174        return EOK;
    157175}
     
    159177errno_t hr_raid1_create(hr_volume_t *new_volume)
    160178{
     179        errno_t rc;
     180
    161181        assert(new_volume->level == hr_l_1);
    162182
     
    167187        }
    168188
    169         errno_t rc;
    170         size_t i, bsize, last_bsize;
    171         uint64_t nblocks, last_nblocks;
    172         uint64_t total_blocks = 0;
    173 
    174         rc = hr_init_devs(new_volume);
    175         if (rc != EOK)
    176                 return rc;
    177 
    178         for (i = 0; i < new_volume->dev_no; i++) {
    179                 rc = block_get_nblocks(new_volume->devs[i], &nblocks);
    180                 if (rc != EOK)
    181                         goto error;
    182                 if (i != 0 && nblocks != last_nblocks) {
    183                         log_msg(LOG_DEFAULT, LVL_ERROR,
    184                             "number of blocks differs");
    185                         rc = EINVAL;
    186                         goto error;
    187                 }
    188                 total_blocks += nblocks;
    189                 last_nblocks = nblocks;
    190         }
    191 
    192         for (i = 0; i < new_volume->dev_no; i++) {
    193                 rc = block_get_bsize(new_volume->devs[i], &bsize);
    194                 if (rc != EOK)
    195                         goto error;
    196                 if (i != 0 && bsize != last_bsize) {
    197                         log_msg(LOG_DEFAULT, LVL_ERROR, "block sizes differ");
    198                         rc = EINVAL;
    199                         goto error;
    200                 }
    201                 last_bsize = bsize;
    202         }
    203 
    204189        bd_srvs_init(&new_volume->hr_bds);
    205190        new_volume->hr_bds.ops = &hr_raid1_bd_ops;
    206191        new_volume->hr_bds.sarg = new_volume;
    207         new_volume->nblocks = total_blocks / new_volume->dev_no;
    208         new_volume->bsize = bsize;
    209192
    210193        rc = hr_register_volume(new_volume);
    211194        if (rc != EOK)
    212                 goto error;
    213 
    214         return EOK;
    215 error:
    216         hr_fini_devs(new_volume);
    217         return rc;
     195                return rc;
     196
     197        return EOK;
    218198}
    219199
Note: See TracChangeset for help on using the changeset viewer.