diff options
author | Ming Lei <tom.leiming@gmail.com> | 2017-02-14 10:29:03 -0500 |
---|---|---|
committer | Shaohua Li <shli@fb.com> | 2017-02-15 14:24:54 -0500 |
commit | d7a1030839d35c04a620e841f406b9b2a8600041 (patch) | |
tree | 293b09d7b92528436daa8953c9202cf669702037 /drivers/md/raid1.c | |
parent | ed7ef732ca9f7d6f42be8df6cc7bf4ace3534af3 (diff) |
md: fast clone bio in bio_clone_mddev()
Firstly bio_clone_mddev() is used in raid normal I/O and isn't
in resync I/O path.
Secondly all the direct access to bvec table in raid happens on
resync I/O except for write behind of raid1, in which we still
use bio_clone() for allocating new bvec table.
So this patch replaces bio_clone() with bio_clone_fast()
in bio_clone_mddev().
Also kill bio_clone_mddev() and call bio_clone_fast() directly, as
suggested by Christoph Hellwig.
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Ming Lei <tom.leiming@gmail.com>
Signed-off-by: Shaohua Li <shli@fb.com>
Diffstat (limited to 'drivers/md/raid1.c')
-rw-r--r-- | drivers/md/raid1.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 691d6d9bf740..ad5c9483bd50 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
@@ -1108,7 +1108,7 @@ read_again: | |||
1108 | r1_bio->read_disk = rdisk; | 1108 | r1_bio->read_disk = rdisk; |
1109 | r1_bio->start_next_window = 0; | 1109 | r1_bio->start_next_window = 0; |
1110 | 1110 | ||
1111 | read_bio = bio_clone_mddev(bio, GFP_NOIO, mddev); | 1111 | read_bio = bio_clone_fast(bio, GFP_NOIO, mddev->bio_set); |
1112 | bio_trim(read_bio, r1_bio->sector - bio->bi_iter.bi_sector, | 1112 | bio_trim(read_bio, r1_bio->sector - bio->bi_iter.bi_sector, |
1113 | max_sectors); | 1113 | max_sectors); |
1114 | 1114 | ||
@@ -1376,7 +1376,7 @@ static void raid1_write_request(struct mddev *mddev, struct bio *bio, | |||
1376 | } | 1376 | } |
1377 | 1377 | ||
1378 | if (!mbio) { | 1378 | if (!mbio) { |
1379 | mbio = bio_clone_mddev(bio, GFP_NOIO, mddev); | 1379 | mbio = bio_clone_fast(bio, GFP_NOIO, mddev->bio_set); |
1380 | bio_trim(mbio, offset, max_sectors); | 1380 | bio_trim(mbio, offset, max_sectors); |
1381 | } | 1381 | } |
1382 | 1382 | ||
@@ -2286,7 +2286,8 @@ static int narrow_write_error(struct r1bio *r1_bio, int i) | |||
2286 | 2286 | ||
2287 | wbio->bi_vcnt = vcnt; | 2287 | wbio->bi_vcnt = vcnt; |
2288 | } else { | 2288 | } else { |
2289 | wbio = bio_clone_mddev(r1_bio->master_bio, GFP_NOIO, mddev); | 2289 | wbio = bio_clone_fast(r1_bio->master_bio, GFP_NOIO, |
2290 | mddev->bio_set); | ||
2290 | } | 2291 | } |
2291 | 2292 | ||
2292 | bio_set_op_attrs(wbio, REQ_OP_WRITE, 0); | 2293 | bio_set_op_attrs(wbio, REQ_OP_WRITE, 0); |
@@ -2424,7 +2425,8 @@ read_more: | |||
2424 | const unsigned long do_sync | 2425 | const unsigned long do_sync |
2425 | = r1_bio->master_bio->bi_opf & REQ_SYNC; | 2426 | = r1_bio->master_bio->bi_opf & REQ_SYNC; |
2426 | r1_bio->read_disk = disk; | 2427 | r1_bio->read_disk = disk; |
2427 | bio = bio_clone_mddev(r1_bio->master_bio, GFP_NOIO, mddev); | 2428 | bio = bio_clone_fast(r1_bio->master_bio, GFP_NOIO, |
2429 | mddev->bio_set); | ||
2428 | bio_trim(bio, r1_bio->sector - bio->bi_iter.bi_sector, | 2430 | bio_trim(bio, r1_bio->sector - bio->bi_iter.bi_sector, |
2429 | max_sectors); | 2431 | max_sectors); |
2430 | r1_bio->bios[r1_bio->read_disk] = bio; | 2432 | r1_bio->bios[r1_bio->read_disk] = bio; |