imsm: FIX: Max position could not be rounded to MB

When rounded array size information from metadata is used for number
of migration units calculation it can occurs that result of units
can be smaller (-1) than required due to used (rounded) array size).

Signed-off-by: Adam Kwolek <adam.kwolek@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
Adam Kwolek 2011-06-09 13:00:55 +10:00 committed by NeilBrown
parent 0228d92ca3
commit 3ef4403cf6
1 changed files with 3 additions and 9 deletions

View File

@ -7620,10 +7620,7 @@ void init_migr_record_imsm(struct supertype *st, struct imsm_dev *dev,
struct imsm_map *map_dest = get_imsm_map(dev, 0);
struct imsm_map *map_src = get_imsm_map(dev, 1);
unsigned long long num_migr_units;
unsigned long long array_blocks =
(((unsigned long long)__le32_to_cpu(dev->size_high)) << 32) +
__le32_to_cpu(dev->size_low);
unsigned long long array_blocks;
memset(migr_rec, 0, sizeof(struct migr_record));
migr_rec->family_num = __cpu_to_le32(super->anchor->family_num);
@ -7639,7 +7636,7 @@ void init_migr_record_imsm(struct supertype *st, struct imsm_dev *dev,
__cpu_to_le32(migr_rec->dest_depth_per_unit * new_data_disks);
migr_rec->dest_depth_per_unit =
__cpu_to_le32(migr_rec->dest_depth_per_unit);
array_blocks = info->component_size * new_data_disks;
num_migr_units =
array_blocks / __le32_to_cpu(migr_rec->blocks_per_unit);
@ -8736,10 +8733,7 @@ static int imsm_manage_reshape(
goto abort;
}
max_position =
__le32_to_cpu(migr_rec->post_migr_vol_cap) +
((unsigned long long)__le32_to_cpu(
migr_rec->post_migr_vol_cap_hi) << 32);
max_position = sra->component_size * ndata;
while (__le32_to_cpu(migr_rec->curr_migr_unit) <
__le32_to_cpu(migr_rec->num_migr_units)) {