Lukasz Dorau: imsm: fix: check if size of expansion is not larger than maximum

Michael Tokarev mjt at alioth.debian.org
Fri May 25 18:01:40 UTC 2012


Module: mdadm
Branch: master
Commit: 65d38cca1400beac74c0f42c104697a4f1542b96
URL:    http://git.debian.org/?p=pkg-mdadm/mdadm.git;a=commit;h=65d38cca1400beac74c0f42c104697a4f1542b96

Author: Lukasz Dorau <lukasz.dorau at intel.com>
Date:   Thu May 17 16:14:00 2012 +0200

imsm: fix: check if size of expansion is not larger than maximum

We do not check if requested size of expansion is larger than maximum
available size now. If it is larger the output message is a bit misleading,
for example:
   mdadm: Cannot set size on array members.
   mdadm: Cannot set device size for /dev/md/vol: Device or resource busy
Now we check if requested size of expansion is larger than maximum
available size and the appropriate output message was added.

Signed-off-by: Lukasz Dorau <lukasz.dorau at intel.com>
Signed-off-by: NeilBrown <neilb at suse.de>

---

 super-intel.c |   47 ++++++++++++++++++++++++++++++++---------------
 1 files changed, 32 insertions(+), 15 deletions(-)

diff --git a/super-intel.c b/super-intel.c
index 733bb38..6c87e20 100644
--- a/super-intel.c
+++ b/super-intel.c
@@ -9902,6 +9902,9 @@ enum imsm_reshape_type imsm_analyze_change(struct supertype *st,
 	struct imsm_dev *dev;
 	struct intel_super *super;
 	long long current_size;
+	unsigned long long free_size;
+	long long max_size;
+	int rv;
 
 	getinfo_super_imsm_volume(st, &info, NULL);
 	if ((geo->level != info.array.level) &&
@@ -10015,28 +10018,33 @@ enum imsm_reshape_type imsm_analyze_change(struct supertype *st,
 				super->current_vol, st->devnum);
 			goto analyse_change_exit;
 		}
+		/* check the maximum available size
+		 */
+		rv =  imsm_get_free_size(st, dev->vol.map->num_members,
+					 0, chunk, &free_size);
+		if (rv == 0)
+			/* Cannot find maximum available space
+			 */
+			max_size = 0;
+		else {
+			max_size = free_size + current_size;
+			/* align component size
+			 */
+			max_size = imsm_component_size_aligment_check(
+					get_imsm_raid_level(dev->vol.map),
+					chunk * 1024,
+					max_size);
+		}
 		if (geo->size == 0) {
 			/* requested size change to the maximum available size
 			 */
-			unsigned long long freesize;
-			int rv;
-
-			rv =  imsm_get_free_size(st, dev->vol.map->num_members,
-						 0, chunk, &freesize);
-			if (rv == 0) {
+			if (max_size == 0) {
 				fprintf(stderr, Name " Error. Cannot find "
 					"maximum available space.\n");
 				change = -1;
 				goto analyse_change_exit;
-			}
-			geo->size = freesize + current_size;
-
-			/* align component size
-			 */
-			geo->size = imsm_component_size_aligment_check(
-					      get_imsm_raid_level(dev->vol.map),
-					      chunk * 1024,
-					      geo->size);
+			} else
+				geo->size = max_size;
 		}
 
 		if ((direction == ROLLBACK_METADATA_CHANGES)) {
@@ -10057,6 +10065,15 @@ enum imsm_reshape_type imsm_analyze_change(struct supertype *st,
 					current_size, geo->size);
 				goto analyse_change_exit;
 			}
+			if (max_size && geo->size > max_size) {
+				fprintf(stderr,
+					Name " Error. Requested size is larger "
+					"than maximum available size (maximum "
+					"available size is %llu, "
+					"requested size /rounded/ is %llu).\n",
+					max_size, geo->size);
+				goto analyse_change_exit;
+			}
 		}
 		geo->size *= data_disks;
 		geo->raid_disks = dev->vol.map->num_members;




More information about the pkg-mdadm-commits mailing list