aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/raid1.c
diff options
context:
space:
mode:
authorMing Lei <ming.lei@redhat.com>2017-07-14 04:14:43 -0400
committerShaohua Li <shli@fb.com>2017-07-21 15:47:20 -0400
commitfb0eb5df09307603b21845af1d143cc910154593 (patch)
tree7415f28242bf25b9351bde3ea2bd7fcadede3392 /drivers/md/raid1.c
parent022e510fcbda79183fd2cdc01abb01b4be80d03f (diff)
md: raid1/raid10: initialize bvec table via bio_add_page()
We will support multipage bvec soon, so initialize bvec table using the standardy way instead of writing the talbe directly. Otherwise it won't work any more once multipage bvec is enabled. Acked-by: Guoqing Jiang <gqjiang@suse.com> Signed-off-by: Ming Lei <ming.lei@redhat.com> Signed-off-by: Shaohua Li <shli@fb.com>
Diffstat (limited to 'drivers/md/raid1.c')
-rw-r--r--drivers/md/raid1.c18
1 files changed, 4 insertions, 14 deletions
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index 0896c772a560..fe86ab18961b 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -81,6 +81,8 @@ static void lower_barrier(struct r1conf *conf, sector_t sector_nr);
81#define raid1_log(md, fmt, args...) \ 81#define raid1_log(md, fmt, args...) \
82 do { if ((md)->queue) blk_add_trace_msg((md)->queue, "raid1 " fmt, ##args); } while (0) 82 do { if ((md)->queue) blk_add_trace_msg((md)->queue, "raid1 " fmt, ##args); } while (0)
83 83
84#include "raid1-10.c"
85
84/* 86/*
85 * 'strct resync_pages' stores actual pages used for doing the resync 87 * 'strct resync_pages' stores actual pages used for doing the resync
86 * IO, and it is per-bio, so make .bi_private points to it. 88 * IO, and it is per-bio, so make .bi_private points to it.
@@ -2085,10 +2087,7 @@ static void process_checks(struct r1bio *r1_bio)
2085 /* Fix variable parts of all bios */ 2087 /* Fix variable parts of all bios */
2086 vcnt = (r1_bio->sectors + PAGE_SIZE / 512 - 1) >> (PAGE_SHIFT - 9); 2088 vcnt = (r1_bio->sectors + PAGE_SIZE / 512 - 1) >> (PAGE_SHIFT - 9);
2087 for (i = 0; i < conf->raid_disks * 2; i++) { 2089 for (i = 0; i < conf->raid_disks * 2; i++) {
2088 int j;
2089 int size;
2090 blk_status_t status; 2090 blk_status_t status;
2091 struct bio_vec *bi;
2092 struct bio *b = r1_bio->bios[i]; 2091 struct bio *b = r1_bio->bios[i];
2093 struct resync_pages *rp = get_resync_pages(b); 2092 struct resync_pages *rp = get_resync_pages(b);
2094 if (b->bi_end_io != end_sync_read) 2093 if (b->bi_end_io != end_sync_read)
@@ -2097,8 +2096,6 @@ static void process_checks(struct r1bio *r1_bio)
2097 status = b->bi_status; 2096 status = b->bi_status;
2098 bio_reset(b); 2097 bio_reset(b);
2099 b->bi_status = status; 2098 b->bi_status = status;
2100 b->bi_vcnt = vcnt;
2101 b->bi_iter.bi_size = r1_bio->sectors << 9;
2102 b->bi_iter.bi_sector = r1_bio->sector + 2099 b->bi_iter.bi_sector = r1_bio->sector +
2103 conf->mirrors[i].rdev->data_offset; 2100 conf->mirrors[i].rdev->data_offset;
2104 b->bi_bdev = conf->mirrors[i].rdev->bdev; 2101 b->bi_bdev = conf->mirrors[i].rdev->bdev;
@@ -2106,15 +2103,8 @@ static void process_checks(struct r1bio *r1_bio)
2106 rp->raid_bio = r1_bio; 2103 rp->raid_bio = r1_bio;
2107 b->bi_private = rp; 2104 b->bi_private = rp;
2108 2105
2109 size = b->bi_iter.bi_size; 2106 /* initialize bvec table again */
2110 bio_for_each_segment_all(bi, b, j) { 2107 md_bio_reset_resync_pages(b, rp, r1_bio->sectors << 9);
2111 bi->bv_offset = 0;
2112 if (size > PAGE_SIZE)
2113 bi->bv_len = PAGE_SIZE;
2114 else
2115 bi->bv_len = size;
2116 size -= PAGE_SIZE;
2117 }
2118 } 2108 }
2119 for (primary = 0; primary < conf->raid_disks * 2; primary++) 2109 for (primary = 0; primary < conf->raid_disks * 2; primary++)
2120 if (r1_bio->bios[primary]->bi_end_io == end_sync_read && 2110 if (r1_bio->bios[primary]->bi_end_io == end_sync_read &&