mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-07 23:20:32 -04:00
Merge tag 'md-3.6-fixes' of git://neil.brown.name/md
Pull md fixes from NeilBrown: "3 fixes for md in 3.6. One reverts a recent patch which turns out to not be such a good idea. Other two fix minor bugs with the new (since 3.3) 'replacement' code and have been tagged for -stable." * tag 'md-3.6-fixes' of git://neil.brown.name/md: md: make sure metadata is updated when spares are activated or removed. md/raid5: fix calculate of 'degraded' when a replacement becomes active. Revert "md/raid5: For odirect-write performance, do not set STRIPE_PREREAD_ACTIVE."
This commit is contained in:
@@ -7619,6 +7619,8 @@ static int remove_and_add_spares(struct mddev *mddev)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (removed)
|
||||
set_bit(MD_CHANGE_DEVS, &mddev->flags);
|
||||
return spares;
|
||||
}
|
||||
|
||||
@@ -7632,9 +7634,11 @@ static void reap_sync_thread(struct mddev *mddev)
|
||||
!test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) {
|
||||
/* success...*/
|
||||
/* activate any spares */
|
||||
if (mddev->pers->spare_active(mddev))
|
||||
if (mddev->pers->spare_active(mddev)) {
|
||||
sysfs_notify(&mddev->kobj, NULL,
|
||||
"degraded");
|
||||
set_bit(MD_CHANGE_DEVS, &mddev->flags);
|
||||
}
|
||||
}
|
||||
if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) &&
|
||||
mddev->pers->finish_reshape)
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user