[PATCH 19/23] Expand raid0 array using takeover

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

 



(Online Capacity Expansion for IMSM)
For raid0 array grow operation is not possible due to lack of implementation in md for this raid level.
In fact raid0 volume can be represented as degraded raid5 (layout 4) with missing parity disk, so for raid0 grow operation we have execute takeover. From metadata perspective nothing has changed, so no additional metadata update is required.

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

 Grow.c |   23 ++++++++++++++++++++++-
 1 files changed, 22 insertions(+), 1 deletions(-)

diff --git a/Grow.c b/Grow.c
index 85d7fe0..77e554c 100644
--- a/Grow.c
+++ b/Grow.c
@@ -615,6 +615,14 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
 		return 1;
 	}
 
+	/* Online Capacity Expansion uses takeover
+	 */
+	if ((array.level == 0) && (level == UnSet)) {
+		/* for raid0 use takeover to raid5
+		 */
+		level = 5;
+	}
+
 	/* ========= set size =============== */
 	if (size >= 0 && (size == 0 || size != array.size)) {
 		array.size = size;
@@ -878,6 +886,12 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
 				/* if raid0 was takeovered by any other
 				 * personality start mdmon */
 				if (level > 0 && orig.level == 0) {
+					/* Online Capacity Expansion uses takeover.
+					 * We have degragated array, so target
+					 * disks number has to be increased
+					 */
+					if ((level == 5) && (raid_disks > 0))
+						raid_disks++;
 					if (!mdmon_running(dn))
 						start_mdmon(dn);
 					ping_monitor(devnum2devname(dn));
@@ -1288,6 +1302,7 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
 			int counter = 20;
 			int result = -1;
 			struct mdu_array_info_s test_array;
+			int required_disks = 0;
 
 			array.raid_disks = ndisks;
 			/* check if we have external or native metadata @@ -1321,6 +1336,12 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
 			if (result != 0)
 				goto ext_array_setup_exit;
 
+			required_disks = ndisks;
+			/* have in mind degradation (takeover)
+			 */
+			if (ioctl(fd, GET_ARRAY_INFO, &test_array) >= 0)
+				required_disks -= test_array.raid_disks - test_array.working_disks;
+
 			/* prepare meta update and add devices to mdmon
 			 */
 			info.delta_disks = delta_disks;
@@ -1340,7 +1361,7 @@ int Grow_reshape(char *devname, int fd, int quiet, char *backup_file,
 				 */
 				if (ioctl(fd, GET_ARRAY_INFO, &test_array) < 0)
 					counter--;
-				else if (test_array.working_disks == ndisks) {
+				else if (test_array.working_disks == required_disks) {
 						counter = 0;
 						external_meta_status = EXTERNAL_META_STATUS_OK;
 					} else {

--
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