imsm: move common code for array size calculation to function
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>
This commit is contained in:
parent
ed7333bd68
commit
70bdf0dcc3
|
@ -5051,6 +5051,37 @@ static void handle_missing(struct intel_super *super, struct imsm_dev *dev)
|
||||||
super->updates_pending++;
|
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_set_disk(struct active_array *a, int n, int state);
|
||||||
|
|
||||||
static void imsm_progress_container_reshape(struct intel_super *super)
|
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 *map = get_imsm_map(dev, 0);
|
||||||
struct imsm_map *map2;
|
struct imsm_map *map2;
|
||||||
int prev_num_members;
|
int prev_num_members;
|
||||||
int used_disks;
|
|
||||||
|
|
||||||
if (dev->vol.migr_state)
|
if (dev->vol.migr_state)
|
||||||
return;
|
return;
|
||||||
|
@ -5098,26 +5128,7 @@ static void imsm_progress_container_reshape(struct intel_super *super)
|
||||||
memcpy(map2, map, copy_map_size);
|
memcpy(map2, map, copy_map_size);
|
||||||
map2->num_members = prev_num_members;
|
map2->num_members = prev_num_members;
|
||||||
|
|
||||||
/* calculate new size
|
imsm_set_array_size(dev);
|
||||||
*/
|
|
||||||
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));
|
|
||||||
}
|
|
||||||
super->updates_pending++;
|
super->updates_pending++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5914,8 +5925,6 @@ static int apply_reshape_container_disks_update(struct imsm_update_reshape *u,
|
||||||
/* update one device only
|
/* update one device only
|
||||||
*/
|
*/
|
||||||
if (devices_to_reshape) {
|
if (devices_to_reshape) {
|
||||||
int used_disks;
|
|
||||||
|
|
||||||
dprintf("imsm: modifying subdev: %i\n",
|
dprintf("imsm: modifying subdev: %i\n",
|
||||||
id->index);
|
id->index);
|
||||||
devices_to_reshape--;
|
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);
|
newmap = get_imsm_map(newdev, 1);
|
||||||
memcpy(newmap, oldmap, sizeof_imsm_map(oldmap));
|
memcpy(newmap, oldmap, sizeof_imsm_map(oldmap));
|
||||||
|
|
||||||
/* calculate new size
|
imsm_set_array_size(newdev);
|
||||||
*/
|
|
||||||
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));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sp = (void **)id->dev;
|
sp = (void **)id->dev;
|
||||||
|
|
Loading…
Reference in New Issue