Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

+6 -5
+2 -2
drivers/md/dm-raid.c
··· 859 859 int ret; 860 860 unsigned redundancy = 0; 861 861 struct raid_dev *dev; 862 - struct md_rdev *rdev, *freshest; 862 + struct md_rdev *rdev, *tmp, *freshest; 863 863 struct mddev *mddev = &rs->md; 864 864 865 865 switch (rs->raid_type->level) { ··· 877 877 } 878 878 879 879 freshest = NULL; 880 - rdev_for_each(rdev, mddev) { 880 + rdev_for_each_safe(rdev, tmp, mddev) { 881 881 if (!rdev->meta_bdev) 882 882 continue; 883 883
+4 -3
drivers/md/md.c
··· 7560 7560 * any transients in the value of "sync_action". 7561 7561 */ 7562 7562 set_bit(MD_RECOVERY_RUNNING, &mddev->recovery); 7563 - clear_bit(MD_RECOVERY_NEEDED, &mddev->recovery); 7564 7563 /* Clear some bits that don't mean anything, but 7565 7564 * might be left set 7566 7565 */ 7567 7566 clear_bit(MD_RECOVERY_INTR, &mddev->recovery); 7568 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 7571 goto unlock; 7572 7572 /* no recovery is running. 7573 7573 * remove any failed drives, then ··· 8140 8140 8141 8141 for_each_mddev(mddev, tmp) { 8142 8142 if (mddev_trylock(mddev)) { 8143 - __md_stop_writes(mddev); 8143 + if (mddev->pers) 8144 + __md_stop_writes(mddev); 8144 8145 mddev->safemode = 2; 8145 8146 mddev_unlock(mddev); 8146 8147 }