summaryrefslogtreecommitdiffstats
path: root/super-intel.c
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2010-06-15 18:41:57 -0700
committerDan Williams <dan.j.williams@intel.com>2010-06-15 18:41:57 -0700
commit4f0a7acc9a0a93d39b66b29e374f9a5edd173047 (patch)
tree5d4b7f9ff2453cdaa778b248effdba4354adbd79 /super-intel.c
parent0d80bb2f97e876379fb0ba732e8e97894ebe3de9 (diff)
downloadmdadm-4f0a7acc9a0a93d39b66b29e374f9a5edd173047.tar.gz
mdadm-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 'super-intel.c')
-rw-r--r--super-intel.c7
1 files changed, 2 insertions, 5 deletions
diff --git a/super-intel.c b/super-intel.c
index b88e6a9..3bd041a 100644
--- a/super-intel.c
+++ b/super-intel.c
@@ -4415,14 +4415,11 @@ static int imsm_set_array_state(struct active_array *a, int consistent)
/* check if we can update curr_migr_unit from resync_start, recovery_start */
blocks_per_unit = blocks_per_migr_unit(dev);
- if (blocks_per_unit && failed <= 1) {
+ if (blocks_per_unit) {
__u32 units32;
__u64 units;
- if (migr_type(dev) == MIGR_REBUILD)
- units = min_recovery_start(&a->info) / blocks_per_unit;
- else
- units = a->info.resync_start / blocks_per_unit;
+ units = a->last_checkpoint / blocks_per_unit;
units32 = units;
/* check that we did not overflow 32-bits, and that