summaryrefslogtreecommitdiffstats
path: root/monitor.c
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2010-06-16 03:41:57 +0200
committerDan Williams <dan.j.williams@intel.com>2010-06-16 03:41:57 +0200
commit4f0a7acc9a0a93d39b66b29e374f9a5edd173047 (patch)
tree5d4b7f9ff2453cdaa778b248effdba4354adbd79 /monitor.c
parentimsm: dump each disk's view of the slot state (diff)
downloadmdadm-4f0a7acc9a0a93d39b66b29e374f9a5edd173047.tar.xz
mdadm-4f0a7acc9a0a93d39b66b29e374f9a5edd173047.zip
mdmon: record sync_completed directly to the metadata
When sync_action is idle mdmon takes the latest value of md/resync_start or md/<dev>/recovery_start to record the resync/rebuild checkpoint in the metadata. However, now that mdmon is reading sync_completed there is no longer a need to wait for, or force an idle event to take a checkpoint. Simply update the forward progress of ->last_checkpoint at every wakeup event and force it to be recorded at least every 1/16th array-size interval. It may be recorded more frequently if a ->set_array_state() event occurs. This also cleans up some confusion in handling the dual-rebuild case. If more than one spare has been activated the kernel starts the rebuild at the lowest recovery offset, so we do not need to worry about min_recovery_start(). Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'monitor.c')
-rw-r--r--monitor.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/monitor.c b/monitor.c
index 12f8d3e6..59b41819 100644
--- a/monitor.c
+++ b/monitor.c
@@ -334,10 +334,14 @@ static int read_and_act(struct active_array *a)
*/
if (sync_completed > a->last_checkpoint &&
sync_completed - a->last_checkpoint > a->info.component_size >> 4 &&
- a->curr_action > reshape && a->next_action == bad_action) {
+ a->curr_action > reshape) {
+ /* A (non-reshape) sync_action has reached a checkpoint.
+ * Record the updated position in the metadata
+ */
+ a->last_checkpoint = sync_completed;
+ a->container->ss->set_array_state(a, a->curr_state <= clean);
+ } else if (sync_completed > a->last_checkpoint)
a->last_checkpoint = sync_completed;
- a->next_action = idle;
- }
a->container->ss->sync_metadata(a->container);
dprintf("%s(%d): state:%s action:%s next(", __func__, a->info.container_member,