md/raid5: move checking badblock before clone bio in raid5_read_one_chunk
authorGuoqing Jiang <jgq516@gmail.com>
Tue, 25 May 2021 09:46:18 +0000 (17:46 +0800)
committerSong Liu <song@kernel.org>
Tue, 15 Jun 2021 05:32:06 +0000 (22:32 -0700)
We don't need to clone bio if the relevant region has badblock.

Signed-off-by: Guoqing Jiang <jiangguoqing@kylinos.cn>
Signed-off-by: Song Liu <song@kernel.org>
drivers/md/raid5.c

index 58e9dbc..5a05277 100644 (file)
@@ -5427,6 +5427,13 @@ static int raid5_read_one_chunk(struct mddev *mddev, struct bio *raid_bio)
        atomic_inc(&rdev->nr_pending);
        rcu_read_unlock();
 
+       if (is_badblock(rdev, sector, bio_sectors(raid_bio), &first_bad,
+                       &bad_sectors)) {
+               bio_put(raid_bio);
+               rdev_dec_pending(rdev, mddev);
+               return 0;
+       }
+
        align_bio = bio_clone_fast(raid_bio, GFP_NOIO, &mddev->bio_set);
        bio_set_dev(align_bio, rdev->bdev);
        align_bio->bi_end_io = raid5_align_endio;
@@ -5435,13 +5442,6 @@ static int raid5_read_one_chunk(struct mddev *mddev, struct bio *raid_bio)
 
        raid_bio->bi_next = (void *)rdev;
 
-       if (is_badblock(rdev, sector, bio_sectors(align_bio), &first_bad,
-                       &bad_sectors)) {
-               bio_put(align_bio);
-               rdev_dec_pending(rdev, mddev);
-               return 0;
-       }
-
        /* No reshape active, so we can trust rdev->data_offset */
        align_bio->bi_iter.bi_sector += rdev->data_offset;