diff options
Diffstat (limited to 'drivers/md/raid10.c')
| -rw-r--r-- | drivers/md/raid10.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 8536ede1e712..1de17da34a95 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
| @@ -1020,7 +1020,7 @@ static void error(mddev_t *mddev, mdk_rdev_t *rdev) | |||
| 1020 | /* | 1020 | /* |
| 1021 | * if recovery is running, make sure it aborts. | 1021 | * if recovery is running, make sure it aborts. |
| 1022 | */ | 1022 | */ |
| 1023 | set_bit(MD_RECOVERY_ERR, &mddev->recovery); | 1023 | set_bit(MD_RECOVERY_INTR, &mddev->recovery); |
| 1024 | } | 1024 | } |
| 1025 | set_bit(Faulty, &rdev->flags); | 1025 | set_bit(Faulty, &rdev->flags); |
| 1026 | set_bit(MD_CHANGE_DEVS, &mddev->flags); | 1026 | set_bit(MD_CHANGE_DEVS, &mddev->flags); |
| @@ -1171,6 +1171,14 @@ static int raid10_remove_disk(mddev_t *mddev, int number) | |||
| 1171 | err = -EBUSY; | 1171 | err = -EBUSY; |
| 1172 | goto abort; | 1172 | goto abort; |
| 1173 | } | 1173 | } |
| 1174 | /* Only remove faulty devices in recovery | ||
| 1175 | * is not possible. | ||
| 1176 | */ | ||
| 1177 | if (!test_bit(Faulty, &rdev->flags) && | ||
| 1178 | enough(conf)) { | ||
| 1179 | err = -EBUSY; | ||
| 1180 | goto abort; | ||
| 1181 | } | ||
| 1174 | p->rdev = NULL; | 1182 | p->rdev = NULL; |
| 1175 | synchronize_rcu(); | 1183 | synchronize_rcu(); |
| 1176 | if (atomic_read(&rdev->nr_pending)) { | 1184 | if (atomic_read(&rdev->nr_pending)) { |
| @@ -1237,6 +1245,7 @@ static void end_sync_write(struct bio *bio, int error) | |||
| 1237 | 1245 | ||
| 1238 | if (!uptodate) | 1246 | if (!uptodate) |
| 1239 | md_error(mddev, conf->mirrors[d].rdev); | 1247 | md_error(mddev, conf->mirrors[d].rdev); |
| 1248 | |||
| 1240 | update_head_pos(i, r10_bio); | 1249 | update_head_pos(i, r10_bio); |
| 1241 | 1250 | ||
| 1242 | while (atomic_dec_and_test(&r10_bio->remaining)) { | 1251 | while (atomic_dec_and_test(&r10_bio->remaining)) { |
| @@ -1844,7 +1853,8 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i | |||
| 1844 | if (rb2) | 1853 | if (rb2) |
| 1845 | atomic_dec(&rb2->remaining); | 1854 | atomic_dec(&rb2->remaining); |
| 1846 | r10_bio = rb2; | 1855 | r10_bio = rb2; |
| 1847 | if (!test_and_set_bit(MD_RECOVERY_ERR, &mddev->recovery)) | 1856 | if (!test_and_set_bit(MD_RECOVERY_INTR, |
| 1857 | &mddev->recovery)) | ||
| 1848 | printk(KERN_INFO "raid10: %s: insufficient working devices for recovery.\n", | 1858 | printk(KERN_INFO "raid10: %s: insufficient working devices for recovery.\n", |
| 1849 | mdname(mddev)); | 1859 | mdname(mddev)); |
| 1850 | break; | 1860 | break; |
