| @@ -3834,7 +3834,7 @@ array_state_store(struct mddev *mddev, const char *buf, size_t len) · 3833 unmodified lines |
| 3834 | 3834 | err = -EBUSY; |
| 3835 | 3835 | } |
| 3836 | 3836 | spin_unlock(&mddev->lock); |
| 3837 | | − return err; |
| 3837 | + return err ?: len; |
| 3838 | 3838 | } |
| 3839 | 3839 | err = mddev_lock(mddev); |
| 3840 | 3840 | if (err) |
| @@ -4217,13 +4217,14 @@ action_store(struct mddev *mddev, const char *page, size_t len) · 376 unmodified lines |
| 4217 | 4217 | set_bit(MD_RECOVERY_FROZEN, &mddev->recovery); |
| 4218 | 4218 | else |
| 4219 | 4219 | clear_bit(MD_RECOVERY_FROZEN, &mddev->recovery); |
| 4220 | | − flush_workqueue(md_misc_wq); |
| 4221 | | − if (mddev->sync_thread) { |
| 4222 | | − set_bit(MD_RECOVERY_INTR, &mddev->recovery); |
| 4223 | | − if (mddev_lock(mddev) == 0) { |
| 4220 | + if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) && |
| 4221 | + mddev_lock(mddev) == 0) { |
| 4222 | + flush_workqueue(md_misc_wq); |
| 4223 | + if (mddev->sync_thread) { |
| 4224 | + set_bit(MD_RECOVERY_INTR, &mddev->recovery); |
| 4224 | 4225 | md_reap_sync_thread(mddev); |
| 4225 | | − mddev_unlock(mddev); |
| 4226 | 4226 | } |
| 4227 | + mddev_unlock(mddev); |
| 4227 | 4228 | } |
| 4228 | 4229 | } else if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) || |
| 4229 | 4230 | test_bit(MD_RECOVERY_NEEDED, &mddev->recovery)) |
| @@ -8261,6 +8262,7 @@ void md_reap_sync_thread(struct mddev *mddev) · 4031 unmodified lines |
| 8261 | 8262 | if (mddev_is_clustered(mddev)) |
| 8262 | 8263 | md_cluster_ops->metadata_update_finish(mddev); |
| 8263 | 8264 | clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery); |
| 8265 | + clear_bit(MD_RECOVERY_DONE, &mddev->recovery); |
| 8264 | 8266 | clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); |
| 8265 | 8267 | clear_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); |
| 8266 | 8268 | clear_bit(MD_RECOVERY_REQUESTED, &mddev->recovery); |