MD_RECOVERY_DONE is normally cleared by md_check_recovery after a resync etc finished. However it is possible for raid5_start_reshape to race and start a reshape before MD_RECOVERY_DONE is cleared. This can lean to multiple reshapes running at the same time, which isn't good. To make sure it is cleared before starting a reshape, and also clear it when reaping a thread, just to be safe.
Unified · Split
| @@ -8262,6 +8262,7 @@ void md_reap_sync_thread(struct mddev *mddev) · 8261 unmodified lines | ||
| 8262 | 8262 | if (mddev_is_clustered(mddev)) |
| 8263 | 8263 | md_cluster_ops->metadata_update_finish(mddev); |
| 8264 | 8264 | clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery); |
| 8265 | + clear_bit(MD_RECOVERY_DONE, &mddev->recovery); | |
| 8265 | 8266 | clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); |
| 8266 | 8267 | clear_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); |
| 8267 | 8268 | clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery); |
| @@ -4156,6 +4156,7 @@ static int raid10_start_reshape(struct mddev *mddev) · 4155 unmodified lines | ||
| 4156 | 4156 | |
| 4157 | 4157 | clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); |
| 4158 | 4158 | clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); |
| 4159 | + clear_bit(MD_RECOVERY_DONE, &mddev->recovery); | |
| 4159 | 4160 | set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); |
| 4160 | 4161 | set_bit(MD_RECOVERY_RUNNING, &mddev->recovery); |
| 4161 | 4162 | |
| @@ -7354,6 +7354,7 @@ static int raid5_start_reshape(struct mddev *mddev) · 7353 unmodified lines | ||
| 7354 | 7354 | |
| 7355 | 7355 | clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); |
| 7356 | 7356 | clear_bit(MD_RECOVERY_CHECK, &mddev->recovery); |
| 7357 | + clear_bit(MD_RECOVERY_DONE, &mddev->recovery); | |
| 7357 | 7358 | set_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); |
| 7358 | 7359 | set_bit(MD_RECOVERY_RUNNING, &mddev->recovery); |
| 7359 | 7360 | mddev->sync_thread = md_register_thread(md_do_sync, mddev, |