diff --git a/SOURCES/1001-mdadm-Fix-socket-connection-failure-when-mdmon-runs-.patch b/SOURCES/1001-mdadm-Fix-socket-connection-failure-when-mdmon-runs-.patch deleted file mode 100644 index 6550d1e..0000000 --- a/SOURCES/1001-mdadm-Fix-socket-connection-failure-when-mdmon-runs-.patch +++ /dev/null @@ -1,118 +0,0 @@ -From 4c23dc37600e4ca96855d7d818f171cf84f57034 Mon Sep 17 00:00:00 2001 -From: Shminderjit Singh -Date: Fri, 13 Sep 2024 06:56:04 +0000 -Subject: [PATCH] mdadm: Fix socket connection failure when mdmon runs in - foreground mode. - -While creating an IMSM RAID, mdadm will wait for the mdmon main process -to finish if mdmon runs in forking mode. This is because with -"Type=forking" in the mdmon service unit file, "systemctl start service" -will block until the main process of mdmon exits. At that moment, mdmon -has already created the socket, so the subsequent socket connect from -mdadm will succeed. - -However, when mdmon runs in foreground mode (without "Type=forking" in -the service unit file), "systemctl start service" will return once the -mdmon process starts. This causes mdadm and mdmon to run in parallel, -which may lead to a socket connection failure since mdmon has not yet -initialized the socket when mdadm tries to connect. If the next -instruction/command is to access this device and try to write to it, a -permission error will occur since mdmon has not yet set the array to RW -mode. - -(cherry picked from commit 3cbe13403ec0c78374343dcd889609aefe791f9b) -Signed-off-by: Shminderjit Singh ---- - Create.c | 6 ++++-- - mdadm.h | 1 + - util.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 50 insertions(+), 2 deletions(-) - -diff --git a/Create.c b/Create.c -index a280c7bc7655..35c3496cf7df 100644 ---- a/Create.c -+++ b/Create.c -@@ -1311,9 +1311,11 @@ int Create(struct supertype *st, struct mddev_ident *ident, int subdevs, - if (c->verbose >= 0) - pr_info("array %s started.\n", chosen_name); - if (st->ss->external && st->container_devnm[0]) { -- if (need_mdmon) -+ if (need_mdmon) { - start_mdmon(st->container_devnm); -- -+ if (wait_for_mdmon_control_socket(st->container_devnm) != MDADM_STATUS_SUCCESS) -+ goto abort; -+ } - ping_monitor(st->container_devnm); - close(container_fd); - } -diff --git a/mdadm.h b/mdadm.h -index 4b0b1d1bd18a..e041263d3d2b 100644 ---- a/mdadm.h -+++ b/mdadm.h -@@ -1751,6 +1751,7 @@ 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 mdadm_status_t wait_for_mdmon_control_socket(const char *container_devnm); - extern int mdmon_running(const char *devnm); - extern int mdmon_pid(const char *devnm); - extern mdadm_status_t wait_for_mdmon(const char *devnm); -diff --git a/util.c b/util.c -index 4d2329a9988b..bd8be4b851cf 100644 ---- a/util.c -+++ b/util.c -@@ -1954,6 +1954,51 @@ int mdmon_running(const char *devnm) - return 0; - } - -+/* -+ * wait_for_mdmon_control_socket() - Waits for mdmon control socket -+ * to be created within specified time. -+ * @container_devnm: Device for which mdmon control socket should start. -+ * -+ * In foreground mode, when mdadm is trying to connect to control -+ * socket it is possible that the mdmon has not created it yet. -+ * Give some time to mdmon to create socket. Timeout set to 2 sec. -+ * -+ * Return: MDADM_STATUS_SUCCESS if connect succeed, otherwise return -+ * error code. -+ */ -+mdadm_status_t wait_for_mdmon_control_socket(const char *container_devnm) -+{ -+ enum mdadm_status status = MDADM_STATUS_SUCCESS; -+ int sfd, rv, retry_count = 0; -+ struct sockaddr_un addr; -+ char path[PATH_MAX]; -+ -+ snprintf(path, PATH_MAX, "%s/%s.sock", MDMON_DIR, container_devnm); -+ sfd = socket(PF_LOCAL, SOCK_STREAM, 0); -+ if (!is_fd_valid(sfd)) -+ return MDADM_STATUS_ERROR; -+ -+ addr.sun_family = PF_LOCAL; -+ strncpy(addr.sun_path, path, sizeof(addr.sun_path) - 1); -+ addr.sun_path[sizeof(addr.sun_path) - 1] = '\0'; -+ -+ for (retry_count = 0; retry_count < 10; retry_count++) { -+ rv = connect(sfd, (struct sockaddr*)&addr, sizeof(addr)); -+ if (rv < 0) { -+ sleep_for(0, MSEC_TO_NSEC(200), true); -+ continue; -+ } -+ break; -+ } -+ -+ if (rv < 0) { -+ pr_err("Failed to connect to control socket.\n"); -+ status = MDADM_STATUS_ERROR; -+ } -+ close(sfd); -+ return status; -+} -+ - /* - * wait_for_mdmon() - Waits for mdmon within specified time. - * @devnm: Device for which mdmon should start. --- -2.39.3 diff --git a/SOURCES/1003-mdmon-imsm-fix-metadata-corruption-when-managing-new.patch b/SOURCES/1003-mdmon-imsm-fix-metadata-corruption-when-managing-new.patch deleted file mode 100644 index 15ba895..0000000 --- a/SOURCES/1003-mdmon-imsm-fix-metadata-corruption-when-managing-new.patch +++ /dev/null @@ -1,124 +0,0 @@ -From 371604603dd6d5da0465df968039737287cd7ab4 Mon Sep 17 00:00:00 2001 -From: Junxiao Bi -Date: Thu, 27 Feb 2025 17:52:05 +0000 -Subject: [PATCH] mdmon: imsm: fix metadata corruption when managing new array - -When manager thread detects new array, it will invoke manage_new(). -For imsm array, it will further invoke imsm_open_new(). Since -commit bbab0940fa75("imsm: write bad block log on metadata sync"), -it preallocates bad block log when opening the array, that requires -increasing the mpb buffer size. -For that, imsm_open_new() invokes function imsm_update_metadata_locally(), -which first uses imsm_prepare_update() to allocate a larger mpb buffer -and store it at "mpb->next_buf", and then invoke imsm_process_update() -to copy the content from current mpb buffer "mpb->buf" to "mpb->next_buf", -and then free the current mpb buffer and set the new buffer as current. - -There is a small race window, when monitor thread is syncing metadata, -it gets current buffer pointer in imsm_sync_metadata()->write_super_imsm(), -but before flushing the buffer to disk, manager thread does above switching -buffer which frees current buffer, then monitor thread will run into -use-after-free issue and could cause on-disk metadata corruption. -If system keeps running, further metadata update could fix the corruption, -because after switching buffer, the new buffer will contain good metadata, -but if panic/power cycle happens while disk metadata is corrupted, -the system will run into bootup failure if array is used as root, -otherwise the array can not be assembled after boot if not used as root. - -This issue will not happen for imsm array with only one member array, -because the memory array has not be opened yet, monitor thread will not -do any metadata updates. -This can happen for imsm array with at lease two member array, in the -following two scenarios: -1. Restarting mdmon process with at least two member array -This will happen during system boot up or user restart mdmon after mdadm -upgrade -2. Adding new member array to exist imsm array with at least one member -array. - -To fix this, delay the switching buffer operation to monitor thread. - -Orabug: 37635990 - -Fixes: bbab0940fa75 ("imsm: write bad block log on metadata sync") -Signed-off-by: Junxiao Bi -Reviewed-by: Himanshu Madhani ---- - managemon.c | 10 ++++++++-- - super-intel.c | 14 +++++++++++--- - 2 files changed, 19 insertions(+), 5 deletions(-) - -diff --git a/managemon.c b/managemon.c -index 358459e79435..f5e42662dffd 100644 ---- a/managemon.c -+++ b/managemon.c -@@ -660,11 +660,12 @@ static void manage_new(struct mdstat_ent *mdstat, - * the monitor. - */ - -+ struct metadata_update *update = NULL; - struct active_array *new = NULL; - struct mdinfo *mdi = NULL, *di; -- int i, inst; -- int failed = 0; - char buf[SYSFS_MAX_BUF_SIZE]; -+ int failed = 0; -+ int i, inst; - - /* check if array is ready to be monitored */ - if (!mdstat->active || !mdstat->level) -@@ -763,9 +764,14 @@ static void manage_new(struct mdstat_ent *mdstat, - /* if everything checks out tell the metadata handler we want to - * manage this instance - */ -+ container->update_tail = &update; - if (!aa_ready(new) || container->ss->open_new(container, new, inst) < 0) { -+ container->update_tail = NULL; - goto error; - } else { -+ if (update) -+ queue_metadata_update(update); -+ container->update_tail = NULL; - replace_array(container, victim, new); - if (failed) { - new->check_degraded = 1; -diff --git a/super-intel.c b/super-intel.c -index 2b8b6fda976c..2363b50a174c 100644 ---- a/super-intel.c -+++ b/super-intel.c -@@ -8396,12 +8396,15 @@ static int imsm_count_failed(struct intel_super *super, struct imsm_dev *dev, - return failed; - } - -+static int imsm_prepare_update(struct supertype *st, -+ struct metadata_update *update); - static int imsm_open_new(struct supertype *c, struct active_array *a, - int inst) - { - struct intel_super *super = c->sb; - struct imsm_super *mpb = super->anchor; -- struct imsm_update_prealloc_bb_mem u; -+ struct imsm_update_prealloc_bb_mem *u; -+ struct metadata_update mu; - - if (inst >= mpb->num_raid_devs) { - pr_err("subarry index %d, out of range\n", inst); -@@ -8411,8 +8414,13 @@ static int imsm_open_new(struct supertype *c, struct active_array *a, - dprintf("imsm: open_new %d\n", inst); - a->info.container_member = inst; - -- u.type = update_prealloc_badblocks_mem; -- imsm_update_metadata_locally(c, &u, sizeof(u)); -+ u = xmalloc(sizeof(*u)); -+ u->type = update_prealloc_badblocks_mem; -+ mu.len = sizeof(*u); -+ mu.buf = (char *)u; -+ imsm_prepare_update(c, &mu); -+ if (c->update_tail) -+ append_metadata_update(c, u, sizeof(*u)); - - return 0; - } --- -2.39.3 - diff --git a/SPECS/mdadm.spec b/SPECS/mdadm.spec index e64fde2..5808488 100644 --- a/SPECS/mdadm.spec +++ b/SPECS/mdadm.spec @@ -2,7 +2,7 @@ Name: mdadm Version: 4.3 # extraversion is used to define rhel internal version %define extraversion 4 -Release: %{extraversion}.0.1%{?dist} +Release: %{extraversion}%{?dist} Summary: The mdadm program controls Linux md devices (software RAID arrays) URL: http://www.kernel.org/pub/linux/utils/raid/mdadm/ License: GPLv2+ @@ -94,10 +94,6 @@ Patch068: 0071-mdadm-Increase-number-limit-in-md-device-name-to-102.patch Patch200: mdadm-udev.patch Patch201: mdadm-2.5.2-static.patch -#Oracle Patch -Patch1001: 1001-mdadm-Fix-socket-connection-failure-when-mdmon-runs-.patch -Patch1003: 1003-mdmon-imsm-fix-metadata-corruption-when-managing-new.patch - BuildRequires: make BuildRequires: systemd-rpm-macros binutils-devel gcc systemd-devel Requires: libreport-filesystem @@ -170,10 +166,6 @@ install -m644 %{SOURCE5} %{buildroot}/etc/libreport/events.d /usr/share/mdadm/mdcheck %changelog -* Tue Mar 18 2025 Akshata Konala - 4.3-4.0.1 -- mdmon: imsm: fix metadata corruption when managing new array. [Orabug: 37635990] -- Fix socket connection failure when mdmon runs in foreground mode. [Orabug: 36077756] - * Mon Dec 16 2024 Xiao Ni 4.3-4 - Increase number limit in md device name to 1024 - Resolves RHEL-71365