]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
md: replace sysfs api sync_action with new helpers
authorYu Kuai <yukuai3@huawei.com>
Tue, 11 Jun 2024 13:22:44 +0000 (21:22 +0800)
committerSong Liu <song@kernel.org>
Wed, 12 Jun 2024 16:27:49 +0000 (16:27 +0000)
To get rid of extrem long if else if usage, and make code cleaner.

Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Signed-off-by: Song Liu <song@kernel.org>
Link: https://lore.kernel.org/r/20240611132251.1967786-6-yukuai1@huaweicloud.com
drivers/md/md.c

index b34ae9fbd24671411fa7e3a562b77b32951724d8..d035cd52e49a2d0422b58b82fc2f73654c2ef593 100644 (file)
@@ -4950,27 +4950,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));
 }
 
 /**
@@ -5113,35 +5095,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