From ebaa220aa5955313f3fe7711440c3d163aec6f26 Mon Sep 17 00:00:00 2001 From: Namhyung Kim Date: Mon, 18 Jul 2011 17:38:49 +1000 Subject: [PATCH] --- yaml --- r: 260970 b: refs/heads/master c: c65060ad4274f70048d62e0a86332cd3fd23f28d h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/md/raid10.c | 23 ++++++++++++----------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/[refs] b/[refs] index f518b30dc69f..65229e66d677 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 778ca01852e6cc9ff335119b37a1938a978df384 +refs/heads/master: c65060ad4274f70048d62e0a86332cd3fd23f28d diff --git a/trunk/drivers/md/raid10.c b/trunk/drivers/md/raid10.c index e434f1e8d223..3715e220e5e0 100644 --- a/trunk/drivers/md/raid10.c +++ b/trunk/drivers/md/raid10.c @@ -123,7 +123,14 @@ static void * r10buf_pool_alloc(gfp_t gfp_flags, void *data) for (j = 0 ; j < nalloc; j++) { bio = r10_bio->devs[j].bio; for (i = 0; i < RESYNC_PAGES; i++) { - page = alloc_page(gfp_flags); + if (j == 1 && !test_bit(MD_RECOVERY_SYNC, + &conf->mddev->recovery)) { + /* we can share bv_page's during recovery */ + struct bio *rbio = r10_bio->devs[0].bio; + page = rbio->bi_io_vec[i].bv_page; + get_page(page); + } else + page = alloc_page(gfp_flags); if (unlikely(!page)) goto out_free_pages; @@ -1360,20 +1367,14 @@ static void sync_request_write(mddev_t *mddev, r10bio_t *r10_bio) static void recovery_request_write(mddev_t *mddev, r10bio_t *r10_bio) { conf_t *conf = mddev->private; - int i, d; - struct bio *bio, *wbio; - + int d; + struct bio *wbio; - /* move the pages across to the second bio + /* + * share the pages with the first bio * and submit the write request */ - bio = r10_bio->devs[0].bio; wbio = r10_bio->devs[1].bio; - for (i=0; i < wbio->bi_vcnt; i++) { - struct page *p = bio->bi_io_vec[i].bv_page; - bio->bi_io_vec[i].bv_page = wbio->bi_io_vec[i].bv_page; - wbio->bi_io_vec[i].bv_page = p; - } d = r10_bio->devs[1].devnum; atomic_inc(&conf->mirrors[d].rdev->nr_pending);