|
@@ -393,6 +393,8 @@ static int calc_degraded(struct r5conf *conf)
|
|
|
degraded = 0;
|
|
|
for (i = 0; i < conf->previous_raid_disks; i++) {
|
|
|
struct md_rdev *rdev = rcu_dereference(conf->disks[i].rdev);
|
|
|
+ if (rdev && test_bit(Faulty, &rdev->flags))
|
|
|
+ rdev = rcu_dereference(conf->disks[i].replacement);
|
|
|
if (!rdev || test_bit(Faulty, &rdev->flags))
|
|
|
degraded++;
|
|
|
else if (test_bit(In_sync, &rdev->flags))
|
|
@@ -417,6 +419,8 @@ static int calc_degraded(struct r5conf *conf)
|
|
|
degraded2 = 0;
|
|
|
for (i = 0; i < conf->raid_disks; i++) {
|
|
|
struct md_rdev *rdev = rcu_dereference(conf->disks[i].rdev);
|
|
|
+ if (rdev && test_bit(Faulty, &rdev->flags))
|
|
|
+ rdev = rcu_dereference(conf->disks[i].replacement);
|
|
|
if (!rdev || test_bit(Faulty, &rdev->flags))
|
|
|
degraded2++;
|
|
|
else if (test_bit(In_sync, &rdev->flags))
|
|
@@ -4192,7 +4196,7 @@ static void make_request(struct mddev *mddev, struct bio * bi)
|
|
|
finish_wait(&conf->wait_for_overlap, &w);
|
|
|
set_bit(STRIPE_HANDLE, &sh->state);
|
|
|
clear_bit(STRIPE_DELAYED, &sh->state);
|
|
|
- if ((bi->bi_rw & REQ_NOIDLE) &&
|
|
|
+ if ((bi->bi_rw & REQ_SYNC) &&
|
|
|
!test_and_set_bit(STRIPE_PREREAD_ACTIVE, &sh->state))
|
|
|
atomic_inc(&conf->preread_active_stripes);
|
|
|
release_stripe_plug(mddev, sh);
|