diff options
| -rw-r--r-- | drivers/md/md.c | 14 | 
1 files changed, 12 insertions, 2 deletions
| diff --git a/drivers/md/md.c b/drivers/md/md.c index ca0de7ddd943..b7f83784710b 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -4806,11 +4806,21 @@ action_store(struct mddev *mddev, const char *page, size_t len)  			return -EINVAL;  		err = mddev_lock(mddev);  		if (!err) { -			if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) +			if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) {  				err =  -EBUSY; -			else { +			} else if (mddev->reshape_position == MaxSector || +				   mddev->pers->check_reshape == NULL || +				   mddev->pers->check_reshape(mddev)) {  				clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);  				err = mddev->pers->start_reshape(mddev); +			} else { +				/* +				 * If reshape is still in progress, and +				 * md_check_recovery() can continue to reshape, +				 * don't restart reshape because data can be +				 * corrupted for raid456. +				 */ +				clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);  			}  			mddev_unlock(mddev);  		} |