@@ -4950,27 +4950,9 @@ const char *md_sync_action_name(enum sync_action action)
4950
4950
static ssize_t
4951
4951
action_show (struct mddev * mddev , char * page )
4952
4952
{
4953
- char * type = "idle" ;
4954
- unsigned long recovery = mddev -> recovery ;
4955
- if (test_bit (MD_RECOVERY_FROZEN , & recovery ))
4956
- type = "frozen" ;
4957
- else if (test_bit (MD_RECOVERY_RUNNING , & recovery ) ||
4958
- (md_is_rdwr (mddev ) && test_bit (MD_RECOVERY_NEEDED , & recovery ))) {
4959
- if (test_bit (MD_RECOVERY_RESHAPE , & recovery ))
4960
- type = "reshape" ;
4961
- else if (test_bit (MD_RECOVERY_SYNC , & recovery )) {
4962
- if (!test_bit (MD_RECOVERY_REQUESTED , & recovery ))
4963
- type = "resync" ;
4964
- else if (test_bit (MD_RECOVERY_CHECK , & recovery ))
4965
- type = "check" ;
4966
- else
4967
- type = "repair" ;
4968
- } else if (test_bit (MD_RECOVERY_RECOVER , & recovery ))
4969
- type = "recover" ;
4970
- else if (mddev -> reshape_position != MaxSector )
4971
- type = "reshape" ;
4972
- }
4973
- return sprintf (page , "%s\n" , type );
4953
+ enum sync_action action = md_sync_action (mddev );
4954
+
4955
+ return sprintf (page , "%s\n" , md_sync_action_name (action ));
4974
4956
}
4975
4957
4976
4958
/**
@@ -5113,35 +5095,63 @@ static int mddev_start_reshape(struct mddev *mddev)
5113
5095
static ssize_t
5114
5096
action_store (struct mddev * mddev , const char * page , size_t len )
5115
5097
{
5098
+ int ret ;
5099
+ enum sync_action action ;
5100
+
5116
5101
if (!mddev -> pers || !mddev -> pers -> sync_request )
5117
5102
return - EINVAL ;
5118
5103
5104
+ action = md_sync_action_by_name (page );
5119
5105
5120
- if (cmd_match (page , "idle" ))
5121
- idle_sync_thread (mddev );
5122
- else if (cmd_match (page , "frozen" ))
5123
- frozen_sync_thread (mddev );
5124
- else if (test_bit (MD_RECOVERY_RUNNING , & mddev -> recovery ))
5125
- return - EBUSY ;
5126
- else if (cmd_match (page , "resync" ))
5127
- clear_bit (MD_RECOVERY_FROZEN , & mddev -> recovery );
5128
- else if (cmd_match (page , "recover" )) {
5129
- clear_bit (MD_RECOVERY_FROZEN , & mddev -> recovery );
5130
- set_bit (MD_RECOVERY_RECOVER , & mddev -> recovery );
5131
- } else if (cmd_match (page , "reshape" )) {
5132
- int err = mddev_start_reshape (mddev );
5133
-
5134
- if (err )
5135
- return err ;
5106
+ /* TODO: mdadm rely on "idle" to start sync_thread. */
5107
+ if (test_bit (MD_RECOVERY_RUNNING , & mddev -> recovery )) {
5108
+ switch (action ) {
5109
+ case ACTION_FROZEN :
5110
+ frozen_sync_thread (mddev );
5111
+ return len ;
5112
+ case ACTION_IDLE :
5113
+ idle_sync_thread (mddev );
5114
+ break ;
5115
+ case ACTION_RESHAPE :
5116
+ case ACTION_RECOVER :
5117
+ case ACTION_CHECK :
5118
+ case ACTION_REPAIR :
5119
+ case ACTION_RESYNC :
5120
+ return - EBUSY ;
5121
+ default :
5122
+ return - EINVAL ;
5123
+ }
5136
5124
} else {
5137
- if (cmd_match (page , "check" ))
5125
+ switch (action ) {
5126
+ case ACTION_FROZEN :
5127
+ set_bit (MD_RECOVERY_FROZEN , & mddev -> recovery );
5128
+ return len ;
5129
+ case ACTION_RESHAPE :
5130
+ clear_bit (MD_RECOVERY_FROZEN , & mddev -> recovery );
5131
+ ret = mddev_start_reshape (mddev );
5132
+ if (ret )
5133
+ return ret ;
5134
+ break ;
5135
+ case ACTION_RECOVER :
5136
+ clear_bit (MD_RECOVERY_FROZEN , & mddev -> recovery );
5137
+ set_bit (MD_RECOVERY_RECOVER , & mddev -> recovery );
5138
+ break ;
5139
+ case ACTION_CHECK :
5138
5140
set_bit (MD_RECOVERY_CHECK , & mddev -> recovery );
5139
- else if (!cmd_match (page , "repair" ))
5141
+ fallthrough ;
5142
+ case ACTION_REPAIR :
5143
+ set_bit (MD_RECOVERY_REQUESTED , & mddev -> recovery );
5144
+ set_bit (MD_RECOVERY_SYNC , & mddev -> recovery );
5145
+ fallthrough ;
5146
+ case ACTION_RESYNC :
5147
+ case ACTION_IDLE :
5148
+ clear_bit (MD_RECOVERY_FROZEN , & mddev -> recovery );
5149
+ break ;
5150
+ default :
5140
5151
return - EINVAL ;
5141
- clear_bit (MD_RECOVERY_FROZEN , & mddev -> recovery );
5142
- set_bit (MD_RECOVERY_REQUESTED , & mddev -> recovery );
5143
- set_bit (MD_RECOVERY_SYNC , & mddev -> recovery );
5152
+ }
5144
5153
}
5154
+
5145
5155
if (mddev -> ro == MD_AUTO_READ ) {
5146
5156
/* A write to sync_action is enough to justify
5147
5157
* canceling read-auto mode
0 commit comments