From: Adam Kwolek Date: Thu, 6 Jan 2011 07:29:11 +0000 (+1100) Subject: imsm: FIX: Division by 0 X-Git-Tag: mdadm-3.2~130 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6345120e387df797bb734bea907112ef1b226030;p=thirdparty%2Fmdadm.git 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 Signed-off-by: NeilBrown --- diff --git a/super-intel.c b/super-intel.c index 27385bb7..ffb03437 100644 --- a/super-intel.c +++ b/super-intel.c @@ -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 {