summaryrefslogtreecommitdiff
path: root/super-intel.c
diff options
context:
space:
mode:
authorAdam Kwolek <adam.kwolek@intel.com>2011-04-06 12:40:31 +1000
committerNeilBrown <neilb@suse.de>2011-04-06 12:40:31 +1000
commit139dae1137839dfe41ec17d720e41aac3af60604 (patch)
treea485ecad150d93b79f5ef7ae8cd89e2e241f8b74 /super-intel.c
parent2a4a08e7d3a3a76094352a3c477d7901ac993554 (diff)
imsm: fix: report aligned component size value
OROM can create array with chunk size not aligned. To resolve this problem in mdadm, metadata handler has to report component size aligned value for mdadm operations while metadata value stays unchanged. Do not correct alignment for raid1 and in error case. Correction allows check in analyse_change() (Grow.c:905) to pass. 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.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/super-intel.c b/super-intel.c
index 362e4330..dc5e34e3 100644
--- a/super-intel.c
+++ b/super-intel.c
@@ -1745,6 +1745,7 @@ static void getinfo_super_imsm_volume(struct supertype *st, struct mdinfo *info,
struct imsm_map *map_to_analyse = map;
struct dl *dl;
char *devname;
+ unsigned int component_size_alligment;
int map_disks = info->array.raid_disks;
if (prev_map)
@@ -1824,6 +1825,21 @@ static void getinfo_super_imsm_volume(struct supertype *st, struct mdinfo *info,
info->data_offset = __le32_to_cpu(map_to_analyse->pba_of_lba0);
info->component_size =
__le32_to_cpu(map_to_analyse->blocks_per_member);
+
+ /* check component size aligment
+ */
+ component_size_alligment =
+ info->component_size % (info->array.chunk_size/512);
+
+ if (component_size_alligment &&
+ (info->array.level != 1) && (info->array.level != UnSet)) {
+ dprintf("imsm: reported component size alligned from %llu ",
+ info->component_size);
+ info->component_size -= component_size_alligment;
+ dprintf("to %llu (%i).\n",
+ info->component_size, component_size_alligment);
+ }
+
memset(info->uuid, 0, sizeof(info->uuid));
info->recovery_start = MaxSector;