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


Ignore:
Timestamp:
2024-11-15T16:44:25Z (6 months ago)
Author:
Miroslav Cimerman <mc@…>
Children:
b235c67
Parents:
5d96f427
git-author:
Miroslav Cimerman <mc@…> (2024-11-15 16:27:17)
git-committer:
Miroslav Cimerman <mc@…> (2024-11-15 16:44:25)
Message:

hr: add all fcn prototypes in raid implementations

Also restructure the file in order: create(), init(),
public BD ops, internal util functions and io ops.

File:
1 edited

Legend:

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

    r5d96f427 r733564a  
    5353extern loc_srv_t *hr_srv;
    5454
     55static errno_t hr_raid1_check_vol_status(hr_volume_t *);
     56static errno_t hr_raid1_update_vol_status(hr_volume_t *);
     57static void handle_extent_error(hr_volume_t *, size_t, errno_t);
     58static errno_t hr_raid1_bd_op(hr_bd_op_type_t, bd_srv_t *, aoff64_t, size_t,
     59    void *, const void *, size_t);
     60
     61/* bdops */
    5562static errno_t hr_raid1_bd_open(bd_srvs_t *, bd_srv_t *);
    5663static errno_t hr_raid1_bd_close(bd_srv_t *);
     
    7380};
    7481
     82errno_t hr_raid1_create(hr_volume_t *new_volume)
     83{
     84        errno_t rc;
     85
     86        assert(new_volume->level == HR_LVL_1);
     87
     88        if (new_volume->dev_no < 2) {
     89                ERR_PRINTF("RAID 1 array needs at least 2 devices\n");
     90                return EINVAL;
     91        }
     92
     93        rc = hr_raid1_update_vol_status(new_volume);
     94        if (rc != EOK)
     95                return rc;
     96
     97        bd_srvs_init(&new_volume->hr_bds);
     98        new_volume->hr_bds.ops = &hr_raid1_bd_ops;
     99        new_volume->hr_bds.sarg = new_volume;
     100
     101        rc = hr_register_volume(new_volume);
     102
     103        return rc;
     104}
     105
     106errno_t hr_raid1_init(hr_volume_t *vol)
     107{
     108        errno_t rc;
     109        size_t bsize;
     110        uint64_t total_blkno;
     111
     112        assert(vol->level == HR_LVL_1);
     113
     114        rc = hr_check_devs(vol, &total_blkno, &bsize);
     115        if (rc != EOK)
     116                return rc;
     117
     118        vol->nblocks = total_blkno / vol->dev_no;
     119        vol->bsize = bsize;
     120        vol->data_offset = HR_DATA_OFF;
     121        vol->data_blkno = vol->nblocks - vol->data_offset;
     122        vol->strip_size = 0;
     123
     124        return EOK;
     125}
     126
     127static errno_t hr_raid1_bd_open(bd_srvs_t *bds, bd_srv_t *bd)
     128{
     129        DPRINTF("hr_bd_open()\n");
     130        return EOK;
     131}
     132
     133static errno_t hr_raid1_bd_close(bd_srv_t *bd)
     134{
     135        DPRINTF("hr_bd_close()\n");
     136        return EOK;
     137}
     138
     139static errno_t hr_raid1_bd_sync_cache(bd_srv_t *bd, aoff64_t ba, size_t cnt)
     140{
     141        return hr_raid1_bd_op(HR_BD_SYNC, bd, ba, cnt, NULL, NULL, 0);
     142}
     143
     144static errno_t hr_raid1_bd_read_blocks(bd_srv_t *bd, aoff64_t ba, size_t cnt,
     145    void *buf, size_t size)
     146{
     147        return hr_raid1_bd_op(HR_BD_READ, bd, ba, cnt, buf, NULL, size);
     148}
     149
     150static errno_t hr_raid1_bd_write_blocks(bd_srv_t *bd, aoff64_t ba, size_t cnt,
     151    const void *data, size_t size)
     152{
     153        return hr_raid1_bd_op(HR_BD_WRITE, bd, ba, cnt, NULL, data, size);
     154}
     155
     156static errno_t hr_raid1_bd_get_block_size(bd_srv_t *bd, size_t *rsize)
     157{
     158        hr_volume_t *vol = bd->srvs->sarg;
     159
     160        *rsize = vol->bsize;
     161        return EOK;
     162}
     163
     164static errno_t hr_raid1_bd_get_num_blocks(bd_srv_t *bd, aoff64_t *rnb)
     165{
     166        hr_volume_t *vol = bd->srvs->sarg;
     167
     168        *rnb = vol->data_blkno;
     169        return EOK;
     170}
     171
    75172static errno_t hr_raid1_check_vol_status(hr_volume_t *vol)
    76173{
     
    118215                return EOK;
    119216        }
    120 }
    121 
    122 static errno_t hr_raid1_bd_open(bd_srvs_t *bds, bd_srv_t *bd)
    123 {
    124         DPRINTF("hr_bd_open()\n");
    125         return EOK;
    126 }
    127 
    128 static errno_t hr_raid1_bd_close(bd_srv_t *bd)
    129 {
    130         DPRINTF("hr_bd_close()\n");
    131         return EOK;
    132217}
    133218
     
    217302}
    218303
    219 static errno_t hr_raid1_bd_sync_cache(bd_srv_t *bd, aoff64_t ba, size_t cnt)
    220 {
    221         return hr_raid1_bd_op(HR_BD_SYNC, bd, ba, cnt, NULL, NULL, 0);
    222 }
    223 
    224 static errno_t hr_raid1_bd_read_blocks(bd_srv_t *bd, aoff64_t ba, size_t cnt,
    225     void *buf, size_t size)
    226 {
    227         return hr_raid1_bd_op(HR_BD_READ, bd, ba, cnt, buf, NULL, size);
    228 }
    229 
    230 static errno_t hr_raid1_bd_write_blocks(bd_srv_t *bd, aoff64_t ba, size_t cnt,
    231     const void *data, size_t size)
    232 {
    233         return hr_raid1_bd_op(HR_BD_WRITE, bd, ba, cnt, NULL, data, size);
    234 }
    235 
    236 static errno_t hr_raid1_bd_get_block_size(bd_srv_t *bd, size_t *rsize)
    237 {
    238         hr_volume_t *vol = bd->srvs->sarg;
    239 
    240         *rsize = vol->bsize;
    241         return EOK;
    242 }
    243 
    244 static errno_t hr_raid1_bd_get_num_blocks(bd_srv_t *bd, aoff64_t *rnb)
    245 {
    246         hr_volume_t *vol = bd->srvs->sarg;
    247 
    248         *rnb = vol->data_blkno;
    249         return EOK;
    250 }
    251 
    252 errno_t hr_raid1_create(hr_volume_t *new_volume)
    253 {
    254         errno_t rc;
    255 
    256         assert(new_volume->level == HR_LVL_1);
    257 
    258         if (new_volume->dev_no < 2) {
    259                 ERR_PRINTF("RAID 1 array needs at least 2 devices\n");
    260                 return EINVAL;
    261         }
    262 
    263         rc = hr_raid1_update_vol_status(new_volume);
    264         if (rc != EOK)
    265                 return rc;
    266 
    267         bd_srvs_init(&new_volume->hr_bds);
    268         new_volume->hr_bds.ops = &hr_raid1_bd_ops;
    269         new_volume->hr_bds.sarg = new_volume;
    270 
    271         rc = hr_register_volume(new_volume);
    272 
    273         return rc;
    274 }
    275 
    276 errno_t hr_raid1_init(hr_volume_t *vol)
    277 {
    278         errno_t rc;
    279         size_t bsize;
    280         uint64_t total_blkno;
    281 
    282         assert(vol->level == HR_LVL_1);
    283 
    284         rc = hr_check_devs(vol, &total_blkno, &bsize);
    285         if (rc != EOK)
    286                 return rc;
    287 
    288         vol->nblocks = total_blkno / vol->dev_no;
    289         vol->bsize = bsize;
    290         vol->data_offset = HR_DATA_OFF;
    291         vol->data_blkno = vol->nblocks - vol->data_offset;
    292         vol->strip_size = 0;
    293 
    294         return EOK;
    295 }
    296 
    297304/** @}
    298305 */
Note: See TracChangeset for help on using the changeset viewer.