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


Ignore:
Timestamp:
2024-11-15T16:44:25Z (8 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/raid5.c

    r5d96f427 r733564a  
    5555extern loc_srv_t *hr_srv;
    5656
     57static errno_t hr_raid5_vol_usable(hr_volume_t *);
     58static ssize_t hr_raid5_get_bad_ext(hr_volume_t *);
     59static errno_t hr_raid5_update_vol_status(hr_volume_t *);
     60static void xor(void *, const void *, size_t);
     61static errno_t hr_raid5_read_degraded(hr_volume_t *, uint64_t, uint64_t,
     62    void *, size_t);
     63static errno_t hr_raid5_write(hr_volume_t *, uint64_t, uint64_t, aoff64_t,
     64    const void *, size_t);
     65static errno_t hr_raid5_write_parity(hr_volume_t *, uint64_t, uint64_t,
     66    uint64_t, const void *, size_t);
     67static errno_t hr_raid5_bd_op(hr_bd_op_type_t, bd_srv_t *, aoff64_t, size_t,
     68    void *, const void *, size_t);
     69
     70/* bdops */
    5771static errno_t hr_raid5_bd_open(bd_srvs_t *, bd_srv_t *);
    5872static errno_t hr_raid5_bd_close(bd_srv_t *);
     
    6579static errno_t hr_raid5_bd_get_num_blocks(bd_srv_t *, aoff64_t *);
    6680
    67 static errno_t hr_raid5_write_parity(hr_volume_t *, uint64_t, uint64_t,
    68     uint64_t, const void *, size_t);
    69 
    7081static bd_ops_t hr_raid5_bd_ops = {
    7182        .open = hr_raid5_bd_open,
     
    7788        .get_num_blocks = hr_raid5_bd_get_num_blocks
    7889};
     90
     91errno_t hr_raid5_create(hr_volume_t *new_volume)
     92{
     93        errno_t rc;
     94
     95        assert(new_volume->level == HR_LVL_5);
     96
     97        if (new_volume->dev_no < 3) {
     98                ERR_PRINTF("RAID 5 array needs at least 3 devices");
     99                return EINVAL;
     100        }
     101
     102        rc = hr_raid5_update_vol_status(new_volume);
     103        if (rc != EOK)
     104                return rc;
     105
     106        bd_srvs_init(&new_volume->hr_bds);
     107        new_volume->hr_bds.ops = &hr_raid5_bd_ops;
     108        new_volume->hr_bds.sarg = new_volume;
     109
     110        rc = hr_register_volume(new_volume);
     111
     112        return rc;
     113}
     114
     115errno_t hr_raid5_init(hr_volume_t *vol)
     116{
     117        errno_t rc;
     118        size_t bsize;
     119        uint64_t total_blkno;
     120
     121        assert(vol->level == HR_LVL_5);
     122
     123        rc = hr_check_devs(vol, &total_blkno, &bsize);
     124        if (rc != EOK)
     125                return rc;
     126
     127        vol->nblocks = total_blkno;
     128        vol->bsize = bsize;
     129        vol->data_offset = HR_DATA_OFF;
     130        vol->data_blkno = vol->nblocks - (vol->data_offset * vol->dev_no) -
     131            (vol->nblocks / vol->dev_no);
     132        vol->strip_size = HR_STRIP_SIZE;
     133
     134        return EOK;
     135}
     136
     137static errno_t hr_raid5_bd_open(bd_srvs_t *bds, bd_srv_t *bd)
     138{
     139        DPRINTF("hr_bd_open()\n");
     140        return EOK;
     141}
     142
     143static errno_t hr_raid5_bd_close(bd_srv_t *bd)
     144{
     145        DPRINTF("hr_bd_close()\n");
     146        return EOK;
     147}
     148
     149static errno_t hr_raid5_bd_sync_cache(bd_srv_t *bd, aoff64_t ba, size_t cnt)
     150{
     151        return hr_raid5_bd_op(HR_BD_SYNC, bd, ba, cnt, NULL, NULL, 0);
     152}
     153
     154static errno_t hr_raid5_bd_read_blocks(bd_srv_t *bd, aoff64_t ba, size_t cnt,
     155    void *buf, size_t size)
     156{
     157        return hr_raid5_bd_op(HR_BD_READ, bd, ba, cnt, buf, NULL, size);
     158}
     159
     160static errno_t hr_raid5_bd_write_blocks(bd_srv_t *bd, aoff64_t ba, size_t cnt,
     161    const void *data, size_t size)
     162{
     163        return hr_raid5_bd_op(HR_BD_WRITE, bd, ba, cnt, NULL, data, size);
     164}
     165
     166static errno_t hr_raid5_bd_get_block_size(bd_srv_t *bd, size_t *rsize)
     167{
     168        hr_volume_t *vol = bd->srvs->sarg;
     169
     170        *rsize = vol->bsize;
     171        return EOK;
     172}
     173
     174static errno_t hr_raid5_bd_get_num_blocks(bd_srv_t *bd, aoff64_t *rnb)
     175{
     176        hr_volume_t *vol = bd->srvs->sarg;
     177
     178        *rnb = vol->data_blkno;
     179        return EOK;
     180}
    79181
    80182static errno_t hr_raid5_vol_usable(hr_volume_t *vol)
     
    317419        free(buf);
    318420        return rc;
    319 }
    320 
    321 static errno_t hr_raid5_bd_open(bd_srvs_t *bds, bd_srv_t *bd)
    322 {
    323         DPRINTF("hr_bd_open()\n");
    324         return EOK;
    325 }
    326 
    327 static errno_t hr_raid5_bd_close(bd_srv_t *bd)
    328 {
    329         DPRINTF("hr_bd_close()\n");
    330         return EOK;
    331421}
    332422
     
    461551}
    462552
    463 static errno_t hr_raid5_bd_sync_cache(bd_srv_t *bd, aoff64_t ba, size_t cnt)
    464 {
    465         return hr_raid5_bd_op(HR_BD_SYNC, bd, ba, cnt, NULL, NULL, 0);
    466 }
    467 
    468 static errno_t hr_raid5_bd_read_blocks(bd_srv_t *bd, aoff64_t ba, size_t cnt,
    469     void *buf, size_t size)
    470 {
    471         return hr_raid5_bd_op(HR_BD_READ, bd, ba, cnt, buf, NULL, size);
    472 }
    473 
    474 static errno_t hr_raid5_bd_write_blocks(bd_srv_t *bd, aoff64_t ba, size_t cnt,
    475     const void *data, size_t size)
    476 {
    477         return hr_raid5_bd_op(HR_BD_WRITE, bd, ba, cnt, NULL, data, size);
    478 }
    479 
    480 static errno_t hr_raid5_bd_get_block_size(bd_srv_t *bd, size_t *rsize)
    481 {
    482         hr_volume_t *vol = bd->srvs->sarg;
    483 
    484         *rsize = vol->bsize;
    485         return EOK;
    486 }
    487 
    488 static errno_t hr_raid5_bd_get_num_blocks(bd_srv_t *bd, aoff64_t *rnb)
    489 {
    490         hr_volume_t *vol = bd->srvs->sarg;
    491 
    492         *rnb = vol->data_blkno;
    493         return EOK;
    494 }
    495 
    496 errno_t hr_raid5_create(hr_volume_t *new_volume)
    497 {
    498         errno_t rc;
    499 
    500         assert(new_volume->level == HR_LVL_5);
    501 
    502         if (new_volume->dev_no < 3) {
    503                 ERR_PRINTF("RAID 5 array needs at least 3 devices");
    504                 return EINVAL;
    505         }
    506 
    507         rc = hr_raid5_update_vol_status(new_volume);
    508         if (rc != EOK)
    509                 return rc;
    510 
    511         bd_srvs_init(&new_volume->hr_bds);
    512         new_volume->hr_bds.ops = &hr_raid5_bd_ops;
    513         new_volume->hr_bds.sarg = new_volume;
    514 
    515         rc = hr_register_volume(new_volume);
    516 
    517         return rc;
    518 }
    519 
    520 errno_t hr_raid5_init(hr_volume_t *vol)
    521 {
    522         errno_t rc;
    523         size_t bsize;
    524         uint64_t total_blkno;
    525 
    526         assert(vol->level == HR_LVL_5);
    527 
    528         rc = hr_check_devs(vol, &total_blkno, &bsize);
    529         if (rc != EOK)
    530                 return rc;
    531 
    532         vol->nblocks = total_blkno;
    533         vol->bsize = bsize;
    534         vol->data_offset = HR_DATA_OFF;
    535         vol->data_blkno = vol->nblocks - (vol->data_offset * vol->dev_no) -
    536             (vol->nblocks / vol->dev_no);
    537         vol->strip_size = HR_STRIP_SIZE;
    538 
    539         return EOK;
    540 }
    541 
    542553/** @}
    543554 */
Note: See TracChangeset for help on using the changeset viewer.