[PATCH 20/34] imsm: FIX: Division by 0

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxx>
---

 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 {

--
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux