From: Adam Kwolek Date: Thu, 6 Jan 2011 07:29:15 +0000 (+1100) Subject: imsm: update array size information in metadata X-Git-Tag: mdadm-3.2~129 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ef83fa1a7c48d356df0ef4408ee4ac89bab6c48a;p=thirdparty%2Fmdadm.git imsm: update array size information in metadata When disks are added size has to increase in metadata. This size should be used by common code to set size in md when reshape will be finished. Signed-off-by: Adam Kwolek Signed-off-by: NeilBrown --- diff --git a/super-intel.c b/super-intel.c index ffb03437..c52aea87 100644 --- a/super-intel.c +++ b/super-intel.c @@ -5646,6 +5646,7 @@ static void imsm_process_update(struct supertype *st, void **sp = update->space_list; struct imsm_dev *newdev; struct imsm_map *newmap, *oldmap; + int used_disks; if (!sp) continue; @@ -5678,6 +5679,28 @@ static void imsm_process_update(struct supertype *st, memcpy(newmap, oldmap, sizeof_imsm_map(oldmap)); } + /* calculate new size + */ + 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; id->dev = newdev; *sp = tofree;