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


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.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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
Note: See TracChangeset for help on using the changeset viewer.