summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Kwolek <adam.kwolek@intel.com>2011-03-14 18:17:53 +1100
committerNeilBrown <neilb@suse.de>2011-03-14 18:17:53 +1100
commit6289d1e07912fe927a8f294eac8855a12241849c (patch)
treea9a1d766dc6d533105b5b4c5c1d78e6c7ae437da
parent0d51bfa20e231ebcbb15c2a278c837c8e3b6c2b1 (diff)
downloadmdadm-6289d1e07912fe927a8f294eac8855a12241849c.tar.gz
imsm: FIX: Store checkpoint in per disk units
While last_checkpoint is counter in per disk units, checkpoints should be stored in the same manner. Restoring from checkpoint should should recalculate checkpoint in to array position (reshape_progress). Signed-off-by: Adam Kwolek <adam.kwolek@intel.com> Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r--super-intel.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/super-intel.c b/super-intel.c
index 7e06cb4..44c100b 100644
--- a/super-intel.c
+++ b/super-intel.c
@@ -1703,8 +1703,6 @@ static __u64 blocks_per_migr_unit(struct imsm_dev *dev)
migr_chunk = migr_strip_blocks_resync(dev);
disks = imsm_num_data_members(dev, 0);
blocks_per_unit = stripes_per_unit * migr_chunk * disks;
- if (migr_type(dev) == MIGR_GEN_MIGR)
- return blocks_per_unit;
stripe = __le32_to_cpu(map->blocks_per_strip) * disks;
segment = blocks_per_unit / stripe;
block_rel = blocks_per_unit - segment * stripe;
@@ -1855,6 +1853,12 @@ static void getinfo_super_imsm_volume(struct supertype *st, struct mdinfo *info,
int used_disks;
info->reshape_progress = blocks_per_unit * units;
+
+ /* checkpoint is written per disks unit
+ * recalculate it to reshape position
+ */
+ used_disks = imsm_num_data_members(dev, 0);
+ info->reshape_progress *= used_disks;
dprintf("IMSM: General Migration checkpoint : %llu "
"(%llu) -> read reshape progress : %llu\n",
units, blocks_per_unit, info->reshape_progress);