Changeset d7768d11 in mainline
- Timestamp:
- 2024-12-06T19:46:43Z (6 months ago)
- Children:
- 241c3f6
- Parents:
- 586b39d
- Location:
- uspace/srv/bd/hr
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/bd/hr/hr.c
r586b39d rd7768d11 188 188 switch (new_volume->level) { 189 189 case HR_LVL_1: 190 new_volume->RLQ = 0x00; /* XXX: yet unused */ 190 191 new_volume->hr_ops.create = hr_raid1_create; 191 192 new_volume->hr_ops.init = hr_raid1_init; … … 194 195 break; 195 196 case HR_LVL_0: 197 new_volume->RLQ = 0x00; 196 198 new_volume->hr_ops.create = hr_raid0_create; 197 199 new_volume->hr_ops.init = hr_raid0_init; … … 205 207 break; 206 208 case HR_LVL_5: 209 new_volume->RLQ = HR_RLQ_RAID5_NR; 207 210 new_volume->hr_ops.create = hr_raid5_create; 208 211 new_volume->hr_ops.init = hr_raid5_init; -
uspace/srv/bd/hr/raid5.c
r586b39d rd7768d11 95 95 errno_t rc; 96 96 97 assert(new_volume->level == HR_LVL_5 );97 assert(new_volume->level == HR_LVL_5 || new_volume->level == HR_LVL_4); 98 98 99 99 if (new_volume->extent_no < 3) { … … 121 121 uint64_t total_blkno; 122 122 123 assert(vol->level == HR_LVL_5 );123 assert(vol->level == HR_LVL_5 || vol->level == HR_LVL_4); 124 124 125 125 rc = hr_check_devs(vol, &total_blkno, &bsize); … … 531 531 return rc; 532 532 533 uint8_t RLQ = vol->RLQ; 534 hr_level_t level = vol->level; 535 533 536 uint64_t strip_size = vol->strip_size / vol->bsize; /* in blocks */ 534 537 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 536 555 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 541 572 uint64_t ext_stripe = stripe / (vol->extent_no - 1); /* stripe level */ 542 573 uint64_t strip_off = ba % strip_size; /* strip offset */ … … 617 648 left -= cnt; 618 649 strip_off = 0; 619 if (extent + 1 >= vol->extent_no ||620 (extent + 1 == p_extent && p_extent + 1 >= vol->extent_no))621 ext_stripe++;622 650 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 } 628 675 } 629 676 -
uspace/srv/bd/hr/superblock.c
r586b39d rd7768d11 153 153 154 154 metadata->magic = host2uint64_t_le(HR_MAGIC); 155 metadata->version = host2uint32_t_le(~(0U)); /* unused */ 155 156 metadata->extent_no = host2uint32_t_le(vol->extent_no); 157 /* index filled separately for each extent */ 156 158 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); 157 161 metadata->nblocks = host2uint64_t_le(vol->nblocks); 158 162 metadata->data_blkno = host2uint64_t_le(vol->data_blkno); 159 metadata->data_offset = host2uint 32_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 */ 162 166 str_cpy(metadata->devname, HR_DEVNAME_LEN, vol->devname); 163 167 … … 231 235 } 232 236 237 /* TODO: handle version */ 233 238 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); 234 241 vol->nblocks = uint64_t_le2host(metadata->nblocks); 235 242 vol->data_blkno = uint64_t_le2host(metadata->data_blkno); 236 vol->data_offset = uint 32_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 */ 238 245 239 246 if (str_cmp(metadata->devname, vol->devname) != 0) { -
uspace/srv/bd/hr/superblock.h
r586b39d rd7768d11 48 48 typedef struct hr_metadata { 49 49 uint64_t magic; 50 uint32_t version; /* unused XXX */ 50 51 uint32_t extent_no; 52 53 uint32_t index; /* index of disk in array */ 51 54 uint32_t level; 55 uint32_t layout; 56 uint32_t strip_size; 57 52 58 uint64_t nblocks; /* all blocks */ 53 59 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 58 65 uint8_t uuid[HR_UUID_LEN]; 66 59 67 char devname[HR_DEVNAME_LEN]; 60 68 } hr_metadata_t; -
uspace/srv/bd/hr/var.h
r586b39d rd7768d11 70 70 uint64_t nblocks; 71 71 uint64_t data_blkno; 72 uint 32_t data_offset; /* in blocks */72 uint64_t data_offset; /* in blocks */ 73 73 uint32_t strip_size; 74 74 75 75 uint64_t rebuild_blk; 76 76 77 uint64_t counter; /* metadata syncing */ 78 77 79 service_id_t svc_id; 78 80 hr_vol_status_t status; 79 81 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 */ 80 94 char devname[HR_DEVNAME_LEN]; 81 95 } hr_volume_t;
Note:
See TracChangeset
for help on using the changeset viewer.