summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Kwolek <adam.kwolek@intel.com>2012-04-13 16:52:02 +0200
committerNeilBrown <neilb@suse.de>2012-04-17 12:33:37 +1000
commit7e7e9a4d72323fe0298c9f5741245b0f11165a31 (patch)
tree934a04c40498a69f540064074f8fd4a94b327708
parent44f6f18113b1764a9d1234d3ff9a6bac968b03b8 (diff)
downloadmdadm-7e7e9a4d72323fe0298c9f5741245b0f11165a31.tar.gz
FIX: Respect metadata size limitations
When reshape_super() updates metadata with new size, due to some metadata limitations saved value can be different than requested value by user. Update size (read it from metadata) for setting it in md. Signed-off-by: Adam Kwolek <adam.kwolek@intel.com> Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r--Grow.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/Grow.c b/Grow.c
index e8f6554..86d1020 100644
--- a/Grow.c
+++ b/Grow.c
@@ -1637,6 +1637,27 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
goto release;
}
sync_metadata(st);
+ if (st->ss->external) {
+ /* metadata can have size limitation
+ * update size value according to metadata information
+ */
+ struct mdinfo *sizeinfo =
+ st->ss->container_content(st, subarray);
+ if (sizeinfo) {
+ unsigned long long new_size =
+ sizeinfo->custom_array_size/2;
+ int data_disks = get_data_disks(
+ sizeinfo->array.level,
+ sizeinfo->array.layout,
+ sizeinfo->array.raid_disks);
+ new_size /= data_disks;
+ dprintf("Metadata size correction from %llu to "
+ "%llu (%llu)\n", orig_size, new_size,
+ new_size * data_disks);
+ size = new_size;
+ sysfs_free(sizeinfo);
+ }
+ }
/* Update the size of each member device in case
* they have been resized. This will never reduce