Changeset 4a2a6b8b in mainline


Ignore:
Timestamp:
2024-09-06T22:09:33Z (8 months ago)
Author:
Miroslav Cimerman <mc@…>
Children:
57c61b0
Parents:
a19d7fc4
Message:

hr: add initial RAID 4 0 (non-rotating parity on disk 0)

Location:
uspace
Files:
1 added
11 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/hrctl/hrctl.c

    ra19d7fc4 r4a2a6b8b  
    232232
    233233        while (c != -1) {
    234                 c = getopt_long(argc, argv, "hsC:c:A:a:l:015Ln:T:",
     234                c = getopt_long(argc, argv, "hsC:c:A:a:l:0145Ln:T:",
    235235                    long_options, NULL);
    236236                switch (c) {
     
    299299                                goto bad;
    300300                        cfg->level = hr_l_1;
     301                        break;
     302                case '4':
     303                        if (cfg->level != hr_l_empty)
     304                                goto bad;
     305                        cfg->level = hr_l_4;
    301306                        break;
    302307                case '5':
  • uspace/lib/device/include/hr.h

    ra19d7fc4 r4a2a6b8b  
    5151        hr_l_0 = 0,
    5252        hr_l_1 = 1,
     53        hr_l_4 = 4,
    5354        hr_l_5 = 5,
    5455        hr_l_linear = 254,
  • uspace/lib/device/src/hr.c

    ra19d7fc4 r4a2a6b8b  
    157157
    158158        printf("level: %d\n", vol_info->level);
    159         if (vol_info->level == hr_l_0) {
     159        if (vol_info->level == hr_l_0 || vol_info->level == hr_l_4) {
    160160                if (vol_info->strip_size / 1024 < 1)
    161161                        printf("strip size in bytes: %u\n",
  • uspace/srv/bd/hr/hr.c

    ra19d7fc4 r4a2a6b8b  
    166166                new_volume->strip_size = HR_STRIP_SIZE;
    167167                break;
     168        case hr_l_4:
     169                new_volume->hr_ops.create = hr_raid4_create;
     170                new_volume->strip_size = HR_STRIP_SIZE;
     171                break;
    168172        default:
    169173                log_msg(LOG_DEFAULT, LVL_ERROR,
     
    271275        case hr_l_0:
    272276                new_volume->hr_ops.create = hr_raid0_create;
     277                break;
     278        case hr_l_4:
     279                new_volume->hr_ops.create = hr_raid4_create;
    273280                break;
    274281        default:
  • uspace/srv/bd/hr/meson.build

    ra19d7fc4 r4a2a6b8b  
    2828
    2929deps = [ 'block', 'device' ]
    30 src = files('hr.c', 'raid0.c', 'raid1.c', 'superblock.c', 'util.c')
     30src = files('hr.c', 'raid0.c', 'raid1.c', 'raid4.c', 'superblock.c', 'util.c')
  • uspace/srv/bd/hr/raid0.c

    ra19d7fc4 r4a2a6b8b  
    105105        errno_t rc;
    106106        uint64_t phys_block;
    107         size_t extent;
     107        size_t extent, left;
     108
     109        rc = hr_check_ba_range(vol, cnt, ba);
     110        if (rc != EOK)
     111                return rc;
    108112
    109113        fibril_mutex_lock(&big_lock);
    110114
    111         size_t left = cnt;
     115        left = cnt;
    112116        while (left != 0) {
    113                 raid0_geometry(ba++, vol, &extent, &phys_block);
    114                 rc = hr_calc_ba(vol, cnt, &ba);
    115                 if (rc != EOK)
    116                         break;
     117                raid0_geometry(ba, vol, &extent, &phys_block);
     118                hr_add_ba_offset(vol, &phys_block);
    117119                rc = block_sync_cache(vol->devs[extent], phys_block, 1);
    118120                if (rc != EOK)
    119121                        break;
    120122                left--;
     123                ba++;
    121124        }
    122125
     
    131134        errno_t rc;
    132135        uint64_t phys_block;
    133         size_t extent;
     136        size_t extent, left;
    134137
    135138        if (size < cnt * vol->bsize)
    136139                return EINVAL;
    137140
     141        rc = hr_check_ba_range(vol, cnt, ba);
     142        if (rc != EOK)
     143                return rc;
     144
    138145        fibril_mutex_lock(&big_lock);
    139146
    140         size_t left = cnt;
     147        left = cnt;
    141148        while (left != 0) {
    142                 raid0_geometry(ba++, vol, &extent, &phys_block);
    143                 rc = hr_calc_ba(vol, cnt, &ba);
    144                 if (rc != EOK)
    145                         break;
     149                raid0_geometry(ba, vol, &extent, &phys_block);
     150                hr_add_ba_offset(vol, &phys_block);
    146151                rc = block_read_direct(vol->devs[extent], phys_block, 1, buf);
    147152                buf = buf + vol->bsize;
     
    149154                        break;
    150155                left--;
     156                ba++;
    151157        }
    152158
     
    161167        errno_t rc;
    162168        uint64_t phys_block;
    163         size_t extent;
     169        size_t extent, left;
    164170
    165171        if (size < cnt * vol->bsize)
    166172                return EINVAL;
    167173
     174        rc = hr_check_ba_range(vol, cnt, ba);
     175        if (rc != EOK)
     176                return rc;
     177
    168178        fibril_mutex_lock(&big_lock);
    169179
    170         size_t left = cnt;
     180        left = cnt;
    171181        while (left != 0) {
    172                 raid0_geometry(ba++, vol, &extent, &phys_block);
    173                 rc = hr_calc_ba(vol, cnt, &phys_block);
    174                 if (rc != EOK)
    175                         break;
     182                raid0_geometry(ba, vol, &extent, &phys_block);
     183                hr_add_ba_offset(vol, &phys_block);
    176184                rc = block_write_direct(vol->devs[extent], phys_block, 1, data);
    177185                data = data + vol->bsize;
     
    179187                        break;
    180188                left--;
     189                ba++;
    181190        }
    182191
  • uspace/srv/bd/hr/raid1.c

    ra19d7fc4 r4a2a6b8b  
    8787static errno_t hr_raid1_bd_sync_cache(bd_srv_t *bd, aoff64_t ba, size_t cnt)
    8888{
     89        hr_volume_t *vol = bd->srvs->sarg;
     90
     91        errno_t rc;
     92        size_t i;
     93
     94        rc = hr_check_ba_range(vol, cnt, ba);
     95        if (rc != EOK)
     96                return rc;
     97
     98        hr_add_ba_offset(vol, &ba);
     99
    89100        fibril_mutex_lock(&big_lock);
    90         hr_volume_t *vol = bd->srvs->sarg;
    91 
    92         errno_t rc;
    93         size_t i;
    94 
    95         rc = hr_calc_ba(vol, cnt, &ba);
    96         if (rc != EOK) {
    97                 fibril_mutex_unlock(&big_lock);
    98                 return rc;
    99         }
    100101
    101102        for (i = 0; i < vol->dev_no; i++) {
     
    112113    void *buf, size_t size)
    113114{
     115        hr_volume_t *vol = bd->srvs->sarg;
     116
     117        errno_t rc;
     118        size_t i;
     119
     120        rc = hr_check_ba_range(vol, cnt, ba);
     121        if (rc != EOK)
     122                return rc;
     123
     124        hr_add_ba_offset(vol, &ba);
     125
    114126        fibril_mutex_lock(&big_lock);
    115         hr_volume_t *vol = bd->srvs->sarg;
    116 
    117         errno_t rc;
    118         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         }
    125127
    126128        for (i = 0; i < vol->dev_no; i++) {
     
    137139    const void *data, size_t size)
    138140{
     141        hr_volume_t *vol = bd->srvs->sarg;
     142
     143        errno_t rc;
     144        size_t i;
     145
     146        rc = hr_check_ba_range(vol, cnt, ba);
     147        if (rc != EOK)
     148                return rc;
     149
     150        hr_add_ba_offset(vol, &ba);
     151
    139152        fibril_mutex_lock(&big_lock);
    140         hr_volume_t *vol = bd->srvs->sarg;
    141 
    142         errno_t rc;
    143         size_t i;
    144 
    145         rc = hr_calc_ba(vol, cnt, &ba);
    146         if (rc != EOK) {
    147                 fibril_mutex_unlock(&big_lock);
    148                 return rc;
    149         }
    150153
    151154        for (i = 0; i < vol->dev_no; i++) {
  • uspace/srv/bd/hr/superblock.c

    ra19d7fc4 r4a2a6b8b  
    7878        } else if (vol->level == hr_l_0) {
    7979                data_blkno = vol->nblocks - (data_offset * vol->dev_no);
     80        } else if (vol->level == hr_l_4) {
     81                data_blkno = vol->nblocks - (data_offset * vol->dev_no) - (vol->nblocks / vol->dev_no);
    8082        } else {
    8183                log_msg(LOG_DEFAULT, LVL_ERROR,
  • uspace/srv/bd/hr/util.c

    ra19d7fc4 r4a2a6b8b  
    159159        if (vol->level == hr_l_1) {
    160160                vol->nblocks = total_blocks / vol->dev_no;
    161         } else if (vol->level == hr_l_0) {
     161        } else if (vol->level == hr_l_0 || vol->level == hr_l_4) {
    162162                vol->nblocks = total_blocks;
    163163        } else {
     
    172172}
    173173
    174 errno_t hr_calc_ba(hr_volume_t *vol, size_t cnt, uint64_t *ba)
     174errno_t hr_check_ba_range(hr_volume_t *vol, size_t cnt, uint64_t ba)
    175175{
    176         if (*ba + cnt > vol->data_blkno)
     176        if (ba + cnt > vol->data_blkno)
    177177                return ERANGE;
     178        return EOK;
     179}
    178180
     181void hr_add_ba_offset(hr_volume_t *vol, uint64_t *ba)
     182{
    179183        *ba = *ba + vol->data_offset;
    180         return EOK;
    181184}
    182185
  • uspace/srv/bd/hr/util.h

    ra19d7fc4 r4a2a6b8b  
    4545extern errno_t hr_register_volume(hr_volume_t *);
    4646extern errno_t hr_check_devs(hr_volume_t *vol);
    47 errno_t hr_calc_ba(hr_volume_t *vol, size_t cnt, uint64_t *ba);
     47errno_t hr_check_ba_range(hr_volume_t *vol, size_t cnt, uint64_t ba);
     48void hr_add_ba_offset(hr_volume_t *vol, uint64_t *ba);
    4849
    4950#endif
  • uspace/srv/bd/hr/var.h

    ra19d7fc4 r4a2a6b8b  
    7272extern errno_t hr_raid0_create(hr_volume_t *);
    7373extern errno_t hr_raid1_create(hr_volume_t *);
     74extern errno_t hr_raid4_create(hr_volume_t *);
    7475
    7576#endif
Note: See TracChangeset for help on using the changeset viewer.