[PATCH 20/34] imsm: FIX: Division by 0
From: Adam Kwolek <hidden>
Date: 2011-01-04 14:38:16
Subsystem:
the rest · Maintainer:
Linus Torvalds
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 <redacted> --- super-intel.c | 15 +++++++++------ 1 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/super-intel.c b/super-intel.c
index 58ed702..dc4f308 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;
@@ -4889,10 +4888,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 {