|
@@ -3036,6 +3036,8 @@ static void analyse_stripe(struct stripe_head *sh, struct stripe_head_state *s)
|
|
|
if (dev->written)
|
|
|
s->written++;
|
|
|
rdev = rcu_dereference(conf->disks[i].rdev);
|
|
|
+ if (rdev && test_bit(Faulty, &rdev->flags))
|
|
|
+ rdev = NULL;
|
|
|
if (rdev) {
|
|
|
is_bad = is_badblock(rdev, sh->sector, STRIPE_SECTORS,
|
|
|
&first_bad, &bad_sectors);
|
|
@@ -3063,7 +3065,7 @@ static void analyse_stripe(struct stripe_head *sh, struct stripe_head_state *s)
|
|
|
}
|
|
|
} else if (test_bit(In_sync, &rdev->flags))
|
|
|
set_bit(R5_Insync, &dev->flags);
|
|
|
- else if (!test_bit(Faulty, &rdev->flags)) {
|
|
|
+ else {
|
|
|
/* in sync if before recovery_offset */
|
|
|
if (sh->sector + STRIPE_SECTORS <= rdev->recovery_offset)
|
|
|
set_bit(R5_Insync, &dev->flags);
|