diff options
author | Adam Kwolek <adam.kwolek@intel.com> | 2011-03-14 18:17:53 +1100 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2011-03-14 18:17:53 +1100 |
commit | 6289d1e07912fe927a8f294eac8855a12241849c (patch) | |
tree | a9a1d766dc6d533105b5b4c5c1d78e6c7ae437da | |
parent | 0d51bfa20e231ebcbb15c2a278c837c8e3b6c2b1 (diff) | |
download | mdadm-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.c | 8 |
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); |