From: Yu Kuai Date: Thu, 31 Oct 2024 03:31:14 +0000 (+0800) Subject: md/raid5: don't set Faulty rdev for blocked_rdev X-Git-Tag: v6.13-rc1~211^2~39^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=649bfec6908bd2365008db79b7328c6c22e662d8;p=thirdparty%2Fkernel%2Flinux.git md/raid5: don't set Faulty rdev for blocked_rdev Faulty rdev should never be accessed anymore, hence there is no point to wait for bad block to be acknowledged in this case while handling write request. Signed-off-by: Yu Kuai Tested-by: Mariusz Tkaczyk Link: https://lore.kernel.org/r/20241031033114.3845582-8-yukuai1@huaweicloud.com Signed-off-by: Song Liu --- diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index dc2ea636d1734..f5ac81dd21b2b 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -4724,14 +4724,13 @@ static void analyse_stripe(struct stripe_head *sh, struct stripe_head_state *s) if (rdev) { is_bad = rdev_has_badblock(rdev, sh->sector, RAID5_STRIPE_SECTORS(conf)); - if (s->blocked_rdev == NULL - && (test_bit(Blocked, &rdev->flags) - || is_bad < 0)) { + if (s->blocked_rdev == NULL) { if (is_bad < 0) - set_bit(BlockedBadBlocks, - &rdev->flags); - s->blocked_rdev = rdev; - atomic_inc(&rdev->nr_pending); + set_bit(BlockedBadBlocks, &rdev->flags); + if (rdev_blocked(rdev)) { + s->blocked_rdev = rdev; + atomic_inc(&rdev->nr_pending); + } } } clear_bit(R5_Insync, &dev->flags);