md: raid1: retrieve page from pre-allocated resync page array
authorMing Lei <tom.leiming@gmail.com>
Thu, 16 Mar 2017 16:12:27 +0000 (00:12 +0800)
committerShaohua Li <shli@fb.com>
Fri, 24 Mar 2017 17:41:36 +0000 (10:41 -0700)
Now one page array is allocated for each resync bio, and we can
retrieve page from this table directly.

Signed-off-by: Ming Lei <tom.leiming@gmail.com>
Signed-off-by: Shaohua Li <shli@fb.com>
drivers/md/raid1.c

index 89a384bdae29e154336054ebd35cd1617a66d6c2..21ef09ae5123091199607c781e6fdc57264f436e 100644 (file)
@@ -1973,6 +1973,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio)
        struct mddev *mddev = r1_bio->mddev;
        struct r1conf *conf = mddev->private;
        struct bio *bio = r1_bio->bios[r1_bio->read_disk];
+       struct page **pages = get_resync_pages(bio)->pages;
        sector_t sect = r1_bio->sector;
        int sectors = r1_bio->sectors;
        int idx = 0;
@@ -2006,7 +2007,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio)
                                 */
                                rdev = conf->mirrors[d].rdev;
                                if (sync_page_io(rdev, sect, s<<9,
-                                                bio->bi_io_vec[idx].bv_page,
+                                                pages[idx],
                                                 REQ_OP_READ, 0, false)) {
                                        success = 1;
                                        break;
@@ -2061,7 +2062,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio)
                                continue;
                        rdev = conf->mirrors[d].rdev;
                        if (r1_sync_page_io(rdev, sect, s,
-                                           bio->bi_io_vec[idx].bv_page,
+                                           pages[idx],
                                            WRITE) == 0) {
                                r1_bio->bios[d]->bi_end_io = NULL;
                                rdev_dec_pending(rdev, mddev);
@@ -2076,7 +2077,7 @@ static int fix_sync_read_error(struct r1bio *r1_bio)
                                continue;
                        rdev = conf->mirrors[d].rdev;
                        if (r1_sync_page_io(rdev, sect, s,
-                                           bio->bi_io_vec[idx].bv_page,
+                                           pages[idx],
                                            READ) != 0)
                                atomic_add(s, &rdev->corrected_errors);
                }
@@ -2152,6 +2153,8 @@ static void process_checks(struct r1bio *r1_bio)
                struct bio *pbio = r1_bio->bios[primary];
                struct bio *sbio = r1_bio->bios[i];
                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)
                        continue;
@@ -2160,11 +2163,8 @@ static void process_checks(struct r1bio *r1_bio)
 
                if (!error) {
                        for (j = vcnt; j-- ; ) {
-                               struct page *p, *s;
-                               p = pbio->bi_io_vec[j].bv_page;
-                               s = sbio->bi_io_vec[j].bv_page;
-                               if (memcmp(page_address(p),
-                                          page_address(s),
+                               if (memcmp(page_address(ppages[j]),
+                                          page_address(spages[j]),
                                           sbio->bi_io_vec[j].bv_len))
                                        break;
                        }