diff options
Diffstat (limited to 'drivers/md/raid1.c')
-rw-r--r-- | drivers/md/raid1.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 9c788e2489b1..7b4f5f7155d8 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
@@ -1016,12 +1016,16 @@ static void error(mddev_t *mddev, mdk_rdev_t *rdev) | |||
1016 | * else mark the drive as failed | 1016 | * else mark the drive as failed |
1017 | */ | 1017 | */ |
1018 | if (test_bit(In_sync, &rdev->flags) | 1018 | if (test_bit(In_sync, &rdev->flags) |
1019 | && (conf->raid_disks - mddev->degraded) == 1) | 1019 | && (conf->raid_disks - mddev->degraded) == 1) { |
1020 | /* | 1020 | /* |
1021 | * Don't fail the drive, act as though we were just a | 1021 | * Don't fail the drive, act as though we were just a |
1022 | * normal single drive | 1022 | * normal single drive. |
1023 | * However don't try a recovery from this drive as | ||
1024 | * it is very likely to fail. | ||
1023 | */ | 1025 | */ |
1026 | mddev->recovery_disabled = 1; | ||
1024 | return; | 1027 | return; |
1028 | } | ||
1025 | if (test_and_clear_bit(In_sync, &rdev->flags)) { | 1029 | if (test_and_clear_bit(In_sync, &rdev->flags)) { |
1026 | unsigned long flags; | 1030 | unsigned long flags; |
1027 | spin_lock_irqsave(&conf->device_lock, flags); | 1031 | spin_lock_irqsave(&conf->device_lock, flags); |
@@ -1919,7 +1923,6 @@ static int run(mddev_t *mddev) | |||
1919 | int i, j, disk_idx; | 1923 | int i, j, disk_idx; |
1920 | mirror_info_t *disk; | 1924 | mirror_info_t *disk; |
1921 | mdk_rdev_t *rdev; | 1925 | mdk_rdev_t *rdev; |
1922 | struct list_head *tmp; | ||
1923 | 1926 | ||
1924 | if (mddev->level != 1) { | 1927 | if (mddev->level != 1) { |
1925 | printk("raid1: %s: raid level not set to mirroring (%d)\n", | 1928 | printk("raid1: %s: raid level not set to mirroring (%d)\n", |
@@ -1964,7 +1967,7 @@ static int run(mddev_t *mddev) | |||
1964 | spin_lock_init(&conf->device_lock); | 1967 | spin_lock_init(&conf->device_lock); |
1965 | mddev->queue->queue_lock = &conf->device_lock; | 1968 | mddev->queue->queue_lock = &conf->device_lock; |
1966 | 1969 | ||
1967 | rdev_for_each(rdev, tmp, mddev) { | 1970 | list_for_each_entry(rdev, &mddev->disks, same_set) { |
1968 | disk_idx = rdev->raid_disk; | 1971 | disk_idx = rdev->raid_disk; |
1969 | if (disk_idx >= mddev->raid_disks | 1972 | if (disk_idx >= mddev->raid_disks |
1970 | || disk_idx < 0) | 1973 | || disk_idx < 0) |