|
@@ -4211,12 +4211,12 @@ action_store(struct mddev *mddev, const char *page, size_t len)
|
|
|
if (!mddev->pers || !mddev->pers->sync_request)
|
|
|
return -EINVAL;
|
|
|
|
|
|
- if (cmd_match(page, "frozen"))
|
|
|
- set_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
|
|
|
- else
|
|
|
- clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
|
|
|
|
|
|
if (cmd_match(page, "idle") || cmd_match(page, "frozen")) {
|
|
|
+ if (cmd_match(page, "frozen"))
|
|
|
+ set_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
|
|
|
+ else
|
|
|
+ clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
|
|
|
flush_workqueue(md_misc_wq);
|
|
|
if (mddev->sync_thread) {
|
|
|
set_bit(MD_RECOVERY_INTR, &mddev->recovery);
|
|
@@ -4229,16 +4229,17 @@ action_store(struct mddev *mddev, const char *page, size_t len)
|
|
|
test_bit(MD_RECOVERY_NEEDED, &mddev->recovery))
|
|
|
return -EBUSY;
|
|
|
else if (cmd_match(page, "resync"))
|
|
|
- set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
|
|
|
+ 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);
|
|
|
- set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
|
|
|
} else if (cmd_match(page, "reshape")) {
|
|
|
int err;
|
|
|
if (mddev->pers->start_reshape == NULL)
|
|
|
return -EINVAL;
|
|
|
err = mddev_lock(mddev);
|
|
|
if (!err) {
|
|
|
+ clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
|
|
|
err = mddev->pers->start_reshape(mddev);
|
|
|
mddev_unlock(mddev);
|
|
|
}
|
|
@@ -4250,6 +4251,7 @@ action_store(struct mddev *mddev, const char *page, size_t len)
|
|
|
set_bit(MD_RECOVERY_CHECK, &mddev->recovery);
|
|
|
else if (!cmd_match(page, "repair"))
|
|
|
return -EINVAL;
|
|
|
+ clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
|
|
|
set_bit(MD_RECOVERY_REQUESTED, &mddev->recovery);
|
|
|
set_bit(MD_RECOVERY_SYNC, &mddev->recovery);
|
|
|
}
|