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

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