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:
parent
a4546b6189
commit
6345120e38
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue