From a13708a0671a46463a94c4452305ed198a99b175 Mon Sep 17 00:00:00 2001 From: eabdullin Date: Tue, 17 Sep 2024 11:34:05 +0000 Subject: [PATCH] import EuroLinux mdadm-4.2-14.el9_4 --- ...ecking-subarray-state-in-update_suba.patch | 42 ++++++ ...e-update_tail-assign-to-Grow_reshape.patch | 61 +++++++++ ...ge-devnm-to-const-in-mdmon-functions.patch | 55 ++++++++ ...-mdmon-when-it-is-stared-via-systemd.patch | 121 ++++++++++++++++++ SPECS/mdadm.spec | 14 +- 5 files changed, 292 insertions(+), 1 deletion(-) create mode 100644 SOURCES/0167-manage-adjust-checking-subarray-state-in-update_suba.patch create mode 100644 SOURCES/0168-Grow-Move-update_tail-assign-to-Grow_reshape.patch create mode 100644 SOURCES/0169-util.c-change-devnm-to-const-in-mdmon-functions.patch create mode 100644 SOURCES/0170-Wait-for-mdmon-when-it-is-stared-via-systemd.patch diff --git a/SOURCES/0167-manage-adjust-checking-subarray-state-in-update_suba.patch b/SOURCES/0167-manage-adjust-checking-subarray-state-in-update_suba.patch new file mode 100644 index 0000000..26d42bf --- /dev/null +++ b/SOURCES/0167-manage-adjust-checking-subarray-state-in-update_suba.patch @@ -0,0 +1,42 @@ +From 582945c2d3bbead4a71de521a392e292a4a84e24 Mon Sep 17 00:00:00 2001 +From: Pawel Piatkowski +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 +Signed-off-by: Mariusz Tkaczyk +--- + 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.41.0 + diff --git a/SOURCES/0168-Grow-Move-update_tail-assign-to-Grow_reshape.patch b/SOURCES/0168-Grow-Move-update_tail-assign-to-Grow_reshape.patch new file mode 100644 index 0000000..d03a67e --- /dev/null +++ b/SOURCES/0168-Grow-Move-update_tail-assign-to-Grow_reshape.patch @@ -0,0 +1,61 @@ +From ea2ca7ed3dbbf881ce08d80fe371f2aaf05011c3 Mon Sep 17 00:00:00 2001 +From: Mateusz Kusiak +Date: Thu, 18 Jan 2024 11:30:18 +0100 +Subject: [PATCH 1/1] Grow: Move update_tail assign to Grow_reshape() + +Due to e919fb0af245 ("FIX: Enable metadata updates for raid0") code +can't enter super-intel.c:3415, resulting in checkpoint not being +saved to metadata for second volume in matrix raid array. +This results in checkpoint being stuck at last value for the +first volume. + +Move st->update_tail to Grow_reshape() so it is assigned for each +volume. + +Signed-off-by: Mateusz Kusiak +Signed-off-by: Mariusz Tkaczyk +--- + Grow.c | 13 +++++++------ + 1 file changed, 7 insertions(+), 6 deletions(-) + +diff --git a/Grow.c b/Grow.c +index f95dae82..5498e54f 100644 +--- a/Grow.c ++++ b/Grow.c +@@ -2085,9 +2085,10 @@ int Grow_reshape(char *devname, int fd, + if (!mdmon_running(st->container_devnm)) + start_mdmon(st->container_devnm); + ping_monitor(container); +- if (mdmon_running(st->container_devnm) && +- st->update_tail == NULL) +- st->update_tail = &st->updates; ++ if (mdmon_running(st->container_devnm) == false) { ++ pr_err("No mdmon found. Grow cannot continue.\n"); ++ goto release; ++ } + } + + if (s->size == MAX_SIZE) +@@ -3048,6 +3049,8 @@ static int reshape_array(char *container, int fd, char *devname, + dprintf("Cannot get array information.\n"); + goto release; + } ++ if (st->update_tail == NULL) ++ st->update_tail = &st->updates; + if (array.level == 0 && info->component_size == 0) { + get_dev_size(fd, NULL, &array_size); + info->component_size = array_size / array.raid_disks; +@@ -5152,9 +5155,7 @@ int Grow_continue_command(char *devname, int fd, + start_mdmon(container); + ping_monitor(container); + +- if (mdmon_running(container)) +- st->update_tail = &st->updates; +- else { ++ if (mdmon_running(container) == false) { + pr_err("No mdmon found. Grow cannot continue.\n"); + ret_val = 1; + goto Grow_continue_command_exit; +-- +2.41.0 + diff --git a/SOURCES/0169-util.c-change-devnm-to-const-in-mdmon-functions.patch b/SOURCES/0169-util.c-change-devnm-to-const-in-mdmon-functions.patch new file mode 100644 index 0000000..7b8a677 --- /dev/null +++ b/SOURCES/0169-util.c-change-devnm-to-const-in-mdmon-functions.patch @@ -0,0 +1,55 @@ +From b0f4e8e30f38d83f7e3f53d01d72d4cb3b4d42d7 Mon Sep 17 00:00:00 2001 +From: Kinga Stefaniuk +Date: Tue, 7 May 2024 05:38:55 +0200 +Subject: [PATCH 1/2] util.c: change devnm to const in mdmon functions + +Devnm shall not be changed inside mdmon_running() +and mdmon_pid() functions, change this parameter to const. + +Signed-off-by: Kinga Stefaniuk +Signed-off-by: Mariusz Tkaczyk +--- + mdadm.h | 4 ++-- + util.c | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/mdadm.h b/mdadm.h +index 2ff3e463..1ba541fc 100644 +--- a/mdadm.h ++++ b/mdadm.h +@@ -1768,8 +1768,8 @@ extern int is_subarray_active(char *subarray, char *devname); + extern int open_subarray(char *dev, char *subarray, struct supertype *st, int quiet); + extern struct superswitch *version_to_superswitch(char *vers); + +-extern int mdmon_running(char *devnm); +-extern int mdmon_pid(char *devnm); ++extern int mdmon_running(const char *devnm); ++extern int mdmon_pid(const char *devnm); + extern int check_env(char *name); + extern __u32 random32(void); + extern void random_uuid(__u8 *buf); +diff --git a/util.c b/util.c +index 4fbf11c4..e2b490e1 100644 +--- a/util.c ++++ b/util.c +@@ -1902,7 +1902,7 @@ unsigned long long min_recovery_start(struct mdinfo *array) + return recovery_start; + } + +-int mdmon_pid(char *devnm) ++int mdmon_pid(const char *devnm) + { + char path[100]; + char pid[10]; +@@ -1922,7 +1922,7 @@ int mdmon_pid(char *devnm) + return atoi(pid); + } + +-int mdmon_running(char *devnm) ++int mdmon_running(const char *devnm) + { + int pid = mdmon_pid(devnm); + if (pid <= 0) +-- +2.41.0 + diff --git a/SOURCES/0170-Wait-for-mdmon-when-it-is-stared-via-systemd.patch b/SOURCES/0170-Wait-for-mdmon-when-it-is-stared-via-systemd.patch new file mode 100644 index 0000000..f4da2b2 --- /dev/null +++ b/SOURCES/0170-Wait-for-mdmon-when-it-is-stared-via-systemd.patch @@ -0,0 +1,121 @@ +From aa1cc5815d2b14a8b47add18cfaa8264e19c10ce Mon Sep 17 00:00:00 2001 +From: Kinga Stefaniuk +Date: Tue, 7 May 2024 05:38:56 +0200 +Subject: [PATCH 2/2] Wait for mdmon when it is stared via systemd + +When mdmon is being started it may need few seconds to start. +For now, we didn't wait for it. Introduce wait_for_mdmon() +function, which waits up to 5 seconds for mdmon to start completely. + +Signed-off-by: Kinga Stefaniuk +Signed-off-by: Mariusz Tkaczyk +--- + Assemble.c | 4 ++-- + Grow.c | 7 ++++--- + mdadm.h | 2 ++ + util.c | 29 +++++++++++++++++++++++++++++ + 4 files changed, 37 insertions(+), 5 deletions(-) + +diff --git a/Assemble.c b/Assemble.c +index f5e9ab1f..83dced19 100644 +--- a/Assemble.c ++++ b/Assemble.c +@@ -2173,8 +2173,8 @@ int assemble_container_content(struct supertype *st, int mdfd, + if (!mdmon_running(st->container_devnm)) + start_mdmon(st->container_devnm); + ping_monitor(st->container_devnm); +- if (mdmon_running(st->container_devnm) && +- st->update_tail == NULL) ++ if (wait_for_mdmon(st->container_devnm) == MDADM_STATUS_SUCCESS && ++ !st->update_tail) + st->update_tail = &st->updates; + } + +diff --git a/Grow.c b/Grow.c +index 87ed9214..1923c27c 100644 +--- a/Grow.c ++++ b/Grow.c +@@ -2134,7 +2134,7 @@ int Grow_reshape(char *devname, int fd, + if (!mdmon_running(st->container_devnm)) + start_mdmon(st->container_devnm); + ping_monitor(container); +- if (mdmon_running(st->container_devnm) == false) { ++ if (wait_for_mdmon(st->container_devnm) != MDADM_STATUS_SUCCESS) { + pr_err("No mdmon found. Grow cannot continue.\n"); + goto release; + } +@@ -3218,7 +3218,8 @@ static int reshape_array(char *container, int fd, char *devname, + if (!mdmon_running(container)) + start_mdmon(container); + ping_monitor(container); +- if (mdmon_running(container) && st->update_tail == NULL) ++ if (wait_for_mdmon(container) == MDADM_STATUS_SUCCESS && ++ !st->update_tail) + st->update_tail = &st->updates; + } + } +@@ -5173,7 +5174,7 @@ int Grow_continue_command(char *devname, int fd, struct context *c) + start_mdmon(container); + ping_monitor(container); + +- if (mdmon_running(container) == false) { ++ if (wait_for_mdmon(container) != MDADM_STATUS_SUCCESS) { + pr_err("No mdmon found. Grow cannot continue.\n"); + ret_val = 1; + goto Grow_continue_command_exit; +diff --git a/mdadm.h b/mdadm.h +index 1ba541fc..b71d7b32 100644 +--- a/mdadm.h ++++ b/mdadm.h +@@ -1770,6 +1770,8 @@ extern struct superswitch *version_to_superswitch(char *vers); + + extern int mdmon_running(const char *devnm); + extern int mdmon_pid(const char *devnm); ++extern mdadm_status_t wait_for_mdmon(const char *devnm); ++ + extern int check_env(char *name); + extern __u32 random32(void); + extern void random_uuid(__u8 *buf); +diff --git a/util.c b/util.c +index e2b490e1..bf79742f 100644 +--- a/util.c ++++ b/util.c +@@ -1932,6 +1932,35 @@ int mdmon_running(const char *devnm) + return 0; + } + ++/* ++ * wait_for_mdmon() - Waits for mdmon within specified time. ++ * @devnm: Device for which mdmon should start. ++ * ++ * Function waits for mdmon to start. It may need few seconds ++ * to start, we set timeout to 5, it should be sufficient. ++ * Do not wait if mdmon has been started. ++ * ++ * Return: MDADM_STATUS_SUCCESS if mdmon is running, error code otherwise. ++ */ ++mdadm_status_t wait_for_mdmon(const char *devnm) ++{ ++ const time_t mdmon_timeout = 5; ++ time_t start_time = time(0); ++ ++ if (mdmon_running(devnm)) ++ return MDADM_STATUS_SUCCESS; ++ ++ pr_info("Waiting for mdmon to start\n"); ++ while (time(0) - start_time < mdmon_timeout) { ++ sleep_for(0, MSEC_TO_NSEC(200), true); ++ if (mdmon_running(devnm)) ++ return MDADM_STATUS_SUCCESS; ++ }; ++ ++ pr_err("Timeout waiting for mdmon\n"); ++ return MDADM_STATUS_ERROR; ++} ++ + int start_mdmon(char *devnm) + { + int i; +-- +2.41.0 + diff --git a/SPECS/mdadm.spec b/SPECS/mdadm.spec index fb8e164..a4e22d9 100644 --- a/SPECS/mdadm.spec +++ b/SPECS/mdadm.spec @@ -1,7 +1,7 @@ Name: mdadm Version: 4.2 # extraversion is used to define rhel internal version -%define extraversion 12 +%define extraversion 14 Release: %{extraversion}%{?dist} Summary: The mdadm program controls Linux md devices (software RAID arrays) URL: http://www.kernel.org/pub/linux/utils/raid/mdadm/ @@ -185,6 +185,10 @@ Patch162: 0163-mdadm-super1-Add-MD_FEATURE_RAID0_LAYOUT-if-kernel-5.patch Patch163: 0164-mdadm-remove-container_enough-logic.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-Grow-Move-update_tail-assign-to-Grow_reshape.patch +Patch168: 0169-util.c-change-devnm-to-const-in-mdmon-functions.patch +Patch169: 0170-Wait-for-mdmon-when-it-is-stared-via-systemd.patch # Fedora customization patches @@ -263,6 +267,14 @@ install -m644 %{SOURCE5} %{buildroot}/etc/libreport/events.d /usr/share/mdadm/mdcheck %changelog +* Mon Jul 15 2024 Xiao Ni 4.2-14 +- IMSM raid0 can't grow +- Resolves RHEL-39990 + +* Tue Apr 30 2024 Xiao Ni 4.2-13 +- consistency-policy cannot be changed on active volume +- Resolves RHEL-34763 + * Wed Mar 20 2024 Xiao Ni 4.2-12 - To fix errata/osci problems - Resolves RHEL-26272