]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
imsm: move common code for array size calculation to function
authorAdam Kwolek <adam.kwolek@intel.com>
Thu, 3 Feb 2011 06:57:25 +0000 (17:57 +1100)
committerNeilBrown <neilb@suse.de>
Thu, 3 Feb 2011 06:57:25 +0000 (17:57 +1100)
Array size calculation is made in the same way in few places in code.
Make function imsm_set_device_size() for this common code.

Signed-off-by: Adam Kwolek <adam.kwolek@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
super-intel.c

index cfa43951d849a683700ad08b7ed7acea9299b5c8..988b603ea0761190d29acb589614fc9d1bbe957c 100644 (file)
@@ -5051,6 +5051,37 @@ static void handle_missing(struct intel_super *super, struct imsm_dev *dev)
        super->updates_pending++;
 }
 
+static unsigned long long imsm_set_array_size(struct imsm_dev *dev)
+{
+       int used_disks = imsm_num_data_members(dev, 0);
+       unsigned long long array_blocks;
+       struct imsm_map *map;
+
+       if (used_disks == 0) {
+               /* when problems occures
+                * return current array_blocks value
+                */
+               array_blocks = __le32_to_cpu(dev->size_high);
+               array_blocks = array_blocks << 32;
+               array_blocks += __le32_to_cpu(dev->size_low);
+
+               return array_blocks;
+       }
+
+       /* set array size in metadata
+        */
+       map = get_imsm_map(dev, 0);
+       array_blocks = map->blocks_per_member * used_disks;
+
+       /* round array size down to closest MB
+        */
+       array_blocks = (array_blocks >> SECT_PER_MB_SHIFT) << SECT_PER_MB_SHIFT;
+       dev->size_low = __cpu_to_le32((__u32)array_blocks);
+       dev->size_high = __cpu_to_le32((__u32)(array_blocks >> 32));
+
+       return array_blocks;
+}
+
 static void imsm_set_disk(struct active_array *a, int n, int state);
 
 static void imsm_progress_container_reshape(struct intel_super *super)
@@ -5070,7 +5101,6 @@ static void imsm_progress_container_reshape(struct intel_super *super)
                struct imsm_map *map = get_imsm_map(dev, 0);
                struct imsm_map *map2;
                int prev_num_members;
-               int used_disks;
 
                if (dev->vol.migr_state)
                        return;
@@ -5098,26 +5128,7 @@ static void imsm_progress_container_reshape(struct intel_super *super)
                memcpy(map2, map, copy_map_size);
                map2->num_members = prev_num_members;
 
-               /* calculate new size
-                */
-               used_disks = imsm_num_data_members(dev, 0);
-               if (used_disks) {
-                       unsigned long long array_blocks;
-
-                       array_blocks =
-                               map->blocks_per_member
-                               * used_disks;
-                       /* round array size down to closest MB
-                        */
-                       array_blocks = (array_blocks
-                                       >> SECT_PER_MB_SHIFT)
-                               << SECT_PER_MB_SHIFT;
-                       dev->size_low =
-                               __cpu_to_le32((__u32)array_blocks);
-                       dev->size_high =
-                               __cpu_to_le32(
-                                       (__u32)(array_blocks >> 32));
-               }
+               imsm_set_array_size(dev);
                super->updates_pending++;
        }
 }
@@ -5914,8 +5925,6 @@ static int apply_reshape_container_disks_update(struct imsm_update_reshape *u,
                /* update one device only
                 */
                if (devices_to_reshape) {
-                       int used_disks;
-
                        dprintf("imsm: modifying subdev: %i\n",
                                id->index);
                        devices_to_reshape--;
@@ -5933,24 +5942,7 @@ static int apply_reshape_container_disks_update(struct imsm_update_reshape *u,
                        newmap = get_imsm_map(newdev, 1);
                        memcpy(newmap, oldmap, sizeof_imsm_map(oldmap));
 
-                       /* calculate new size
-                        */
-                       used_disks = imsm_num_data_members(newdev, 0);
-                       if (used_disks) {
-                               unsigned long long array_blocks;
-
-                               array_blocks =
-                                       newmap->blocks_per_member * used_disks;
-                               /* round array size down to closest MB
-                                */
-                               array_blocks = (array_blocks
-                                               >> SECT_PER_MB_SHIFT)
-                                       << SECT_PER_MB_SHIFT;
-                               newdev->size_low =
-                                       __cpu_to_le32((__u32)array_blocks);
-                               newdev->size_high =
-                                       __cpu_to_le32((__u32)(array_blocks >> 32));
-                       }
+                       imsm_set_array_size(newdev);
                }
 
                sp = (void **)id->dev;