diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-04-23 21:25:01 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-04-23 21:25:01 -0400 |
| commit | d2da626d6cb5df2c5d4222168c91ddf765aa4354 (patch) | |
| tree | 920867db0e41b6d7f40a546265054ab53f7ce6b5 | |
| parent | 721b024bd47c1e4b995e7eeb6455b714b817ad60 (diff) | |
| parent | 30b8aa9172dfeaac6d77897c67ee9f9fc574cdbb (diff) | |
Merge tag 'md-3.4-fixes' of git://neil.brown.name/md
Pull a few more md bug fixes from NeilBrown:
"2 are tagged for -stable, one being for a fairly serious bug that can
corrupt metadata and make it hard to recovery an array. The other is
for a more recent regression since 3.3"
* tag 'md-3.4-fixes' of git://neil.brown.name/md:
md: fix possible corruption of array metadata on shutdown.
md: don't call ->add_disk unless there is good reason.
DM RAID: Use safe version of rdev_for_each
| -rw-r--r-- | drivers/md/dm-raid.c | 4 | ||||
| -rw-r--r-- | drivers/md/md.c | 7 |
2 files changed, 6 insertions, 5 deletions
diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c index b0ba52459ed7..68965e663248 100644 --- a/drivers/md/dm-raid.c +++ b/drivers/md/dm-raid.c | |||
| @@ -859,7 +859,7 @@ static int analyse_superblocks(struct dm_target *ti, struct raid_set *rs) | |||
| 859 | int ret; | 859 | int ret; |
| 860 | unsigned redundancy = 0; | 860 | unsigned redundancy = 0; |
| 861 | struct raid_dev *dev; | 861 | struct raid_dev *dev; |
| 862 | struct md_rdev *rdev, *freshest; | 862 | struct md_rdev *rdev, *tmp, *freshest; |
| 863 | struct mddev *mddev = &rs->md; | 863 | struct mddev *mddev = &rs->md; |
| 864 | 864 | ||
| 865 | switch (rs->raid_type->level) { | 865 | switch (rs->raid_type->level) { |
| @@ -877,7 +877,7 @@ static int analyse_superblocks(struct dm_target *ti, struct raid_set *rs) | |||
| 877 | } | 877 | } |
| 878 | 878 | ||
| 879 | freshest = NULL; | 879 | freshest = NULL; |
| 880 | rdev_for_each(rdev, mddev) { | 880 | rdev_for_each_safe(rdev, tmp, mddev) { |
| 881 | if (!rdev->meta_bdev) | 881 | if (!rdev->meta_bdev) |
| 882 | continue; | 882 | continue; |
| 883 | 883 | ||
diff --git a/drivers/md/md.c b/drivers/md/md.c index b572e1e386ce..477eb2e180c0 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
| @@ -7560,14 +7560,14 @@ void md_check_recovery(struct mddev *mddev) | |||
| 7560 | * any transients in the value of "sync_action". | 7560 | * any transients in the value of "sync_action". |
| 7561 | */ | 7561 | */ |
| 7562 | set_bit(MD_RECOVERY_RUNNING, &mddev->recovery); | 7562 | set_bit(MD_RECOVERY_RUNNING, &mddev->recovery); |
| 7563 | clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery); | ||
| 7564 | /* Clear some bits that don't mean anything, but | 7563 | /* Clear some bits that don't mean anything, but |
| 7565 | * might be left set | 7564 | * might be left set |
| 7566 | */ | 7565 | */ |
| 7567 | clear_bit(MD_RECOVERY_INTR, &mddev->recovery); | 7566 | clear_bit(MD_RECOVERY_INTR, &mddev->recovery); |
| 7568 | clear_bit(MD_RECOVERY_DONE, &mddev->recovery); | 7567 | clear_bit(MD_RECOVERY_DONE, &mddev->recovery); |
| 7569 | 7568 | ||
| 7570 | if (test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) | 7569 | if (!test_and_clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery) || |
| 7570 | test_bit(MD_RECOVERY_FROZEN, &mddev->recovery)) | ||
| 7571 | goto unlock; | 7571 | goto unlock; |
| 7572 | /* no recovery is running. | 7572 | /* no recovery is running. |
| 7573 | * remove any failed drives, then | 7573 | * remove any failed drives, then |
| @@ -8140,7 +8140,8 @@ static int md_notify_reboot(struct notifier_block *this, | |||
| 8140 | 8140 | ||
| 8141 | for_each_mddev(mddev, tmp) { | 8141 | for_each_mddev(mddev, tmp) { |
| 8142 | if (mddev_trylock(mddev)) { | 8142 | if (mddev_trylock(mddev)) { |
| 8143 | __md_stop_writes(mddev); | 8143 | if (mddev->pers) |
| 8144 | __md_stop_writes(mddev); | ||
| 8144 | mddev->safemode = 2; | 8145 | mddev->safemode = 2; |
| 8145 | mddev_unlock(mddev); | 8146 | mddev_unlock(mddev); |
| 8146 | } | 8147 | } |
