aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/raid1.c
diff options
context:
space:
mode:
authorShaohua Li <shli@fb.com>2017-03-24 18:20:47 -0400
committerShaohua Li <shli@fb.com>2017-03-25 12:38:06 -0400
commit41743c1f046a14c6749fd1808bb3793c08e47a3e (patch)
tree2e4c01da3f7cda8e5903dcc9e786e0bbc284261f /drivers/md/raid1.c
parentf45958756fef552436e4a63029a168495920026e (diff)
md/raid1: skip data copy for behind io for discard request
discard request doesn't have data attached, so it's meaningless to allocate memory and copy from original bio for behind IO. And the copy is bogus because bio_copy_data_partial can't handle discard request. We don't support writesame/writezeros request so far. Reviewed-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.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index c6a671f13bc0..b7d9651286d4 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -1102,6 +1102,10 @@ static struct bio *alloc_behind_master_bio(struct r1bio *r1_bio,
1102 if (!behind_bio) 1102 if (!behind_bio)
1103 goto fail; 1103 goto fail;
1104 1104
1105 /* discard op, we don't support writezero/writesame yet */
1106 if (!bio_has_data(bio))
1107 goto skip_copy;
1108
1105 while (i < vcnt && size) { 1109 while (i < vcnt && size) {
1106 struct page *page; 1110 struct page *page;
1107 int len = min_t(int, PAGE_SIZE, size); 1111 int len = min_t(int, PAGE_SIZE, size);
@@ -1118,7 +1122,7 @@ static struct bio *alloc_behind_master_bio(struct r1bio *r1_bio,
1118 1122
1119 bio_copy_data_partial(behind_bio, bio, offset, 1123 bio_copy_data_partial(behind_bio, bio, offset,
1120 behind_bio->bi_iter.bi_size); 1124 behind_bio->bi_iter.bi_size);
1121 1125skip_copy:
1122 r1_bio->behind_master_bio = behind_bio;; 1126 r1_bio->behind_master_bio = behind_bio;;
1123 set_bit(R1BIO_BehindIO, &r1_bio->state); 1127 set_bit(R1BIO_BehindIO, &r1_bio->state);
1124 1128