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

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