Commit c8ecfe68 authored by Yu Kuai's avatar Yu Kuai Committed by Song Liu

md: replace sysfs api sync_action with new helpers

To get rid of extrem long if else if usage, and make code cleaner.
Signed-off-by: default avatarYu Kuai <yukuai3@huawei.com>
Signed-off-by: default avatarSong Liu <song@kernel.org>
Link: https://lore.kernel.org/r/20240611132251.1967786-6-yukuai1@huaweicloud.com
parent 207c5656
...@@ -4950,27 +4950,9 @@ const char *md_sync_action_name(enum sync_action action) ...@@ -4950,27 +4950,9 @@ const char *md_sync_action_name(enum sync_action action)
static ssize_t static ssize_t
action_show(struct mddev *mddev, char *page) action_show(struct mddev *mddev, char *page)
{ {
char *type = "idle"; enum sync_action action = md_sync_action(mddev);
unsigned long recovery = mddev->recovery;
if (test_bit(MD_RECOVERY_FROZEN, &recovery)) return sprintf(page, "%s\n", md_sync_action_name(action));
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);
} }
/** /**
...@@ -5113,35 +5095,63 @@ static int mddev_start_reshape(struct mddev *mddev) ...@@ -5113,35 +5095,63 @@ static int mddev_start_reshape(struct mddev *mddev)
static ssize_t static ssize_t
action_store(struct mddev *mddev, const char *page, size_t len) action_store(struct mddev *mddev, const char *page, size_t len)
{ {
int ret;
enum sync_action action;
if (!mddev->pers || !mddev->pers->sync_request) if (!mddev->pers || !mddev->pers->sync_request)
return -EINVAL; return -EINVAL;
action = md_sync_action_by_name(page);
if (cmd_match(page, "idle")) /* TODO: mdadm rely on "idle" to start sync_thread. */
idle_sync_thread(mddev); if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) {
else if (cmd_match(page, "frozen")) switch (action) {
frozen_sync_thread(mddev); case ACTION_FROZEN:
else if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery)) frozen_sync_thread(mddev);
return -EBUSY; return len;
else if (cmd_match(page, "resync")) case ACTION_IDLE:
clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); idle_sync_thread(mddev);
else if (cmd_match(page, "recover")) { break;
clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); case ACTION_RESHAPE:
set_bit(MD_RECOVERY_RECOVER, &mddev->recovery); case ACTION_RECOVER:
} else if (cmd_match(page, "reshape")) { case ACTION_CHECK:
int err = mddev_start_reshape(mddev); case ACTION_REPAIR:
case ACTION_RESYNC:
if (err) return -EBUSY;
return err; default:
return -EINVAL;
}
} else { } 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); 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; 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) { if (mddev->ro == MD_AUTO_READ) {
/* A write to sync_action is enough to justify /* A write to sync_action is enough to justify
* canceling read-auto mode * canceling read-auto mode
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment