To get rid of extrem long if else if usage, and make code cleaner.

Signed-off-by: Yu Kuai <[email protected]>
---
 drivers/md/md.c | 94 +++++++++++++++++++++++++++----------------------
 1 file changed, 52 insertions(+), 42 deletions(-)

diff --git a/drivers/md/md.c b/drivers/md/md.c
index 28f50a106566..8a54b56e3463 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -4949,27 +4949,9 @@ const char *md_sync_action_name(enum sync_action action)
 static ssize_t
 action_show(struct mddev *mddev, char *page)
 {
-       char *type = "idle";
-       unsigned long recovery = mddev->recovery;
-       if (test_bit(MD_RECOVERY_FROZEN, &recovery))
-               type = "frozen";
-       else if (test_bit(MD_RECOVERY_RUNNING, &recovery) ||
-           (md_is_rdwr(mddev) && test_bit(MD_RECOVERY_NEEDED, &recovery))) {
-               if (test_bit(MD_RECOVERY_RESHAPE, &recovery))
-                       type = "reshape";
-               else if (test_bit(MD_RECOVERY_SYNC, &recovery)) {
-                       if (!test_bit(MD_RECOVERY_REQUESTED, &recovery))
-                               type = "resync";
-                       else if (test_bit(MD_RECOVERY_CHECK, &recovery))
-                               type = "check";
-                       else
-                               type = "repair";
-               } else if (test_bit(MD_RECOVERY_RECOVER, &recovery))
-                       type = "recover";
-               else if (mddev->reshape_position != MaxSector)
-                       type = "reshape";
-       }
-       return sprintf(page, "%s\n", type);
+       enum sync_action action = md_sync_action(mddev);
+
+       return sprintf(page, "%s\n", md_sync_action_name(action));
 }
 
 /**
@@ -5112,35 +5094,63 @@ static int mddev_start_reshape(struct mddev *mddev)
 static ssize_t
 action_store(struct mddev *mddev, const char *page, size_t len)
 {
+       int ret;
+       enum sync_action action;
+
        if (!mddev->pers || !mddev->pers->sync_request)
                return -EINVAL;
 
+       action = md_sync_action_by_name(page);
 
-       if (cmd_match(page, "idle"))
-               idle_sync_thread(mddev);
-       else if (cmd_match(page, "frozen"))
-               frozen_sync_thread(mddev);
-       else if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery))
-               return -EBUSY;
-       else if (cmd_match(page, "resync"))
-               clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
-       else if (cmd_match(page, "recover")) {
-               clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
-               set_bit(MD_RECOVERY_RECOVER, &mddev->recovery);
-       } else if (cmd_match(page, "reshape")) {
-               int err = mddev_start_reshape(mddev);
-
-               if (err)
-                       return err;
+       /* TODO: mdadm rely on "idle" to start sync_thread. */
+       if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) {
+               switch (action) {
+               case ACTION_FROZEN:
+                       frozen_sync_thread(mddev);
+                       return len;
+               case ACTION_IDLE:
+                       idle_sync_thread(mddev);
+                       break;
+               case ACTION_RESHAPE:
+               case ACTION_RECOVER:
+               case ACTION_CHECK:
+               case ACTION_REPAIR:
+               case ACTION_RESYNC:
+                       return -EBUSY;
+               default:
+                       return -EINVAL;
+               }
        } else {
-               if (cmd_match(page, "check"))
+               switch (action) {
+               case ACTION_FROZEN:
+                       set_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
+                       return len;
+               case ACTION_RESHAPE:
+                       clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
+                       ret = mddev_start_reshape(mddev);
+                       if (ret)
+                               return ret;
+                       break;
+               case ACTION_RECOVER:
+                       clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
+                       set_bit(MD_RECOVERY_RECOVER, &mddev->recovery);
+                       break;
+               case ACTION_CHECK:
                        set_bit(MD_RECOVERY_CHECK, &mddev->recovery);
-               else if (!cmd_match(page, "repair"))
+                       fallthrough;
+               case ACTION_REPAIR:
+                       set_bit(MD_RECOVERY_REQUESTED, &mddev->recovery);
+                       set_bit(MD_RECOVERY_SYNC, &mddev->recovery);
+                       fallthrough;
+               case ACTION_RESYNC:
+               case ACTION_IDLE:
+                       clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
+                       break;
+               default:
                        return -EINVAL;
-               clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
-               set_bit(MD_RECOVERY_REQUESTED, &mddev->recovery);
-               set_bit(MD_RECOVERY_SYNC, &mddev->recovery);
+               }
        }
+
        if (mddev->ro == MD_AUTO_READ) {
                /* A write to sync_action is enough to justify
                 * canceling read-auto mode
-- 
2.39.2


Reply via email to