]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
imsm: fix: imsm_num_data_members() can return error
authorAdam Kwolek <adam.kwolek@intel.com>
Thu, 3 Feb 2011 06:47:52 +0000 (17:47 +1100)
committerNeilBrown <neilb@suse.de>
Thu, 3 Feb 2011 06:47:52 +0000 (17:47 +1100)
imsm_num_data_members() can indicate error by returning 0 value
In such case size cannot be set based on 0 value.

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

index c29f37e613a525ca3ad6b81df9fad57d7c7b1d56..998df3e2d9efded40df27c55206c75eccc8a0907 100644 (file)
@@ -5177,18 +5177,27 @@ static int imsm_set_array_state(struct active_array *a, int consistent)
                                struct mdinfo *mdi;
 
                                used_disks = imsm_num_data_members(dev, -1);
-                               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));
-                               a->info.custom_array_size = array_blocks;
-                               a->check_reshape = 1; /* encourage manager to update
-                                                      * array size
-                                                      */
-                               super->updates_pending++;
+                               if (used_disks > 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));
+                                       a->info.custom_array_size = array_blocks;
+                                       /* encourage manager to update array
+                                        * size
+                                        */
+                                       super->updates_pending++;
 
+                                       a->check_reshape = 1;
+                               }
                                /* finalize online capacity expansion/reshape */
                                for (mdi = a->info.devs; mdi; mdi = mdi->next)
                                        imsm_set_disk(a,