forked from pool/mdadm
Accepting request 1083057 from Base:System
OBS-URL: https://build.opensuse.org/request/show/1083057 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/mdadm?expand=0&rev=142
This commit is contained in:
commit
7db78d5cae
87
0052-mdmon-fix-segfault.patch
Normal file
87
0052-mdmon-fix-segfault.patch
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
From 9b429fc0a4ffd7028b3b336589d38e32fb9045dc Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mateusz Kusiak <mateusz.kusiak@intel.com>
|
||||||
|
Date: Mon, 2 Jan 2023 09:46:21 +0100
|
||||||
|
Subject: [PATCH] mdmon: fix segfault
|
||||||
|
|
||||||
|
Mdmon crashes if stat2devnm returns null.
|
||||||
|
Use open_mddev to check if device is mddevice and get name using
|
||||||
|
fd2devnm.
|
||||||
|
Refactor container name handling.
|
||||||
|
|
||||||
|
Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
|
||||||
|
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
|
||||||
|
Signed-off-by: Coly Li <colyli@suse.de>
|
||||||
|
---
|
||||||
|
Makefile | 2 +-
|
||||||
|
mdmon.c | 26 ++++++++++++--------------
|
||||||
|
2 files changed, 13 insertions(+), 15 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Makefile b/Makefile
|
||||||
|
index ec1f99e..5eac1a4 100644
|
||||||
|
--- a/Makefile
|
||||||
|
+++ b/Makefile
|
||||||
|
@@ -160,7 +160,7 @@ SRCS = $(patsubst %.o,%.c,$(OBJS))
|
||||||
|
|
||||||
|
INCL = mdadm.h part.h bitmap.h
|
||||||
|
|
||||||
|
-MON_OBJS = mdmon.o monitor.o managemon.o uuid.o util.o maps.o mdstat.o sysfs.o \
|
||||||
|
+MON_OBJS = mdmon.o monitor.o managemon.o uuid.o util.o maps.o mdstat.o sysfs.o config.o mapfile.o mdopen.o\
|
||||||
|
policy.o lib.o \
|
||||||
|
Kill.o sg_io.o dlink.o ReadMe.o super-intel.o \
|
||||||
|
super-mbr.o super-gpt.o \
|
||||||
|
diff --git a/mdmon.c b/mdmon.c
|
||||||
|
index e9d035e..ecf52dc 100644
|
||||||
|
--- a/mdmon.c
|
||||||
|
+++ b/mdmon.c
|
||||||
|
@@ -363,14 +363,14 @@ int main(int argc, char *argv[])
|
||||||
|
}
|
||||||
|
|
||||||
|
if (all == 0 && container_name == NULL) {
|
||||||
|
- if (argv[optind])
|
||||||
|
- container_name = argv[optind];
|
||||||
|
+ if (argv[optind]) {
|
||||||
|
+ container_name = get_md_name(argv[optind]);
|
||||||
|
+ if (!container_name)
|
||||||
|
+ container_name = argv[optind];
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (container_name == NULL)
|
||||||
|
- usage();
|
||||||
|
-
|
||||||
|
- if (argc - optind > 1)
|
||||||
|
+ if (container_name == NULL || argc - optind > 1)
|
||||||
|
usage();
|
||||||
|
|
||||||
|
if (strcmp(container_name, "/proc/mdstat") == 0)
|
||||||
|
@@ -402,21 +402,19 @@ int main(int argc, char *argv[])
|
||||||
|
free_mdstat(mdstat);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
- } else if (strncmp(container_name, "md", 2) == 0) {
|
||||||
|
- int id = devnm2devid(container_name);
|
||||||
|
- if (id)
|
||||||
|
- devnm = container_name;
|
||||||
|
} else {
|
||||||
|
- struct stat st;
|
||||||
|
+ int mdfd = open_mddev(container_name, 1);
|
||||||
|
|
||||||
|
- if (stat(container_name, &st) == 0)
|
||||||
|
- devnm = xstrdup(stat2devnm(&st));
|
||||||
|
+ if (mdfd < 0)
|
||||||
|
+ return 1;
|
||||||
|
+ devnm = fd2devnm(mdfd);
|
||||||
|
+ close(mdfd);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!devnm) {
|
||||||
|
pr_err("%s is not a valid md device name\n",
|
||||||
|
container_name);
|
||||||
|
- exit(1);
|
||||||
|
+ return 1;
|
||||||
|
}
|
||||||
|
return mdmon(devnm, dofork && do_fork(), takeover);
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.35.3
|
||||||
|
|
117
0053-util-remove-obsolete-code-from-get_md_name.patch
Normal file
117
0053-util-remove-obsolete-code-from-get_md_name.patch
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
From b938519e7719c992dae2d61c796c45fe49e6b71b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mateusz Kusiak <mateusz.kusiak@intel.com>
|
||||||
|
Date: Mon, 2 Jan 2023 09:46:22 +0100
|
||||||
|
Subject: [PATCH] util: remove obsolete code from get_md_name
|
||||||
|
|
||||||
|
get_md_name() is used only with mdstat entries.
|
||||||
|
Remove dead code and simplyfy function.
|
||||||
|
|
||||||
|
Remove redundadnt checks from mdmon.c
|
||||||
|
|
||||||
|
Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
|
||||||
|
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
|
||||||
|
Signed-off-by: Coly Li <colyli@suse.de>
|
||||||
|
---
|
||||||
|
mdmon.c | 8 +++-----
|
||||||
|
util.c | 51 +++++++++++++++++----------------------------------
|
||||||
|
2 files changed, 20 insertions(+), 39 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/mdmon.c b/mdmon.c
|
||||||
|
index ecf52dc..60ba318 100644
|
||||||
|
--- a/mdmon.c
|
||||||
|
+++ b/mdmon.c
|
||||||
|
@@ -366,7 +366,7 @@ int main(int argc, char *argv[])
|
||||||
|
if (argv[optind]) {
|
||||||
|
container_name = get_md_name(argv[optind]);
|
||||||
|
if (!container_name)
|
||||||
|
- container_name = argv[optind];
|
||||||
|
+ return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -403,11 +403,9 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
|
return status;
|
||||||
|
} else {
|
||||||
|
- int mdfd = open_mddev(container_name, 1);
|
||||||
|
-
|
||||||
|
- if (mdfd < 0)
|
||||||
|
- return 1;
|
||||||
|
+ int mdfd = open_mddev(container_name, 0);
|
||||||
|
devnm = fd2devnm(mdfd);
|
||||||
|
+
|
||||||
|
close(mdfd);
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/util.c b/util.c
|
||||||
|
index 26ffdce..9cd89fa 100644
|
||||||
|
--- a/util.c
|
||||||
|
+++ b/util.c
|
||||||
|
@@ -968,47 +968,30 @@ dev_t devnm2devid(char *devnm)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+/**
|
||||||
|
+ * get_md_name() - Get main dev node of the md device.
|
||||||
|
+ * @devnm: Md device name or path.
|
||||||
|
+ *
|
||||||
|
+ * Function checks if the full name was passed and returns md name
|
||||||
|
+ * if it is the MD device.
|
||||||
|
+ *
|
||||||
|
+ * Return: Main dev node of the md device or NULL if not found.
|
||||||
|
+ */
|
||||||
|
char *get_md_name(char *devnm)
|
||||||
|
{
|
||||||
|
- /* find /dev/md%d or /dev/md/%d or make a device /dev/.tmp.md%d */
|
||||||
|
- /* if dev < 0, want /dev/md/d%d or find mdp in /proc/devices ... */
|
||||||
|
-
|
||||||
|
- static char devname[50];
|
||||||
|
+ static char devname[NAME_MAX];
|
||||||
|
struct stat stb;
|
||||||
|
- dev_t rdev = devnm2devid(devnm);
|
||||||
|
- char *dn;
|
||||||
|
|
||||||
|
- if (rdev == 0)
|
||||||
|
- return 0;
|
||||||
|
- if (strncmp(devnm, "md_", 3) == 0) {
|
||||||
|
- snprintf(devname, sizeof(devname), "/dev/md/%s",
|
||||||
|
- devnm + 3);
|
||||||
|
- if (stat(devname, &stb) == 0 &&
|
||||||
|
- (S_IFMT&stb.st_mode) == S_IFBLK && (stb.st_rdev == rdev))
|
||||||
|
- return devname;
|
||||||
|
- }
|
||||||
|
- snprintf(devname, sizeof(devname), "/dev/%s", devnm);
|
||||||
|
- if (stat(devname, &stb) == 0 && (S_IFMT&stb.st_mode) == S_IFBLK &&
|
||||||
|
- (stb.st_rdev == rdev))
|
||||||
|
- return devname;
|
||||||
|
+ if (strncmp(devnm, "/dev/", 5) == 0)
|
||||||
|
+ snprintf(devname, sizeof(devname), "%s", devnm);
|
||||||
|
+ else
|
||||||
|
+ snprintf(devname, sizeof(devname), "/dev/%s", devnm);
|
||||||
|
|
||||||
|
- snprintf(devname, sizeof(devname), "/dev/md/%s", devnm+2);
|
||||||
|
- if (stat(devname, &stb) == 0 && (S_IFMT&stb.st_mode) == S_IFBLK &&
|
||||||
|
- (stb.st_rdev == rdev))
|
||||||
|
+ if (!is_mddev(devname))
|
||||||
|
+ return NULL;
|
||||||
|
+ if (stat(devname, &stb) == 0 && (S_IFMT&stb.st_mode) == S_IFBLK)
|
||||||
|
return devname;
|
||||||
|
|
||||||
|
- dn = map_dev(major(rdev), minor(rdev), 0);
|
||||||
|
- if (dn)
|
||||||
|
- return dn;
|
||||||
|
- snprintf(devname, sizeof(devname), "/dev/.tmp.%s", devnm);
|
||||||
|
- if (mknod(devname, S_IFBLK | 0600, rdev) == -1)
|
||||||
|
- if (errno != EEXIST)
|
||||||
|
- return NULL;
|
||||||
|
-
|
||||||
|
- if (stat(devname, &stb) == 0 && (S_IFMT&stb.st_mode) == S_IFBLK &&
|
||||||
|
- (stb.st_rdev == rdev))
|
||||||
|
- return devname;
|
||||||
|
- unlink(devname);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.35.3
|
||||||
|
|
47
0054-mdmon-don-t-test-both-all-and-container_name.patch
Normal file
47
0054-mdmon-don-t-test-both-all-and-container_name.patch
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
From d39fd87e31024804dd7f2c16c03af0379b71f5f1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: NeilBrown <neilb@suse.de>
|
||||||
|
Date: Mon, 13 Mar 2023 14:42:58 +1100
|
||||||
|
Subject: [PATCH] mdmon: don't test both 'all' and 'container_name'.
|
||||||
|
|
||||||
|
If 'all' is not set, then container_name must be NULL, as nothing else
|
||||||
|
can set it. So simplify the test to ignore container_name.
|
||||||
|
This makes the purpose of the code more obvious.
|
||||||
|
|
||||||
|
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||||
|
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
|
||||||
|
---
|
||||||
|
mdmon.c | 11 ++++-------
|
||||||
|
1 file changed, 4 insertions(+), 7 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/mdmon.c b/mdmon.c
|
||||||
|
index 60ba318..f8fd2f0 100644
|
||||||
|
--- a/mdmon.c
|
||||||
|
+++ b/mdmon.c
|
||||||
|
@@ -352,7 +352,6 @@ int main(int argc, char *argv[])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-
|
||||||
|
if (in_initrd()) {
|
||||||
|
/*
|
||||||
|
* set first char of argv[0] to @. This is used by
|
||||||
|
@@ -362,12 +361,10 @@ int main(int argc, char *argv[])
|
||||||
|
argv[0][0] = '@';
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (all == 0 && container_name == NULL) {
|
||||||
|
- if (argv[optind]) {
|
||||||
|
- container_name = get_md_name(argv[optind]);
|
||||||
|
- if (!container_name)
|
||||||
|
- return 1;
|
||||||
|
- }
|
||||||
|
+ if (!all && argv[optind]) {
|
||||||
|
+ container_name = get_md_name(argv[optind]);
|
||||||
|
+ if (!container_name)
|
||||||
|
+ return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (container_name == NULL || argc - optind > 1)
|
||||||
|
--
|
||||||
|
2.35.3
|
||||||
|
|
33
0055-mdmon-change-systemd-unit-file-to-use-foreground.patch
Normal file
33
0055-mdmon-change-systemd-unit-file-to-use-foreground.patch
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
From 6660e33edde76329bd3b7f03383856c7efee2aa9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: NeilBrown <neilb@suse.de>
|
||||||
|
Date: Mon, 13 Mar 2023 14:42:58 +1100
|
||||||
|
Subject: [PATCH] mdmon: change systemd unit file to use --foreground
|
||||||
|
|
||||||
|
There is no value in mdmon forking when it is running under systemd -
|
||||||
|
systemd can still track it anyway.
|
||||||
|
|
||||||
|
So add --foreground option, and remove "Type=forking".
|
||||||
|
|
||||||
|
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||||
|
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
|
||||||
|
---
|
||||||
|
systemd/mdmon@.service | 3 +--
|
||||||
|
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/systemd/mdmon@.service b/systemd/mdmon@.service
|
||||||
|
index cb6482d..bba9b0e 100644
|
||||||
|
--- a/systemd/mdmon@.service
|
||||||
|
+++ b/systemd/mdmon@.service
|
||||||
|
@@ -20,8 +20,7 @@ Environment=IMSM_NO_PLATFORM=1
|
||||||
|
# 'takeover'. As the '--offroot --takeover' don't hurt when
|
||||||
|
# not necessary, are are useful with root-on-md in dracut,
|
||||||
|
# have them always present.
|
||||||
|
-ExecStart=BINDIR/mdmon --offroot --takeover %I
|
||||||
|
-Type=forking
|
||||||
|
+ExecStart=BINDIR/mdmon --foreground --offroot --takeover %I
|
||||||
|
# Don't set the PIDFile. It isn't necessary (systemd can work
|
||||||
|
# it out) and systemd will remove it when transitioning from
|
||||||
|
# initramfs to rootfs.
|
||||||
|
--
|
||||||
|
2.35.3
|
||||||
|
|
55
0056-mdmon-Remove-need-for-KillMode-none.patch
Normal file
55
0056-mdmon-Remove-need-for-KillMode-none.patch
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
From 0f9a4b3e11fbe4f8631d20b1f89cf43e9219db55 Mon Sep 17 00:00:00 2001
|
||||||
|
From: NeilBrown <neilb@suse.de>
|
||||||
|
Date: Mon, 13 Mar 2023 14:42:58 +1100
|
||||||
|
Subject: [PATCH] mdmon: Remove need for KillMode=none
|
||||||
|
|
||||||
|
mdmon needs to keep running during the switchroot out of (at boot) and
|
||||||
|
then back into (at shutdown) the initrd. It runs until a new mdmon
|
||||||
|
takes over.
|
||||||
|
|
||||||
|
Killmode=none is used to achieve this, with the help of --offroot which
|
||||||
|
sets argv[0][0] to '@' which systemd understands.
|
||||||
|
|
||||||
|
This is needed because mdmon is currently run in system-mdmon.slice
|
||||||
|
which conflicts with shutdown.target so without Killmode=none mdmon
|
||||||
|
would get killed early in shutdown when system.mdmon.slice is removed.
|
||||||
|
|
||||||
|
As described in systemd.service(5), this conflict with shutdown can be
|
||||||
|
resolved by explicitly requesting system.slice, which is a natural
|
||||||
|
counterpart to DefaultDependencies=no.
|
||||||
|
|
||||||
|
So add that, and also add IgnoreOnIsolate=true to avoid another possible
|
||||||
|
source of an early death. With these we no longer need KillMode=none
|
||||||
|
which the systemd developers have marked as "deprecated".
|
||||||
|
|
||||||
|
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||||
|
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
|
||||||
|
---
|
||||||
|
systemd/mdmon@.service | 7 ++++++-
|
||||||
|
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/systemd/mdmon@.service b/systemd/mdmon@.service
|
||||||
|
index bba9b0e..303ad05 100644
|
||||||
|
--- a/systemd/mdmon@.service
|
||||||
|
+++ b/systemd/mdmon@.service
|
||||||
|
@@ -10,6 +10,9 @@ Description=MD Metadata Monitor on /dev/%I
|
||||||
|
DefaultDependencies=no
|
||||||
|
Before=initrd-switch-root.target
|
||||||
|
Documentation=man:mdmon(8)
|
||||||
|
+# Allow mdmon to keep running after switchroot, until a new
|
||||||
|
+# instance is started.
|
||||||
|
+IgnoreOnIsolate=true
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
# mdmon should never complain due to lack of a platform,
|
||||||
|
@@ -25,4 +28,6 @@ ExecStart=BINDIR/mdmon --foreground --offroot --takeover %I
|
||||||
|
# it out) and systemd will remove it when transitioning from
|
||||||
|
# initramfs to rootfs.
|
||||||
|
#PIDFile=/run/mdadm/%I.pid
|
||||||
|
-KillMode=none
|
||||||
|
+# The default slice is system-mdmon.slice which Conflicts
|
||||||
|
+# with shutdown, causing mdmon to exit early. So use system.slice.
|
||||||
|
+Slice=system.slice
|
||||||
|
--
|
||||||
|
2.35.3
|
||||||
|
|
163
0057-mdmon-Improve-switchroot-interactions.patch
Normal file
163
0057-mdmon-Improve-switchroot-interactions.patch
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
From 723d1df4946eb40337bf494f9b2549500c1399b2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: NeilBrown <neilb@suse.de>
|
||||||
|
Date: Mon, 13 Mar 2023 14:42:58 +1100
|
||||||
|
Subject: [PATCH] mdmon: Improve switchroot interactions.
|
||||||
|
|
||||||
|
We need a new mdmon@mdfoo instance to run in the root filesystem after
|
||||||
|
switch root, as /sys and /dev are removed from the initrd.
|
||||||
|
|
||||||
|
systemd will not start a new unit with the same name running while the
|
||||||
|
old unit is still active, and we want the two mdmon processes to overlap
|
||||||
|
in time to avoid any risk of deadlock, which can happen when a write is
|
||||||
|
attempted with no mdmon running.
|
||||||
|
|
||||||
|
So we need a different unit name in the initrd than in the root. Apart
|
||||||
|
from the name, everything else should be the same.
|
||||||
|
|
||||||
|
This is easily achieved using a different instance name as the
|
||||||
|
mdmon@.service unit file already supports multiple instances (for
|
||||||
|
different arrays).
|
||||||
|
|
||||||
|
So start "mdmon@mdfoo.service" from root, but
|
||||||
|
"mdmon@initrd-mdfoo.service" from the initrd. udev can tell which
|
||||||
|
circumstance is the case by looking for /etc/initrd-release.
|
||||||
|
continue_from_systemd() is enhanced so that the "initrd-" prefix can be
|
||||||
|
requested.
|
||||||
|
|
||||||
|
Teach mdmon that a container name like "initrd/foo" should be treated
|
||||||
|
just like "foo". Note that systemd passes the instance name
|
||||||
|
"initrd-foo" as "initrd/foo".
|
||||||
|
|
||||||
|
We don't need a similar mechanism at shutdown because dracut runs
|
||||||
|
"mdmon --takeover --all" when appropriate.
|
||||||
|
|
||||||
|
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||||
|
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
|
||||||
|
---
|
||||||
|
Grow.c | 4 ++--
|
||||||
|
mdadm.h | 2 +-
|
||||||
|
mdmon.c | 7 ++++++-
|
||||||
|
systemd/mdmon@.service | 2 +-
|
||||||
|
udev-md-raid-arrays.rules | 3 ++-
|
||||||
|
util.c | 7 ++++---
|
||||||
|
6 files changed, 16 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
Index: mdadm-4.2/Grow.c
|
||||||
|
===================================================================
|
||||||
|
--- mdadm-4.2.orig/Grow.c
|
||||||
|
+++ mdadm-4.2/Grow.c
|
||||||
|
@@ -3513,7 +3513,7 @@ started:
|
||||||
|
|
||||||
|
if (!forked)
|
||||||
|
if (continue_via_systemd(container ?: sra->sys_name,
|
||||||
|
- GROW_SERVICE)) {
|
||||||
|
+ GROW_SERVICE, NULL)) {
|
||||||
|
free(fdlist);
|
||||||
|
free(offsets);
|
||||||
|
sysfs_free(sra);
|
||||||
|
@@ -3711,7 +3711,7 @@ int reshape_container(char *container, c
|
||||||
|
ping_monitor(container);
|
||||||
|
|
||||||
|
if (!forked && !freeze_reshape)
|
||||||
|
- if (continue_via_systemd(container, GROW_SERVICE))
|
||||||
|
+ if (continue_via_systemd(container, GROW_SERVICE, NULL))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
switch (forked ? 0 : fork()) {
|
||||||
|
Index: mdadm-4.2/mdadm.h
|
||||||
|
===================================================================
|
||||||
|
--- mdadm-4.2.orig/mdadm.h
|
||||||
|
+++ mdadm-4.2/mdadm.h
|
||||||
|
@@ -1550,7 +1550,7 @@ extern int same_dev(char *one, char *two
|
||||||
|
extern int compare_paths (char* path1,char* path2);
|
||||||
|
extern void enable_fds(int devices);
|
||||||
|
extern void manage_fork_fds(int close_all);
|
||||||
|
-extern int continue_via_systemd(char *devnm, char *service_name);
|
||||||
|
+extern int continue_via_systemd(char *devnm, char *service_name, char *prefix);
|
||||||
|
|
||||||
|
extern int parse_auto(char *str, char *msg, int config);
|
||||||
|
extern struct mddev_ident *conf_get_ident(char *dev);
|
||||||
|
Index: mdadm-4.2/mdmon.c
|
||||||
|
===================================================================
|
||||||
|
--- mdadm-4.2.orig/mdmon.c
|
||||||
|
+++ mdadm-4.2/mdmon.c
|
||||||
|
@@ -362,7 +362,12 @@ int main(int argc, char *argv[])
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!all && argv[optind]) {
|
||||||
|
- container_name = get_md_name(argv[optind]);
|
||||||
|
+ static const char prefix[] = "initrd/";
|
||||||
|
+ container_name = argv[optind];
|
||||||
|
+ if (strncmp(container_name, prefix,
|
||||||
|
+ sizeof(prefix) - 1) == 0)
|
||||||
|
+ container_name += sizeof(prefix)-1;
|
||||||
|
+ container_name = get_md_name(container_name);
|
||||||
|
if (!container_name)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
Index: mdadm-4.2/systemd/mdmon@.service
|
||||||
|
===================================================================
|
||||||
|
--- mdadm-4.2.orig/systemd/mdmon@.service
|
||||||
|
+++ mdadm-4.2/systemd/mdmon@.service
|
||||||
|
@@ -6,7 +6,7 @@
|
||||||
|
# (at your option) any later version.
|
||||||
|
|
||||||
|
[Unit]
|
||||||
|
-Description=MD Metadata Monitor on /dev/%I
|
||||||
|
+Description=MD Metadata Monitor on %I
|
||||||
|
DefaultDependencies=no
|
||||||
|
Before=initrd-switch-root.target
|
||||||
|
Documentation=man:mdmon(8)
|
||||||
|
Index: mdadm-4.2/udev-md-raid-arrays.rules
|
||||||
|
===================================================================
|
||||||
|
--- mdadm-4.2.orig/udev-md-raid-arrays.rules
|
||||||
|
+++ mdadm-4.2/udev-md-raid-arrays.rules
|
||||||
|
@@ -38,7 +38,8 @@ ENV{MD_LEVEL}=="raid[1-9]*", ENV{SYSTEMD
|
||||||
|
|
||||||
|
# Tell systemd to run mdmon for our container, if we need it.
|
||||||
|
ENV{MD_LEVEL}=="raid[1-9]*", ENV{MD_CONTAINER}=="?*", PROGRAM="/usr/bin/readlink $env{MD_CONTAINER}", ENV{MD_MON_THIS}="%c"
|
||||||
|
-ENV{MD_MON_THIS}=="?*", PROGRAM="/usr/bin/basename $env{MD_MON_THIS}", ENV{SYSTEMD_WANTS}+="mdmon@%c.service"
|
||||||
|
+ENV{MD_MON_THIS}=="?*", TEST=="/etc/initrd-release", PROGRAM="/usr/bin/basename $env{MD_MON_THIS}", ENV{SYSTEMD_WANTS}+="mdmon@initrd-%c.service"
|
||||||
|
+ENV{MD_MON_THIS}=="?*", TEST!="/etc/initrd-release", PROGRAM="/usr/bin/basename $env{MD_MON_THIS}", ENV{SYSTEMD_WANTS}+="mdmon@%c.service"
|
||||||
|
ENV{RESHAPE_ACTIVE}=="yes", PROGRAM="/usr/bin/basename $env{MD_MON_THIS}", ENV{SYSTEMD_WANTS}+="mdadm-grow-continue@%c.service"
|
||||||
|
|
||||||
|
LABEL="md_end"
|
||||||
|
Index: mdadm-4.2/util.c
|
||||||
|
===================================================================
|
||||||
|
--- mdadm-4.2.orig/util.c
|
||||||
|
+++ mdadm-4.2/util.c
|
||||||
|
@@ -1906,6 +1906,7 @@ int start_mdmon(char *devnm)
|
||||||
|
int len;
|
||||||
|
pid_t pid;
|
||||||
|
int status;
|
||||||
|
+ char *prefix = in_initrd() ? "initrd-" : "";
|
||||||
|
char pathbuf[1024];
|
||||||
|
char *paths[4] = {
|
||||||
|
pathbuf,
|
||||||
|
@@ -1916,7 +1917,7 @@ int start_mdmon(char *devnm)
|
||||||
|
|
||||||
|
if (check_env("MDADM_NO_MDMON"))
|
||||||
|
return 0;
|
||||||
|
- if (continue_via_systemd(devnm, MDMON_SERVICE))
|
||||||
|
+ if (continue_via_systemd(devnm, MDMON_SERVICE, prefix))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* That failed, try running mdmon directly */
|
||||||
|
@@ -2187,7 +2188,7 @@ void manage_fork_fds(int close_all)
|
||||||
|
* 1- if systemd service has been started
|
||||||
|
* 0- otherwise
|
||||||
|
*/
|
||||||
|
-int continue_via_systemd(char *devnm, char *service_name)
|
||||||
|
+int continue_via_systemd(char *devnm, char *service_name, char *prefix)
|
||||||
|
{
|
||||||
|
int pid, status;
|
||||||
|
char pathbuf[1024];
|
||||||
|
@@ -2199,7 +2200,7 @@ int continue_via_systemd(char *devnm, ch
|
||||||
|
case 0:
|
||||||
|
manage_fork_fds(1);
|
||||||
|
snprintf(pathbuf, sizeof(pathbuf),
|
||||||
|
- "%s@%s.service", service_name, devnm);
|
||||||
|
+ "%s@%s%s.service", service_name, prefix ?: "", devnm);
|
||||||
|
status = execl("/usr/bin/systemctl", "systemctl", "restart",
|
||||||
|
pathbuf, NULL);
|
||||||
|
status = execl("/bin/systemctl", "systemctl", "restart",
|
40
0058-mdopen-always-try-create_named_array.patch
Normal file
40
0058-mdopen-always-try-create_named_array.patch
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
From 2e10c46d0906b1a1ec40e8f5005ccb63125dcd9e Mon Sep 17 00:00:00 2001
|
||||||
|
From: NeilBrown <neilb@suse.de>
|
||||||
|
Date: Tue, 14 Mar 2023 11:06:25 +1100
|
||||||
|
Subject: [PATCH] mdopen: always try create_named_array()
|
||||||
|
|
||||||
|
mdopen() will use create_named_array() to ask the kernel to create the
|
||||||
|
given md array, but only if it is given a number or name.
|
||||||
|
If it is NOT given a name and is required to choose one itself using
|
||||||
|
find_free_devnm() it does NOT use create_named_array().
|
||||||
|
|
||||||
|
On kernels with CONFIG_BLOCK_LEGACY_AUTOLOAD not set, this can result in
|
||||||
|
failure to assemble an array. This can particularly seen when the
|
||||||
|
"name" of the array begins with a host name different to the name of the
|
||||||
|
host running the command.
|
||||||
|
|
||||||
|
So add the missing call to create_named_array().
|
||||||
|
|
||||||
|
Link: https://bugzilla.kernel.org/show_bug.cgi?id=217074
|
||||||
|
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||||
|
Acked-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
|
||||||
|
---
|
||||||
|
mdopen.c | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
diff --git a/mdopen.c b/mdopen.c
|
||||||
|
index d18c931..810f79a 100644
|
||||||
|
--- a/mdopen.c
|
||||||
|
+++ b/mdopen.c
|
||||||
|
@@ -370,6 +370,7 @@ int create_mddev(char *dev, char *name, int autof, int trustworthy,
|
||||||
|
}
|
||||||
|
if (block_udev)
|
||||||
|
udev_block(devnm);
|
||||||
|
+ create_named_array(devnm);
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(devname, "/dev/%s", devnm);
|
||||||
|
--
|
||||||
|
2.35.3
|
||||||
|
|
172
0059-Improvements-for-IMSM_NO_PLATFORM-testing.patch
Normal file
172
0059-Improvements-for-IMSM_NO_PLATFORM-testing.patch
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
From 420dafcd38c5949c2ddb90ad6873e7edd625db30 Mon Sep 17 00:00:00 2001
|
||||||
|
From: NeilBrown <neilb@suse.de>
|
||||||
|
Date: Mon, 20 Mar 2023 14:43:54 +1100
|
||||||
|
Subject: [PATCH] Improvements for IMSM_NO_PLATFORM testing.
|
||||||
|
|
||||||
|
Factor out IMSM_NO_PLATFORM testing into a single function that caches
|
||||||
|
the result.
|
||||||
|
|
||||||
|
Allow mdmon to explicitly set the result to "1" so that we don't need
|
||||||
|
the ENV var in the unit file
|
||||||
|
|
||||||
|
Check if the kernel command line contains "mdadm.imsm.test=1" and in
|
||||||
|
that case assert NO_PLATFORM. This simplifies testing in a virtual
|
||||||
|
machine.
|
||||||
|
|
||||||
|
Signed-off-by: NeilBrown <neilb@suse.de>
|
||||||
|
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
|
||||||
|
---
|
||||||
|
mdadm.8.in | 5 +++++
|
||||||
|
mdadm.h | 2 ++
|
||||||
|
mdmon.c | 6 ++++++
|
||||||
|
super-intel.c | 45 +++++++++++++++++++++++++++++++++++++++---
|
||||||
|
systemd/mdmon@.service | 3 ---
|
||||||
|
5 files changed, 55 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/mdadm.8.in b/mdadm.8.in
|
||||||
|
index 6f0f6c1..b715950 100644
|
||||||
|
--- a/mdadm.8.in
|
||||||
|
+++ b/mdadm.8.in
|
||||||
|
@@ -3197,6 +3197,11 @@ environment. This can be useful for testing or for disaster
|
||||||
|
recovery. You should be aware that interoperability may be
|
||||||
|
compromised by setting this value.
|
||||||
|
|
||||||
|
+These change can also be suppressed by adding
|
||||||
|
+.B mdadm.imsm.test=1
|
||||||
|
+to the kernel command line. This makes it easy to test IMSM
|
||||||
|
+code in a virtual machine that doesn't have IMSM virtual hardware.
|
||||||
|
+
|
||||||
|
.TP
|
||||||
|
.B MDADM_GROW_ALLOW_OLD
|
||||||
|
If an array is stopped while it is performing a reshape and that
|
||||||
|
diff --git a/mdadm.h b/mdadm.h
|
||||||
|
index 1e51827..0d99544 100644
|
||||||
|
--- a/mdadm.h
|
||||||
|
+++ b/mdadm.h
|
||||||
|
@@ -1263,6 +1263,8 @@ extern struct superswitch super0, super1;
|
||||||
|
extern struct superswitch super_imsm, super_ddf;
|
||||||
|
extern struct superswitch mbr, gpt;
|
||||||
|
|
||||||
|
+void imsm_set_no_platform(int v);
|
||||||
|
+
|
||||||
|
struct metadata_update {
|
||||||
|
int len;
|
||||||
|
char *buf;
|
||||||
|
diff --git a/mdmon.c b/mdmon.c
|
||||||
|
index 096b4d7..cef5bbc 100644
|
||||||
|
--- a/mdmon.c
|
||||||
|
+++ b/mdmon.c
|
||||||
|
@@ -318,6 +318,12 @@ int main(int argc, char *argv[])
|
||||||
|
{NULL, 0, NULL, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
+ /*
|
||||||
|
+ * mdmon should never complain due to lack of a platform,
|
||||||
|
+ * that is mdadm's job if at all.
|
||||||
|
+ */
|
||||||
|
+ imsm_set_no_platform(1);
|
||||||
|
+
|
||||||
|
while ((opt = getopt_long(argc, argv, "thaF", options, NULL)) != -1) {
|
||||||
|
switch (opt) {
|
||||||
|
case 'a':
|
||||||
|
diff --git a/super-intel.c b/super-intel.c
|
||||||
|
index e155a8a..a5c86cb 100644
|
||||||
|
--- a/super-intel.c
|
||||||
|
+++ b/super-intel.c
|
||||||
|
@@ -20,6 +20,7 @@
|
||||||
|
#define HAVE_STDINT_H 1
|
||||||
|
#include "mdadm.h"
|
||||||
|
#include "mdmon.h"
|
||||||
|
+#include "dlink.h"
|
||||||
|
#include "sha1.h"
|
||||||
|
#include "platform-intel.h"
|
||||||
|
#include <values.h>
|
||||||
|
@@ -629,6 +630,44 @@ static const char *_sys_dev_type[] = {
|
||||||
|
[SYS_DEV_VMD] = "VMD"
|
||||||
|
};
|
||||||
|
|
||||||
|
+static int no_platform = -1;
|
||||||
|
+
|
||||||
|
+static int check_no_platform(void)
|
||||||
|
+{
|
||||||
|
+ static const char search[] = "mdadm.imsm.test=1";
|
||||||
|
+ FILE *fp;
|
||||||
|
+
|
||||||
|
+ if (no_platform >= 0)
|
||||||
|
+ return no_platform;
|
||||||
|
+
|
||||||
|
+ if (check_env("IMSM_NO_PLATFORM")) {
|
||||||
|
+ no_platform = 1;
|
||||||
|
+ return 1;
|
||||||
|
+ }
|
||||||
|
+ fp = fopen("/proc/cmdline", "r");
|
||||||
|
+ if (fp) {
|
||||||
|
+ char *l = conf_line(fp);
|
||||||
|
+ char *w = l;
|
||||||
|
+
|
||||||
|
+ do {
|
||||||
|
+ if (strcmp(w, search) == 0)
|
||||||
|
+ no_platform = 1;
|
||||||
|
+ w = dl_next(w);
|
||||||
|
+ } while (w != l);
|
||||||
|
+ free_line(l);
|
||||||
|
+ fclose(fp);
|
||||||
|
+ if (no_platform >= 0)
|
||||||
|
+ return no_platform;
|
||||||
|
+ }
|
||||||
|
+ no_platform = 0;
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void imsm_set_no_platform(int v)
|
||||||
|
+{
|
||||||
|
+ no_platform = v;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
const char *get_sys_dev_type(enum sys_dev_type type)
|
||||||
|
{
|
||||||
|
if (type >= SYS_DEV_MAX)
|
||||||
|
@@ -2699,7 +2738,7 @@ static int detail_platform_imsm(int verbose, int enumerate_only, char *controlle
|
||||||
|
int result=1;
|
||||||
|
|
||||||
|
if (enumerate_only) {
|
||||||
|
- if (check_env("IMSM_NO_PLATFORM"))
|
||||||
|
+ if (check_no_platform())
|
||||||
|
return 0;
|
||||||
|
list = find_intel_devices();
|
||||||
|
if (!list)
|
||||||
|
@@ -4722,7 +4761,7 @@ static int find_intel_hba_capability(int fd, struct intel_super *super, char *de
|
||||||
|
devname);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
- if (!is_fd_valid(fd) || check_env("IMSM_NO_PLATFORM")) {
|
||||||
|
+ if (!is_fd_valid(fd) || check_no_platform()) {
|
||||||
|
super->orom = NULL;
|
||||||
|
super->hba = NULL;
|
||||||
|
return 0;
|
||||||
|
@@ -10697,7 +10736,7 @@ static int imsm_get_allowed_degradation(int level, int raid_disks,
|
||||||
|
******************************************************************************/
|
||||||
|
int validate_container_imsm(struct mdinfo *info)
|
||||||
|
{
|
||||||
|
- if (check_env("IMSM_NO_PLATFORM"))
|
||||||
|
+ if (check_no_platform())
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
struct sys_dev *idev;
|
||||||
|
diff --git a/systemd/mdmon@.service b/systemd/mdmon@.service
|
||||||
|
index 23a375f..020cc7e 100644
|
||||||
|
--- a/systemd/mdmon@.service
|
||||||
|
+++ b/systemd/mdmon@.service
|
||||||
|
@@ -15,9 +15,6 @@ Documentation=man:mdmon(8)
|
||||||
|
IgnoreOnIsolate=true
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
-# mdmon should never complain due to lack of a platform,
|
||||||
|
-# that is mdadm's job if at all.
|
||||||
|
-Environment=IMSM_NO_PLATFORM=1
|
||||||
|
# The mdmon starting in the initramfs (with dracut at least)
|
||||||
|
# cannot see sysfs after root is mounted, so we will have to
|
||||||
|
# 'takeover'. As the '--offroot --takeover' don't hurt when
|
||||||
|
--
|
||||||
|
2.35.3
|
||||||
|
|
@ -1,3 +1,26 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Apr 24 15:06:42 UTC 2023 - Coly Li <colyli@suse.de>
|
||||||
|
|
||||||
|
- Fixes for mdmon to ensure it run at the right time in the
|
||||||
|
fight mount namespace. This fixes various problems with
|
||||||
|
IMSM raid arrays in 15-SP4 (bsc#1205493, bsc#1205830)
|
||||||
|
- mdmon: fix segfault
|
||||||
|
0052-mdmon-fix-segfault.patch
|
||||||
|
- util: remove obsolete code from get_md_name
|
||||||
|
0053-util-remove-obsolete-code-from-get_md_name.patch
|
||||||
|
- mdmon: don't test both 'all' and 'container_name'.
|
||||||
|
0054-mdmon-don-t-test-both-all-and-container_name.patch
|
||||||
|
- mdmon: change systemd unit file to use --foreground
|
||||||
|
0055-mdmon-change-systemd-unit-file-to-use-foreground.patch
|
||||||
|
- mdmon: Remove need for KillMode=none
|
||||||
|
0056-mdmon-Remove-need-for-KillMode-none.patch
|
||||||
|
- mdmon: Improve switchroot interactions.
|
||||||
|
0057-mdmon-Improve-switchroot-interactions.patch
|
||||||
|
- mdopen: always try create_named_array()
|
||||||
|
0058-mdopen-always-try-create_named_array.patch
|
||||||
|
- Improvements for IMSM_NO_PLATFORM testing
|
||||||
|
0059-Improvements-for-IMSM_NO_PLATFORM-testing.patch
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Sat Apr 1 15:17:58 UTC 2023 - Coly Li <colyli@suse.de>
|
Sat Apr 1 15:17:58 UTC 2023 - Coly Li <colyli@suse.de>
|
||||||
|
|
||||||
|
16
mdadm.spec
16
mdadm.spec
@ -92,6 +92,14 @@ Patch48: 0048-mdadm-Add-Documentation-entries-to-systemd-services.patch
|
|||||||
Patch49: 0049-ReadMe-fix-command-line-help.patch
|
Patch49: 0049-ReadMe-fix-command-line-help.patch
|
||||||
Patch50: 0050-mdadm-replace-container-level-checking-with-inline.patch
|
Patch50: 0050-mdadm-replace-container-level-checking-with-inline.patch
|
||||||
Patch51: 0051-Mdmonitor-Omit-non-md-devices.patch
|
Patch51: 0051-Mdmonitor-Omit-non-md-devices.patch
|
||||||
|
Patch52: 0052-mdmon-fix-segfault.patch
|
||||||
|
Patch53: 0053-util-remove-obsolete-code-from-get_md_name.patch
|
||||||
|
Patch54: 0054-mdmon-don-t-test-both-all-and-container_name.patch
|
||||||
|
Patch55: 0055-mdmon-change-systemd-unit-file-to-use-foreground.patch
|
||||||
|
Patch56: 0056-mdmon-Remove-need-for-KillMode-none.patch
|
||||||
|
Patch57: 0057-mdmon-Improve-switchroot-interactions.patch
|
||||||
|
Patch58: 0058-mdopen-always-try-create_named_array.patch
|
||||||
|
Patch59: 0059-Improvements-for-IMSM_NO_PLATFORM-testing.patch
|
||||||
Patch1001: 1001-display-timeout-status.patch
|
Patch1001: 1001-display-timeout-status.patch
|
||||||
Patch1002: 1002-OnCalendar-format-fix-of-mdcheck_start-timer.patch
|
Patch1002: 1002-OnCalendar-format-fix-of-mdcheck_start-timer.patch
|
||||||
Patch1003: 1003-mdadm-treat-the-Dell-softraid-array-as-local-array.patch
|
Patch1003: 1003-mdadm-treat-the-Dell-softraid-array-as-local-array.patch
|
||||||
@ -155,6 +163,14 @@ mdadm is a program that can be used to control Linux md devices.
|
|||||||
%patch49 -p1
|
%patch49 -p1
|
||||||
%patch50 -p1
|
%patch50 -p1
|
||||||
%patch51 -p1
|
%patch51 -p1
|
||||||
|
%patch52 -p1
|
||||||
|
%patch53 -p1
|
||||||
|
%patch54 -p1
|
||||||
|
%patch55 -p1
|
||||||
|
%patch56 -p1
|
||||||
|
%patch57 -p1
|
||||||
|
%patch58 -p1
|
||||||
|
%patch59 -p1
|
||||||
%patch1001 -p1
|
%patch1001 -p1
|
||||||
%patch1002 -p1
|
%patch1002 -p1
|
||||||
%patch1003 -p1
|
%patch1003 -p1
|
||||||
|
Loading…
Reference in New Issue
Block a user