Commit 44cf0f4d authored by Ming Lei's avatar Ming Lei Committed by Shaohua Li

md: raid1: retrieve page from pre-allocated resync page array

Now one page array is allocated for each resync bio, and we can
retrieve page from this table directly.
Signed-off-by: default avatarMing Lei <tom.leiming@gmail.com>
Signed-off-by: default avatarShaohua Li <shli@fb.com>
parent 98d30c58
...@@ -1973,6 +1973,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio) ...@@ -1973,6 +1973,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio)
struct mddev *mddev = r1_bio->mddev; struct mddev *mddev = r1_bio->mddev;
struct r1conf *conf = mddev->private; struct r1conf *conf = mddev->private;
struct bio *bio = r1_bio->bios[r1_bio->read_disk]; struct bio *bio = r1_bio->bios[r1_bio->read_disk];
struct page **pages = get_resync_pages(bio)->pages;
sector_t sect = r1_bio->sector; sector_t sect = r1_bio->sector;
int sectors = r1_bio->sectors; int sectors = r1_bio->sectors;
int idx = 0; int idx = 0;
...@@ -2006,7 +2007,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio) ...@@ -2006,7 +2007,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio)
*/ */
rdev = conf->mirrors[d].rdev; rdev = conf->mirrors[d].rdev;
if (sync_page_io(rdev, sect, s<<9, if (sync_page_io(rdev, sect, s<<9,
bio->bi_io_vec[idx].bv_page, pages[idx],
REQ_OP_READ, 0, false)) { REQ_OP_READ, 0, false)) {
success = 1; success = 1;
break; break;
...@@ -2061,7 +2062,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio) ...@@ -2061,7 +2062,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio)
continue; continue;
rdev = conf->mirrors[d].rdev; rdev = conf->mirrors[d].rdev;
if (r1_sync_page_io(rdev, sect, s, if (r1_sync_page_io(rdev, sect, s,
bio->bi_io_vec[idx].bv_page, pages[idx],
WRITE) == 0) { WRITE) == 0) {
r1_bio->bios[d]->bi_end_io = NULL; r1_bio->bios[d]->bi_end_io = NULL;
rdev_dec_pending(rdev, mddev); rdev_dec_pending(rdev, mddev);
...@@ -2076,7 +2077,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio) ...@@ -2076,7 +2077,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio)
continue; continue;
rdev = conf->mirrors[d].rdev; rdev = conf->mirrors[d].rdev;
if (r1_sync_page_io(rdev, sect, s, if (r1_sync_page_io(rdev, sect, s,
bio->bi_io_vec[idx].bv_page, pages[idx],
READ) != 0) READ) != 0)
atomic_add(s, &rdev->corrected_errors); atomic_add(s, &rdev->corrected_errors);
} }
...@@ -2152,6 +2153,8 @@ static void process_checks(struct r1bio *r1_bio) ...@@ -2152,6 +2153,8 @@ static void process_checks(struct r1bio *r1_bio)
struct bio *pbio = r1_bio->bios[primary]; struct bio *pbio = r1_bio->bios[primary];
struct bio *sbio = r1_bio->bios[i]; struct bio *sbio = r1_bio->bios[i];
int error = sbio->bi_error; int error = sbio->bi_error;
struct page **ppages = get_resync_pages(pbio)->pages;
struct page **spages = get_resync_pages(sbio)->pages;
if (sbio->bi_end_io != end_sync_read) if (sbio->bi_end_io != end_sync_read)
continue; continue;
...@@ -2160,11 +2163,8 @@ static void process_checks(struct r1bio *r1_bio) ...@@ -2160,11 +2163,8 @@ static void process_checks(struct r1bio *r1_bio)
if (!error) { if (!error) {
for (j = vcnt; j-- ; ) { for (j = vcnt; j-- ; ) {
struct page *p, *s; if (memcmp(page_address(ppages[j]),
p = pbio->bi_io_vec[j].bv_page; page_address(spages[j]),
s = sbio->bi_io_vec[j].bv_page;
if (memcmp(page_address(p),
page_address(s),
sbio->bi_io_vec[j].bv_len)) sbio->bi_io_vec[j].bv_len))
break; break;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment