imsm: FIX: Division by 0

For general migration function blocks_per_migr_unit() has to return valid value.
If there is no valid return, 0 is returned instead and causes division by 0 error.
Additionally guard in function was added for such case.

Signed-off-by: Adam Kwolek <adam.kwolek@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
Adam Kwolek 2011-01-06 18:29:11 +11:00 committed by NeilBrown
parent a4546b6189
commit 6345120e38
1 changed files with 9 additions and 6 deletions

View File

@ -1498,6 +1498,7 @@ static __u64 blocks_per_migr_unit(struct imsm_dev *dev)
return 0;
switch (migr_type(dev)) {
case MIGR_GEN_MIGR:
case MIGR_VERIFY:
case MIGR_REPAIR:
case MIGR_INIT: {
@ -1534,8 +1535,6 @@ static __u64 blocks_per_migr_unit(struct imsm_dev *dev)
migr_chunk = migr_strip_blocks_rebuild(dev);
return migr_chunk * stripes_per_unit;
}
case MIGR_GEN_MIGR:
/* FIXME I need a number here */
case MIGR_STATE_CHANGE:
default:
return 0;
@ -4877,10 +4876,14 @@ static int imsm_set_array_state(struct active_array *a, int consistent)
/* still reshaping, maybe update curr_migr_unit */
long long blocks_per_unit = blocks_per_migr_unit(dev);
long long unit = a->last_checkpoint;
unit /= blocks_per_unit;
if (unit > __le32_to_cpu(dev->vol.curr_migr_unit)) {
dev->vol.curr_migr_unit = __cpu_to_le32(unit);
super->updates_pending++;
if (blocks_per_unit) {
unit /= blocks_per_unit;
if (unit >
__le32_to_cpu(dev->vol.curr_migr_unit)) {
dev->vol.curr_migr_unit =
__cpu_to_le32(unit);
super->updates_pending++;
}
}
return 0;
} else {