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);
                }