Changeset d7768d11 in mainline for uspace/srv/bd/hr/raid5.c
- Timestamp:
- 2024-12-06T19:46:43Z (6 months ago)
- Children:
- 241c3f6
- Parents:
- 586b39d
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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
Note:
See TracChangeset
for help on using the changeset viewer.