[PATCH] Ignore RAID0 layout if the second zone has only one device

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

 



Le 07/04/2022 à 00:55, NeilBrown wrote:
On Wed, 06 Apr 2022, Pascal Hambourg wrote:
On 05/04/2022, NeilBrown wrote:
On Wed, 06 Apr 2022, Pascal Hambourg wrote:

This is a question about original/alternate layout enforcement for RAID0
arrays with members of different sizes introduced by commits
c84a1372df929033cb1a0441fb57bd3932f39ac9 ("md/raid0: avoid RAID0 data
corruption due to layout confusion.)" and
33f2c35a54dfd75ad0e7e86918dcbe4de799a56c ("md: add feature flag
MD_FEATURE_RAID0_LAYOUT").

The layout is irrelevant if all members have the same size so the array
has only one zone. But isn't it also irrelevant if the array has two
zones and the second zone has only one device, for example if the array
has two members of different sizes ?

Yes.

So wouldn't it make sense to allow assembly even when the layout is
undefined, like what is done when the array has only one zone ?

Yes.

P.S.  maybe you would like to try making the code change yourself, and
posting the patch.

Sure. In order to check the number of devices in the second zone I had
to move the layout check after all zones are set up. Is this fine ?

diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c
index b21e101183f4..7623811cc11c 100644
--- a/drivers/md/raid0.c
+++ b/drivers/md/raid0.c
@@ -128,21 +128,6 @@ static int create_strip_zones(struct mddev *mddev, struct r0conf **private_conf)
   	pr_debug("md/raid0:%s: FINAL %d zones\n",
   		 mdname(mddev), conf->nr_strip_zones);

-	if (conf->nr_strip_zones == 1) {
-		conf->layout = RAID0_ORIG_LAYOUT;
-	} else if (mddev->layout == RAID0_ORIG_LAYOUT ||
-		   mddev->layout == RAID0_ALT_MULTIZONE_LAYOUT) {
-		conf->layout = mddev->layout;
-	} else if (default_layout == RAID0_ORIG_LAYOUT ||
-		   default_layout == RAID0_ALT_MULTIZONE_LAYOUT) {
-		conf->layout = default_layout;
-	} else {
-		pr_err("md/raid0:%s: cannot assemble multi-zone RAID0 with default_layout setting\n",
-		       mdname(mddev));
-		pr_err("md/raid0: please set raid0.default_layout to 1 or 2\n");
-		err = -ENOTSUPP;
-		goto abort;
-	}
   	/*
   	 * now since we have the hard sector sizes, we can make sure
   	 * chunk size is a multiple of that sector size
@@ -273,6 +258,22 @@ static int create_strip_zones(struct mddev *mddev, struct r0conf **private_conf)
   			 (unsigned long long)smallest->sectors);
   	}

+	if (conf->nr_strip_zones == 1 || conf->strip_zone[1].nb_dev == 1) {
+		conf->layout = RAID0_ORIG_LAYOUT;
+	} else if (mddev->layout == RAID0_ORIG_LAYOUT ||
+		   mddev->layout == RAID0_ALT_MULTIZONE_LAYOUT) {
+		conf->layout = mddev->layout;
+	} else if (default_layout == RAID0_ORIG_LAYOUT ||
+		   default_layout == RAID0_ALT_MULTIZONE_LAYOUT) {
+		conf->layout = default_layout;
+	} else {
+		pr_err("md/raid0:%s: cannot assemble multi-zone RAID0 with default_layout setting\n",
+		       mdname(mddev));
+		pr_err("md/raid0: please set raid0.default_layout to 1 or 2\n");
+		err = -ENOTSUPP;
+		goto abort;
+	}
+
   	pr_debug("md/raid0:%s: done.\n", mdname(mddev));
   	*private_conf = conf;




[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