@@ -5071,6 +5071,45 @@ static void frozen_sync_thread(struct mddev *mddev)
5071
5071
mutex_unlock (& mddev -> sync_mutex );
5072
5072
}
5073
5073
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
+
5074
5113
static ssize_t
5075
5114
action_store (struct mddev * mddev , const char * page , size_t len )
5076
5115
{
@@ -5090,32 +5129,10 @@ action_store(struct mddev *mddev, const char *page, size_t len)
5090
5129
clear_bit (MD_RECOVERY_FROZEN , & mddev -> recovery );
5091
5130
set_bit (MD_RECOVERY_RECOVER , & mddev -> recovery );
5092
5131
} 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
+
5116
5134
if (err )
5117
5135
return err ;
5118
- sysfs_notify_dirent_safe (mddev -> sysfs_degraded );
5119
5136
} else {
5120
5137
if (cmd_match (page , "check" ))
5121
5138
set_bit (MD_RECOVERY_CHECK , & mddev -> recovery );
0 commit comments