imsm: fix: imsm_num_data_members() can return error

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>
This commit is contained in:
Adam Kwolek 2011-02-03 17:47:52 +11:00 committed by NeilBrown
parent e154ced310
commit d55adef98e
1 changed files with 20 additions and 11 deletions

View 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,