diff options
Diffstat (limited to 'drivers/md/raid1.c')
-rw-r--r-- | drivers/md/raid1.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index d0f4021bbc2e..c610b947218a 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
@@ -1027,7 +1027,7 @@ static void error(mddev_t *mddev, mdk_rdev_t *rdev) | |||
1027 | /* | 1027 | /* |
1028 | * if recovery is running, make sure it aborts. | 1028 | * if recovery is running, make sure it aborts. |
1029 | */ | 1029 | */ |
1030 | set_bit(MD_RECOVERY_ERR, &mddev->recovery); | 1030 | set_bit(MD_RECOVERY_INTR, &mddev->recovery); |
1031 | } else | 1031 | } else |
1032 | set_bit(Faulty, &rdev->flags); | 1032 | set_bit(Faulty, &rdev->flags); |
1033 | set_bit(MD_CHANGE_DEVS, &mddev->flags); | 1033 | set_bit(MD_CHANGE_DEVS, &mddev->flags); |
@@ -1148,6 +1148,14 @@ static int raid1_remove_disk(mddev_t *mddev, int number) | |||
1148 | err = -EBUSY; | 1148 | err = -EBUSY; |
1149 | goto abort; | 1149 | goto abort; |
1150 | } | 1150 | } |
1151 | /* Only remove non-faulty devices is recovery | ||
1152 | * is not possible. | ||
1153 | */ | ||
1154 | if (!test_bit(Faulty, &rdev->flags) && | ||
1155 | mddev->degraded < conf->raid_disks) { | ||
1156 | err = -EBUSY; | ||
1157 | goto abort; | ||
1158 | } | ||
1151 | p->rdev = NULL; | 1159 | p->rdev = NULL; |
1152 | synchronize_rcu(); | 1160 | synchronize_rcu(); |
1153 | if (atomic_read(&rdev->nr_pending)) { | 1161 | if (atomic_read(&rdev->nr_pending)) { |