[PATCH 23/34] Set array size after adding new disks

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



When new disks are added array size has to be set by mdadm as array grows.

Signed-off-by: Adam Kwolek <adam.kwolek@xxxxxxxxx>
---

 Grow.c |   67 +++++++++++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 51 insertions(+), 16 deletions(-)

diff --git a/Grow.c b/Grow.c
index 1c10889..0b151f1 100644
--- a/Grow.c
+++ b/Grow.c
@@ -2034,26 +2034,61 @@ static int reshape_array(char *container, int fd, char *devname,
 			unlink(backup_file);
 		if (!done)
 			abort_reshape(sra);
-		else if (info->new_level != info->array.level) {
-			/* We need to wait for the reshape to finish
-			 * (which will have happened unless odata < ndata)
-			 * and then set the level
+		else {
+			/* set new array size size - if required
 			 */
+			if (reshape.before.raid_disks <
+			    reshape.after.raid_disks) {
+				struct mdinfo *info2;
 
-			c = map_num(pers, info->new_level);
-			if (c == NULL) {
-				if (forked)
-					return 1;
-				exit(0);/* not possible */
+				wait_reshape(sra);
+				ping_monitor(container);
+
+				info2 = st->ss->container_content(st, subarray);
+				if (info2) {
+					unsigned long long current_size = 0;
+					unsigned long long new_size =
+						info2->custom_array_size/2;
+
+					sysfs_get_ll(sra,
+						     NULL,
+						     "array_size",
+						     &current_size);
+					if (new_size > current_size) {
+						if (sysfs_set_num(sra, NULL,
+							"array_size", new_size)
+						    < 0)
+							dprintf("Error: Cannot"\
+							     " set array size");
+						else
+							dprintf("Array size "\
+								"changed");
+						dprintf(" from %llu to %llu.\n",
+							current_size, new_size);
+					}
+					sysfs_free(info2);
+				}
 			}
 
-			if (reshape.before.raid_disks < 
-			    reshape.after.raid_disks)
-				wait_reshape(sra);
-			err = sysfs_set_str(sra, NULL, "level", c);
-			if (err)
-				fprintf(stderr, Name ": %s: could not set level to %s\n",
-					devname, c);
+			if (info->new_level != info->array.level) {
+				/* We need to wait for the reshape to finish
+				* (which will have happened unless
+				 * odata < ndata) and then set the level
+				*/
+
+				c = map_num(pers, info->new_level);
+				if (c == NULL) {
+					if (forked)
+						return 1;
+					exit(0);/* not possible */
+				}
+
+				err = sysfs_set_str(sra, NULL, "level", c);
+				if (err)
+					fprintf(stderr, Name\
+						": %s: could not set level"\
+						"to %s\n", devname, c);
+			}
 		}
 		if (forked)
 			return 0;

--
To unsubscribe from this list: send the line "unsubscribe linux-raid" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux