md/raid1: skip data copy for behind io for discard request
authorShaohua Li <shli@fb.com>
Fri, 24 Mar 2017 22:20:47 +0000 (15:20 -0700)
committerShaohua Li <shli@fb.com>
Sat, 25 Mar 2017 16:38:06 +0000 (09:38 -0700)
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>
drivers/md/raid1.c

index c6a671f13bc0b8a2a35915cad72c99dca94b6c6b..b7d9651286d4d73e3b24f208b1081e0a85308d53 100644 (file)
@@ -1102,6 +1102,10 @@ static struct bio *alloc_behind_master_bio(struct r1bio *r1_bio,
        if (!behind_bio)
                goto fail;
 
+       /* discard op, we don't support writezero/writesame yet */
+       if (!bio_has_data(bio))
+               goto skip_copy;
+
        while (i < vcnt && size) {
                struct page *page;
                int len = min_t(int, PAGE_SIZE, size);
@@ -1118,7 +1122,7 @@ static struct bio *alloc_behind_master_bio(struct r1bio *r1_bio,
 
        bio_copy_data_partial(behind_bio, bio, offset,
                              behind_bio->bi_iter.bi_size);
-
+skip_copy:
        r1_bio->behind_master_bio = behind_bio;;
        set_bit(R1BIO_BehindIO, &r1_bio->state);