]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
imsm: FIX: Division by 0
authorAdam Kwolek <adam.kwolek@intel.com>
Thu, 6 Jan 2011 07:29:11 +0000 (18:29 +1100)
committerNeilBrown <neilb@suse.de>
Thu, 6 Jan 2011 07:29:11 +0000 (18:29 +1100)
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>
super-intel.c

index 27385bb7c9fd4462b51bc949df14f1f2dcc87d8d..ffb03437697e55ede723d916862bf545b8d13df2 100644 (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 {