Blame SOURCES/0025-imsm-block-changing-slots-during-creation.patch

b33395
From 9a7df595bbe360132cb37c8b39aa1fd9ac24b43f Mon Sep 17 00:00:00 2001
b33395
From: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
b33395
Date: Tue, 21 Jun 2022 00:10:43 +0800
b33395
Subject: [PATCH 25/52] imsm: block changing slots during creation
b33395
b33395
If user specifies drives for array creation, then slot order across
b33395
volumes is not preserved.
b33395
Ideally, it should be checked in validate_geometry() but it is not
b33395
possible in current implementation (order is determined later).
b33395
Add verification in add_to_super_imsm_volume() and throw error if
b33395
mismatch is detected.
b33395
IMSM allows to use only same members within container.
b33395
This is not hardware dependency but metadata limitation.
b33395
Therefore, 09-imsm-overlap test is removed. Testing it is pointless.
b33395
After this patch, creation in this scenario is blocked. Offset
b33395
verification is covered in other tests.
b33395
b33395
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
b33395
Acked-by: Coly Li <colyli@suse.de>
b33395
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
b33395
---
b33395
 super-intel.c        | 33 ++++++++++++++++++++++-----------
b33395
 tests/09imsm-overlap | 28 ----------------------------
b33395
 2 files changed, 22 insertions(+), 39 deletions(-)
b33395
 delete mode 100644 tests/09imsm-overlap
b33395
b33395
diff --git a/super-intel.c b/super-intel.c
b33395
index deef7c87..8ffe485c 100644
b33395
--- a/super-intel.c
b33395
+++ b/super-intel.c
b33395
@@ -5789,6 +5789,10 @@ static int add_to_super_imsm_volume(struct supertype *st, mdu_disk_info_t *dk,
b33395
 	struct imsm_map *map;
b33395
 	struct dl *dl, *df;
b33395
 	int slot;
b33395
+	int autolayout = 0;
b33395
+
b33395
+	if (!is_fd_valid(fd))
b33395
+		autolayout = 1;
b33395
 
b33395
 	dev = get_imsm_dev(super, super->current_vol);
b33395
 	map = get_imsm_map(dev, MAP_0);
b33395
@@ -5799,25 +5803,32 @@ static int add_to_super_imsm_volume(struct supertype *st, mdu_disk_info_t *dk,
b33395
 		return 1;
b33395
 	}
b33395
 
b33395
-	if (!is_fd_valid(fd)) {
b33395
-		/* we're doing autolayout so grab the pre-marked (in
b33395
-		 * validate_geometry) raid_disk
b33395
-		 */
b33395
-		for (dl = super->disks; dl; dl = dl->next)
b33395
+	for (dl = super->disks; dl ; dl = dl->next) {
b33395
+		if (autolayout) {
b33395
 			if (dl->raiddisk == dk->raid_disk)
b33395
 				break;
b33395
-	} else {
b33395
-		for (dl = super->disks; dl ; dl = dl->next)
b33395
-			if (dl->major == dk->major &&
b33395
-			    dl->minor == dk->minor)
b33395
-				break;
b33395
+		} else if (dl->major == dk->major && dl->minor == dk->minor)
b33395
+			break;
b33395
 	}
b33395
 
b33395
 	if (!dl) {
b33395
-		pr_err("%s is not a member of the same container\n", devname);
b33395
+		if (!autolayout)
b33395
+			pr_err("%s is not a member of the same container.\n",
b33395
+			       devname);
b33395
 		return 1;
b33395
 	}
b33395
 
b33395
+	if (!autolayout && super->current_vol > 0) {
b33395
+		int _slot = get_disk_slot_in_dev(super, 0, dl->index);
b33395
+
b33395
+		if (_slot != dk->raid_disk) {
b33395
+			pr_err("Member %s is in %d slot for the first volume, but is in %d slot for a new volume.\n",
b33395
+			       dl->devname, _slot, dk->raid_disk);
b33395
+			pr_err("Raid members are in different order than for the first volume, aborting.\n");
b33395
+			return 1;
b33395
+		}
b33395
+	}
b33395
+
b33395
 	if (mpb->num_disks == 0)
b33395
 		if (!get_dev_sector_size(dl->fd, dl->devname,
b33395
 					 &super->sector_size))
b33395
diff --git a/tests/09imsm-overlap b/tests/09imsm-overlap
b33395
deleted file mode 100644
b33395
index ff5d2093..00000000
b33395
--- a/tests/09imsm-overlap
b33395
+++ /dev/null
b33395
@@ -1,28 +0,0 @@
b33395
-
b33395
-. tests/env-imsm-template
b33395
-
b33395
-# create raid arrays with varying degress of overlap
b33395
-mdadm -CR $container -e imsm -n 6 $dev0 $dev1 $dev2 $dev3 $dev4 $dev5
b33395
-imsm_check container 6
b33395
-
b33395
-size=1024
b33395
-level=1
b33395
-num_disks=2
b33395
-mdadm -CR $member0 $dev0 $dev1 -n $num_disks -l $level -z $size
b33395
-mdadm -CR $member1 $dev1 $dev2 -n $num_disks -l $level -z $size
b33395
-mdadm -CR $member2 $dev2 $dev3 -n $num_disks -l $level -z $size
b33395
-mdadm -CR $member3 $dev3 $dev4 -n $num_disks -l $level -z $size
b33395
-mdadm -CR $member4 $dev4 $dev5 -n $num_disks -l $level -z $size
b33395
-
b33395
-udevadm settle
b33395
-
b33395
-offset=0
b33395
-imsm_check member $member0 $num_disks $level $size 1024 $offset
b33395
-offset=$((offset+size+4096))
b33395
-imsm_check member $member1 $num_disks $level $size 1024 $offset
b33395
-offset=$((offset+size+4096))
b33395
-imsm_check member $member2 $num_disks $level $size 1024 $offset
b33395
-offset=$((offset+size+4096))
b33395
-imsm_check member $member3 $num_disks $level $size 1024 $offset
b33395
-offset=$((offset+size+4096))
b33395
-imsm_check member $member4 $num_disks $level $size 1024 $offset
b33395
-- 
b33395
2.31.1
b33395