Changeset d7768d11 in mainline


Ignore:
Timestamp:
2024-12-06T19:46:43Z (6 months ago)
Author:
Miroslav Cimerman <mc@…>
Children:
241c3f6
Parents:
586b39d
Message:

hr: add different RAID4,5 layouts

Also prepare the metadata for metada versioning
and sync counter.

Location:
uspace/srv/bd/hr
Files:
5 edited

Legend:

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

    r586b39d rd7768d11  
    188188        switch (new_volume->level) {
    189189        case HR_LVL_1:
     190                new_volume->RLQ = 0x00; /* XXX: yet unused */
    190191                new_volume->hr_ops.create = hr_raid1_create;
    191192                new_volume->hr_ops.init = hr_raid1_init;
     
    194195                break;
    195196        case HR_LVL_0:
     197                new_volume->RLQ = 0x00;
    196198                new_volume->hr_ops.create = hr_raid0_create;
    197199                new_volume->hr_ops.init = hr_raid0_init;
     
    205207                break;
    206208        case HR_LVL_5:
     209                new_volume->RLQ = HR_RLQ_RAID5_NR;
    207210                new_volume->hr_ops.create = hr_raid5_create;
    208211                new_volume->hr_ops.init = hr_raid5_init;
  • uspace/srv/bd/hr/raid5.c

    r586b39d rd7768d11  
    9595        errno_t rc;
    9696
    97         assert(new_volume->level == HR_LVL_5);
     97        assert(new_volume->level == HR_LVL_5 || new_volume->level == HR_LVL_4);
    9898
    9999        if (new_volume->extent_no < 3) {
     
    121121        uint64_t total_blkno;
    122122
    123         assert(vol->level == HR_LVL_5);
     123        assert(vol->level == HR_LVL_5 || vol->level == HR_LVL_4);
    124124
    125125        rc = hr_check_devs(vol, &total_blkno, &bsize);
     
    531531                return rc;
    532532
     533        uint8_t RLQ = vol->RLQ;
     534        hr_level_t level = vol->level;
     535
    533536        uint64_t strip_size = vol->strip_size / vol->bsize; /* in blocks */
    534537        uint64_t stripe = (ba / strip_size); /* stripe number */
    535         uint64_t p_extent = (stripe / (vol->extent_no - 1)) % vol->extent_no; /* parity extent */
     538
     539        /* parity extent */
     540        uint64_t p_extent;
     541        if (level == HR_LVL_4 && RLQ == HR_RLQ_RAID4_0) {
     542                p_extent = 0;
     543        } else if (level == HR_LVL_4 && RLQ == HR_RLQ_RAID4_N) {
     544                p_extent = vol->extent_no - 1;
     545        } else if (level == HR_LVL_5 && RLQ == HR_RLQ_RAID5_0R) {
     546                p_extent = (stripe / (vol->extent_no - 1)) % vol->extent_no;
     547        } else if (level == HR_LVL_5 &&
     548            (RLQ == HR_RLQ_RAID5_NR || RLQ == HR_RLQ_RAID5_NC)) {
     549                p_extent = (vol->extent_no - 1) -
     550                    (stripe / (vol->extent_no - 1)) % vol->extent_no;
     551        } else {
     552                return EINVAL;
     553        }
     554
    536555        uint64_t extent;
    537         if ((stripe % (vol->extent_no - 1)) < p_extent)
    538                 extent = (stripe % (vol->extent_no - 1));
    539         else
    540                 extent = ((stripe % (vol->extent_no - 1)) + 1);
     556        if (level == HR_LVL_4 && RLQ == HR_RLQ_RAID4_0) {
     557                extent = (stripe % (vol->extent_no - 1)) + 1;
     558        } else if (level == HR_LVL_4 && RLQ == HR_RLQ_RAID4_N) {
     559                extent = stripe % (vol->extent_no - 1);
     560        } else if (level == HR_LVL_5 &&
     561            (RLQ == HR_RLQ_RAID5_0R || RLQ == HR_RLQ_RAID5_NR)) {
     562                if ((stripe % (vol->extent_no - 1)) < p_extent)
     563                        extent = stripe % (vol->extent_no - 1);
     564                else
     565                        extent = (stripe % (vol->extent_no - 1)) + 1;
     566        } else if (level == HR_LVL_5 && RLQ == HR_RLQ_RAID5_NC) {
     567                extent = ((stripe % (vol->extent_no - 1)) + p_extent + 1) % vol->extent_no;
     568        } else {
     569                return EINVAL;
     570        }
     571
    541572        uint64_t ext_stripe = stripe / (vol->extent_no - 1); /* stripe level */
    542573        uint64_t strip_off = ba % strip_size; /* strip offset */
     
    617648                left -= cnt;
    618649                strip_off = 0;
    619                 if (extent + 1 >= vol->extent_no ||
    620                     (extent + 1 == p_extent && p_extent + 1 >= vol->extent_no))
    621                         ext_stripe++;
    622650                stripe++;
    623                 p_extent = (stripe / (vol->extent_no - 1)) % vol->extent_no; /* parity extent */
    624                 if ((stripe % (vol->extent_no - 1)) < p_extent)
    625                         extent = (stripe % (vol->extent_no - 1));
    626                 else
    627                         extent = ((stripe % (vol->extent_no - 1)) + 1);
     651
     652                ext_stripe = stripe / (vol->extent_no - 1); /* stripe level */
     653
     654                if (level == HR_LVL_5 && RLQ == HR_RLQ_RAID5_0R) {
     655                        p_extent = (stripe / (vol->extent_no - 1)) % vol->extent_no;
     656                } else if (level == HR_LVL_5 &&
     657                    (RLQ == HR_RLQ_RAID5_NR || RLQ == HR_RLQ_RAID5_NC)) {
     658                        p_extent = (vol->extent_no - 1) -
     659                            (stripe / (vol->extent_no - 1)) % vol->extent_no;
     660                }
     661
     662                if (level == HR_LVL_4 && RLQ == HR_RLQ_RAID4_0) {
     663                        extent = (stripe % (vol->extent_no - 1)) + 1;
     664                } else if (level == HR_LVL_4 && RLQ == HR_RLQ_RAID4_N) {
     665                        extent = stripe % (vol->extent_no - 1);
     666                } else if (level == HR_LVL_5 &&
     667                    (RLQ == HR_RLQ_RAID5_0R || RLQ == HR_RLQ_RAID5_NR)) {
     668                        if ((stripe % (vol->extent_no - 1)) < p_extent)
     669                                extent = stripe % (vol->extent_no - 1);
     670                        else
     671                                extent = (stripe % (vol->extent_no - 1)) + 1;
     672                } else if (level == HR_LVL_5 && RLQ == HR_RLQ_RAID5_NC) {
     673                        extent = ((stripe % (vol->extent_no - 1)) + p_extent + 1) % vol->extent_no;
     674                }
    628675        }
    629676
  • uspace/srv/bd/hr/superblock.c

    r586b39d rd7768d11  
    153153
    154154        metadata->magic = host2uint64_t_le(HR_MAGIC);
     155        metadata->version = host2uint32_t_le(~(0U)); /* unused */
    155156        metadata->extent_no = host2uint32_t_le(vol->extent_no);
     157        /* index filled separately for each extent */
    156158        metadata->level = host2uint32_t_le(vol->level);
     159        metadata->layout = host2uint32_t_le(vol->RLQ);
     160        metadata->strip_size = host2uint32_t_le(vol->strip_size);
    157161        metadata->nblocks = host2uint64_t_le(vol->nblocks);
    158162        metadata->data_blkno = host2uint64_t_le(vol->data_blkno);
    159         metadata->data_offset = host2uint32_t_le(vol->data_offset);
    160         metadata->strip_size = host2uint32_t_le(vol->strip_size);
    161 
     163        metadata->data_offset = host2uint64_t_le(vol->data_offset);
     164        metadata->counter = host2uint64_t_le(~(0UL)); /* unused */
     165        /* UUID generated separately for each extent */
    162166        str_cpy(metadata->devname, HR_DEVNAME_LEN, vol->devname);
    163167
     
    231235        }
    232236
     237        /* TODO: handle version */
    233238        vol->level = uint32_t_le2host(metadata->level);
     239        vol->RLQ = (uint8_t)uint32_t_le2host(metadata->layout);
     240        vol->strip_size = uint32_t_le2host(metadata->strip_size);
    234241        vol->nblocks = uint64_t_le2host(metadata->nblocks);
    235242        vol->data_blkno = uint64_t_le2host(metadata->data_blkno);
    236         vol->data_offset = uint32_t_le2host(metadata->data_offset);
    237         vol->strip_size = uint32_t_le2host(metadata->strip_size);
     243        vol->data_offset = uint64_t_le2host(metadata->data_offset);
     244        vol->counter = uint64_t_le2host(0x00); /* unused */
    238245
    239246        if (str_cmp(metadata->devname, vol->devname) != 0) {
  • uspace/srv/bd/hr/superblock.h

    r586b39d rd7768d11  
    4848typedef struct hr_metadata {
    4949        uint64_t magic;
     50        uint32_t version;       /* unused XXX */
    5051        uint32_t extent_no;
     52
     53        uint32_t index;         /* index of disk in array */
    5154        uint32_t level;
     55        uint32_t layout;
     56        uint32_t strip_size;
     57
    5258        uint64_t nblocks;       /* all blocks */
    5359        uint64_t data_blkno;    /* usable blocks */
    54         uint32_t data_offset;   /* block where data starts */
    55         uint32_t index;         /* index of disk in array */
    56         uint32_t strip_size;
    57         uint32_t status;        /* yet unused */
     60
     61        uint64_t data_offset;   /* block where data starts */
     62
     63        uint64_t counter; /* unused */
     64
    5865        uint8_t uuid[HR_UUID_LEN];
     66
    5967        char devname[HR_DEVNAME_LEN];
    6068} hr_metadata_t;
  • uspace/srv/bd/hr/var.h

    r586b39d rd7768d11  
    7070        uint64_t nblocks;
    7171        uint64_t data_blkno;
    72         uint32_t data_offset; /* in blocks */
     72        uint64_t data_offset; /* in blocks */
    7373        uint32_t strip_size;
    7474
    7575        uint64_t rebuild_blk;
    7676
     77        uint64_t counter; /* metadata syncing */
     78
    7779        service_id_t svc_id;
    7880        hr_vol_status_t status;
    7981        hr_level_t level;
     82        /*
     83         * SNIA
     84         * Common RAID Disk Data Format
     85         * Specification
     86         * Version 2.0 Revision 19
     87         */
     88#define HR_RLQ_RAID4_0  0x00 /* RAID-4 Non-Rotating Parity 0 */
     89#define HR_RLQ_RAID4_N  0x01 /* RAID-4 Non-Rotating Parity N */
     90#define HR_RLQ_RAID5_0R 0x00 /* RAID-5 Rotating Parity 0 with Data Restart */
     91#define HR_RLQ_RAID5_NR 0x02 /* RAID-5 Rotating Parity N with Data Restart */
     92#define HR_RLQ_RAID5_NC 0x03 /* RAID-5 Rotating Parity N with Data Continuation */
     93        uint8_t RLQ; /* RAID Level Qualifier */
    8094        char devname[HR_DEVNAME_LEN];
    8195} hr_volume_t;
Note: See TracChangeset for help on using the changeset viewer.