diff options
author | Adam Kwolek <adam.kwolek@intel.com> | 2011-02-03 17:47:52 +1100 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2011-02-03 17:47:52 +1100 |
commit | d55adef98e6a9ee0550857d79e7ce4568a388092 (patch) | |
tree | 2378a180072cf20350697eb01de8b9acd0bdfea5 /super-intel.c | |
parent | e154ced310878c96700cd0f73e5c5df60e6352b3 (diff) |
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>
Diffstat (limited to 'super-intel.c')
-rw-r--r-- | super-intel.c | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/super-intel.c b/super-intel.c index c29f37e6..998df3e2 100644 --- a/super-intel.c +++ b/super-intel.c @@ -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, |