@@ -4950,27 +4950,9 @@ const char *md_sync_action_name(enum sync_action action)
49504950static ssize_t
49514951action_show (struct mddev * mddev , char * page )
49524952{
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 ));
49744956}
49754957
49764958/**
@@ -5113,35 +5095,63 @@ static int mddev_start_reshape(struct mddev *mddev)
51135095static ssize_t
51145096action_store (struct mddev * mddev , const char * page , size_t len )
51155097{
5098+ int ret ;
5099+ enum sync_action action ;
5100+
51165101 if (!mddev -> pers || !mddev -> pers -> sync_request )
51175102 return - EINVAL ;
51185103
5104+ action = md_sync_action_by_name (page );
51195105
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+ }
51365124 } 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 :
51385140 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 :
51405151 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+ }
51445153 }
5154+
51455155 if (mddev -> ro == MD_AUTO_READ ) {
51465156 /* A write to sync_action is enough to justify
51475157 * canceling read-auto mode
0 commit comments