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

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
Loading
Loading
Loading
Loading
+52 −42
Original line number Diff line number Diff line
@@ -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"))
	/* 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);
	else if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery))
			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;
	else if (cmd_match(page, "resync"))
		default:
			return -EINVAL;
		}
	} else {
		switch (action) {
		case ACTION_FROZEN:
			set_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
			return len;
		case ACTION_RESHAPE:
			clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
	else if (cmd_match(page, "recover")) {
			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);
	} else if (cmd_match(page, "reshape")) {
		int err = mddev_start_reshape(mddev);

		if (err)
			return err;
	} else {
		if (cmd_match(page, "check"))
			break;
		case ACTION_CHECK:
			set_bit(MD_RECOVERY_CHECK, &mddev->recovery);
		else if (!cmd_match(page, "repair"))
			return -EINVAL;
		clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
			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;
		}
	}

	if (mddev->ro == MD_AUTO_READ) {
		/* A write to sync_action is enough to justify
		 * canceling read-auto mode