Compare commits

..

No commits in common. "c8-beta" and "c8" have entirely different histories.
c8-beta ... c8

4 changed files with 476 additions and 1 deletions

View File

@ -0,0 +1,151 @@
From 476b00bdeeb6c004b3a758bd842b0fa9e4164508 Mon Sep 17 00:00:00 2001
From: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Date: Mon, 5 Feb 2024 15:50:29 +0100
Subject: [PATCH 1/1] Revert "mdadm: remove container_enough logic"
Mentioned patch changes way of IMSM member arrays assembling, they are
updated by every new drive incremental processes. Previously, member
arrays were created and filled once, by last drive incremental process.
We determined regressions with various impact. Unfortunately, initial
testing didn't show them.
Regressions are connected to drive appearance order and may not be
reproducible on every configuration, there are at least two know
issues for now:
- sysfs attributes are filled using old metadata if there is
outdated drive and it is enumerated first.
- rebuild may be aborted and started from beginning after reboot,
if drive under rebuild is enumerated as the last one.
This reverts commit 4dde420fc3e24077ab926f79674eaae1b71de10b. It fixes
checkpatch issues and reworks logic to remove empty "if" branch in
Incremental.
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
---
Incremental.c | 9 +++++++++
mdadm.h | 7 +++++++
super-ddf.c | 1 +
super-intel.c | 32 +++++++++++++++++++++++++++++++-
4 files changed, 48 insertions(+), 1 deletion(-)
diff --git a/Incremental.c b/Incremental.c
index 6cbc164a27b9..30c07c037028 100644
--- a/Incremental.c
+++ b/Incremental.c
@@ -1467,6 +1467,15 @@ static int Incremental_container(struct supertype *st, char *devname,
st->ss->getinfo_super(st, &info, NULL);
+ if (info.container_enough < 0 || (info.container_enough == 0 && c->runstop < 1)) {
+ if (c->export)
+ printf("MD_STARTED=no\n");
+ else if (c->verbose)
+ pr_err("Not enough devices to start the container.\n");
+
+ return 0;
+ }
+
match = conf_match(st, &info, devname, c->verbose, &rv);
if (match == NULL && rv == 2)
return rv;
diff --git a/mdadm.h b/mdadm.h
index 709b6104c401..1f28b3e754be 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -377,6 +377,13 @@ struct mdinfo {
int container_member; /* for assembling external-metatdata arrays
* This is to be used internally by metadata
* handler only */
+ /**
+ * flag external handlers can set to indicate that subarrays have:
+ * - not enough disks to start (-1),
+ * - enough disks to start (0),
+ * - all expected disks (1).
+ */
+ int container_enough;
char sys_name[32];
struct mdinfo *devs;
struct mdinfo *next;
diff --git a/super-ddf.c b/super-ddf.c
index a87e3169d325..7571e3b740c6 100644
--- a/super-ddf.c
+++ b/super-ddf.c
@@ -1975,6 +1975,7 @@ static void getinfo_super_ddf(struct supertype *st, struct mdinfo *info, char *m
info->array.ctime = DECADE + __be32_to_cpu(*cptr);
info->array.chunk_size = 0;
+ info->container_enough = 1;
info->disk.major = 0;
info->disk.minor = 0;
diff --git a/super-intel.c b/super-intel.c
index 6a664a2e58d3..dbea235dd4bd 100644
--- a/super-intel.c
+++ b/super-intel.c
@@ -3778,6 +3778,7 @@ static void getinfo_super_imsm(struct supertype *st, struct mdinfo *info, char *
struct intel_super *super = st->sb;
struct imsm_disk *disk;
int map_disks = info->array.raid_disks;
+ int max_enough = -1;
int i;
struct imsm_super *mpb;
@@ -3819,9 +3820,12 @@ static void getinfo_super_imsm(struct supertype *st, struct mdinfo *info, char *
for (i = 0; i < mpb->num_raid_devs; i++) {
struct imsm_dev *dev = get_imsm_dev(super, i);
- int j = 0;
+ int failed, enough, j, missing = 0;
struct imsm_map *map;
+ __u8 state;
+ failed = imsm_count_failed(super, dev, MAP_0);
+ state = imsm_check_degraded(super, dev, failed, MAP_0);
map = get_imsm_map(dev, MAP_0);
/* any newly missing disks?
@@ -3836,11 +3840,37 @@ static void getinfo_super_imsm(struct supertype *st, struct mdinfo *info, char *
if (!(ord & IMSM_ORD_REBUILD) &&
get_imsm_missing(super, idx)) {
+ missing = 1;
break;
}
}
+
+ if (state == IMSM_T_STATE_FAILED)
+ enough = -1;
+ else if (state == IMSM_T_STATE_DEGRADED &&
+ (state != map->map_state || missing))
+ enough = 0;
+ else /* we're normal, or already degraded */
+ enough = 1;
+ if (is_gen_migration(dev) && missing) {
+ /* during general migration we need all disks
+ * that process is running on.
+ * No new missing disk is allowed.
+ */
+ max_enough = -1;
+ enough = -1;
+ /* no more checks necessary
+ */
+ break;
+ }
+ /* in the missing/failed disk case check to see
+ * if at least one array is runnable
+ */
+ max_enough = max(max_enough, enough);
}
+ info->container_enough = max_enough;
+
if (super->disks) {
__u32 reserved = imsm_reserved_sectors(super, super->disks);
--
2.32.0 (Apple Git-132)

View File

@ -0,0 +1,42 @@
From 582945c2d3bbead4a71de521a392e292a4a84e24 Mon Sep 17 00:00:00 2001
From: Pawel Piatkowski <pawel.piatkowski@intel.com>
Date: Wed, 20 Dec 2023 10:32:49 +0100
Subject: [PATCH 1/1] manage: adjust checking subarray state in update_subarray
Only changing bitmap related consistency_policy requires
subarray to be inactive.
consistency_policy with PPL or NO_PPL value can be changed on
active subarray.
It fixes regression introduced in commit
db10eab68e652f141169 ("Fix --update-subarray on active volume")
Signed-off-by: Pawel Piatkowski <pawel.piatkowski@intel.com>
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
---
Manage.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/Manage.c b/Manage.c
index f0d4cb01..91532266 100644
--- a/Manage.c
+++ b/Manage.c
@@ -1749,6 +1749,7 @@ int Update_subarray(char *dev, char *subarray, enum update_opt update,
int fd, rv = 2;
struct mdinfo *info = NULL;
char *update_verb = map_num(update_options, update);
+ bool allow_active = update == UOPT_PPL || update == UOPT_NO_PPL;
memset(st, 0, sizeof(*st));
@@ -1763,7 +1764,7 @@ int Update_subarray(char *dev, char *subarray, enum update_opt update,
goto free_super;
}
- if (is_subarray_active(subarray, st->devnm)) {
+ if (!allow_active && is_subarray_active(subarray, st->devnm)) {
if (verbose >= 0)
pr_err("Subarray %s in %s is active, cannot update %s\n",
subarray, dev, update_verb);
--
2.40.1

View File

@ -0,0 +1,267 @@
From dcc22ae74a864358b812327a423435b541789a36 Mon Sep 17 00:00:00 2001
From: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Date: Thu, 1 Feb 2024 12:32:41 +0100
Subject: [PATCH 1/1] super1: remove support for name= in config
Only super1 provides "name=" to config. It is recoreded in metadata
so there is no need to duplicate same information.
UUID is our main key.
It is not used by Incremental and Assemble handles empty name well
because other supertypes don't set it in conf.
Expectation that the name in config is same as in metadata is bug prone.
Config should be the place where use can define customized settings.
Remove printing "name=" from mdadm config creation commands. Ignore
the name in config file to keep backward compatibility. Remove
description from man mdadm.conf.
Update 00conftest because "name" is no longer accepted.
As the name is ignored, error for mdadm --detail is not printed.
Reported-by: Stefan Fleischmann <sfle@kth.se>
Fixes: e2eb503bd797 ("mdadm: Follow POSIX Portable Character Set")
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
---
config.c | 12 ++----
mdadm.conf.5.in | 7 ---
super1.c | 8 ----
tests/00confnames | 79 ++++++----------------------------
tests/templates/names_template | 7 +--
5 files changed, 19 insertions(+), 94 deletions(-)
diff --git a/config.c b/config.c
index 9a04cae8..44f7dd2f 100644
--- a/config.c
+++ b/config.c
@@ -262,6 +262,7 @@ pass:
* @cmdline: context dependent actions.
*
* If criteria passed, set name in @ident.
+ * Note: name is not used by config file, it for cmdline only.
*
* Return: %MDADM_STATUS_SUCCESS or %MDADM_STATUS_ERROR.
*/
@@ -571,7 +572,8 @@ void arrayline(char *line)
mis.super_minor = minor;
}
} else if (strncasecmp(w, "name=", 5) == 0) {
- _ident_set_name(&mis, w + 5, false);
+ /* Ignore name in confile */
+ continue;
} else if (strncasecmp(w, "bitmap=", 7) == 0) {
if (mis.bitmap_file)
pr_err("only specify bitmap file once. %s ignored\n",
@@ -1279,13 +1281,7 @@ struct mddev_ident *conf_match(struct supertype *st,
array_list->devname);
continue;
}
- if (array_list->name[0] &&
- strcasecmp(array_list->name, info->name) != 0) {
- if (verbose >= 2 && array_list->devname)
- pr_err("Name differs from %s.\n",
- array_list->devname);
- continue;
- }
+
if (array_list->devices && devname &&
!match_oneof(array_list->devices, devname)) {
if (verbose >= 2 && array_list->devname)
diff --git a/mdadm.conf.5.in b/mdadm.conf.5.in
index 94e23dd0..787e51e9 100644
--- a/mdadm.conf.5.in
+++ b/mdadm.conf.5.in
@@ -133,13 +133,6 @@ The value should be a 128 bit uuid in hexadecimal, with punctuation
interspersed if desired. This must match the uuid stored in the
superblock.
.TP
-.B name=
-The value should be a simple textual name as was given to
-.I mdadm
-when the array was created. This must match the name stored in the
-superblock on a device for that device to be included in the array.
-Not all superblock formats support names.
-.TP
.B super\-minor=
The value is an integer which indicates the minor number that was
stored in the superblock when the array was created. When an array is
diff --git a/super1.c b/super1.c
index dfde4629..5fd2228e 100644
--- a/super1.c
+++ b/super1.c
@@ -645,10 +645,6 @@ static void brief_examine_super1(struct supertype *st, int verbose)
printf(":");
printf("%02x", sb->set_uuid[i]);
}
- if (sb->set_name[0]) {
- printf(" name=");
- print_quoted(sb->set_name);
- }
printf("\n");
}
@@ -875,10 +871,6 @@ static void brief_detail_super1(struct supertype *st, char *subarray)
struct mdp_superblock_1 *sb = st->sb;
int i;
- if (sb->set_name[0]) {
- printf(" name=");
- print_quoted(sb->set_name);
- }
printf(" UUID=");
for (i = 0; i < 16; i++) {
if ((i & 3) == 0 && i != 0)
diff --git a/tests/00confnames b/tests/00confnames
index 10823f01..191a905f 100644
--- a/tests/00confnames
+++ b/tests/00confnames
@@ -1,10 +1,8 @@
set -x -e
. tests/templates/names_template
-# Test how <devname> and <name> from config are handled during Incremental assemblation.
-# 1-6 <devnode> only tests (no <name> in config).
-# 6-10 <devname> and <name> combinations are tested.
-# 11-13 corner cases.
+# Test how <devname> is handled during Incremental assemblation with
+# config file and ARRAYLINE specified.
names_create "/dev/md/name"
local _UUID="$(mdadm -D --export /dev/md127 | grep MD_UUID | cut -d'=' -f2)"
@@ -12,96 +10,47 @@ local _UUID="$(mdadm -D --export /dev/md127 | grep MD_UUID | cut -d'=' -f2)"
# 1. <devname> definition consistent with metadata name.
-names_make_conf $_UUID "/dev/md/name" "empty" $config
+names_make_conf $_UUID "/dev/md/name" $config
mdadm -S "/dev/md127"
mdadm -I $dev0 --config=$config
names_verify "/dev/md127" "name" "name"
mdadm -S "/dev/md127"
# 2. Same as 1, but use short name form of <devname>.
-names_make_conf $_UUID "name" "empty" $config
+names_make_conf $_UUID "name" $config
mdadm -I $dev0 --config=$config
names_verify "/dev/md127" "name" "name"
mdadm -S "/dev/md127"
# 3. Same as 1, but use different <devname> than metadata provides.
-names_make_conf $_UUID "/dev/md/other" "empty" $config
+names_make_conf $_UUID "/dev/md/other" $config
mdadm -I $dev0 --config=$config
names_verify "/dev/md127" "other" "name"
mdadm -S "/dev/md127"
# 4. Same as 3, but use short name form of <devname>.
-names_make_conf $_UUID "other" "empty" $config
+names_make_conf $_UUID "other" $config
mdadm -I $dev0 --config=$config
names_verify "/dev/md127" "other" "name"
mdadm -S "/dev/md127"
-# 5. Force particular node creation by setting <devname> to /dev/mdX. Link is not created in this
-# case.
-names_make_conf $_UUID "/dev/md4" "empty" $config
+# 5. Force particular node creation by setting <devname> to /dev/mdX.
+# Link is not created in this case.
+names_make_conf $_UUID "/dev/md4" $config
mdadm -I $dev0 --config=$config
names_verify "/dev/md4" "empty" "name"
mdadm -S "/dev/md4"
-# 6. <devname> set to /dev/mdX, <name> same as in metadata.
-# Metadata name and default node used - controversial. Current behavior documented.
-names_make_conf $_UUID "/dev/md22" "name" $config
-mdadm -I $dev0 --config=$config
-names_verify "/dev/md127" "name" "name"
-mdadm -S "/dev/md127"
-
-# 7. <devname> set to /dev/mdX, <name> different than in metadata.
-# Metadata name and default node used - controversial. Current behavior documented.
-names_make_conf $_UUID "/dev/md8" "other" $config
-mdadm -I $dev0 --config=$config
-names_verify "/dev/md127" "name" "name"
-mdadm -S "/dev/md127"
-
-# 8. Both <devname> and <name> different than in metadata.
-# Metadata name and default node used - controversial. Current behavior documented.
-names_make_conf $_UUID "devnode" "other_name" $config
-mdadm -I $dev0 --config=$config
-names_verify "/dev/md127" "name" "name"
-mdadm -S "/dev/md127"
-
-# 9. <devname> set to metadata name, <name> different than in metadata.
-# Metadata name and default node used - controversial. Current behavior documented.
-names_make_conf $_UUID "name" "other_name" $config
-mdadm -I $dev0 --config=$config
-names_verify "/dev/md127" "name" "name"
-mdadm -S "/dev/md127"
-
-# 10. Bad <devname> set, no <name>.
-# Metadata name and default node used - expected.
-names_make_conf $_UUID "/im/bad/devname" "empty" $config
-mdadm -I $dev0 --config=$config
-names_verify "/dev/md127" "name" "name"
-mdadm -S "/dev/md127"
-
-# 11. <devname> with some special symbols and locales, no <name>.
+# 6. <devname> with some special symbols and locales.
# <devname> should be ignored.
-names_make_conf $_UUID "tźż-\.,<>st+-" "empty" $config
-mdadm -I $dev0 --config=$config
-names_verify "/dev/md127" "name" "name"
-mdadm -S "/dev/md127"
-
-# 12. No <devname> and <name> set.
-# Metadata name and default node used - expected.
-names_make_conf $_UUID "empty" "empty" $config
-mdadm -I $dev0 --config=$config
-names_verify "/dev/md127" "name" "name"
-mdadm -S "/dev/md127"
-
-# 13. No <devname>, <name> set to /dev/mdX.
-# Entry should be ignored, it is not ignored but result is good anyway.
-names_make_conf $_UUID "empty" "/dev/md12" $config
+names_make_conf $_UUID "tźż-\.,<>st+-" $config
mdadm -I $dev0 --config=$config
names_verify "/dev/md127" "name" "name"
mdadm -S "/dev/md127"
-# 13. No <devname>, <name> with special symbols and locales.
-# Entry should be ignored, it is not ignored but result is good anyway.
-names_make_conf $_UUID "empty" "./\śćń#&" $config
+# 7. No <devname> set.
+# Metadata name and default node used.
+names_make_conf $_UUID "empty" $config
mdadm -I $dev0 --config=$config
names_verify "/dev/md127" "name" "name"
mdadm -S "/dev/md127"
diff --git a/tests/templates/names_template b/tests/templates/names_template
index 6181bfaa..1b6cd14b 100644
--- a/tests/templates/names_template
+++ b/tests/templates/names_template
@@ -63,8 +63,7 @@ function names_verify() {
names_make_conf() {
local UUID="$1"
local WANTED_DEVNAME="$2"
- local WANTED_NAME="$3"
- local CONF="$4"
+ local CONF="$3"
local LINE="ARRAY metadata=1.2 UUID=$UUID"
@@ -72,9 +71,5 @@ names_make_conf() {
LINE="$LINE $WANTED_DEVNAME"
fi
- if [[ "$WANTED_NAME" != "empty" ]]; then
- LINE="$LINE name=$WANTED_NAME"
- fi
-
echo $LINE > $CONF
}
--
2.41.0

View File

@ -2,7 +2,7 @@ Summary: The mdadm program controls Linux md devices (software RAID arrays)
Name: mdadm Name: mdadm
Version: 4.2 Version: 4.2
# extraversion is used to define rhel internal version # extraversion is used to define rhel internal version
%define extraversion 13 %define extraversion 16
Release: %{extraversion}%{?dist} Release: %{extraversion}%{?dist}
Source: http://www.kernel.org/pub/linux/utils/raid/mdadm/mdadm-%{version}%{?subversion:-%{subversion}}.tar.xz Source: http://www.kernel.org/pub/linux/utils/raid/mdadm/mdadm-%{version}%{?subversion:-%{subversion}}.tar.xz
Source1: mdmonitor.init Source1: mdmonitor.init
@ -179,6 +179,9 @@ Patch161: 0162-mdadm-ddf-Abort-when-raid-disk-is-smaller-in-getinfo.patch
Patch162: 0163-mdadm-super1-Add-MD_FEATURE_RAID0_LAYOUT-if-kernel-5.patch Patch162: 0163-mdadm-super1-Add-MD_FEATURE_RAID0_LAYOUT-if-kernel-5.patch
Patch163: 0164-mdadm-remove-container_enough-logic.patch Patch163: 0164-mdadm-remove-container_enough-logic.patch
Patch164: 0165-Fix-assembling-RAID-volume-by-using-incremental.patch Patch164: 0165-Fix-assembling-RAID-volume-by-using-incremental.patch
Patch165: 0166-Revert-mdadm-remove-container_enough-logic.patch
Patch166: 0167-manage-adjust-checking-subarray-state-in-update_suba.patch
Patch167: 0168-super1-remove-support-for-name-in-config.patch
# RHEL customization patches # RHEL customization patches
Patch200: mdadm-udev.patch Patch200: mdadm-udev.patch
@ -273,6 +276,18 @@ rm -rf %{buildroot}
/usr/share/mdadm/mdcheck /usr/share/mdadm/mdcheck
%changelog %changelog
* Mon Oct 28 2024 Xiao Ni <xni@redhat.com> - 4.2-16
- Remove name= support in config file
- Resolves RHEL-45608
* Thu Mar 28 2024 Xiao Ni <xni@redhat.com> - 4.2-15
- Fix update_subarray on active volume - missing patch
- Resolves RHEL-20833
* Fri Mar 15 2024 Xiao Ni <xni@redhat.com> - 4.2-14
- Revert "mdadm: remove container_enough logic"
- Resolves RHEL-26274
* Fri Nov 10 2023 Xiao Ni <xni@redhat.com> - 4.2-13 * Fri Nov 10 2023 Xiao Ni <xni@redhat.com> - 4.2-13
- Fix raid0 layout display problem - Fix raid0 layout display problem
- Resolves RHEL-8372 - Resolves RHEL-8372