aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/exofs/ore.c10
-rw-r--r--fs/exofs/ore_raid.c13
-rw-r--r--fs/exofs/ore_raid.h18
3 files changed, 10 insertions, 31 deletions
diff --git a/fs/exofs/ore.c b/fs/exofs/ore.c
index 92157b6971b3..0e2a8353f7cc 100644
--- a/fs/exofs/ore.c
+++ b/fs/exofs/ore.c
@@ -545,17 +545,19 @@ void ore_calc_stripe_info(struct ore_layout *layout, u64 file_offset,
545 545
546 /* "H - (N * U)" is just "H % U" so it's bound to u32 */ 546 /* "H - (N * U)" is just "H % U" so it's bound to u32 */
547 u32 C = (u32)(H - (N * U)) / stripe_unit + G * group_width; 547 u32 C = (u32)(H - (N * U)) / stripe_unit + G * group_width;
548 u32 first_dev = C - C % group_width;
548 549
549 div_u64_rem(file_offset, stripe_unit, &si->unit_off); 550 div_u64_rem(file_offset, stripe_unit, &si->unit_off);
550 551
551 si->obj_offset = si->unit_off + (N * stripe_unit) + 552 si->obj_offset = si->unit_off + (N * stripe_unit) +
552 (M * group_depth * stripe_unit); 553 (M * group_depth * stripe_unit);
554 si->cur_comp = C - first_dev;
555 si->cur_pg = si->unit_off / PAGE_SIZE;
553 556
554 if (parity) { 557 if (parity) {
555 u32 LCMdP = lcm(group_width, parity) / parity; 558 u32 LCMdP = lcm(group_width, parity) / parity;
556 /* R = N % LCMdP; */ 559 /* R = N % LCMdP; */
557 u32 RxP = (N % LCMdP) * parity; 560 u32 RxP = (N % LCMdP) * parity;
558 u32 first_dev = C - C % group_width;
559 561
560 si->par_dev = (group_width + group_width - parity - RxP) % 562 si->par_dev = (group_width + group_width - parity - RxP) %
561 group_width + first_dev; 563 group_width + first_dev;
@@ -670,9 +672,7 @@ static int _prepare_for_striping(struct ore_io_state *ios)
670 672
671 BUG_ON(length > si->length); 673 BUG_ON(length > si->length);
672 674
673 dev_order = _dev_order(devs_in_group, mirrors_p1, si->par_dev, dev); 675 dev_order = si->cur_comp;
674 si->cur_comp = dev_order;
675 si->cur_pg = si->unit_off / PAGE_SIZE;
676 676
677 while (length) { 677 while (length) {
678 struct ore_per_dev_state *per_dev = 678 struct ore_per_dev_state *per_dev =
@@ -718,6 +718,8 @@ static int _prepare_for_striping(struct ore_io_state *ios)
718 * stripe. then operate on parity dev. 718 * stripe. then operate on parity dev.
719 */ 719 */
720 dev = si->par_dev; 720 dev = si->par_dev;
721 /* If last stripe operate on parity comp */
722 si->cur_comp = group_width - ios->layout->parity;
721 } 723 }
722 per_dev = &ios->per_dev[dev - first_dev]; 724 per_dev = &ios->per_dev[dev - first_dev];
723 if (!per_dev->length) { 725 if (!per_dev->length) {
diff --git a/fs/exofs/ore_raid.c b/fs/exofs/ore_raid.c
index af417d351535..d58a952e28bc 100644
--- a/fs/exofs/ore_raid.c
+++ b/fs/exofs/ore_raid.c
@@ -402,9 +402,8 @@ static int _add_to_r4w_last_page(struct ore_io_state *ios, u64 *offset)
402 402
403 ore_calc_stripe_info(ios->layout, *offset, 0, &si); 403 ore_calc_stripe_info(ios->layout, *offset, 0, &si);
404 404
405 p = si.unit_off / PAGE_SIZE; 405 p = si.cur_pg;
406 c = _dev_order(ios->layout->group_width * ios->layout->mirrors_p1, 406 c = si.cur_comp;
407 ios->layout->mirrors_p1, si.par_dev, si.dev);
408 page = ios->sp2d->_1p_stripes[p].pages[c]; 407 page = ios->sp2d->_1p_stripes[p].pages[c];
409 408
410 pg_len = PAGE_SIZE - (si.unit_off % PAGE_SIZE); 409 pg_len = PAGE_SIZE - (si.unit_off % PAGE_SIZE);
@@ -532,9 +531,8 @@ static int _read_4_write_last_stripe(struct ore_io_state *ios)
532 goto read_it; 531 goto read_it;
533 532
534 ore_calc_stripe_info(ios->layout, offset, 0, &read_si); 533 ore_calc_stripe_info(ios->layout, offset, 0, &read_si);
535 p = read_si.unit_off / PAGE_SIZE; 534 p = read_si.cur_pg;
536 c = _dev_order(ios->layout->group_width * ios->layout->mirrors_p1, 535 c = read_si.cur_comp;
537 ios->layout->mirrors_p1, read_si.par_dev, read_si.dev);
538 536
539 if (min_p == sp2d->pages_in_unit) { 537 if (min_p == sp2d->pages_in_unit) {
540 /* Didn't do it yet */ 538 /* Didn't do it yet */
@@ -638,9 +636,6 @@ int _ore_add_parity_unit(struct ore_io_state *ios,
638 si->cur_pg = _sp2d_min_pg(sp2d); 636 si->cur_pg = _sp2d_min_pg(sp2d);
639 num_pages = _sp2d_max_pg(sp2d) + 1 - si->cur_pg; 637 num_pages = _sp2d_max_pg(sp2d) + 1 - si->cur_pg;
640 638
641 if (!cur_len) /* If last stripe operate on parity comp */
642 si->cur_comp = sp2d->data_devs;
643
644 if (!per_dev->length) { 639 if (!per_dev->length) {
645 per_dev->offset += si->cur_pg * PAGE_SIZE; 640 per_dev->offset += si->cur_pg * PAGE_SIZE;
646 /* If first stripe, Read in all read4write pages 641 /* If first stripe, Read in all read4write pages
diff --git a/fs/exofs/ore_raid.h b/fs/exofs/ore_raid.h
index 2ffd2c3c6e46..d365bda6beef 100644
--- a/fs/exofs/ore_raid.h
+++ b/fs/exofs/ore_raid.h
@@ -31,24 +31,6 @@
31#define ORE_DBGMSG2(M...) do {} while (0) 31#define ORE_DBGMSG2(M...) do {} while (0)
32/* #define ORE_DBGMSG2 ORE_DBGMSG */ 32/* #define ORE_DBGMSG2 ORE_DBGMSG */
33 33
34/* Calculate the component order in a stripe. eg the logical data unit
35 * address within the stripe of @dev given the @par_dev of this stripe.
36 */
37static inline unsigned _dev_order(unsigned devs_in_group, unsigned mirrors_p1,
38 unsigned par_dev, unsigned dev)
39{
40 unsigned first_dev = dev - dev % devs_in_group;
41
42 dev -= first_dev;
43 par_dev -= first_dev;
44
45 if (devs_in_group == par_dev) /* The raid 0 case */
46 return dev / mirrors_p1;
47 /* raid4/5/6 case */
48 return ((devs_in_group + dev - par_dev - mirrors_p1) % devs_in_group) /
49 mirrors_p1;
50}
51
52/* ios_raid.c stuff needed by ios.c */ 34/* ios_raid.c stuff needed by ios.c */
53int _ore_post_alloc_raid_stuff(struct ore_io_state *ios); 35int _ore_post_alloc_raid_stuff(struct ore_io_state *ios);
54void _ore_free_raid_stuff(struct ore_io_state *ios); 36void _ore_free_raid_stuff(struct ore_io_state *ios);