@@ -5071,6 +5071,45 @@ static void frozen_sync_thread(struct mddev *mddev)
50715071 mutex_unlock (& mddev -> sync_mutex );
50725072}
50735073
5074+ static int mddev_start_reshape (struct mddev * mddev )
5075+ {
5076+ int ret ;
5077+
5078+ if (mddev -> pers -> start_reshape == NULL )
5079+ return - EINVAL ;
5080+
5081+ ret = mddev_lock (mddev );
5082+ if (ret )
5083+ return ret ;
5084+
5085+ if (test_bit (MD_RECOVERY_RUNNING , & mddev -> recovery )) {
5086+ mddev_unlock (mddev );
5087+ return - EBUSY ;
5088+ }
5089+
5090+ if (mddev -> reshape_position == MaxSector ||
5091+ mddev -> pers -> check_reshape == NULL ||
5092+ mddev -> pers -> check_reshape (mddev )) {
5093+ clear_bit (MD_RECOVERY_FROZEN , & mddev -> recovery );
5094+ ret = mddev -> pers -> start_reshape (mddev );
5095+ if (ret ) {
5096+ mddev_unlock (mddev );
5097+ return ret ;
5098+ }
5099+ } else {
5100+ /*
5101+ * If reshape is still in progress, and md_check_recovery() can
5102+ * continue to reshape, don't restart reshape because data can
5103+ * be corrupted for raid456.
5104+ */
5105+ clear_bit (MD_RECOVERY_FROZEN , & mddev -> recovery );
5106+ }
5107+
5108+ mddev_unlock (mddev );
5109+ sysfs_notify_dirent_safe (mddev -> sysfs_degraded );
5110+ return 0 ;
5111+ }
5112+
50745113static ssize_t
50755114action_store (struct mddev * mddev , const char * page , size_t len )
50765115{
@@ -5090,32 +5129,10 @@ action_store(struct mddev *mddev, const char *page, size_t len)
50905129 clear_bit (MD_RECOVERY_FROZEN , & mddev -> recovery );
50915130 set_bit (MD_RECOVERY_RECOVER , & mddev -> recovery );
50925131 } else if (cmd_match (page , "reshape" )) {
5093- int err ;
5094- if (mddev -> pers -> start_reshape == NULL )
5095- return - EINVAL ;
5096- err = mddev_lock (mddev );
5097- if (!err ) {
5098- if (test_bit (MD_RECOVERY_RUNNING , & mddev -> recovery )) {
5099- err = - EBUSY ;
5100- } else if (mddev -> reshape_position == MaxSector ||
5101- mddev -> pers -> check_reshape == NULL ||
5102- mddev -> pers -> check_reshape (mddev )) {
5103- clear_bit (MD_RECOVERY_FROZEN , & mddev -> recovery );
5104- err = mddev -> pers -> start_reshape (mddev );
5105- } else {
5106- /*
5107- * If reshape is still in progress, and
5108- * md_check_recovery() can continue to reshape,
5109- * don't restart reshape because data can be
5110- * corrupted for raid456.
5111- */
5112- clear_bit (MD_RECOVERY_FROZEN , & mddev -> recovery );
5113- }
5114- mddev_unlock (mddev );
5115- }
5132+ int err = mddev_start_reshape (mddev );
5133+
51165134 if (err )
51175135 return err ;
5118- sysfs_notify_dirent_safe (mddev -> sysfs_degraded );
51195136 } else {
51205137 if (cmd_match (page , "check" ))
51215138 set_bit (MD_RECOVERY_CHECK , & mddev -> recovery );
0 commit comments