diff --git a/SOURCES/0001-Unify-error-message.patch b/SOURCES/0001-Unify-error-message.patch index b4ceb95..14dc69c 100644 --- a/SOURCES/0001-Unify-error-message.patch +++ b/SOURCES/0001-Unify-error-message.patch @@ -1,7 +1,7 @@ From f1cc8ab9ab6a92c3cd94ab7590b46285e214681e Mon Sep 17 00:00:00 2001 From: Lukasz Florczak Date: Tue, 15 Mar 2022 09:30:30 +0100 -Subject: [PATCH 01/12] Unify error message. +Subject: [PATCH 01/83] Unify error message. Provide the same error message for the same error that can occur in Grow.c and super-intel.c. @@ -43,5 +43,5 @@ index d5fad102..5ffa7636 100644 } } -- -2.31.1 +2.38.1 diff --git a/SOURCES/0002-mdadm-Fix-double-free.patch b/SOURCES/0002-mdadm-Fix-double-free.patch index d3e1db1..e6b7d37 100644 --- a/SOURCES/0002-mdadm-Fix-double-free.patch +++ b/SOURCES/0002-mdadm-Fix-double-free.patch @@ -1,7 +1,7 @@ From 5ce5a15f0bf007e850e15259bba4f53736605fb2 Mon Sep 17 00:00:00 2001 From: Lukasz Florczak Date: Fri, 25 Mar 2022 12:48:59 +0100 -Subject: [PATCH 02/12] mdadm: Fix double free +Subject: [PATCH 02/83] mdadm: Fix double free If there was a size mismatch after creation it would get fixed on grow in imsm_fix_size_mismatch(), but due to double free "double free or corruption (fasttop)" @@ -29,5 +29,5 @@ index 5ffa7636..6ff336ee 100644 ret_val = 0; exit: -- -2.31.1 +2.38.1 diff --git a/SOURCES/0003-Grow_reshape-Add-r0-grow-size-error-message-and-upda.patch b/SOURCES/0003-Grow_reshape-Add-r0-grow-size-error-message-and-upda.patch index a36866b..e43cdaa 100644 --- a/SOURCES/0003-Grow_reshape-Add-r0-grow-size-error-message-and-upda.patch +++ b/SOURCES/0003-Grow_reshape-Add-r0-grow-size-error-message-and-upda.patch @@ -1,7 +1,7 @@ From fea026b4849182fc8413014c81456e7215af28d9 Mon Sep 17 00:00:00 2001 From: Mateusz Kusiak Date: Wed, 23 Mar 2022 15:05:19 +0100 -Subject: [PATCH 03/12] Grow_reshape: Add r0 grow size error message and update +Subject: [PATCH 03/83] Grow_reshape: Add r0 grow size error message and update man Grow size on r0 is not supported for imsm and native metadata. @@ -79,5 +79,5 @@ index be902dba..e2a42425 100644 .BR \-Z ", " \-\-array\-size= This is only meaningful with -- -2.31.1 +2.38.1 diff --git a/SOURCES/0004-udev-adapt-rules-to-systemd-v247.patch b/SOURCES/0004-udev-adapt-rules-to-systemd-v247.patch index c1bcb29..a755c53 100644 --- a/SOURCES/0004-udev-adapt-rules-to-systemd-v247.patch +++ b/SOURCES/0004-udev-adapt-rules-to-systemd-v247.patch @@ -1,7 +1,7 @@ From cf9a109209aad285372b67306d54118af6fc522b Mon Sep 17 00:00:00 2001 From: Mariusz Tkaczyk Date: Fri, 14 Jan 2022 16:44:33 +0100 -Subject: [PATCH 04/12] udev: adapt rules to systemd v247 +Subject: [PATCH 04/83] udev: adapt rules to systemd v247 New events have been added in kernel 4.14 ("bind" and "unbind"). Systemd maintainer suggests to modify "add|change" branches. @@ -63,5 +63,5 @@ index 12bdcaa8..2e185cee 100644 ENV{MD_LEVEL}=="raid[1-9]*", \ TEST=="/sys/block/$parent/device/timeout", \ -- -2.31.1 +2.38.1 diff --git a/SOURCES/0005-Replace-error-prone-signal-with-sigaction.patch b/SOURCES/0005-Replace-error-prone-signal-with-sigaction.patch index 34552bb..dd04b8c 100644 --- a/SOURCES/0005-Replace-error-prone-signal-with-sigaction.patch +++ b/SOURCES/0005-Replace-error-prone-signal-with-sigaction.patch @@ -1,7 +1,7 @@ From 83a379cfbd283b387919fe05d44eb4c49e155ad6 Mon Sep 17 00:00:00 2001 From: Lukasz Florczak Date: Mon, 21 Feb 2022 13:05:20 +0100 -Subject: [PATCH 05/12] Replace error prone signal() with sigaction() +Subject: [PATCH 05/83] Replace error prone signal() with sigaction() Up to this date signal() was used which implementation could vary [1]. Sigaction() call is preferred. This commit introduces replacement @@ -248,5 +248,5 @@ index 3d05d074..cc94f96e 100644 -- -2.31.1 +2.38.1 diff --git a/SOURCES/0006-mdadm-Respect-config-file-location-in-man.patch b/SOURCES/0006-mdadm-Respect-config-file-location-in-man.patch index c5885b6..bee28ac 100644 --- a/SOURCES/0006-mdadm-Respect-config-file-location-in-man.patch +++ b/SOURCES/0006-mdadm-Respect-config-file-location-in-man.patch @@ -1,7 +1,7 @@ From e9dd5644843e2013a7dd1a8a5da2b9fa35837416 Mon Sep 17 00:00:00 2001 From: Lukasz Florczak Date: Fri, 18 Mar 2022 09:26:04 +0100 -Subject: [PATCH 06/12] mdadm: Respect config file location in man +Subject: [PATCH 06/83] mdadm: Respect config file location in man Default config file location could differ depending on OS (e.g. Debian family). This patch takes default config file into consideration when creating mdadm.man @@ -1529,5 +1529,5 @@ index 00000000..83edd008 +.BR mdadm (8), +.BR md (4). -- -2.31.1 +2.38.1 diff --git a/SOURCES/0007-mdadm-Update-ReadMe.patch b/SOURCES/0007-mdadm-Update-ReadMe.patch index 90ce556..a143a22 100644 --- a/SOURCES/0007-mdadm-Update-ReadMe.patch +++ b/SOURCES/0007-mdadm-Update-ReadMe.patch @@ -1,7 +1,7 @@ From c23400377bb3d8e98e810cd92dba478dac1dff82 Mon Sep 17 00:00:00 2001 From: Lukasz Florczak Date: Fri, 18 Mar 2022 09:26:05 +0100 -Subject: [PATCH 07/12] mdadm: Update ReadMe +Subject: [PATCH 07/83] mdadm: Update ReadMe Instead of hardcoded config file path give reference to config manual. @@ -44,5 +44,5 @@ index 81399765..8f873c48 100644 ; -- -2.31.1 +2.38.1 diff --git a/SOURCES/0008-mdadm-Update-config-man-regarding-default-files-and-.patch b/SOURCES/0008-mdadm-Update-config-man-regarding-default-files-and-.patch index 8375fd9..0109e9a 100644 --- a/SOURCES/0008-mdadm-Update-config-man-regarding-default-files-and-.patch +++ b/SOURCES/0008-mdadm-Update-config-man-regarding-default-files-and-.patch @@ -1,7 +1,7 @@ From 24e075c659d0a8718aabefe5af4c97195a188af7 Mon Sep 17 00:00:00 2001 From: Lukasz Florczak Date: Fri, 18 Mar 2022 09:26:06 +0100 -Subject: [PATCH 08/12] mdadm: Update config man regarding default files and +Subject: [PATCH 08/83] mdadm: Update config man regarding default files and multi-keyword behavior Simplify default and alternative config file and directory location references @@ -199,5 +199,5 @@ index 83edd008..dd331a6a 100644 .SH EXAMPLE DEVICE /dev/sd[bcdjkl]1 -- -2.31.1 +2.38.1 diff --git a/SOURCES/0009-mdadm-Update-config-manual.patch b/SOURCES/0009-mdadm-Update-config-manual.patch index 313b2c9..08599d5 100644 --- a/SOURCES/0009-mdadm-Update-config-manual.patch +++ b/SOURCES/0009-mdadm-Update-config-manual.patch @@ -1,7 +1,7 @@ From c33bbda5b0e127bb161fd4ad44bcfaa2a5daf153 Mon Sep 17 00:00:00 2001 From: Lukasz Florczak Date: Fri, 18 Mar 2022 09:26:07 +0100 -Subject: [PATCH 09/12] mdadm: Update config manual +Subject: [PATCH 09/83] mdadm: Update config manual Add missing HOMECLUSTER keyword description. @@ -41,5 +41,5 @@ index dd331a6a..cd4e6a9d 100644 .B AUTO A list of names of metadata format can be given, each preceded by a -- -2.31.1 +2.38.1 diff --git a/SOURCES/0010-Create-Build-use-default_layout.patch b/SOURCES/0010-Create-Build-use-default_layout.patch index a15ae3e..7f9791b 100644 --- a/SOURCES/0010-Create-Build-use-default_layout.patch +++ b/SOURCES/0010-Create-Build-use-default_layout.patch @@ -1,7 +1,7 @@ From 913f07d1db4a0078acc26d6ccabe1c315cf9273c Mon Sep 17 00:00:00 2001 From: Mariusz Tkaczyk Date: Thu, 20 Jan 2022 13:18:32 +0100 -Subject: [PATCH 10/12] Create, Build: use default_layout() +Subject: [PATCH 10/83] Create, Build: use default_layout() This code is duplicated for Build mode so make default_layout() extern and use it. Simplify the function structure. @@ -149,5 +149,5 @@ index 26e7e5cd..cd72e711 100644 extern int parse_layout_10(char *layout); extern int parse_layout_faulty(char *layout); -- -2.31.1 +2.38.1 diff --git a/SOURCES/0011-mdadm-add-map_num_s.patch b/SOURCES/0011-mdadm-add-map_num_s.patch index 196d47d..ee2c755 100644 --- a/SOURCES/0011-mdadm-add-map_num_s.patch +++ b/SOURCES/0011-mdadm-add-map_num_s.patch @@ -1,7 +1,7 @@ From 5f21d67472ad08c1e96b4385254adba79aa1c467 Mon Sep 17 00:00:00 2001 From: Mariusz Tkaczyk Date: Thu, 20 Jan 2022 13:18:33 +0100 -Subject: [PATCH 11/12] mdadm: add map_num_s() +Subject: [PATCH 11/83] mdadm: add map_num_s() map_num() returns NULL if key is not defined. This patch adds alternative, non NULL version for cases where NULL is not expected. @@ -378,5 +378,5 @@ index 2995713d..0d98a65f 100644 info->consistency_policy = CONSISTENCY_POLICY_RESYNC; } -- -2.31.1 +2.38.1 diff --git a/SOURCES/0013-mdmon-Stop-parsing-duplicate-options.patch b/SOURCES/0013-mdmon-Stop-parsing-duplicate-options.patch index fed1740..77324cf 100644 --- a/SOURCES/0013-mdmon-Stop-parsing-duplicate-options.patch +++ b/SOURCES/0013-mdmon-Stop-parsing-duplicate-options.patch @@ -1,7 +1,7 @@ From 1066ab83dbe9a4cc20f7db44a40aa2cbb9d5eed6 Mon Sep 17 00:00:00 2001 From: Lukasz Florczak Date: Fri, 13 May 2022 09:19:42 +0200 -Subject: [PATCH 13/52] mdmon: Stop parsing duplicate options +Subject: [PATCH 13/83] mdmon: Stop parsing duplicate options Introduce new function is_duplicate_opt() to check if given option was already used and prevent setting it again along with an error @@ -118,5 +118,5 @@ index 5570574b..c057da63 100644 struct mdstat_ent *mdstat, *e; int container_len = strlen(container_name); -- -2.31.1 +2.38.1 diff --git a/SOURCES/0014-Grow-block-n-on-external-volumes.patch b/SOURCES/0014-Grow-block-n-on-external-volumes.patch index 25ffac1..4e6a874 100644 --- a/SOURCES/0014-Grow-block-n-on-external-volumes.patch +++ b/SOURCES/0014-Grow-block-n-on-external-volumes.patch @@ -1,7 +1,7 @@ From 20e114e334ed6ed3280c37a9a08fb95578393d1a Mon Sep 17 00:00:00 2001 From: Mateusz Kusiak Date: Thu, 19 May 2022 09:16:08 +0200 -Subject: [PATCH 14/52] Grow: block -n on external volumes. +Subject: [PATCH 14/83] Grow: block -n on external volumes. Performing --raid-devices on external metadata volume should be blocked as it causes unwanted behaviour. @@ -37,5 +37,5 @@ index 8a242b0f..f6efbc48 100644 return 1; } -- -2.31.1 +2.38.1 diff --git a/SOURCES/0015-Incremental-Fix-possible-memory-and-resource-leaks.patch b/SOURCES/0015-Incremental-Fix-possible-memory-and-resource-leaks.patch index 42fa773..51a9e0f 100644 --- a/SOURCES/0015-Incremental-Fix-possible-memory-and-resource-leaks.patch +++ b/SOURCES/0015-Incremental-Fix-possible-memory-and-resource-leaks.patch @@ -1,7 +1,7 @@ From de064c93e3819d72720e4fba6575265ba10e1553 Mon Sep 17 00:00:00 2001 From: Mateusz Grzonka Date: Mon, 13 Jun 2022 12:11:25 +0200 -Subject: [PATCH 15/52] Incremental: Fix possible memory and resource leaks +Subject: [PATCH 15/83] Incremental: Fix possible memory and resource leaks map allocated through map_by_uuid() is not freed if mdfd is invalid. In addition mdfd is not closed, and mdinfo list is not freed too. @@ -86,5 +86,5 @@ index a57fc323..4d0cd9d6 100644 static void run_udisks(char *arg1, char *arg2) -- -2.31.1 +2.38.1 diff --git a/SOURCES/0016-Mdmonitor-Fix-segfault.patch b/SOURCES/0016-Mdmonitor-Fix-segfault.patch index 05c7fb4..61c64ab 100644 --- a/SOURCES/0016-Mdmonitor-Fix-segfault.patch +++ b/SOURCES/0016-Mdmonitor-Fix-segfault.patch @@ -1,7 +1,7 @@ From e702f392959d1c2ad2089e595b52235ed97b4e18 Mon Sep 17 00:00:00 2001 From: Kinga Tanska Date: Mon, 6 Jun 2022 12:32:12 +0200 -Subject: [PATCH 16/52] Mdmonitor: Fix segfault +Subject: [PATCH 16/83] Mdmonitor: Fix segfault Mdadm with "--monitor" parameter requires md device as an argument to be monitored. If given argument is @@ -94,5 +94,5 @@ index 245be537..d18c9319 100644 { static char devnm[32]; -- -2.31.1 +2.38.1 diff --git a/SOURCES/0017-Mdmonitor-Improve-logging-method.patch b/SOURCES/0017-Mdmonitor-Improve-logging-method.patch index f00b8b3..3c7eed2 100644 --- a/SOURCES/0017-Mdmonitor-Improve-logging-method.patch +++ b/SOURCES/0017-Mdmonitor-Improve-logging-method.patch @@ -1,7 +1,7 @@ From f5ff2988761625b43eb15555993f2797af29f166 Mon Sep 17 00:00:00 2001 From: Kinga Tanska Date: Mon, 6 Jun 2022 12:32:13 +0200 -Subject: [PATCH 17/52] Mdmonitor: Improve logging method +Subject: [PATCH 17/83] Mdmonitor: Improve logging method Change logging, and as a result, mdmonitor in verbose mode will report its configuration. @@ -57,5 +57,5 @@ index 4e5802b5..6ca1ebe5 100644 info.mailaddr = mailaddr; info.mailfrom = mailfrom; -- -2.31.1 +2.38.1 diff --git a/SOURCES/0018-Fix-possible-NULL-ptr-dereferences-and-memory-leaks.patch b/SOURCES/0018-Fix-possible-NULL-ptr-dereferences-and-memory-leaks.patch index a5e9351..24db49f 100644 --- a/SOURCES/0018-Fix-possible-NULL-ptr-dereferences-and-memory-leaks.patch +++ b/SOURCES/0018-Fix-possible-NULL-ptr-dereferences-and-memory-leaks.patch @@ -1,7 +1,7 @@ From 626bc45396c4959f2c4685c2faa7c4f553f4efdf Mon Sep 17 00:00:00 2001 From: Mateusz Grzonka Date: Mon, 13 Jun 2022 11:59:34 +0200 -Subject: [PATCH 18/52] Fix possible NULL ptr dereferences and memory leaks +Subject: [PATCH 18/83] Fix possible NULL ptr dereferences and memory leaks In Assemble there was a NULL check for sra variable, which effectively didn't stop the execution in every case. @@ -69,5 +69,5 @@ index 8cda23a7..abbc8b09 100644 } vc->phys_refnum[i_prim] = ddf->phys->entries[dl->pdnum].refnum; -- -2.31.1 +2.38.1 diff --git a/SOURCES/0019-imsm-Remove-possibility-for-get_imsm_dev-to-return-N.patch b/SOURCES/0019-imsm-Remove-possibility-for-get_imsm_dev-to-return-N.patch index 87b6db6..12dd070 100644 --- a/SOURCES/0019-imsm-Remove-possibility-for-get_imsm_dev-to-return-N.patch +++ b/SOURCES/0019-imsm-Remove-possibility-for-get_imsm_dev-to-return-N.patch @@ -1,7 +1,7 @@ From 756a15f32338fdf0c562678694bc8991ad6afb90 Mon Sep 17 00:00:00 2001 From: Mateusz Grzonka Date: Mon, 13 Jun 2022 12:00:09 +0200 -Subject: [PATCH 19/52] imsm: Remove possibility for get_imsm_dev to return +Subject: [PATCH 19/83] imsm: Remove possibility for get_imsm_dev to return NULL Returning NULL from get_imsm_dev or __get_imsm_dev will cause segfault. @@ -297,5 +297,5 @@ index ba3bd41f..3788feb9 100644 } -- -2.31.1 +2.38.1 diff --git a/SOURCES/0020-Revert-mdadm-fix-coredump-of-mdadm-monitor-r.patch b/SOURCES/0020-Revert-mdadm-fix-coredump-of-mdadm-monitor-r.patch index 107ac28..f51c730 100644 --- a/SOURCES/0020-Revert-mdadm-fix-coredump-of-mdadm-monitor-r.patch +++ b/SOURCES/0020-Revert-mdadm-fix-coredump-of-mdadm-monitor-r.patch @@ -1,7 +1,7 @@ From 190dc029b141c423e724566cbed5d5afbb10b05a Mon Sep 17 00:00:00 2001 From: Nigel Croxon Date: Mon, 18 Apr 2022 13:44:23 -0400 -Subject: [PATCH 20/52] Revert "mdadm: fix coredump of mdadm --monitor -r" +Subject: [PATCH 20/83] Revert "mdadm: fix coredump of mdadm --monitor -r" This reverts commit 546047688e1c64638f462147c755b58119cabdc8. @@ -81,5 +81,5 @@ index 8f873c48..bec1be9a 100644 struct option long_options[] = { {"manage", 0, 0, ManageOpt}, -- -2.31.1 +2.38.1 diff --git a/SOURCES/0021-util-replace-ioctl-use-with-function.patch b/SOURCES/0021-util-replace-ioctl-use-with-function.patch index 3833674..56ee5e8 100644 --- a/SOURCES/0021-util-replace-ioctl-use-with-function.patch +++ b/SOURCES/0021-util-replace-ioctl-use-with-function.patch @@ -1,7 +1,7 @@ From 953cc7e5a485a91ddec7312c7a5d7779749fad5f Mon Sep 17 00:00:00 2001 From: Kinga Tanska Date: Tue, 21 Jun 2022 00:10:39 +0800 -Subject: [PATCH 21/52] util: replace ioctl use with function +Subject: [PATCH 21/83] util: replace ioctl use with function Replace using of ioctl calling to get md array info with special function prepared to it. @@ -27,5 +27,5 @@ index cc94f96e..38f0420e 100644 return !ret; -- -2.31.1 +2.38.1 diff --git a/SOURCES/0022-mdadm-super1-restore-commit-45a87c2f31335-to-fix-clu.patch b/SOURCES/0022-mdadm-super1-restore-commit-45a87c2f31335-to-fix-clu.patch index 360ec6e..88bba83 100644 --- a/SOURCES/0022-mdadm-super1-restore-commit-45a87c2f31335-to-fix-clu.patch +++ b/SOURCES/0022-mdadm-super1-restore-commit-45a87c2f31335-to-fix-clu.patch @@ -1,7 +1,7 @@ From 63902857b98c37c8ac4b837bb01d006b327a4532 Mon Sep 17 00:00:00 2001 From: Heming Zhao Date: Tue, 21 Jun 2022 00:10:40 +0800 -Subject: [PATCH 22/52] mdadm/super1: restore commit 45a87c2f31335 to fix +Subject: [PATCH 22/83] mdadm/super1: restore commit 45a87c2f31335 to fix clustered slot issue Commit 9d67f6496c71 ("mdadm:check the nodes when operate clustered @@ -106,5 +106,5 @@ index e3e2f954..3a0c69fd 100644 * Since the nodes num is not increased, no * need to check the space enough or not, -- -2.31.1 +2.38.1 diff --git a/SOURCES/0023-imsm-introduce-get_disk_slot_in_dev.patch b/SOURCES/0023-imsm-introduce-get_disk_slot_in_dev.patch index d979cc5..ca1d015 100644 --- a/SOURCES/0023-imsm-introduce-get_disk_slot_in_dev.patch +++ b/SOURCES/0023-imsm-introduce-get_disk_slot_in_dev.patch @@ -1,7 +1,7 @@ From 76c152ca9851e9fcdf52e8f6e7e6c09b936bdd14 Mon Sep 17 00:00:00 2001 From: Mariusz Tkaczyk Date: Tue, 21 Jun 2022 00:10:41 +0800 -Subject: [PATCH 23/52] imsm: introduce get_disk_slot_in_dev() +Subject: [PATCH 23/83] imsm: introduce get_disk_slot_in_dev() The routine was added to remove unnecessary get_imsm_dev() and get_imsm_map() calls, used only to determine disk slot. @@ -118,5 +118,5 @@ index 3788feb9..cd1f1e3d 100644 } -- -2.31.1 +2.38.1 diff --git a/SOURCES/0024-imsm-use-same-slot-across-container.patch b/SOURCES/0024-imsm-use-same-slot-across-container.patch index 31348e4..dc23b3c 100644 --- a/SOURCES/0024-imsm-use-same-slot-across-container.patch +++ b/SOURCES/0024-imsm-use-same-slot-across-container.patch @@ -1,7 +1,7 @@ From 6d4d9ab295de165e57b5c30e044028dbffb8f297 Mon Sep 17 00:00:00 2001 From: Mariusz Tkaczyk Date: Tue, 21 Jun 2022 00:10:42 +0800 -Subject: [PATCH 24/52] imsm: use same slot across container +Subject: [PATCH 24/83] imsm: use same slot across container Autolayout relies on drives order on super->disks list, but it is not quaranted by readdir() in sysfs_read(). As a result @@ -248,5 +248,5 @@ index cd1f1e3d..deef7c87 100644 */ max_size = 0; -- -2.31.1 +2.38.1 diff --git a/SOURCES/0025-imsm-block-changing-slots-during-creation.patch b/SOURCES/0025-imsm-block-changing-slots-during-creation.patch index 6de11e1..4c3b918 100644 --- a/SOURCES/0025-imsm-block-changing-slots-during-creation.patch +++ b/SOURCES/0025-imsm-block-changing-slots-during-creation.patch @@ -1,7 +1,7 @@ From 9a7df595bbe360132cb37c8b39aa1fd9ac24b43f Mon Sep 17 00:00:00 2001 From: Mariusz Tkaczyk Date: Tue, 21 Jun 2022 00:10:43 +0800 -Subject: [PATCH 25/52] imsm: block changing slots during creation +Subject: [PATCH 25/83] imsm: block changing slots during creation If user specifies drives for array creation, then slot order across volumes is not preserved. @@ -118,5 +118,5 @@ index ff5d2093..00000000 -offset=$((offset+size+4096)) -imsm_check member $member4 $num_disks $level $size 1024 $offset -- -2.31.1 +2.38.1 diff --git a/SOURCES/0026-mdadm-block-update-ppl-for-non-raid456-levels.patch b/SOURCES/0026-mdadm-block-update-ppl-for-non-raid456-levels.patch index 5e9e87f..d593669 100644 --- a/SOURCES/0026-mdadm-block-update-ppl-for-non-raid456-levels.patch +++ b/SOURCES/0026-mdadm-block-update-ppl-for-non-raid456-levels.patch @@ -1,7 +1,7 @@ From 70f1ff4291b0388adca1f4c91918ce1175e8b360 Mon Sep 17 00:00:00 2001 From: Lukasz Florczak Date: Wed, 15 Jun 2022 14:28:39 +0200 -Subject: [PATCH 26/52] mdadm: block update=ppl for non raid456 levels +Subject: [PATCH 26/83] mdadm: block update=ppl for non raid456 levels Option ppl should be used only for raid levels 4, 5 and 6. Cancel update for other levels. @@ -173,5 +173,5 @@ index 3a0c69fd..71af860c 100644 __le64_to_cpu(sb->reshape_position); reshape_chunk = __le32_to_cpu(sb->new_chunk); -- -2.31.1 +2.38.1 diff --git a/SOURCES/0027-mdadm-Fix-array-size-mismatch-after-grow.patch b/SOURCES/0027-mdadm-Fix-array-size-mismatch-after-grow.patch index cd3e93a..02bdf9c 100644 --- a/SOURCES/0027-mdadm-Fix-array-size-mismatch-after-grow.patch +++ b/SOURCES/0027-mdadm-Fix-array-size-mismatch-after-grow.patch @@ -1,7 +1,7 @@ From 42e02e613fb0b4a2c0c0d984b9e6e2933875bb44 Mon Sep 17 00:00:00 2001 From: Lukasz Florczak Date: Fri, 22 Jul 2022 08:43:47 +0200 -Subject: [PATCH 27/52] mdadm: Fix array size mismatch after grow +Subject: [PATCH 27/83] mdadm: Fix array size mismatch after grow imsm_fix_size_mismatch() is invoked to fix the problem, but it couldn't proceed due to migration check. This patch allows for intended behavior. @@ -26,5 +26,5 @@ index 8ffe485c..76b947f5 100644 /* There is a difference, confirm that imsm_dev_size is -- -2.31.1 +2.38.1 diff --git a/SOURCES/0028-mdadm-Remove-dead-code-in-imsm_fix_size_mismatch.patch b/SOURCES/0028-mdadm-Remove-dead-code-in-imsm_fix_size_mismatch.patch index 4fde0c9..08688dd 100644 --- a/SOURCES/0028-mdadm-Remove-dead-code-in-imsm_fix_size_mismatch.patch +++ b/SOURCES/0028-mdadm-Remove-dead-code-in-imsm_fix_size_mismatch.patch @@ -1,7 +1,7 @@ From 751757620afb25a4c02746bf8368a7b5f22352ec Mon Sep 17 00:00:00 2001 From: Lukasz Florczak Date: Fri, 22 Jul 2022 08:43:48 +0200 -Subject: [PATCH 28/52] mdadm: Remove dead code in imsm_fix_size_mismatch +Subject: [PATCH 28/83] mdadm: Remove dead code in imsm_fix_size_mismatch imsm_create_metadata_update_for_size_change() that returns u_size value could return 0 in the past. As its behavior changed, and returned value @@ -30,5 +30,5 @@ index 76b947f5..4ddfcf94 100644 if (st->update_tail) { append_metadata_update(st, update, u_size); -- -2.31.1 +2.38.1 diff --git a/SOURCES/0029-Monitor-use-devname-as-char-array-instead-of-pointer.patch b/SOURCES/0029-Monitor-use-devname-as-char-array-instead-of-pointer.patch index c7d871d..f337ff0 100644 --- a/SOURCES/0029-Monitor-use-devname-as-char-array-instead-of-pointer.patch +++ b/SOURCES/0029-Monitor-use-devname-as-char-array-instead-of-pointer.patch @@ -1,7 +1,7 @@ From c8d1c398505b62d9129a4e711f17e4469f4327ff Mon Sep 17 00:00:00 2001 From: Kinga Tanska Date: Thu, 14 Jul 2022 09:02:10 +0200 -Subject: [PATCH 29/52] Monitor: use devname as char array instead of pointer +Subject: [PATCH 29/83] Monitor: use devname as char array instead of pointer Device name wasn't filled properly due to incorrect use of strcpy. Strcpy was used twice. Firstly to fill devname with "/dev/md/" @@ -36,5 +36,5 @@ index 6ca1ebe5..a5b11ae2 100644 if (!is_mddev(mdlist->devname)) return 1; -- -2.31.1 +2.38.1 diff --git a/SOURCES/0030-Monitor-use-snprintf-to-fill-device-name.patch b/SOURCES/0030-Monitor-use-snprintf-to-fill-device-name.patch index 83543cb..7d3b4bc 100644 --- a/SOURCES/0030-Monitor-use-snprintf-to-fill-device-name.patch +++ b/SOURCES/0030-Monitor-use-snprintf-to-fill-device-name.patch @@ -1,7 +1,7 @@ From 84d969be8f6d8a345b75f558fad26e4f62a558f6 Mon Sep 17 00:00:00 2001 From: Kinga Tanska Date: Thu, 14 Jul 2022 09:02:11 +0200 -Subject: [PATCH 30/52] Monitor: use snprintf to fill device name +Subject: [PATCH 30/83] Monitor: use snprintf to fill device name Safe string functions are propagated in Monitor.c. @@ -129,5 +129,5 @@ index a5b11ae2..93f36ac0 100644 *sl = 0; } else -- -2.31.1 +2.38.1 diff --git a/SOURCES/0031-Makefile-Don-t-build-static-build-with-everything-an.patch b/SOURCES/0031-Makefile-Don-t-build-static-build-with-everything-an.patch index 8922281..de5e49e 100644 --- a/SOURCES/0031-Makefile-Don-t-build-static-build-with-everything-an.patch +++ b/SOURCES/0031-Makefile-Don-t-build-static-build-with-everything-an.patch @@ -1,7 +1,7 @@ From 14ae4c37bce9a53da08d59d6c2d7e0946e9c9f47 Mon Sep 17 00:00:00 2001 From: Logan Gunthorpe Date: Wed, 22 Jun 2022 14:25:06 -0600 -Subject: [PATCH 31/52] Makefile: Don't build static build with everything and +Subject: [PATCH 31/83] Makefile: Don't build static build with everything and everything-test Running the test suite requires building everything, but it seems to be @@ -38,5 +38,5 @@ index bf126033..ec1f99ed 100644 # mdadm.uclibc doesn't work on x86-64 # mdadm.tcc doesn't work.. -- -2.31.1 +2.38.1 diff --git a/SOURCES/0032-DDF-Cleanup-validate_geometry_ddf_container.patch b/SOURCES/0032-DDF-Cleanup-validate_geometry_ddf_container.patch index 99e2e6b..ec2954d 100644 --- a/SOURCES/0032-DDF-Cleanup-validate_geometry_ddf_container.patch +++ b/SOURCES/0032-DDF-Cleanup-validate_geometry_ddf_container.patch @@ -1,7 +1,7 @@ From 679bd9508a30b2a0a1baecc9a21dd6c7d8d8d7dc Mon Sep 17 00:00:00 2001 From: Logan Gunthorpe Date: Wed, 22 Jun 2022 14:25:07 -0600 -Subject: [PATCH 32/52] DDF: Cleanup validate_geometry_ddf_container() +Subject: [PATCH 32/83] DDF: Cleanup validate_geometry_ddf_container() Move the function up so that the function declaration is not necessary and remove the unused arguments to the function. @@ -137,5 +137,5 @@ index abbc8b09..9d867f69 100644 int level, int layout, int raiddisks, int *chunk, unsigned long long size, -- -2.31.1 +2.38.1 diff --git a/SOURCES/0033-DDF-Fix-NULL-pointer-dereference-in-validate_geometr.patch b/SOURCES/0033-DDF-Fix-NULL-pointer-dereference-in-validate_geometr.patch index 3be71e7..3a53577 100644 --- a/SOURCES/0033-DDF-Fix-NULL-pointer-dereference-in-validate_geometr.patch +++ b/SOURCES/0033-DDF-Fix-NULL-pointer-dereference-in-validate_geometr.patch @@ -1,7 +1,7 @@ From 2b93288a5650bb811932836f67f30d63c5ddcfbd Mon Sep 17 00:00:00 2001 From: Logan Gunthorpe Date: Wed, 22 Jun 2022 14:25:08 -0600 -Subject: [PATCH 33/52] DDF: Fix NULL pointer dereference in +Subject: [PATCH 33/83] DDF: Fix NULL pointer dereference in validate_geometry_ddf() A relatively recent patch added a call to validate_geometry() in @@ -45,5 +45,5 @@ index 9d867f69..949e7d15 100644 mdu_array_info_t array = { .level = level, -- -2.31.1 +2.38.1 diff --git a/SOURCES/0034-mdadm-Grow-Fix-use-after-close-bug-by-closing-after-.patch b/SOURCES/0034-mdadm-Grow-Fix-use-after-close-bug-by-closing-after-.patch index 849a475..2695f67 100644 --- a/SOURCES/0034-mdadm-Grow-Fix-use-after-close-bug-by-closing-after-.patch +++ b/SOURCES/0034-mdadm-Grow-Fix-use-after-close-bug-by-closing-after-.patch @@ -1,7 +1,7 @@ From 548e9b916f86c06e2cdb50d8f49633f9bec66c7e Mon Sep 17 00:00:00 2001 From: Logan Gunthorpe Date: Wed, 22 Jun 2022 14:25:09 -0600 -Subject: [PATCH 34/52] mdadm/Grow: Fix use after close bug by closing after +Subject: [PATCH 34/83] mdadm/Grow: Fix use after close bug by closing after fork The test 07reshape-grow fails most of the time. But it succeeds around @@ -81,5 +81,5 @@ index 8c520d42..97f22c75 100644 * reshape will wait for them. This would mean that * the first section that we suspend will stay suspended -- -2.31.1 +2.38.1 diff --git a/SOURCES/0035-monitor-Avoid-segfault-when-calling-NULL-get_bad_blo.patch b/SOURCES/0035-monitor-Avoid-segfault-when-calling-NULL-get_bad_blo.patch index c19c1e4..ed09288 100644 --- a/SOURCES/0035-monitor-Avoid-segfault-when-calling-NULL-get_bad_blo.patch +++ b/SOURCES/0035-monitor-Avoid-segfault-when-calling-NULL-get_bad_blo.patch @@ -1,7 +1,7 @@ From 9ae62977b51dab0f4bb46b1c8ea5ebd1705b2f4d Mon Sep 17 00:00:00 2001 From: Logan Gunthorpe Date: Wed, 22 Jun 2022 14:25:10 -0600 -Subject: [PATCH 35/52] monitor: Avoid segfault when calling NULL +Subject: [PATCH 35/83] monitor: Avoid segfault when calling NULL get_bad_blocks Not all struct superswitch implement a get_bad_blocks() function, @@ -32,5 +32,5 @@ index b877e595..820a93d0 100644 * Get a list of bad blocks for an array, then read list of * acknowledged bad blocks from kernel and compare it against metadata -- -2.31.1 +2.38.1 diff --git a/SOURCES/0036-mdadm-Fix-mdadm-r-remove-option-regression.patch b/SOURCES/0036-mdadm-Fix-mdadm-r-remove-option-regression.patch index 8bcf0c9..f091c64 100644 --- a/SOURCES/0036-mdadm-Fix-mdadm-r-remove-option-regression.patch +++ b/SOURCES/0036-mdadm-Fix-mdadm-r-remove-option-regression.patch @@ -1,7 +1,7 @@ From 6c9d9260633f2c8491985b0782cf0fbd7e51651b Mon Sep 17 00:00:00 2001 From: Logan Gunthorpe Date: Wed, 22 Jun 2022 14:25:11 -0600 -Subject: [PATCH 36/52] mdadm: Fix mdadm -r remove option regression +Subject: [PATCH 36/83] mdadm: Fix mdadm -r remove option regression The commit noted below globally adds a parameter to the -r option but missed the fact that -r is used for another purpose: --remove. @@ -74,5 +74,5 @@ index 974415b9..163f4a49 100644 extern char short_bitmap_auto_options[]; extern struct option long_options[]; -- -2.31.1 +2.38.1 diff --git a/SOURCES/0037-mdadm-Fix-optional-write-behind-parameter.patch b/SOURCES/0037-mdadm-Fix-optional-write-behind-parameter.patch index c10712a..60cafdb 100644 --- a/SOURCES/0037-mdadm-Fix-optional-write-behind-parameter.patch +++ b/SOURCES/0037-mdadm-Fix-optional-write-behind-parameter.patch @@ -1,7 +1,7 @@ From 41edf6f45895193f4a523cb0a08d639c9ff9ccc9 Mon Sep 17 00:00:00 2001 From: Logan Gunthorpe Date: Wed, 22 Jun 2022 14:25:12 -0600 -Subject: [PATCH 37/52] mdadm: Fix optional --write-behind parameter +Subject: [PATCH 37/83] mdadm: Fix optional --write-behind parameter The commit noted below changed the behaviour of --write-behind to require an argument. This broke the 06wrmostly test with the error: @@ -38,5 +38,5 @@ index d0c5e6de..56722ed9 100644 optarg); exit(2); -- -2.31.1 +2.38.1 diff --git a/SOURCES/0038-tests-00raid0-add-a-test-that-validates-raid0-with-l.patch b/SOURCES/0038-tests-00raid0-add-a-test-that-validates-raid0-with-l.patch index e934bed..7794e18 100644 --- a/SOURCES/0038-tests-00raid0-add-a-test-that-validates-raid0-with-l.patch +++ b/SOURCES/0038-tests-00raid0-add-a-test-that-validates-raid0-with-l.patch @@ -1,7 +1,7 @@ From 7539254342bc591717b0051734cc6c09c1b88640 Mon Sep 17 00:00:00 2001 From: Sudhakar Panneerselvam Date: Wed, 22 Jun 2022 14:25:13 -0600 -Subject: [PATCH 38/52] tests/00raid0: add a test that validates raid0 with +Subject: [PATCH 38/83] tests/00raid0: add a test that validates raid0 with layout fails for 0.9 329dfc28debb disallows the creation of raid0 with layouts for 0.9 @@ -34,5 +34,5 @@ index 8bc18985..e6b21cc4 100644 # now with no superblock mdadm -B $md0 -l0 -n5 $dev0 $dev1 $dev2 $dev3 $dev4 -- -2.31.1 +2.38.1 diff --git a/SOURCES/0039-tests-fix-raid0-tests-for-0.90-metadata.patch b/SOURCES/0039-tests-fix-raid0-tests-for-0.90-metadata.patch index ace5fbe..d897fb1 100644 --- a/SOURCES/0039-tests-fix-raid0-tests-for-0.90-metadata.patch +++ b/SOURCES/0039-tests-fix-raid0-tests-for-0.90-metadata.patch @@ -1,7 +1,7 @@ From 14c2161edb77d7294199e8aa7daa9f9d1d0ad5d7 Mon Sep 17 00:00:00 2001 From: Sudhakar Panneerselvam Date: Wed, 22 Jun 2022 14:25:14 -0600 -Subject: [PATCH 39/52] tests: fix raid0 tests for 0.90 metadata +Subject: [PATCH 39/83] tests: fix raid0 tests for 0.90 metadata Some of the test cases fail because raid0 creation fails with the error, "0.90 metadata does not support layouts for RAID0" added by commit, @@ -95,5 +95,5 @@ index 232fc1ff..08c14af7 100644 s=${ls#*/} l=${ls%/*} mdadm -CR --assume-clean -e 0.90 $md0 --level $l -n 4 -c 64 $dlist -- -2.31.1 +2.38.1 diff --git a/SOURCES/0040-tests-04update-metadata-avoid-passing-chunk-size-to-.patch b/SOURCES/0040-tests-04update-metadata-avoid-passing-chunk-size-to-.patch index 76a7586..12b291b 100644 --- a/SOURCES/0040-tests-04update-metadata-avoid-passing-chunk-size-to-.patch +++ b/SOURCES/0040-tests-04update-metadata-avoid-passing-chunk-size-to-.patch @@ -1,7 +1,7 @@ From de045db607b1ac4b70fc2a8878463e029c2ab1dc Mon Sep 17 00:00:00 2001 From: Sudhakar Panneerselvam Date: Wed, 22 Jun 2022 14:25:15 -0600 -Subject: [PATCH 40/52] tests/04update-metadata: avoid passing chunk size to +Subject: [PATCH 40/83] tests/04update-metadata: avoid passing chunk size to raid1 '04update-metadata' test fails with error, "specifying chunk size is @@ -35,5 +35,5 @@ index 08c14af7..2b72a303 100644 mdadm -S $md0 mdadm -A $md0 --update=metadata $dlist -- -2.31.1 +2.38.1 diff --git a/SOURCES/0041-tests-02lineargrow-clear-the-superblock-at-every-ite.patch b/SOURCES/0041-tests-02lineargrow-clear-the-superblock-at-every-ite.patch index 00c9367..e6b9bba 100644 --- a/SOURCES/0041-tests-02lineargrow-clear-the-superblock-at-every-ite.patch +++ b/SOURCES/0041-tests-02lineargrow-clear-the-superblock-at-every-ite.patch @@ -1,7 +1,7 @@ From a2c832465fc75202e244327b2081231dfa974617 Mon Sep 17 00:00:00 2001 From: Sudhakar Panneerselvam Date: Wed, 22 Jun 2022 14:25:16 -0600 -Subject: [PATCH 41/52] tests/02lineargrow: clear the superblock at every +Subject: [PATCH 41/83] tests/02lineargrow: clear the superblock at every iteration This fixes 02lineargrow test as prior metadata causes --add operation @@ -27,5 +27,5 @@ index e05c219d..595bf9f2 100644 + mdadm --zero /dev/loop3 done -- -2.31.1 +2.38.1 diff --git a/SOURCES/0042-mdadm-test-Add-a-mode-to-repeat-specified-tests.patch b/SOURCES/0042-mdadm-test-Add-a-mode-to-repeat-specified-tests.patch index 288ca2c..63f72dc 100644 --- a/SOURCES/0042-mdadm-test-Add-a-mode-to-repeat-specified-tests.patch +++ b/SOURCES/0042-mdadm-test-Add-a-mode-to-repeat-specified-tests.patch @@ -1,7 +1,7 @@ From a7bfcc716e235664dfb3b6c5a9590273e611ac72 Mon Sep 17 00:00:00 2001 From: Logan Gunthorpe Date: Wed, 22 Jun 2022 14:25:17 -0600 -Subject: [PATCH 42/52] mdadm/test: Add a mode to repeat specified tests +Subject: [PATCH 42/83] mdadm/test: Add a mode to repeat specified tests Many tests fail infrequently or rarely. To help find these, add an option to run the tests multiple times by specifying --loop=N. @@ -84,5 +84,5 @@ index 711a3c7a..da6db5e0 100755 } -- -2.31.1 +2.38.1 diff --git a/SOURCES/0043-mdadm-test-Mark-and-ignore-broken-test-failures.patch b/SOURCES/0043-mdadm-test-Mark-and-ignore-broken-test-failures.patch index 5585173..52fd3e9 100644 --- a/SOURCES/0043-mdadm-test-Mark-and-ignore-broken-test-failures.patch +++ b/SOURCES/0043-mdadm-test-Mark-and-ignore-broken-test-failures.patch @@ -1,7 +1,7 @@ From 28520bf114b3b0515a48ff44fff4ecbe9ed6dfad Mon Sep 17 00:00:00 2001 From: Logan Gunthorpe Date: Wed, 22 Jun 2022 14:25:18 -0600 -Subject: [PATCH 43/52] mdadm/test: Mark and ignore broken test failures +Subject: [PATCH 43/83] mdadm/test: Mark and ignore broken test failures Add functionality to continue if a test marked as broken fails. @@ -116,5 +116,5 @@ index da6db5e0..61d9ee83 100755 fi -- -2.31.1 +2.38.1 diff --git a/SOURCES/0044-tests-Add-broken-files-for-all-broken-tests.patch b/SOURCES/0044-tests-Add-broken-files-for-all-broken-tests.patch index 643bf3f..2484e1b 100644 --- a/SOURCES/0044-tests-Add-broken-files-for-all-broken-tests.patch +++ b/SOURCES/0044-tests-Add-broken-files-for-all-broken-tests.patch @@ -1,7 +1,7 @@ From daa86d6634761796ada1f535c13e47fdd3cc95eb Mon Sep 17 00:00:00 2001 From: Logan Gunthorpe Date: Wed, 22 Jun 2022 14:25:19 -0600 -Subject: [PATCH 44/52] tests: Add broken files for all broken tests +Subject: [PATCH 44/83] tests: Add broken files for all broken tests Each broken file contains the rough frequency of brokeness as well as a brief explanation of what happens when it breaks. Estimates @@ -443,5 +443,5 @@ index 00000000..e91a1425 + + "should detect errors" -- -2.31.1 +2.38.1 diff --git a/SOURCES/0045-mdadm-Replace-obsolete-usleep-with-nanosleep.patch b/SOURCES/0045-mdadm-Replace-obsolete-usleep-with-nanosleep.patch index 44b6d7c..74bf834 100644 --- a/SOURCES/0045-mdadm-Replace-obsolete-usleep-with-nanosleep.patch +++ b/SOURCES/0045-mdadm-Replace-obsolete-usleep-with-nanosleep.patch @@ -1,7 +1,7 @@ From 239b3cc0b5da87e966746533b1873c439db54b16 Mon Sep 17 00:00:00 2001 From: Mateusz Grzonka Date: Fri, 12 Aug 2022 16:36:02 +0200 -Subject: [PATCH 45/52] mdadm: Replace obsolete usleep with nanosleep +Subject: [PATCH 45/83] mdadm: Replace obsolete usleep with nanosleep According to POSIX.1-2001, usleep is considered obsolete. Replace it with a wrapper that uses nanosleep, as recommended in man. @@ -312,5 +312,5 @@ index 38f0420e..ca48d976 100644 + } while (!wake_after_interrupt && errno == EINTR); +} -- -2.31.1 +2.38.1 diff --git a/SOURCES/0046-tests-00readonly-Run-udevadm-settle-before-setting-r.patch b/SOURCES/0046-tests-00readonly-Run-udevadm-settle-before-setting-r.patch index 34f81dd..5872416 100644 --- a/SOURCES/0046-tests-00readonly-Run-udevadm-settle-before-setting-r.patch +++ b/SOURCES/0046-tests-00readonly-Run-udevadm-settle-before-setting-r.patch @@ -1,7 +1,7 @@ From 39b381252c32275079344d30de18b76fda4bba26 Mon Sep 17 00:00:00 2001 From: Logan Gunthorpe Date: Wed, 27 Jul 2022 15:52:45 -0600 -Subject: [PATCH 46/52] tests/00readonly: Run udevadm settle before setting ro +Subject: [PATCH 46/83] tests/00readonly: Run udevadm settle before setting ro In some recent kernel versions, 00readonly fails with: @@ -32,5 +32,5 @@ index 39202487..afe243b3 100644 check readonly state=$(cat /sys/block/md0/md/array_state) -- -2.31.1 +2.38.1 diff --git a/SOURCES/0047-tests-add-test-for-names.patch b/SOURCES/0047-tests-add-test-for-names.patch index b1dee23..03aee00 100644 --- a/SOURCES/0047-tests-add-test-for-names.patch +++ b/SOURCES/0047-tests-add-test-for-names.patch @@ -1,7 +1,7 @@ From b7671c82010ffc04dfaecff2dd19ef8b2283e2b6 Mon Sep 17 00:00:00 2001 From: Mariusz Tkaczyk Date: Tue, 19 Jul 2022 14:48:21 +0200 -Subject: [PATCH 47/52] tests: add test for names +Subject: [PATCH 47/83] tests: add test for names Current behavior is not documented and tested. This test is a base for future improvements. It is enough to test it only with native metadata, @@ -115,5 +115,5 @@ index 00000000..64b81b92 +_verify "/dev/md0" "empty" "name" +mdadm -S "/dev/md0" -- -2.31.1 +2.38.1 diff --git a/SOURCES/0048-mdadm-remove-symlink-option.patch b/SOURCES/0048-mdadm-remove-symlink-option.patch index 13f67ad..1956e2b 100644 --- a/SOURCES/0048-mdadm-remove-symlink-option.patch +++ b/SOURCES/0048-mdadm-remove-symlink-option.patch @@ -1,7 +1,7 @@ From e4a030a0d3a953b8e74c118200e58dc83c2fc608 Mon Sep 17 00:00:00 2001 From: Mariusz Tkaczyk Date: Tue, 19 Jul 2022 14:48:22 +0200 -Subject: [PATCH 48/52] mdadm: remove symlink option +Subject: [PATCH 48/83] mdadm: remove symlink option The option is not used. Remove it from code. @@ -172,5 +172,5 @@ index add9c0b6..93e72786 100644 Waitclean, DetailPlatform, -- -2.31.1 +2.38.1 diff --git a/SOURCES/0049-mdadm-move-data_offset-to-struct-shape.patch b/SOURCES/0049-mdadm-move-data_offset-to-struct-shape.patch index 9613654..5dca508 100644 --- a/SOURCES/0049-mdadm-move-data_offset-to-struct-shape.patch +++ b/SOURCES/0049-mdadm-move-data_offset-to-struct-shape.patch @@ -1,7 +1,7 @@ From ae5dfc56b7a96805d5a0b50eaf93b9fec8604298 Mon Sep 17 00:00:00 2001 From: Mariusz Tkaczyk Date: Tue, 19 Jul 2022 14:48:23 +0200 -Subject: [PATCH 49/52] mdadm: move data_offset to struct shape +Subject: [PATCH 49/83] mdadm: move data_offset to struct shape Data offset is a shape property so move it there to remove additional parameter from some functions. @@ -228,5 +228,5 @@ index 93e72786..adb7cdaa 100644 extern int Detail(char *dev, struct context *c); extern int Detail_Platform(struct superswitch *ss, int scan, int verbose, int export, char *controller_path); -- -2.31.1 +2.38.1 diff --git a/SOURCES/0050-mdadm-Don-t-open-md-device-for-CREATE-and-ASSEMBLE.patch b/SOURCES/0050-mdadm-Don-t-open-md-device-for-CREATE-and-ASSEMBLE.patch index a28efa4..c319da2 100644 --- a/SOURCES/0050-mdadm-Don-t-open-md-device-for-CREATE-and-ASSEMBLE.patch +++ b/SOURCES/0050-mdadm-Don-t-open-md-device-for-CREATE-and-ASSEMBLE.patch @@ -1,7 +1,7 @@ From 27ad4900501c615b7c6b266bf23948e5606dba53 Mon Sep 17 00:00:00 2001 From: Logan Gunthorpe Date: Wed, 27 Jul 2022 15:52:46 -0600 -Subject: [PATCH 50/52] mdadm: Don't open md device for CREATE and ASSEMBLE +Subject: [PATCH 50/83] mdadm: Don't open md device for CREATE and ASSEMBLE The mdadm command tries to open the md device for most modes, first thing, no matter what. When running to create or assemble an array, @@ -158,5 +158,5 @@ index adb7cdaa..8208b81e 100644 extern void udev_block(char *devnm); extern void udev_unblock(void); -- -2.31.1 +2.38.1 diff --git a/SOURCES/0051-Grow-Split-Grow_reshape-into-helper-function.patch b/SOURCES/0051-Grow-Split-Grow_reshape-into-helper-function.patch index 2b5aaaf..8fe5894 100644 --- a/SOURCES/0051-Grow-Split-Grow_reshape-into-helper-function.patch +++ b/SOURCES/0051-Grow-Split-Grow_reshape-into-helper-function.patch @@ -1,7 +1,7 @@ From 7211116c295ba1f9e1fcbdc2dd2d3762855062e1 Mon Sep 17 00:00:00 2001 From: Mateusz Kusiak Date: Thu, 28 Jul 2022 20:20:53 +0800 -Subject: [PATCH 51/52] Grow: Split Grow_reshape into helper function +Subject: [PATCH 51/83] Grow: Split Grow_reshape into helper function Grow_reshape should be split into helper functions given its size. - Add helper function for preparing reshape on external metadata. @@ -227,5 +227,5 @@ index ca48d976..26ffdcea 100644 { /* like 'open', but if 'dev' matches %d:%d, create a temp -- -2.31.1 +2.38.1 diff --git a/SOURCES/0052-Assemble-check-if-device-is-container-before-schedul.patch b/SOURCES/0052-Assemble-check-if-device-is-container-before-schedul.patch index 4c4c323..52d08b8 100644 --- a/SOURCES/0052-Assemble-check-if-device-is-container-before-schedul.patch +++ b/SOURCES/0052-Assemble-check-if-device-is-container-before-schedul.patch @@ -1,7 +1,7 @@ From 5c3c3df646dd3b7e8df81152f08e9ac4ddccc671 Mon Sep 17 00:00:00 2001 From: Kinga Tanska Date: Fri, 19 Aug 2022 02:55:46 +0200 -Subject: [PATCH 52/52] Assemble: check if device is container before +Subject: [PATCH 52/83] Assemble: check if device is container before scheduling force-clean update Up to now using assemble with force flag making each array as clean. @@ -32,5 +32,5 @@ index be2160b4..1dd82a8c 100644 devices[chosen_drive].devname, c->verbose, 0, NULL); -- -2.31.1 +2.38.1 diff --git a/SOURCES/0053-super1-report-truncated-device.patch b/SOURCES/0053-super1-report-truncated-device.patch index dec6198..35cbd4b 100644 --- a/SOURCES/0053-super1-report-truncated-device.patch +++ b/SOURCES/0053-super1-report-truncated-device.patch @@ -1,7 +1,7 @@ From 171e9743881edf2dfb163ddff483566fbf913ccd Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Fri, 26 Aug 2022 08:55:56 +1000 -Subject: [PATCH 53/63] super1: report truncated device +Subject: [PATCH 53/83] super1: report truncated device When the metadata is at the start of the device, it is possible that it describes a device large than the one it is actually stored on. When diff --git a/SOURCES/0054-mdadm-Correct-typos-punctuation-and-grammar-in-man.patch b/SOURCES/0054-mdadm-Correct-typos-punctuation-and-grammar-in-man.patch index 01e3bdc..c37276f 100644 --- a/SOURCES/0054-mdadm-Correct-typos-punctuation-and-grammar-in-man.patch +++ b/SOURCES/0054-mdadm-Correct-typos-punctuation-and-grammar-in-man.patch @@ -1,7 +1,7 @@ From 1a386f804d8392b849b3362da6b0157b0db83091 Mon Sep 17 00:00:00 2001 From: Mateusz Grzonka Date: Fri, 12 Aug 2022 16:52:12 +0200 -Subject: [PATCH 54/63] mdadm: Correct typos, punctuation and grammar in man +Subject: [PATCH 54/83] mdadm: Correct typos, punctuation and grammar in man Signed-off-by: Mateusz Grzonka Reviewed-by: Wol diff --git a/SOURCES/0055-Manage-Block-unsafe-member-failing.patch b/SOURCES/0055-Manage-Block-unsafe-member-failing.patch index 7f68fcc..290c56f 100644 --- a/SOURCES/0055-Manage-Block-unsafe-member-failing.patch +++ b/SOURCES/0055-Manage-Block-unsafe-member-failing.patch @@ -1,7 +1,7 @@ From fc6fd4063769f4194c3fb8f77b32b2819e140fb9 Mon Sep 17 00:00:00 2001 From: Mateusz Kusiak Date: Thu, 18 Aug 2022 11:47:21 +0200 -Subject: [PATCH 55/63] Manage: Block unsafe member failing +Subject: [PATCH 55/83] Manage: Block unsafe member failing Kernel may or may not block mdadm from removing member device if it will cause arrays failed state. It depends on raid personality diff --git a/SOURCES/0056-Monitor-Fix-statelist-memory-leaks.patch b/SOURCES/0056-Monitor-Fix-statelist-memory-leaks.patch index a10a514..ad36a25 100644 --- a/SOURCES/0056-Monitor-Fix-statelist-memory-leaks.patch +++ b/SOURCES/0056-Monitor-Fix-statelist-memory-leaks.patch @@ -1,7 +1,7 @@ From 55c10e4de13abe3e6934895e1fff7d2d20d0b2c2 Mon Sep 17 00:00:00 2001 From: Pawel Baldysiak Date: Thu, 1 Sep 2022 11:20:31 +0200 -Subject: [PATCH 56/63] Monitor: Fix statelist memory leaks +Subject: [PATCH 56/83] Monitor: Fix statelist memory leaks Free statelist in error path in Monitor initialization. diff --git a/SOURCES/0057-mdadm-added-support-for-Intel-Alderlake-RST-on-VMD-p.patch b/SOURCES/0057-mdadm-added-support-for-Intel-Alderlake-RST-on-VMD-p.patch index 4751571..79a3262 100644 --- a/SOURCES/0057-mdadm-added-support-for-Intel-Alderlake-RST-on-VMD-p.patch +++ b/SOURCES/0057-mdadm-added-support-for-Intel-Alderlake-RST-on-VMD-p.patch @@ -1,7 +1,7 @@ From ea7a02a3294aae223e1329aed5da7f4aa3ac05c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Old=C5=99ich=20Jedli=C4=8Dka?= Date: Wed, 31 Aug 2022 19:57:29 +0200 -Subject: [PATCH 57/63] mdadm: added support for Intel Alderlake RST on VMD +Subject: [PATCH 57/83] mdadm: added support for Intel Alderlake RST on VMD platform MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 diff --git a/SOURCES/0058-mdadm-Add-Documentation-entries-to-systemd-services.patch b/SOURCES/0058-mdadm-Add-Documentation-entries-to-systemd-services.patch index 8f9337b..6e1a179 100644 --- a/SOURCES/0058-mdadm-Add-Documentation-entries-to-systemd-services.patch +++ b/SOURCES/0058-mdadm-Add-Documentation-entries-to-systemd-services.patch @@ -1,7 +1,7 @@ From ea109700563d93704ebdc540c7770d874369f667 Mon Sep 17 00:00:00 2001 From: Mariusz Tkaczyk Date: Fri, 9 Sep 2022 15:50:33 +0200 -Subject: [PATCH 58/63] mdadm: Add Documentation entries to systemd services +Subject: [PATCH 58/83] mdadm: Add Documentation entries to systemd services Add documentation section. Copied from Debian. diff --git a/SOURCES/0059-ReadMe-fix-command-line-help.patch b/SOURCES/0059-ReadMe-fix-command-line-help.patch index 4a111d7..837a339 100644 --- a/SOURCES/0059-ReadMe-fix-command-line-help.patch +++ b/SOURCES/0059-ReadMe-fix-command-line-help.patch @@ -1,7 +1,7 @@ From f7cbd810b639eb946ba1b3bddb1faefb9696de42 Mon Sep 17 00:00:00 2001 From: Mariusz Tkaczyk Date: Fri, 9 Sep 2022 15:50:34 +0200 -Subject: [PATCH 59/63] ReadMe: fix command-line help +Subject: [PATCH 59/83] ReadMe: fix command-line help Make command-line help consistent with manual page. Copied from Debian. diff --git a/SOURCES/0060-mdadm-replace-container-level-checking-with-inline.patch b/SOURCES/0060-mdadm-replace-container-level-checking-with-inline.patch index 3edc640..7b2b6b2 100644 --- a/SOURCES/0060-mdadm-replace-container-level-checking-with-inline.patch +++ b/SOURCES/0060-mdadm-replace-container-level-checking-with-inline.patch @@ -1,7 +1,7 @@ From 6f2af6a48c541f207cb727a31fb86de2cd04fc21 Mon Sep 17 00:00:00 2001 From: Kinga Tanska Date: Fri, 2 Sep 2022 08:49:23 +0200 -Subject: [PATCH 60/63] mdadm: replace container level checking with inline +Subject: [PATCH 60/83] mdadm: replace container level checking with inline To unify all containers checks in code, is_container() function is added and propagated. diff --git a/SOURCES/0061-Mdmonitor-Omit-non-md-devices.patch b/SOURCES/0061-Mdmonitor-Omit-non-md-devices.patch index 9864079..062ecdf 100644 --- a/SOURCES/0061-Mdmonitor-Omit-non-md-devices.patch +++ b/SOURCES/0061-Mdmonitor-Omit-non-md-devices.patch @@ -1,7 +1,7 @@ From 8b668d4aa3305af5963162b7499b128bd71f8f29 Mon Sep 17 00:00:00 2001 From: Lukasz Florczak Date: Thu, 22 Sep 2022 08:29:50 +0200 -Subject: [PATCH 61/63] Mdmonitor: Omit non-md devices +Subject: [PATCH 61/83] Mdmonitor: Omit non-md devices Fix segfault commit [1] introduced check whether given device is mddevice, but it happend to terminate Mdmonitor if at least one of given diff --git a/SOURCES/0062-Create-goto-abort_locked-instead-of-return-1-in-erro.patch b/SOURCES/0062-Create-goto-abort_locked-instead-of-return-1-in-erro.patch deleted file mode 100644 index afb77d5..0000000 --- a/SOURCES/0062-Create-goto-abort_locked-instead-of-return-1-in-erro.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 75f23f662fdfd6709be3d1d554d435cc0aa33443 Mon Sep 17 00:00:00 2001 -From: Logan Gunthorpe -Date: Wed, 21 Sep 2022 14:43:50 -0600 -Subject: [PATCH 62/63] Create: goto abort_locked instead of return 1 in error - path - -The return 1 after the fstat_is_blkdev() check should be replaced -with an error return that goes through the error path to unlock -resources locked by this function. - -Signed-off-by: Logan Gunthorpe ---- - Create.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/Create.c b/Create.c -index 953e7372..2e8203ec 100644 ---- a/Create.c -+++ b/Create.c -@@ -939,7 +939,7 @@ int Create(struct supertype *st, char *mddev, - goto abort_locked; - } - if (!fstat_is_blkdev(fd, dv->devname, &rdev)) -- return 1; -+ goto abort_locked; - inf->disk.major = major(rdev); - inf->disk.minor = minor(rdev); - } --- -2.38.1 - diff --git a/SOURCES/0062-Mdmonitor-Split-alert-into-separate-functions.patch b/SOURCES/0062-Mdmonitor-Split-alert-into-separate-functions.patch new file mode 100644 index 0000000..c7562e7 --- /dev/null +++ b/SOURCES/0062-Mdmonitor-Split-alert-into-separate-functions.patch @@ -0,0 +1,233 @@ +From 3698867194f27fdd7824b8bdd172d619a2c087cc Mon Sep 17 00:00:00 2001 +From: Mateusz Grzonka +Date: Wed, 7 Sep 2022 14:56:49 +0200 +Subject: [PATCH 62/83] Mdmonitor: Split alert() into separate functions + +Signed-off-by: Mateusz Grzonka +Signed-off-by: Jes Sorensen +--- + Monitor.c | 186 ++++++++++++++++++++++++++++-------------------------- + 1 file changed, 95 insertions(+), 91 deletions(-) + +diff --git a/Monitor.c b/Monitor.c +index 7d7dc4d2..0036e8cd 100644 +--- a/Monitor.c ++++ b/Monitor.c +@@ -66,7 +66,7 @@ struct alert_info { + static int make_daemon(char *pidfile); + static int check_one_sharer(int scan); + static void write_autorebuild_pid(void); +-static void alert(char *event, char *dev, char *disc, struct alert_info *info); ++static void alert(const char *event, const char *dev, const char *disc, struct alert_info *info); + static int check_array(struct state *st, struct mdstat_ent *mdstat, + int test, struct alert_info *info, + int increments, char *prefer); +@@ -407,111 +407,115 @@ static void write_autorebuild_pid() + } + } + +-static void alert(char *event, char *dev, char *disc, struct alert_info *info) ++static void execute_alert_cmd(const char *event, const char *dev, const char *disc, struct alert_info *info) ++{ ++ int pid = fork(); ++ ++ switch (pid) { ++ default: ++ waitpid(pid, NULL, 0); ++ break; ++ case -1: ++ pr_err("Cannot fork to execute alert command"); ++ break; ++ case 0: ++ execl(info->alert_cmd, info->alert_cmd, event, dev, disc, NULL); ++ exit(2); ++ } ++} ++ ++static void send_event_email(const char *event, const char *dev, const char *disc, struct alert_info *info) ++{ ++ FILE *mp, *mdstat; ++ char hname[256]; ++ char buf[BUFSIZ]; ++ int n; ++ ++ mp = popen(Sendmail, "w"); ++ if (!mp) { ++ pr_err("Cannot open pipe stream for sendmail.\n"); ++ return; ++ } ++ ++ gethostname(hname, sizeof(hname)); ++ signal(SIGPIPE, SIG_IGN); ++ if (info->mailfrom) ++ fprintf(mp, "From: %s\n", info->mailfrom); ++ else ++ fprintf(mp, "From: %s monitoring \n", Name); ++ fprintf(mp, "To: %s\n", info->mailaddr); ++ fprintf(mp, "Subject: %s event on %s:%s\n\n", event, dev, hname); ++ fprintf(mp, "This is an automatically generated mail message. \n"); ++ fprintf(mp, "A %s event had been detected on md device %s.\n\n", event, dev); ++ ++ if (disc && disc[0] != ' ') ++ fprintf(mp, ++ "It could be related to component device %s.\n\n", disc); ++ if (disc && disc[0] == ' ') ++ fprintf(mp, "Extra information:%s.\n\n", disc); ++ ++ mdstat = fopen("/proc/mdstat", "r"); ++ if (!mdstat) { ++ pr_err("Cannot open /proc/mdstat\n"); ++ pclose(mp); ++ return; ++ } ++ ++ fprintf(mp, "The /proc/mdstat file currently contains the following:\n\n"); ++ while ((n = fread(buf, 1, sizeof(buf), mdstat)) > 0) ++ n = fwrite(buf, 1, n, mp); ++ fclose(mdstat); ++ pclose(mp); ++} ++ ++static void log_event_to_syslog(const char *event, const char *dev, const char *disc) + { + int priority; ++ /* Log at a different severity depending on the event. ++ * ++ * These are the critical events: */ ++ if (strncmp(event, "Fail", 4) == 0 || ++ strncmp(event, "Degrade", 7) == 0 || ++ strncmp(event, "DeviceDisappeared", 17) == 0) ++ priority = LOG_CRIT; ++ /* Good to know about, but are not failures: */ ++ else if (strncmp(event, "Rebuild", 7) == 0 || ++ strncmp(event, "MoveSpare", 9) == 0 || ++ strncmp(event, "Spares", 6) != 0) ++ priority = LOG_WARNING; ++ /* Everything else: */ ++ else ++ priority = LOG_INFO; + ++ if (disc && disc[0] != ' ') ++ syslog(priority, ++ "%s event detected on md device %s, component device %s", event, dev, disc); ++ else if (disc) ++ syslog(priority, "%s event detected on md device %s: %s", event, dev, disc); ++ else ++ syslog(priority, "%s event detected on md device %s", event, dev); ++} ++ ++static void alert(const char *event, const char *dev, const char *disc, struct alert_info *info) ++{ + if (!info->alert_cmd && !info->mailaddr && !info->dosyslog) { + time_t now = time(0); + + printf("%1.15s: %s on %s %s\n", ctime(&now) + 4, + event, dev, disc?disc:"unknown device"); + } +- if (info->alert_cmd) { +- int pid = fork(); +- switch(pid) { +- default: +- waitpid(pid, NULL, 0); +- break; +- case -1: +- break; +- case 0: +- execl(info->alert_cmd, info->alert_cmd, +- event, dev, disc, NULL); +- exit(2); +- } +- } ++ if (info->alert_cmd) ++ execute_alert_cmd(event, dev, disc, info); ++ + if (info->mailaddr && (strncmp(event, "Fail", 4) == 0 || + strncmp(event, "Test", 4) == 0 || + strncmp(event, "Spares", 6) == 0 || + strncmp(event, "Degrade", 7) == 0)) { +- FILE *mp = popen(Sendmail, "w"); +- if (mp) { +- FILE *mdstat; +- char hname[256]; +- +- gethostname(hname, sizeof(hname)); +- signal_s(SIGPIPE, SIG_IGN); +- +- if (info->mailfrom) +- fprintf(mp, "From: %s\n", info->mailfrom); +- else +- fprintf(mp, "From: %s monitoring \n", +- Name); +- fprintf(mp, "To: %s\n", info->mailaddr); +- fprintf(mp, "Subject: %s event on %s:%s\n\n", +- event, dev, hname); +- +- fprintf(mp, +- "This is an automatically generated mail message from %s\n", Name); +- fprintf(mp, "running on %s\n\n", hname); +- +- fprintf(mp, +- "A %s event had been detected on md device %s.\n\n", event, dev); +- +- if (disc && disc[0] != ' ') +- fprintf(mp, +- "It could be related to component device %s.\n\n", disc); +- if (disc && disc[0] == ' ') +- fprintf(mp, "Extra information:%s.\n\n", disc); +- +- fprintf(mp, "Faithfully yours, etc.\n"); +- +- mdstat = fopen("/proc/mdstat", "r"); +- if (mdstat) { +- char buf[8192]; +- int n; +- fprintf(mp, +- "\nP.S. The /proc/mdstat file currently contains the following:\n\n"); +- while ((n = fread(buf, 1, sizeof(buf), +- mdstat)) > 0) +- n = fwrite(buf, 1, n, mp); +- fclose(mdstat); +- } +- pclose(mp); +- } ++ send_event_email(event, dev, disc, info); + } + +- /* log the event to syslog maybe */ +- if (info->dosyslog) { +- /* Log at a different severity depending on the event. +- * +- * These are the critical events: */ +- if (strncmp(event, "Fail", 4) == 0 || +- strncmp(event, "Degrade", 7) == 0 || +- strncmp(event, "DeviceDisappeared", 17) == 0) +- priority = LOG_CRIT; +- /* Good to know about, but are not failures: */ +- else if (strncmp(event, "Rebuild", 7) == 0 || +- strncmp(event, "MoveSpare", 9) == 0 || +- strncmp(event, "Spares", 6) != 0) +- priority = LOG_WARNING; +- /* Everything else: */ +- else +- priority = LOG_INFO; +- +- if (disc && disc[0] != ' ') +- syslog(priority, +- "%s event detected on md device %s, component device %s", event, dev, disc); +- else if (disc) +- syslog(priority, +- "%s event detected on md device %s: %s", +- event, dev, disc); +- else +- syslog(priority, +- "%s event detected on md device %s", +- event, dev); +- } ++ if (info->dosyslog) ++ log_event_to_syslog(event, dev, disc); + } + + static int check_array(struct state *st, struct mdstat_ent *mdstat, +-- +2.38.1 + diff --git a/SOURCES/0063-Create-remove-safe_mode_delay-local-variable.patch b/SOURCES/0063-Create-remove-safe_mode_delay-local-variable.patch deleted file mode 100644 index b2d029b..0000000 --- a/SOURCES/0063-Create-remove-safe_mode_delay-local-variable.patch +++ /dev/null @@ -1,59 +0,0 @@ -From 249da94563dddb852ccb52164411ff99a6c90489 Mon Sep 17 00:00:00 2001 -From: Logan Gunthorpe -Date: Wed, 21 Sep 2022 14:43:51 -0600 -Subject: [PATCH 63/63] Create: remove safe_mode_delay local variable - -All .getinfo_super() call sets the info.safe_mode_delay variables -to a constant value, so no matter what the current state is -that function will always set it to the same value. - -Create() calls .getinfo_super() multiple times while creating the array. -The value is stored in a local variable for every disk in the loop -to add disks (so the last disc call takes precedence). The local -variable is then used in the call to sysfs_set_safemode(). - -This can be simplified by using info.safe_mode_delay directly. The info -variable had .getinfo_super() called on it early in the function so, by the -reasoning above, it will have the same value as the local variable which -can thus be removed. - -Doing this allows for factoring out code from Create() in a subsequent -patch. - -Signed-off-by: Logan Gunthorpe ---- - Create.c | 4 +--- - 1 file changed, 1 insertion(+), 3 deletions(-) - -diff --git a/Create.c b/Create.c -index 2e8203ec..8ded81dc 100644 ---- a/Create.c -+++ b/Create.c -@@ -137,7 +137,6 @@ int Create(struct supertype *st, char *mddev, - int did_default = 0; - int do_default_layout = 0; - int do_default_chunk = 0; -- unsigned long safe_mode_delay = 0; - char chosen_name[1024]; - struct map_ent *map = NULL; - unsigned long long newsize; -@@ -952,7 +951,6 @@ int Create(struct supertype *st, char *mddev, - goto abort_locked; - } - st->ss->getinfo_super(st, inf, NULL); -- safe_mode_delay = inf->safe_mode_delay; - - if (have_container && c->verbose > 0) - pr_err("Using %s for device %d\n", -@@ -1065,7 +1063,7 @@ int Create(struct supertype *st, char *mddev, - "readonly"); - break; - } -- sysfs_set_safemode(&info, safe_mode_delay); -+ sysfs_set_safemode(&info, info.safe_mode_delay); - if (err) { - pr_err("failed to activate array.\n"); - ioctl(mdfd, STOP_ARRAY, NULL); --- -2.38.1 - diff --git a/SOURCES/0063-Monitor-block-if-monitor-modes-are-combined.patch b/SOURCES/0063-Monitor-block-if-monitor-modes-are-combined.patch new file mode 100644 index 0000000..d993d9d --- /dev/null +++ b/SOURCES/0063-Monitor-block-if-monitor-modes-are-combined.patch @@ -0,0 +1,41 @@ +From f40ac0e7e6043361ad12e9db97c07e56c3977cf6 Mon Sep 17 00:00:00 2001 +From: Blazej Kucman +Date: Mon, 19 Dec 2022 11:21:57 +0100 +Subject: [PATCH 63/83] Monitor: block if monitor modes are combined. + +Block monitoring start if --scan mode and MD devices list are combined. + +Signed-off-by: Blazej Kucman +Signed-off-by: Jes Sorensen +--- + Monitor.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/Monitor.c b/Monitor.c +index 0036e8cd..188cb8be 100644 +--- a/Monitor.c ++++ b/Monitor.c +@@ -123,7 +123,7 @@ int Monitor(struct mddev_dev *devlist, + * and if we can get_disk_info and find a name + * Then we hot-remove and hot-add to the other array + * +- * If devlist is NULL, then we can monitor everything because --scan ++ * If devlist is NULL, then we can monitor everything if --scan + * was given. We get an initial list from config file and add anything + * that appears in /proc/mdstat + */ +@@ -136,6 +136,11 @@ int Monitor(struct mddev_dev *devlist, + struct mddev_ident *mdlist; + int delay_for_event = c->delay; + ++ if (devlist && c->scan) { ++ pr_err("Devices list and --scan option cannot be combined - not monitoring.\n"); ++ return 1; ++ } ++ + if (!mailaddr) + mailaddr = conf_get_mailaddr(); + +-- +2.38.1 + diff --git a/SOURCES/0064-Update-mdadm-Monitor-manual.patch b/SOURCES/0064-Update-mdadm-Monitor-manual.patch new file mode 100644 index 0000000..15f52e1 --- /dev/null +++ b/SOURCES/0064-Update-mdadm-Monitor-manual.patch @@ -0,0 +1,119 @@ +From 725e37cd14866906ba28c970394b9f7a4cd97413 Mon Sep 17 00:00:00 2001 +From: Blazej Kucman +Date: Mon, 19 Dec 2022 11:21:58 +0100 +Subject: [PATCH 64/83] Update mdadm Monitor manual. + +- describe monitor work modes, +- clarify the turning off condition, +- describe the mdmonitor.service as a prefered management way. + +Signed-off-by: Blazej Kucman +Signed-off-by: Jes Sorensen +--- + mdadm.8.in | 71 ++++++++++++++++++++++++++++++++++++++---------------- + 1 file changed, 50 insertions(+), 21 deletions(-) + +diff --git a/mdadm.8.in b/mdadm.8.in +index 70c79d1e..64f71ed1 100644 +--- a/mdadm.8.in ++++ b/mdadm.8.in +@@ -2548,13 +2548,33 @@ Usage: + .I options... devices... + + .PP +-This usage causes ++Monitor option can work in two modes: ++.IP \(bu 4 ++system wide mode, follow all md devices based on ++.B /proc/mdstat, ++.IP \(bu 4 ++follow only specified MD devices in command line. ++.PP ++ ++.B \-\-scan - ++indicates system wide mode. Option causes the ++.I monitor ++to track all md devices that appear in ++.B /proc/mdstat. ++If it is not set, then at least one ++.B device ++must be specified. ++ ++Monitor usage causes + .I mdadm + to periodically poll a number of md arrays and to report on any events + noticed. +-.I mdadm +-will never exit once it decides that there are arrays to be checked, +-so it should normally be run in the background. ++ ++In both modes, ++.I monitor ++will work as long as there is an active array with redundancy and it is defined to follow (for ++.B \-\-scan ++every array is followed). + + As well as reporting events, + .I mdadm +@@ -2565,15 +2585,6 @@ or + .B domain + and if the destination array has a failed drive but no spares. + +-If any devices are listed on the command line, +-.I mdadm +-will only monitor those devices, otherwise, all arrays listed in the +-configuration file will be monitored. Further, if +-.B \-\-scan +-is given, then any other md devices that appear in +-.B /proc/mdstat +-will also be monitored. +- + The result of monitoring the arrays is the generation of events. + These events are passed to a separate program (if specified) and may + be mailed to a given E-mail address. +@@ -2586,16 +2597,34 @@ device if relevant (such as a component device that has failed). + + If + .B \-\-scan +-is given, then a program or an E-mail address must be specified on the +-command line or in the config file. If neither are available, then ++is given, then a ++.B program ++or an ++.B e-mail ++address must be specified on the ++command line or in the config file. If neither are available, then + .I mdadm + will not monitor anything. +-Without +-.B \-\-scan, +-.I mdadm +-will continue monitoring as long as something was found to monitor. If +-no program or email is given, then each event is reported to +-.BR stdout . ++For devices given directly in command line, without ++.B program ++or ++.B email ++specified, each event is reported to ++.BR stdout. ++ ++Note: For systems where ++.If mdadm monitor ++is configured via systemd, ++.B mdmonitor(mdmonitor.service) ++should be configured. The service is designed to be primary solution for array monitoring, ++it is configured to work in system wide mode. ++It is automatically started and stopped according to current state and types of MD arrays in system. ++The service may require additional configuration, like ++.B e-mail ++or ++.B delay. ++That should be done in ++.B mdadm.conf. + + The different events are: + +-- +2.38.1 + diff --git a/SOURCES/0065-Grow-fix-possible-memory-leak.patch b/SOURCES/0065-Grow-fix-possible-memory-leak.patch new file mode 100644 index 0000000..07d9fb6 --- /dev/null +++ b/SOURCES/0065-Grow-fix-possible-memory-leak.patch @@ -0,0 +1,38 @@ +From 434b3b9bb96a76dc12f693b64cf23b581781e20b Mon Sep 17 00:00:00 2001 +From: Blazej Kucman +Date: Tue, 20 Dec 2022 12:07:51 +0100 +Subject: [PATCH 65/83] Grow: fix possible memory leak. + +Signed-off-by: Blazej Kucman +Signed-off-by: Jes Sorensen +--- + Grow.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/Grow.c b/Grow.c +index e362403a..b73ec2ae 100644 +--- a/Grow.c ++++ b/Grow.c +@@ -432,6 +432,7 @@ int Grow_addbitmap(char *devname, int fd, struct context *c, struct shape *s) + if (((disk.state & (1 << MD_DISK_WRITEMOSTLY)) == 0) && + (strcmp(s->bitmap_file, "clustered") == 0)) { + pr_err("%s disks marked write-mostly are not supported with clustered bitmap\n",devname); ++ free(mdi); + return 1; + } + fd2 = dev_open(dv, O_RDWR); +@@ -453,8 +454,10 @@ int Grow_addbitmap(char *devname, int fd, struct context *c, struct shape *s) + pr_err("failed to load super-block.\n"); + } + close(fd2); +- if (rv) ++ if (rv) { ++ free(mdi); + return 1; ++ } + } + if (offset_setable) { + st->ss->getinfo_super(st, mdi, NULL); +-- +2.38.1 + diff --git a/SOURCES/0066-mdadm-create-ident_init.patch b/SOURCES/0066-mdadm-create-ident_init.patch new file mode 100644 index 0000000..32d374b --- /dev/null +++ b/SOURCES/0066-mdadm-create-ident_init.patch @@ -0,0 +1,148 @@ +From 7fcbfd7c620e2dcd3b539d18e93cb503ee3a8a62 Mon Sep 17 00:00:00 2001 +From: Mariusz Tkaczyk +Date: Wed, 21 Dec 2022 12:50:17 +0100 +Subject: [PATCH 66/83] mdadm: create ident_init() + +Add a wrapper for repeated initializations in mdadm.c and config.c. +Move includes up. + +Signed-off-by: Mariusz Tkaczyk +Signed-off-by: Jes Sorensen +--- + config.c | 45 +++++++++++++++++++++++++++++---------------- + mdadm.c | 16 ++-------------- + mdadm.h | 7 +++++-- + 3 files changed, 36 insertions(+), 32 deletions(-) + +diff --git a/config.c b/config.c +index dc1620c1..eeedd0c6 100644 +--- a/config.c ++++ b/config.c +@@ -119,6 +119,34 @@ int match_keyword(char *word) + return -1; + } + ++/** ++ * ident_init() - Set defaults. ++ * @ident: ident pointer, not NULL. ++ */ ++inline void ident_init(struct mddev_ident *ident) ++{ ++ assert(ident); ++ ++ ident->assembled = false; ++ ident->autof = 0; ++ ident->bitmap_fd = -1; ++ ident->bitmap_file = NULL; ++ ident->container = NULL; ++ ident->devices = NULL; ++ ident->devname = NULL; ++ ident->level = UnSet; ++ ident->member = NULL; ++ ident->name[0] = 0; ++ ident->next = NULL; ++ ident->raid_disks = UnSet; ++ ident->spare_group = NULL; ++ ident->spare_disks = 0; ++ ident->st = NULL; ++ ident->super_minor = UnSet; ++ ident->uuid[0] = 0; ++ ident->uuid_set = 0; ++} ++ + struct conf_dev { + struct conf_dev *next; + char *name; +@@ -363,22 +391,7 @@ void arrayline(char *line) + struct mddev_ident mis; + struct mddev_ident *mi; + +- mis.uuid_set = 0; +- mis.super_minor = UnSet; +- mis.level = UnSet; +- mis.raid_disks = UnSet; +- mis.spare_disks = 0; +- mis.devices = NULL; +- mis.devname = NULL; +- mis.spare_group = NULL; +- mis.autof = 0; +- mis.next = NULL; +- mis.st = NULL; +- mis.bitmap_fd = -1; +- mis.bitmap_file = NULL; +- mis.name[0] = 0; +- mis.container = NULL; +- mis.member = NULL; ++ ident_init(&mis); + + for (w = dl_next(line); w != line; w = dl_next(w)) { + if (w[0] == '/' || strchr(w, '=') == NULL) { +diff --git a/mdadm.c b/mdadm.c +index 972adb52..74fdec31 100644 +--- a/mdadm.c ++++ b/mdadm.c +@@ -107,25 +107,13 @@ int main(int argc, char *argv[]) + + srandom(time(0) ^ getpid()); + +- ident.uuid_set = 0; +- ident.level = UnSet; +- ident.raid_disks = UnSet; +- ident.super_minor = UnSet; +- ident.devices = 0; +- ident.spare_group = NULL; +- ident.autof = 0; +- ident.st = NULL; +- ident.bitmap_fd = -1; +- ident.bitmap_file = NULL; +- ident.name[0] = 0; +- ident.container = NULL; +- ident.member = NULL; +- + if (get_linux_version() < 2006015) { + pr_err("This version of mdadm does not support kernels older than 2.6.15\n"); + exit(1); + } + ++ ident_init(&ident); ++ + while ((option_index = -1), + (opt = getopt_long(argc, argv, shortopt, long_options, + &option_index)) != -1) { +diff --git a/mdadm.h b/mdadm.h +index 3673494e..23ffe977 100644 +--- a/mdadm.h ++++ b/mdadm.h +@@ -33,8 +33,10 @@ extern __off64_t lseek64 __P ((int __fd, __off64_t __offset, int __whence)); + # endif + #endif + ++#include + #include + #include ++#include + #include + #include + #include +@@ -1552,6 +1554,8 @@ 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 void ident_init(struct mddev_ident *ident); ++ + extern int parse_auto(char *str, char *msg, int config); + extern struct mddev_ident *conf_get_ident(char *dev); + extern struct mddev_dev *conf_get_devs(void); +@@ -1779,8 +1783,7 @@ static inline sighandler_t signal_s(int sig, sighandler_t handler) + #define dprintf_cont(fmt, arg...) \ + ({ if (0) fprintf(stderr, fmt, ##arg); 0; }) + #endif +-#include +-#include ++ + static inline int xasprintf(char **strp, const char *fmt, ...) { + va_list ap; + int ret; +-- +2.38.1 + diff --git a/SOURCES/0067-mdadm-Add-option-validation-for-update-subarray.patch b/SOURCES/0067-mdadm-Add-option-validation-for-update-subarray.patch new file mode 100644 index 0000000..faa7113 --- /dev/null +++ b/SOURCES/0067-mdadm-Add-option-validation-for-update-subarray.patch @@ -0,0 +1,287 @@ +From 2568ce89ea5c26225e8984733adc2ea7559d853a Mon Sep 17 00:00:00 2001 +From: Mateusz Kusiak +Date: Mon, 2 Jan 2023 09:35:15 +0100 +Subject: [PATCH 67/83] mdadm: Add option validation for --update-subarray + +Subset of options available for "--update" is not same as for "--update-subarray". +Define maps and enum for update options and use them instead of direct comparisons. +Add proper error message. + +Signed-off-by: Mateusz Kusiak +Signed-off-by: Jes Sorensen +--- + ReadMe.c | 31 +++++++++++++++++ + maps.c | 31 +++++++++++++++++ + mdadm.c | 104 +++++++++++++++++-------------------------------------- + mdadm.h | 32 ++++++++++++++++- + 4 files changed, 124 insertions(+), 74 deletions(-) + +diff --git a/ReadMe.c b/ReadMe.c +index 50a5e36d..bd8d50d2 100644 +--- a/ReadMe.c ++++ b/ReadMe.c +@@ -655,3 +655,34 @@ char *mode_help[mode_count] = { + [GROW] = Help_grow, + [INCREMENTAL] = Help_incr, + }; ++ ++/** ++ * fprint_update_options() - Print valid update options depending on the mode. ++ * @outf: File (output stream) ++ * @update_mode: Used to distinguish update and update_subarray ++ */ ++void fprint_update_options(FILE *outf, enum update_opt update_mode) ++{ ++ int counter = UOPT_NAME, breakpoint = UOPT_HELP; ++ mapping_t *map = update_options; ++ ++ if (!outf) ++ return; ++ if (update_mode == UOPT_SUBARRAY_ONLY) { ++ breakpoint = UOPT_SUBARRAY_ONLY; ++ fprintf(outf, "Valid --update options for update-subarray are:\n\t"); ++ } else ++ fprintf(outf, "Valid --update options are:\n\t"); ++ while (map->num) { ++ if (map->num >= breakpoint) ++ break; ++ fprintf(outf, "'%s', ", map->name); ++ if (counter % 5 == 0) ++ fprintf(outf, "\n\t"); ++ counter++; ++ map++; ++ } ++ if ((counter - 1) % 5) ++ fprintf(outf, "\n"); ++ fprintf(outf, "\r"); ++} +diff --git a/maps.c b/maps.c +index 20fcf719..b586679a 100644 +--- a/maps.c ++++ b/maps.c +@@ -165,6 +165,37 @@ mapping_t sysfs_array_states[] = { + { "broken", ARRAY_BROKEN }, + { NULL, ARRAY_UNKNOWN_STATE } + }; ++/** ++ * mapping_t update_options - stores supported update options. ++ */ ++mapping_t update_options[] = { ++ { "name", UOPT_NAME }, ++ { "ppl", UOPT_PPL }, ++ { "no-ppl", UOPT_NO_PPL }, ++ { "bitmap", UOPT_BITMAP }, ++ { "no-bitmap", UOPT_NO_BITMAP }, ++ { "sparc2.2", UOPT_SPARC22 }, ++ { "super-minor", UOPT_SUPER_MINOR }, ++ { "summaries", UOPT_SUMMARIES }, ++ { "resync", UOPT_RESYNC }, ++ { "uuid", UOPT_UUID }, ++ { "homehost", UOPT_HOMEHOST }, ++ { "home-cluster", UOPT_HOME_CLUSTER }, ++ { "nodes", UOPT_NODES }, ++ { "devicesize", UOPT_DEVICESIZE }, ++ { "bbl", UOPT_BBL }, ++ { "no-bbl", UOPT_NO_BBL }, ++ { "force-no-bbl", UOPT_FORCE_NO_BBL }, ++ { "metadata", UOPT_METADATA }, ++ { "revert-reshape", UOPT_REVERT_RESHAPE }, ++ { "layout-original", UOPT_LAYOUT_ORIGINAL }, ++ { "layout-alternate", UOPT_LAYOUT_ALTERNATE }, ++ { "layout-unspecified", UOPT_LAYOUT_UNSPECIFIED }, ++ { "byteorder", UOPT_BYTEORDER }, ++ { "help", UOPT_HELP }, ++ { "?", UOPT_HELP }, ++ { NULL, UOPT_UNDEFINED} ++}; + + /** + * map_num_s() - Safer alternative of map_num() function. +diff --git a/mdadm.c b/mdadm.c +index 74fdec31..f5f505fe 100644 +--- a/mdadm.c ++++ b/mdadm.c +@@ -100,7 +100,7 @@ int main(int argc, char *argv[]) + char *dump_directory = NULL; + + int print_help = 0; +- FILE *outf; ++ FILE *outf = NULL; + + int mdfd = -1; + int locked = 0; +@@ -723,7 +723,11 @@ int main(int argc, char *argv[]) + continue; + + case O(ASSEMBLE,'U'): /* update the superblock */ +- case O(MISC,'U'): ++ case O(MISC,'U'): { ++ enum update_opt updateopt = map_name(update_options, c.update); ++ enum update_opt print_mode = UOPT_HELP; ++ const char *error_addon = "update option"; ++ + if (c.update) { + pr_err("Can only update one aspect of superblock, both %s and %s given.\n", + c.update, optarg); +@@ -733,83 +737,37 @@ int main(int argc, char *argv[]) + pr_err("Only subarrays can be updated in misc mode\n"); + exit(2); + } ++ + c.update = optarg; +- if (strcmp(c.update, "sparc2.2") == 0) +- continue; +- if (strcmp(c.update, "super-minor") == 0) +- continue; +- if (strcmp(c.update, "summaries") == 0) +- continue; +- if (strcmp(c.update, "resync") == 0) +- continue; +- if (strcmp(c.update, "uuid") == 0) +- continue; +- if (strcmp(c.update, "name") == 0) +- continue; +- if (strcmp(c.update, "homehost") == 0) +- continue; +- if (strcmp(c.update, "home-cluster") == 0) +- continue; +- if (strcmp(c.update, "nodes") == 0) +- continue; +- if (strcmp(c.update, "devicesize") == 0) +- continue; +- if (strcmp(c.update, "bitmap") == 0) +- continue; +- if (strcmp(c.update, "no-bitmap") == 0) +- continue; +- if (strcmp(c.update, "bbl") == 0) +- continue; +- if (strcmp(c.update, "no-bbl") == 0) +- continue; +- if (strcmp(c.update, "force-no-bbl") == 0) +- continue; +- if (strcmp(c.update, "ppl") == 0) +- continue; +- if (strcmp(c.update, "no-ppl") == 0) +- continue; +- if (strcmp(c.update, "metadata") == 0) +- continue; +- if (strcmp(c.update, "revert-reshape") == 0) +- continue; +- if (strcmp(c.update, "layout-original") == 0 || +- strcmp(c.update, "layout-alternate") == 0 || +- strcmp(c.update, "layout-unspecified") == 0) +- continue; +- if (strcmp(c.update, "byteorder") == 0) { ++ ++ if (devmode == UpdateSubarray) { ++ print_mode = UOPT_SUBARRAY_ONLY; ++ error_addon = "update-subarray option"; ++ ++ if (updateopt > UOPT_SUBARRAY_ONLY && updateopt < UOPT_HELP) ++ updateopt = UOPT_UNDEFINED; ++ } ++ ++ switch (updateopt) { ++ case UOPT_UNDEFINED: ++ pr_err("'--update=%s' is invalid %s. ", ++ c.update, error_addon); ++ outf = stderr; ++ case UOPT_HELP: ++ if (!outf) ++ outf = stdout; ++ fprint_update_options(outf, print_mode); ++ exit(outf == stdout ? 0 : 2); ++ case UOPT_BYTEORDER: + if (ss) { + pr_err("must not set metadata type with --update=byteorder.\n"); + exit(2); + } +- for(i = 0; !ss && superlist[i]; i++) +- ss = superlist[i]->match_metadata_desc( +- "0.swap"); +- if (!ss) { +- pr_err("INTERNAL ERROR cannot find 0.swap\n"); +- exit(2); +- } +- +- continue; ++ default: ++ break; + } +- if (strcmp(c.update,"?") == 0 || +- strcmp(c.update, "help") == 0) { +- outf = stdout; +- fprintf(outf, "%s: ", Name); +- } else { +- outf = stderr; +- fprintf(outf, +- "%s: '--update=%s' is invalid. ", +- Name, c.update); +- } +- fprintf(outf, "Valid --update options are:\n" +- " 'sparc2.2', 'super-minor', 'uuid', 'name', 'nodes', 'resync',\n" +- " 'summaries', 'homehost', 'home-cluster', 'byteorder', 'devicesize',\n" +- " 'bitmap', 'no-bitmap', 'metadata', 'revert-reshape'\n" +- " 'bbl', 'no-bbl', 'force-no-bbl', 'ppl', 'no-ppl'\n" +- " 'layout-original', 'layout-alternate', 'layout-unspecified'\n" +- ); +- exit(outf == stdout ? 0 : 2); +- ++ continue; ++ } + case O(MANAGE,'U'): + /* update=devicesize is allowed with --re-add */ + if (devmode != 'A') { +diff --git a/mdadm.h b/mdadm.h +index 23ffe977..51f1db2d 100644 +--- a/mdadm.h ++++ b/mdadm.h +@@ -497,6 +497,36 @@ enum special_options { + ConsistencyPolicy, + }; + ++enum update_opt { ++ UOPT_NAME = 1, ++ UOPT_PPL, ++ UOPT_NO_PPL, ++ UOPT_BITMAP, ++ UOPT_NO_BITMAP, ++ UOPT_SUBARRAY_ONLY, ++ UOPT_SPARC22, ++ UOPT_SUPER_MINOR, ++ UOPT_SUMMARIES, ++ UOPT_RESYNC, ++ UOPT_UUID, ++ UOPT_HOMEHOST, ++ UOPT_HOME_CLUSTER, ++ UOPT_NODES, ++ UOPT_DEVICESIZE, ++ UOPT_BBL, ++ UOPT_NO_BBL, ++ UOPT_FORCE_NO_BBL, ++ UOPT_METADATA, ++ UOPT_REVERT_RESHAPE, ++ UOPT_LAYOUT_ORIGINAL, ++ UOPT_LAYOUT_ALTERNATE, ++ UOPT_LAYOUT_UNSPECIFIED, ++ UOPT_BYTEORDER, ++ UOPT_HELP, ++ UOPT_UNDEFINED ++}; ++extern void fprint_update_options(FILE *outf, enum update_opt update_mode); ++ + enum prefix_standard { + JEDEC, + IEC +@@ -777,7 +807,7 @@ extern char *map_num(mapping_t *map, int num); + extern int map_name(mapping_t *map, char *name); + extern mapping_t r0layout[], r5layout[], r6layout[], + pers[], modes[], faultylayout[]; +-extern mapping_t consistency_policies[], sysfs_array_states[]; ++extern mapping_t consistency_policies[], sysfs_array_states[], update_options[]; + + extern char *map_dev_preferred(int major, int minor, int create, + char *prefer); +-- +2.38.1 + diff --git a/SOURCES/0068-Fix-update-subarray-on-active-volume.patch b/SOURCES/0068-Fix-update-subarray-on-active-volume.patch new file mode 100644 index 0000000..7c1c4bc --- /dev/null +++ b/SOURCES/0068-Fix-update-subarray-on-active-volume.patch @@ -0,0 +1,54 @@ +From db10eab68e652f141169b7240e057d110d626c3d Mon Sep 17 00:00:00 2001 +From: Mateusz Kusiak +Date: Mon, 2 Jan 2023 09:35:16 +0100 +Subject: [PATCH 68/83] Fix --update-subarray on active volume + +Options: bitmap, ppl and name should not be updated when array is active. +Those features are mutually exclusive and share the same data area in IMSM (danger of overwriting by kernel). +Remove check for active subarrays from super-intel. +Since ddf is not supported, apply it globally for all options. + +Signed-off-by: Mateusz Kusiak +Signed-off-by: Jes Sorensen +--- + Manage.c | 7 +++++++ + super-intel.c | 5 ----- + 2 files changed, 7 insertions(+), 5 deletions(-) + +diff --git a/Manage.c b/Manage.c +index b1d0e630..5a9ea316 100644 +--- a/Manage.c ++++ b/Manage.c +@@ -1745,6 +1745,13 @@ int Update_subarray(char *dev, char *subarray, char *update, struct mddev_ident + goto free_super; + } + ++ if (is_subarray_active(subarray, st->devnm)) { ++ if (verbose >= 0) ++ pr_err("Subarray %s in %s is active, cannot update %s\n", ++ subarray, dev, update); ++ goto free_super; ++ } ++ + if (mdmon_running(st->devnm)) + st->update_tail = &st->updates; + +diff --git a/super-intel.c b/super-intel.c +index b0565610..5f93f3d3 100644 +--- a/super-intel.c ++++ b/super-intel.c +@@ -7914,11 +7914,6 @@ static int update_subarray_imsm(struct supertype *st, char *subarray, + char *ep; + int vol; + +- if (is_subarray_active(subarray, st->devnm)) { +- pr_err("Unable to update name of active subarray\n"); +- return 2; +- } +- + if (!check_name(super, name, 0)) + return 2; + +-- +2.38.1 + diff --git a/SOURCES/0069-Add-code-specific-update-options-to-enum.patch b/SOURCES/0069-Add-code-specific-update-options-to-enum.patch new file mode 100644 index 0000000..57386f5 --- /dev/null +++ b/SOURCES/0069-Add-code-specific-update-options-to-enum.patch @@ -0,0 +1,77 @@ +From 2257de106cbf17a7f1df33a10cfd2be0d5a064cb Mon Sep 17 00:00:00 2001 +From: Mateusz Kusiak +Date: Mon, 2 Jan 2023 09:35:17 +0100 +Subject: [PATCH 69/83] Add code specific update options to enum. + +Some of update options aren't taken from user input, but are hard-coded +as strings. +Include those options in enum. + +Signed-off-by: Mateusz Kusiak +Signed-off-by: Jes Sorensen +--- + maps.c | 21 +++++++++++++++++++++ + mdadm.h | 15 +++++++++++++++ + 2 files changed, 36 insertions(+) + +diff --git a/maps.c b/maps.c +index b586679a..c59036f1 100644 +--- a/maps.c ++++ b/maps.c +@@ -194,6 +194,27 @@ mapping_t update_options[] = { + { "byteorder", UOPT_BYTEORDER }, + { "help", UOPT_HELP }, + { "?", UOPT_HELP }, ++ /* ++ * Those enries are temporary and will be removed in this patchset. ++ * ++ * Before update_super:update can be changed to enum, ++ * all update_super sub-functions must be adapted first. ++ * Update options will be passed as string (as it is for now), ++ * and then mapped, so all options must be handled temporarily. ++ * ++ * Those options code specific and should not be accessible for user. ++ */ ++ { "force-one", UOPT_SPEC_FORCE_ONE }, ++ { "force-array", UOPT_SPEC_FORCE_ARRAY }, ++ { "assemble", UOPT_SPEC_ASSEMBLE }, ++ { "linear-grow-new", UOPT_SPEC_LINEAR_GROW_NEW }, ++ { "linear-grow-update", UOPT_SPEC_LINEAR_GROW_UPDATE }, ++ { "_reshape_progress", UOPT_SPEC__RESHAPE_PROGRESS }, ++ { "writemostly", UOPT_SPEC_WRITEMOSTLY }, ++ { "readwrite", UOPT_SPEC_READWRITE }, ++ { "failfast", UOPT_SPEC_FAILFAST }, ++ { "nofailfast", UOPT_SPEC_NOFAILFAST }, ++ { "revert-reshape-nobackup", UOPT_SPEC_REVERT_RESHAPE_NOBACKUP }, + { NULL, UOPT_UNDEFINED} + }; + +diff --git a/mdadm.h b/mdadm.h +index 51f1db2d..31db25f5 100644 +--- a/mdadm.h ++++ b/mdadm.h +@@ -523,6 +523,21 @@ enum update_opt { + UOPT_LAYOUT_UNSPECIFIED, + UOPT_BYTEORDER, + UOPT_HELP, ++ UOPT_USER_ONLY, ++ /* ++ * Code specific options, cannot be set by the user ++ */ ++ UOPT_SPEC_FORCE_ONE, ++ UOPT_SPEC_FORCE_ARRAY, ++ UOPT_SPEC_ASSEMBLE, ++ UOPT_SPEC_LINEAR_GROW_NEW, ++ UOPT_SPEC_LINEAR_GROW_UPDATE, ++ UOPT_SPEC__RESHAPE_PROGRESS, ++ UOPT_SPEC_WRITEMOSTLY, ++ UOPT_SPEC_READWRITE, ++ UOPT_SPEC_FAILFAST, ++ UOPT_SPEC_NOFAILFAST, ++ UOPT_SPEC_REVERT_RESHAPE_NOBACKUP, + UOPT_UNDEFINED + }; + extern void fprint_update_options(FILE *outf, enum update_opt update_mode); +-- +2.38.1 + diff --git a/SOURCES/0070-super-ddf-Remove-update_super_ddf.patch b/SOURCES/0070-super-ddf-Remove-update_super_ddf.patch new file mode 100644 index 0000000..7a6d213 --- /dev/null +++ b/SOURCES/0070-super-ddf-Remove-update_super_ddf.patch @@ -0,0 +1,106 @@ +From 35aa44c549290e22f285896684c704acb53b7717 Mon Sep 17 00:00:00 2001 +From: Mateusz Kusiak +Date: Mon, 2 Jan 2023 09:35:18 +0100 +Subject: [PATCH 70/83] super-ddf: Remove update_super_ddf. + +This is not supported by ddf. +It hides errors by returning success status for some updates. +Remove update_super_dff(). + +Signed-off-by: Mateusz Kusiak +Signed-off-by: Jes Sorensen +--- + super-ddf.c | 70 ----------------------------------------------------- + 1 file changed, 70 deletions(-) + +diff --git a/super-ddf.c b/super-ddf.c +index 9d1e3b94..309812df 100644 +--- a/super-ddf.c ++++ b/super-ddf.c +@@ -2139,75 +2139,6 @@ static void getinfo_super_ddf_bvd(struct supertype *st, struct mdinfo *info, cha + } + } + +-static int update_super_ddf(struct supertype *st, struct mdinfo *info, +- char *update, +- char *devname, int verbose, +- int uuid_set, char *homehost) +-{ +- /* For 'assemble' and 'force' we need to return non-zero if any +- * change was made. For others, the return value is ignored. +- * Update options are: +- * force-one : This device looks a bit old but needs to be included, +- * update age info appropriately. +- * assemble: clear any 'faulty' flag to allow this device to +- * be assembled. +- * force-array: Array is degraded but being forced, mark it clean +- * if that will be needed to assemble it. +- * +- * newdev: not used ???? +- * grow: Array has gained a new device - this is currently for +- * linear only +- * resync: mark as dirty so a resync will happen. +- * uuid: Change the uuid of the array to match what is given +- * homehost: update the recorded homehost +- * name: update the name - preserving the homehost +- * _reshape_progress: record new reshape_progress position. +- * +- * Following are not relevant for this version: +- * sparc2.2 : update from old dodgey metadata +- * super-minor: change the preferred_minor number +- * summaries: update redundant counters. +- */ +- int rv = 0; +-// struct ddf_super *ddf = st->sb; +-// struct vd_config *vd = find_vdcr(ddf, info->container_member); +-// struct virtual_entry *ve = find_ve(ddf); +- +- /* we don't need to handle "force-*" or "assemble" as +- * there is no need to 'trick' the kernel. When the metadata is +- * first updated to activate the array, all the implied modifications +- * will just happen. +- */ +- +- if (strcmp(update, "grow") == 0) { +- /* FIXME */ +- } else if (strcmp(update, "resync") == 0) { +-// info->resync_checkpoint = 0; +- } else if (strcmp(update, "homehost") == 0) { +- /* homehost is stored in controller->vendor_data, +- * or it is when we are the vendor +- */ +-// if (info->vendor_is_local) +-// strcpy(ddf->controller.vendor_data, homehost); +- rv = -1; +- } else if (strcmp(update, "name") == 0) { +- /* name is stored in virtual_entry->name */ +-// memset(ve->name, ' ', 16); +-// strncpy(ve->name, info->name, 16); +- rv = -1; +- } else if (strcmp(update, "_reshape_progress") == 0) { +- /* We don't support reshape yet */ +- } else if (strcmp(update, "assemble") == 0 ) { +- /* Do nothing, just succeed */ +- rv = 0; +- } else +- rv = -1; +- +-// update_all_csum(ddf); +- +- return rv; +-} +- + static void make_header_guid(char *guid) + { + be32 stamp; +@@ -5211,7 +5142,6 @@ struct superswitch super_ddf = { + .match_home = match_home_ddf, + .uuid_from_super= uuid_from_super_ddf, + .getinfo_super = getinfo_super_ddf, +- .update_super = update_super_ddf, + + .avail_size = avail_size_ddf, + +-- +2.38.1 + diff --git a/SOURCES/0071-super0-refactor-the-code-for-enum.patch b/SOURCES/0071-super0-refactor-the-code-for-enum.patch new file mode 100644 index 0000000..f01c534 --- /dev/null +++ b/SOURCES/0071-super0-refactor-the-code-for-enum.patch @@ -0,0 +1,212 @@ +From 0a9e39383d3bf63e1f5cf10f64200083a1af8091 Mon Sep 17 00:00:00 2001 +From: Mateusz Kusiak +Date: Mon, 2 Jan 2023 09:35:19 +0100 +Subject: [PATCH 71/83] super0: refactor the code for enum + +It prepares update_super0 for change context->update to enum. +Change if else statements to switch. + +Signed-off-by: Mateusz Kusiak +Signed-off-by: Jes Sorensen +--- + super0.c | 102 ++++++++++++++++++++++++++++++++++--------------------- + 1 file changed, 63 insertions(+), 39 deletions(-) + +diff --git a/super0.c b/super0.c +index 93876e2e..d9f5bff4 100644 +--- a/super0.c ++++ b/super0.c +@@ -502,19 +502,39 @@ static int update_super0(struct supertype *st, struct mdinfo *info, + int rv = 0; + int uuid[4]; + mdp_super_t *sb = st->sb; ++ enum update_opt update_enum = map_name(update_options, update); + +- if (strcmp(update, "homehost") == 0 && +- homehost) { +- /* note that 'homehost' is special as it is really ++ if (update_enum == UOPT_HOMEHOST && homehost) { ++ /* ++ * note that 'homehost' is special as it is really + * a "uuid" update. + */ + uuid_set = 0; +- update = "uuid"; ++ update_enum = UOPT_UUID; + info->uuid[0] = sb->set_uuid0; + info->uuid[1] = sb->set_uuid1; + } + +- if (strcmp(update, "sparc2.2")==0 ) { ++ switch (update_enum) { ++ case UOPT_UUID: ++ if (!uuid_set && homehost) { ++ char buf[20]; ++ memcpy(info->uuid+2, ++ sha1_buffer(homehost, strlen(homehost), buf), ++ 8); ++ } ++ sb->set_uuid0 = info->uuid[0]; ++ sb->set_uuid1 = info->uuid[1]; ++ sb->set_uuid2 = info->uuid[2]; ++ sb->set_uuid3 = info->uuid[3]; ++ if (sb->state & (1<uuid, uuid, 16); ++ } ++ break; ++ case UOPT_SPARC22: { + /* 2.2 sparc put the events in the wrong place + * So we copy the tail of the superblock + * up 4 bytes before continuing +@@ -527,12 +547,15 @@ static int update_super0(struct supertype *st, struct mdinfo *info, + if (verbose >= 0) + pr_err("adjusting superblock of %s for 2.2/sparc compatibility.\n", + devname); +- } else if (strcmp(update, "super-minor") ==0) { ++ break; ++ } ++ case UOPT_SUPER_MINOR: + sb->md_minor = info->array.md_minor; + if (verbose > 0) + pr_err("updating superblock of %s with minor number %d\n", + devname, info->array.md_minor); +- } else if (strcmp(update, "summaries") == 0) { ++ break; ++ case UOPT_SUMMARIES: { + unsigned int i; + /* set nr_disks, active_disks, working_disks, + * failed_disks, spare_disks based on disks[] +@@ -559,7 +582,9 @@ static int update_super0(struct supertype *st, struct mdinfo *info, + sb->spare_disks++; + } else if (i >= sb->raid_disks && sb->disks[i].number == 0) + sb->disks[i].state = 0; +- } else if (strcmp(update, "force-one")==0) { ++ break; ++ } ++ case UOPT_SPEC_FORCE_ONE: { + /* Not enough devices for a working array, so + * bring this one up-to-date. + */ +@@ -569,7 +594,9 @@ static int update_super0(struct supertype *st, struct mdinfo *info, + if (sb->events_hi != ehi || + sb->events_lo != elo) + rv = 1; +- } else if (strcmp(update, "force-array")==0) { ++ break; ++ } ++ case UOPT_SPEC_FORCE_ARRAY: + /* degraded array and 'force' requested, so + * maybe need to mark it 'clean' + */ +@@ -579,7 +606,8 @@ static int update_super0(struct supertype *st, struct mdinfo *info, + sb->state |= (1 << MD_SB_CLEAN); + rv = 1; + } +- } else if (strcmp(update, "assemble")==0) { ++ break; ++ case UOPT_SPEC_ASSEMBLE: { + int d = info->disk.number; + int wonly = sb->disks[d].state & (1<disks[d].state & (1<reshape_position = info->reshape_progress; + rv = 1; + } +- } else if (strcmp(update, "linear-grow-new") == 0) { ++ break; ++ } ++ case UOPT_SPEC_LINEAR_GROW_NEW: + memset(&sb->disks[info->disk.number], 0, sizeof(sb->disks[0])); + sb->disks[info->disk.number].number = info->disk.number; + sb->disks[info->disk.number].major = info->disk.major; +@@ -617,7 +647,8 @@ static int update_super0(struct supertype *st, struct mdinfo *info, + sb->disks[info->disk.number].raid_disk = info->disk.raid_disk; + sb->disks[info->disk.number].state = info->disk.state; + sb->this_disk = sb->disks[info->disk.number]; +- } else if (strcmp(update, "linear-grow-update") == 0) { ++ break; ++ case UOPT_SPEC_LINEAR_GROW_UPDATE: + sb->raid_disks = info->array.raid_disks; + sb->nr_disks = info->array.nr_disks; + sb->active_disks = info->array.active_disks; +@@ -628,29 +659,15 @@ static int update_super0(struct supertype *st, struct mdinfo *info, + sb->disks[info->disk.number].minor = info->disk.minor; + sb->disks[info->disk.number].raid_disk = info->disk.raid_disk; + sb->disks[info->disk.number].state = info->disk.state; +- } else if (strcmp(update, "resync") == 0) { +- /* make sure resync happens */ ++ break; ++ case UOPT_RESYNC: ++ /* ++ * make sure resync happens ++ */ + sb->state &= ~(1<recovery_cp = 0; +- } else if (strcmp(update, "uuid") == 0) { +- if (!uuid_set && homehost) { +- char buf[20]; +- char *hash = sha1_buffer(homehost, +- strlen(homehost), +- buf); +- memcpy(info->uuid+2, hash, 8); +- } +- sb->set_uuid0 = info->uuid[0]; +- sb->set_uuid1 = info->uuid[1]; +- sb->set_uuid2 = info->uuid[2]; +- sb->set_uuid3 = info->uuid[3]; +- if (sb->state & (1<uuid, uuid, 16); +- } +- } else if (strcmp(update, "metadata") == 0) { ++ break; ++ case UOPT_METADATA: + /* Create some v1.0 metadata to match ours but make the + * ctime bigger. Also update info->array.*_version. + * We need to arrange that store_super writes out +@@ -670,7 +687,8 @@ static int update_super0(struct supertype *st, struct mdinfo *info, + uuid_from_super0(st, info->uuid); + st->other = super1_make_v0(st, info, st->sb); + } +- } else if (strcmp(update, "revert-reshape") == 0) { ++ break; ++ case UOPT_REVERT_RESHAPE: + rv = -2; + if (sb->minor_version <= 90) + pr_err("No active reshape to revert on %s\n", +@@ -702,16 +720,22 @@ static int update_super0(struct supertype *st, struct mdinfo *info, + sb->new_chunk = sb->chunk_size; + sb->chunk_size = tmp; + } +- } else if (strcmp(update, "no-bitmap") == 0) { ++ break; ++ case UOPT_NO_BITMAP: + sb->state &= ~(1<reshape_position = info->reshape_progress; +- else if (strcmp(update, "writemostly")==0) ++ break; ++ case UOPT_SPEC_WRITEMOSTLY: + sb->state |= (1<state &= ~(1<sb_csum = calc_sb0_csum(sb); + return rv; +-- +2.38.1 + diff --git a/SOURCES/0072-super1-refactor-the-code-for-enum.patch b/SOURCES/0072-super1-refactor-the-code-for-enum.patch new file mode 100644 index 0000000..bd164b8 --- /dev/null +++ b/SOURCES/0072-super1-refactor-the-code-for-enum.patch @@ -0,0 +1,302 @@ +From 7e8daba8b7937716dce8ea28298a4e2e72cb829e Mon Sep 17 00:00:00 2001 +From: Mateusz Kusiak +Date: Mon, 2 Jan 2023 09:35:20 +0100 +Subject: [PATCH 72/83] super1: refactor the code for enum + +It prepares update_super1 for change context->update to enum. +Change if else statements into switch. + +Signed-off-by: Mateusz Kusiak +Signed-off-by: Jes Sorensen +--- + super1.c | 152 +++++++++++++++++++++++++++++++++---------------------- + 1 file changed, 91 insertions(+), 61 deletions(-) + +diff --git a/super1.c b/super1.c +index 0b505a7e..b0a97016 100644 +--- a/super1.c ++++ b/super1.c +@@ -1218,30 +1218,55 @@ static int update_super1(struct supertype *st, struct mdinfo *info, + int rv = 0; + struct mdp_superblock_1 *sb = st->sb; + bitmap_super_t *bms = (bitmap_super_t*)(((char*)sb) + MAX_SB_SIZE); ++ enum update_opt update_enum = map_name(update_options, update); + +- if (strcmp(update, "homehost") == 0 && +- homehost) { +- /* Note that 'homehost' is special as it is really ++ if (update_enum == UOPT_HOMEHOST && homehost) { ++ /* ++ * Note that 'homehost' is special as it is really + * a "name" update. + */ + char *c; +- update = "name"; ++ update_enum = UOPT_NAME; + c = strchr(sb->set_name, ':'); + if (c) +- strncpy(info->name, c+1, 31 - (c-sb->set_name)); ++ snprintf(info->name, sizeof(info->name), "%s", c+1); + else +- strncpy(info->name, sb->set_name, 32); +- info->name[32] = 0; ++ snprintf(info->name, sizeof(info->name), "%s", sb->set_name); + } + +- if (strcmp(update, "force-one")==0) { ++ switch (update_enum) { ++ case UOPT_NAME: { ++ int namelen; ++ ++ if (!info->name[0]) ++ snprintf(info->name, sizeof(info->name), "%d", info->array.md_minor); ++ memset(sb->set_name, 0, sizeof(sb->set_name)); ++ ++ namelen = strnlen(homehost, MD_NAME_MAX) + 1 + strnlen(info->name, MD_NAME_MAX); ++ if (homehost && ++ strchr(info->name, ':') == NULL && ++ namelen < MD_NAME_MAX) { ++ strcpy(sb->set_name, homehost); ++ strcat(sb->set_name, ":"); ++ strcat(sb->set_name, info->name); ++ } else { ++ namelen = min((int)strnlen(info->name, MD_NAME_MAX), ++ (int)sizeof(sb->set_name) - 1); ++ memcpy(sb->set_name, info->name, namelen); ++ memset(&sb->set_name[namelen], '\0', ++ sizeof(sb->set_name) - namelen); ++ } ++ break; ++ } ++ case UOPT_SPEC_FORCE_ONE: + /* Not enough devices for a working array, + * so bring this one up-to-date + */ + if (sb->events != __cpu_to_le64(info->events)) + rv = 1; + sb->events = __cpu_to_le64(info->events); +- } else if (strcmp(update, "force-array")==0) { ++ break; ++ case UOPT_SPEC_FORCE_ARRAY: + /* Degraded array and 'force' requests to + * maybe need to mark it 'clean'. + */ +@@ -1254,7 +1279,8 @@ static int update_super1(struct supertype *st, struct mdinfo *info, + rv = 1; + sb->resync_offset = MaxSector; + } +- } else if (strcmp(update, "assemble")==0) { ++ break; ++ case UOPT_SPEC_ASSEMBLE: { + int d = info->disk.number; + int want; + if (info->disk.state & (1<reshape_progress); + rv = 1; + } +- } else if (strcmp(update, "linear-grow-new") == 0) { ++ break; ++ } ++ case UOPT_SPEC_LINEAR_GROW_NEW: { + int i; + int fd; + int max = __le32_to_cpu(sb->max_dev); +@@ -1330,7 +1358,9 @@ static int update_super1(struct supertype *st, struct mdinfo *info, + ds - __le64_to_cpu(sb->data_offset)); + } + } +- } else if (strcmp(update, "linear-grow-update") == 0) { ++ break; ++ } ++ case UOPT_SPEC_LINEAR_GROW_UPDATE: { + int max = __le32_to_cpu(sb->max_dev); + int i = info->disk.number; + if (max > MAX_DEVS || i > MAX_DEVS) +@@ -1342,19 +1372,20 @@ static int update_super1(struct supertype *st, struct mdinfo *info, + sb->raid_disks = __cpu_to_le32(info->array.raid_disks); + sb->dev_roles[info->disk.number] = + __cpu_to_le16(info->disk.raid_disk); +- } else if (strcmp(update, "resync") == 0) { +- /* make sure resync happens */ +- sb->resync_offset = 0ULL; +- } else if (strcmp(update, "uuid") == 0) { ++ break; ++ } ++ case UOPT_UUID: + copy_uuid(sb->set_uuid, info->uuid, super1.swapuuid); + + if (__le32_to_cpu(sb->feature_map) & MD_FEATURE_BITMAP_OFFSET) + memcpy(bms->uuid, sb->set_uuid, 16); +- } else if (strcmp(update, "no-bitmap") == 0) { ++ break; ++ case UOPT_NO_BITMAP: + sb->feature_map &= ~__cpu_to_le32(MD_FEATURE_BITMAP_OFFSET); + if (bms->version == BITMAP_MAJOR_CLUSTERED && !IsBitmapDirty(devname)) + sb->resync_offset = MaxSector; +- } else if (strcmp(update, "bbl") == 0) { ++ break; ++ case UOPT_BBL: { + /* only possible if there is room after the bitmap, or if + * there is no bitmap + */ +@@ -1383,14 +1414,12 @@ static int update_super1(struct supertype *st, struct mdinfo *info, + bb_offset = bitmap_offset + bm_sectors; + while (bb_offset < (long)sb_offset + 8 + 32*2 && + bb_offset + 8+8 <= (long)data_offset) +- /* too close to bitmap, and room to grow */ + bb_offset += 8; + if (bb_offset + 8 <= (long)data_offset) { + sb->bblog_size = __cpu_to_le16(8); + sb->bblog_offset = __cpu_to_le32(bb_offset); + } + } else { +- /* 1.0 - Put bbl just before super block */ + if (bm_sectors && bitmap_offset < 0) + space = -bitmap_offset - bm_sectors; + else +@@ -1401,7 +1430,9 @@ static int update_super1(struct supertype *st, struct mdinfo *info, + sb->bblog_offset = __cpu_to_le32((unsigned)-8); + } + } +- } else if (strcmp(update, "no-bbl") == 0) { ++ break; ++ } ++ case UOPT_NO_BBL: + if (sb->feature_map & __cpu_to_le32(MD_FEATURE_BAD_BLOCKS)) + pr_err("Cannot remove active bbl from %s\n",devname); + else { +@@ -1409,12 +1440,14 @@ static int update_super1(struct supertype *st, struct mdinfo *info, + sb->bblog_shift = 0; + sb->bblog_offset = 0; + } +- } else if (strcmp(update, "force-no-bbl") == 0) { ++ break; ++ case UOPT_FORCE_NO_BBL: + sb->feature_map &= ~ __cpu_to_le32(MD_FEATURE_BAD_BLOCKS); + sb->bblog_size = 0; + sb->bblog_shift = 0; + sb->bblog_offset = 0; +- } else if (strcmp(update, "ppl") == 0) { ++ break; ++ case UOPT_PPL: { + unsigned long long sb_offset = __le64_to_cpu(sb->super_offset); + unsigned long long data_offset = __le64_to_cpu(sb->data_offset); + unsigned long long data_size = __le64_to_cpu(sb->data_size); +@@ -1464,37 +1497,26 @@ static int update_super1(struct supertype *st, struct mdinfo *info, + sb->ppl.offset = __cpu_to_le16(offset); + sb->ppl.size = __cpu_to_le16(space); + sb->feature_map |= __cpu_to_le32(MD_FEATURE_PPL); +- } else if (strcmp(update, "no-ppl") == 0) { ++ break; ++ } ++ case UOPT_NO_PPL: + sb->feature_map &= ~__cpu_to_le32(MD_FEATURE_PPL | + MD_FEATURE_MUTLIPLE_PPLS); +- } else if (strcmp(update, "name") == 0) { +- if (info->name[0] == 0) +- sprintf(info->name, "%d", info->array.md_minor); +- memset(sb->set_name, 0, sizeof(sb->set_name)); +- if (homehost && +- strchr(info->name, ':') == NULL && +- strlen(homehost)+1+strlen(info->name) < 32) { +- strcpy(sb->set_name, homehost); +- strcat(sb->set_name, ":"); +- strcat(sb->set_name, info->name); +- } else { +- int namelen; +- +- namelen = min((int)strlen(info->name), +- (int)sizeof(sb->set_name) - 1); +- memcpy(sb->set_name, info->name, namelen); +- memset(&sb->set_name[namelen], '\0', +- sizeof(sb->set_name) - namelen); +- } +- } else if (strcmp(update, "devicesize") == 0 && +- __le64_to_cpu(sb->super_offset) < +- __le64_to_cpu(sb->data_offset)) { +- /* set data_size to device size less data_offset */ ++ break; ++ case UOPT_DEVICESIZE: ++ if (__le64_to_cpu(sb->super_offset) >= ++ __le64_to_cpu(sb->data_offset)) ++ break; ++ /* ++ * set data_size to device size less data_offset ++ */ + struct misc_dev_info *misc = (struct misc_dev_info*) + (st->sb + MAX_SB_SIZE + BM_SUPER_SIZE); + sb->data_size = __cpu_to_le64( + misc->device_size - __le64_to_cpu(sb->data_offset)); +- } else if (strncmp(update, "revert-reshape", 14) == 0) { ++ break; ++ case UOPT_SPEC_REVERT_RESHAPE_NOBACKUP: ++ case UOPT_REVERT_RESHAPE: + rv = -2; + if (!(sb->feature_map & + __cpu_to_le32(MD_FEATURE_RESHAPE_ACTIVE))) +@@ -1512,7 +1534,7 @@ static int update_super1(struct supertype *st, struct mdinfo *info, + * If that couldn't happen, the "-nobackup" version + * will be used. + */ +- if (strcmp(update, "revert-reshape-nobackup") == 0 && ++ if (update_enum == UOPT_SPEC_REVERT_RESHAPE_NOBACKUP && + sb->reshape_position == 0 && + (__le32_to_cpu(sb->delta_disks) > 0 || + (__le32_to_cpu(sb->delta_disks) == 0 && +@@ -1575,32 +1597,40 @@ static int update_super1(struct supertype *st, struct mdinfo *info, + } + done:; + } +- } else if (strcmp(update, "_reshape_progress") == 0) ++ break; ++ case UOPT_SPEC__RESHAPE_PROGRESS: + sb->reshape_position = __cpu_to_le64(info->reshape_progress); +- else if (strcmp(update, "writemostly") == 0) ++ break; ++ case UOPT_SPEC_WRITEMOSTLY: + sb->devflags |= WriteMostly1; +- else if (strcmp(update, "readwrite") == 0) ++ break; ++ case UOPT_SPEC_READWRITE: + sb->devflags &= ~WriteMostly1; +- else if (strcmp(update, "failfast") == 0) ++ break; ++ case UOPT_SPEC_FAILFAST: + sb->devflags |= FailFast1; +- else if (strcmp(update, "nofailfast") == 0) ++ break; ++ case UOPT_SPEC_NOFAILFAST: + sb->devflags &= ~FailFast1; +- else if (strcmp(update, "layout-original") == 0 || +- strcmp(update, "layout-alternate") == 0 || +- strcmp(update, "layout-unspecified") == 0) { ++ break; ++ case UOPT_LAYOUT_ORIGINAL: ++ case UOPT_LAYOUT_ALTERNATE: ++ case UOPT_LAYOUT_UNSPECIFIED: + if (__le32_to_cpu(sb->level) != 0) { + pr_err("%s: %s only supported for RAID0\n", +- devname?:"", update); ++ devname ?: "", map_num(update_options, update_enum)); + rv = -1; +- } else if (strcmp(update, "layout-unspecified") == 0) { ++ } else if (update_enum == UOPT_LAYOUT_UNSPECIFIED) { + sb->feature_map &= ~__cpu_to_le32(MD_FEATURE_RAID0_LAYOUT); + sb->layout = 0; + } else { + sb->feature_map |= __cpu_to_le32(MD_FEATURE_RAID0_LAYOUT); +- sb->layout = __cpu_to_le32(update[7] == 'o' ? 1 : 2); ++ sb->layout = __cpu_to_le32(update_enum == UOPT_LAYOUT_ORIGINAL ? 1 : 2); + } +- } else ++ break; ++ default: + rv = -1; ++ } + + sb->sb_csum = calc_sb_1_csum(sb); + +-- +2.38.1 + diff --git a/SOURCES/0073-super-intel-refactor-the-code-for-enum.patch b/SOURCES/0073-super-intel-refactor-the-code-for-enum.patch new file mode 100644 index 0000000..6756297 --- /dev/null +++ b/SOURCES/0073-super-intel-refactor-the-code-for-enum.patch @@ -0,0 +1,106 @@ +From 4345e135c4c7dd04bb15bad140dfc4747f677738 Mon Sep 17 00:00:00 2001 +From: Mateusz Kusiak +Date: Mon, 2 Jan 2023 09:35:21 +0100 +Subject: [PATCH 73/83] super-intel: refactor the code for enum + +It prepares super-intel for change context->update to enum. + +Signed-off-by: Mateusz Kusiak +Signed-off-by: Jes Sorensen +--- + super-intel.c | 37 +++++++++++++++++++++++++------------ + 1 file changed, 25 insertions(+), 12 deletions(-) + +diff --git a/super-intel.c b/super-intel.c +index 5f93f3d3..85fb7f17 100644 +--- a/super-intel.c ++++ b/super-intel.c +@@ -3930,7 +3930,8 @@ static int update_super_imsm(struct supertype *st, struct mdinfo *info, + + mpb = super->anchor; + +- if (strcmp(update, "uuid") == 0) { ++ switch (map_name(update_options, update)) { ++ case UOPT_UUID: + /* We take this to mean that the family_num should be updated. + * However that is much smaller than the uuid so we cannot really + * allow an explicit uuid to be given. And it is hard to reliably +@@ -3954,10 +3955,14 @@ static int update_super_imsm(struct supertype *st, struct mdinfo *info, + } + if (rv == 0) + mpb->orig_family_num = info->uuid[0]; +- } else if (strcmp(update, "assemble") == 0) ++ break; ++ case UOPT_SPEC_ASSEMBLE: + rv = 0; +- else ++ break; ++ default: + rv = -1; ++ break; ++ } + + /* successful update? recompute checksum */ + if (rv == 0) +@@ -7889,17 +7894,25 @@ static int kill_subarray_imsm(struct supertype *st, char *subarray_id) + return 0; + } + +-static int get_rwh_policy_from_update(char *update) ++/** ++ * get_rwh_policy_from_update() - Get the rwh policy for update option. ++ * @update: Update option. ++ */ ++static int get_rwh_policy_from_update(enum update_opt update) + { +- if (strcmp(update, "ppl") == 0) ++ switch (update) { ++ case UOPT_PPL: + return RWH_MULTIPLE_DISTRIBUTED; +- else if (strcmp(update, "no-ppl") == 0) ++ case UOPT_NO_PPL: + return RWH_MULTIPLE_OFF; +- else if (strcmp(update, "bitmap") == 0) ++ case UOPT_BITMAP: + return RWH_BITMAP; +- else if (strcmp(update, "no-bitmap") == 0) ++ case UOPT_NO_BITMAP: + return RWH_OFF; +- return -1; ++ default: ++ break; ++ } ++ return UOPT_UNDEFINED; + } + + static int update_subarray_imsm(struct supertype *st, char *subarray, +@@ -7909,7 +7922,7 @@ static int update_subarray_imsm(struct supertype *st, char *subarray, + struct intel_super *super = st->sb; + struct imsm_super *mpb = super->anchor; + +- if (strcmp(update, "name") == 0) { ++ if (map_name(update_options, update) == UOPT_NAME) { + char *name = ident->name; + char *ep; + int vol; +@@ -7943,7 +7956,7 @@ static int update_subarray_imsm(struct supertype *st, char *subarray, + } + super->updates_pending++; + } +- } else if (get_rwh_policy_from_update(update) != -1) { ++ } else if (get_rwh_policy_from_update(map_name(update_options, update)) != UOPT_UNDEFINED) { + int new_policy; + char *ep; + int vol = strtoul(subarray, &ep, 10); +@@ -7951,7 +7964,7 @@ static int update_subarray_imsm(struct supertype *st, char *subarray, + if (*ep != '\0' || vol >= super->anchor->num_raid_devs) + return 2; + +- new_policy = get_rwh_policy_from_update(update); ++ new_policy = get_rwh_policy_from_update(map_name(update_options, update)); + + if (st->update_tail) { + struct imsm_update_rwh_policy *u = xmalloc(sizeof(*u)); +-- +2.38.1 + diff --git a/SOURCES/0074-Change-update-to-enum-in-update_super-and-update_sub.patch b/SOURCES/0074-Change-update-to-enum-in-update_super-and-update_sub.patch new file mode 100644 index 0000000..c9e186e --- /dev/null +++ b/SOURCES/0074-Change-update-to-enum-in-update_super-and-update_sub.patch @@ -0,0 +1,424 @@ +From 03312b5240438ffc3b63114bdc87e911222f01e5 Mon Sep 17 00:00:00 2001 +From: Mateusz Kusiak +Date: Mon, 2 Jan 2023 09:35:22 +0100 +Subject: [PATCH 74/83] Change update to enum in update_super and + update_subarray + +Use already existing enum, change update_super and update_subarray +update to enum globally. +Refactor function references also. +Remove code specific options from update_options. + +Signed-off-by: Mateusz Kusiak +Signed-off-by: Jes Sorensen +--- + Assemble.c | 14 +++++++++----- + Examine.c | 2 +- + Grow.c | 9 +++++---- + Manage.c | 14 ++++++++------ + maps.c | 21 --------------------- + mdadm.h | 12 +++++++++--- + super-intel.c | 16 ++++++++-------- + super0.c | 9 ++++----- + super1.c | 17 ++++++++--------- + 9 files changed, 52 insertions(+), 62 deletions(-) + +diff --git a/Assemble.c b/Assemble.c +index 8b0af0c9..dba910cd 100644 +--- a/Assemble.c ++++ b/Assemble.c +@@ -695,12 +695,16 @@ static int load_devices(struct devs *devices, char *devmap, + } else if (strcmp(c->update, "revert-reshape") == 0 && + c->invalid_backup) + err = tst->ss->update_super(tst, content, +- "revert-reshape-nobackup", ++ UOPT_SPEC_REVERT_RESHAPE_NOBACKUP, + devname, c->verbose, + ident->uuid_set, + c->homehost); + else +- err = tst->ss->update_super(tst, content, c->update, ++ /* ++ * Mapping is temporary, will be removed in this patchset ++ */ ++ err = tst->ss->update_super(tst, content, ++ map_name(update_options, c->update), + devname, c->verbose, + ident->uuid_set, + c->homehost); +@@ -960,7 +964,7 @@ static int force_array(struct mdinfo *content, + continue; + } + content->events = devices[most_recent].i.events; +- tst->ss->update_super(tst, content, "force-one", ++ tst->ss->update_super(tst, content, UOPT_SPEC_FORCE_ONE, + devices[chosen_drive].devname, c->verbose, + 0, NULL); + +@@ -1788,7 +1792,7 @@ try_again: + if (!(devices[j].i.array.state & 1)) + clean = 0; + +- if (st->ss->update_super(st, &devices[j].i, "assemble", NULL, ++ if (st->ss->update_super(st, &devices[j].i, UOPT_SPEC_ASSEMBLE, NULL, + c->verbose, 0, NULL)) { + if (c->force) { + if (c->verbose >= 0) +@@ -1811,7 +1815,7 @@ try_again: + if (c->force && !clean && !is_container(content->array.level) && + !enough(content->array.level, content->array.raid_disks, + content->array.layout, clean, avail)) { +- change += st->ss->update_super(st, content, "force-array", ++ change += st->ss->update_super(st, content, UOPT_SPEC_FORCE_ARRAY, + devices[chosen_drive].devname, c->verbose, + 0, NULL); + was_forced = 1; +diff --git a/Examine.c b/Examine.c +index 9574a3cc..c9605a60 100644 +--- a/Examine.c ++++ b/Examine.c +@@ -117,7 +117,7 @@ int Examine(struct mddev_dev *devlist, + } + + if (c->SparcAdjust) +- st->ss->update_super(st, NULL, "sparc2.2", ++ st->ss->update_super(st, NULL, UOPT_SPARC22, + devlist->devname, 0, 0, NULL); + /* Ok, its good enough to try, though the checksum could be wrong */ + +diff --git a/Grow.c b/Grow.c +index b73ec2ae..82d5d2ea 100644 +--- a/Grow.c ++++ b/Grow.c +@@ -196,7 +196,7 @@ int Grow_Add_device(char *devname, int fd, char *newdev) + info.disk.minor = minor(rdev); + info.disk.raid_disk = d; + info.disk.state = (1 << MD_DISK_SYNC) | (1 << MD_DISK_ACTIVE); +- if (st->ss->update_super(st, &info, "linear-grow-new", newdev, ++ if (st->ss->update_super(st, &info, UOPT_SPEC_LINEAR_GROW_NEW, newdev, + 0, 0, NULL) != 0) { + pr_err("Preparing new metadata failed on %s\n", newdev); + close(nfd); +@@ -254,7 +254,7 @@ int Grow_Add_device(char *devname, int fd, char *newdev) + info.array.active_disks = nd+1; + info.array.working_disks = nd+1; + +- if (st->ss->update_super(st, &info, "linear-grow-update", dv, ++ if (st->ss->update_super(st, &info, UOPT_SPEC_LINEAR_GROW_UPDATE, dv, + 0, 0, NULL) != 0) { + pr_err("Updating metadata failed on %s\n", dv); + close(fd2); +@@ -668,7 +668,7 @@ int Grow_consistency_policy(char *devname, int fd, struct context *c, struct sha + goto free_info; + } + +- ret = st->ss->update_super(st, sra, "ppl", ++ ret = st->ss->update_super(st, sra, UOPT_PPL, + devname, + c->verbose, 0, NULL); + if (ret) { +@@ -4950,7 +4950,8 @@ int Grow_restart(struct supertype *st, struct mdinfo *info, int *fdlist, + continue; + st->ss->getinfo_super(st, &dinfo, NULL); + dinfo.reshape_progress = info->reshape_progress; +- st->ss->update_super(st, &dinfo, "_reshape_progress", ++ st->ss->update_super(st, &dinfo, ++ UOPT_SPEC__RESHAPE_PROGRESS, + NULL,0, 0, NULL); + st->ss->store_super(st, fdlist[j]); + st->ss->free_super(st); +diff --git a/Manage.c b/Manage.c +index 5a9ea316..87b8aa0c 100644 +--- a/Manage.c ++++ b/Manage.c +@@ -605,6 +605,7 @@ int attempt_re_add(int fd, int tfd, struct mddev_dev *dv, + struct mdinfo mdi; + int duuid[4]; + int ouuid[4]; ++ enum update_opt update_enum = map_name(update_options, update); + + dev_st->ss->getinfo_super(dev_st, &mdi, NULL); + dev_st->ss->uuid_from_super(dev_st, ouuid); +@@ -666,23 +667,23 @@ int attempt_re_add(int fd, int tfd, struct mddev_dev *dv, + + if (dv->writemostly == FlagSet) + rv = dev_st->ss->update_super( +- dev_st, NULL, "writemostly", ++ dev_st, NULL, UOPT_SPEC_WRITEMOSTLY, + devname, verbose, 0, NULL); + if (dv->writemostly == FlagClear) + rv = dev_st->ss->update_super( +- dev_st, NULL, "readwrite", ++ dev_st, NULL, UOPT_SPEC_READWRITE, + devname, verbose, 0, NULL); + if (dv->failfast == FlagSet) + rv = dev_st->ss->update_super( +- dev_st, NULL, "failfast", ++ dev_st, NULL, UOPT_SPEC_FAILFAST, + devname, verbose, 0, NULL); + if (dv->failfast == FlagClear) + rv = dev_st->ss->update_super( +- dev_st, NULL, "nofailfast", ++ dev_st, NULL, UOPT_SPEC_NOFAILFAST, + devname, verbose, 0, NULL); + if (update) + rv = dev_st->ss->update_super( +- dev_st, NULL, update, ++ dev_st, NULL, update_enum, + devname, verbose, 0, NULL); + if (rv == 0) + rv = dev_st->ss->store_super(dev_st, tfd); +@@ -1731,6 +1732,7 @@ int Update_subarray(char *dev, char *subarray, char *update, struct mddev_ident + struct supertype supertype, *st = &supertype; + int fd, rv = 2; + struct mdinfo *info = NULL; ++ enum update_opt update_enum = map_name(update_options, update); + + memset(st, 0, sizeof(*st)); + +@@ -1762,7 +1764,7 @@ int Update_subarray(char *dev, char *subarray, char *update, struct mddev_ident + goto free_super; + } + +- rv = st->ss->update_subarray(st, subarray, update, ident); ++ rv = st->ss->update_subarray(st, subarray, update_enum, ident); + + if (rv) { + if (verbose >= 0) +diff --git a/maps.c b/maps.c +index c59036f1..b586679a 100644 +--- a/maps.c ++++ b/maps.c +@@ -194,27 +194,6 @@ mapping_t update_options[] = { + { "byteorder", UOPT_BYTEORDER }, + { "help", UOPT_HELP }, + { "?", UOPT_HELP }, +- /* +- * Those enries are temporary and will be removed in this patchset. +- * +- * Before update_super:update can be changed to enum, +- * all update_super sub-functions must be adapted first. +- * Update options will be passed as string (as it is for now), +- * and then mapped, so all options must be handled temporarily. +- * +- * Those options code specific and should not be accessible for user. +- */ +- { "force-one", UOPT_SPEC_FORCE_ONE }, +- { "force-array", UOPT_SPEC_FORCE_ARRAY }, +- { "assemble", UOPT_SPEC_ASSEMBLE }, +- { "linear-grow-new", UOPT_SPEC_LINEAR_GROW_NEW }, +- { "linear-grow-update", UOPT_SPEC_LINEAR_GROW_UPDATE }, +- { "_reshape_progress", UOPT_SPEC__RESHAPE_PROGRESS }, +- { "writemostly", UOPT_SPEC_WRITEMOSTLY }, +- { "readwrite", UOPT_SPEC_READWRITE }, +- { "failfast", UOPT_SPEC_FAILFAST }, +- { "nofailfast", UOPT_SPEC_NOFAILFAST }, +- { "revert-reshape-nobackup", UOPT_SPEC_REVERT_RESHAPE_NOBACKUP }, + { NULL, UOPT_UNDEFINED} + }; + +diff --git a/mdadm.h b/mdadm.h +index 31db25f5..5dc94390 100644 +--- a/mdadm.h ++++ b/mdadm.h +@@ -1011,7 +1011,7 @@ extern struct superswitch { + * it will resume going in the opposite direction. + */ + int (*update_super)(struct supertype *st, struct mdinfo *info, +- char *update, ++ enum update_opt update, + char *devname, int verbose, + int uuid_set, char *homehost); + +@@ -1137,9 +1137,15 @@ extern struct superswitch { + /* Permit subarray's to be deleted from inactive containers */ + int (*kill_subarray)(struct supertype *st, + char *subarray_id); /* optional */ +- /* Permit subarray's to be modified */ ++ /** ++ * update_subarray() - Permit subarray to be modified. ++ * @st: Supertype. ++ * @subarray: Subarray name. ++ * @update: Update option. ++ * @ident: Optional identifiers. ++ */ + int (*update_subarray)(struct supertype *st, char *subarray, +- char *update, struct mddev_ident *ident); /* optional */ ++ enum update_opt update, struct mddev_ident *ident); + /* Check if reshape is supported for this external format. + * st is obtained from super_by_fd() where st->subarray[0] is + * initialized to indicate if reshape is being performed at the +diff --git a/super-intel.c b/super-intel.c +index 85fb7f17..1f5f6eda 100644 +--- a/super-intel.c ++++ b/super-intel.c +@@ -3893,8 +3893,8 @@ struct mdinfo *getinfo_super_disks_imsm(struct supertype *st) + } + + static int update_super_imsm(struct supertype *st, struct mdinfo *info, +- char *update, char *devname, int verbose, +- int uuid_set, char *homehost) ++ enum update_opt update, char *devname, ++ int verbose, int uuid_set, char *homehost) + { + /* For 'assemble' and 'force' we need to return non-zero if any + * change was made. For others, the return value is ignored. +@@ -3930,7 +3930,7 @@ static int update_super_imsm(struct supertype *st, struct mdinfo *info, + + mpb = super->anchor; + +- switch (map_name(update_options, update)) { ++ switch (update) { + case UOPT_UUID: + /* We take this to mean that the family_num should be updated. + * However that is much smaller than the uuid so we cannot really +@@ -6538,7 +6538,7 @@ static int validate_ppl_imsm(struct supertype *st, struct mdinfo *info, + if (mdmon_running(st->container_devnm)) + st->update_tail = &st->updates; + +- if (st->ss->update_subarray(st, subarray, "ppl", NULL)) { ++ if (st->ss->update_subarray(st, subarray, UOPT_PPL, NULL)) { + pr_err("Failed to update subarray %s\n", + subarray); + } else { +@@ -7916,13 +7916,13 @@ static int get_rwh_policy_from_update(enum update_opt update) + } + + static int update_subarray_imsm(struct supertype *st, char *subarray, +- char *update, struct mddev_ident *ident) ++ enum update_opt update, struct mddev_ident *ident) + { + /* update the subarray currently referenced by ->current_vol */ + struct intel_super *super = st->sb; + struct imsm_super *mpb = super->anchor; + +- if (map_name(update_options, update) == UOPT_NAME) { ++ if (update == UOPT_NAME) { + char *name = ident->name; + char *ep; + int vol; +@@ -7956,7 +7956,7 @@ static int update_subarray_imsm(struct supertype *st, char *subarray, + } + super->updates_pending++; + } +- } else if (get_rwh_policy_from_update(map_name(update_options, update)) != UOPT_UNDEFINED) { ++ } else if (get_rwh_policy_from_update(update) != UOPT_UNDEFINED) { + int new_policy; + char *ep; + int vol = strtoul(subarray, &ep, 10); +@@ -7964,7 +7964,7 @@ static int update_subarray_imsm(struct supertype *st, char *subarray, + if (*ep != '\0' || vol >= super->anchor->num_raid_devs) + return 2; + +- new_policy = get_rwh_policy_from_update(map_name(update_options, update)); ++ new_policy = get_rwh_policy_from_update(update); + + if (st->update_tail) { + struct imsm_update_rwh_policy *u = xmalloc(sizeof(*u)); +diff --git a/super0.c b/super0.c +index d9f5bff4..a7c5f813 100644 +--- a/super0.c ++++ b/super0.c +@@ -491,7 +491,7 @@ static struct mdinfo *container_content0(struct supertype *st, char *subarray) + } + + static int update_super0(struct supertype *st, struct mdinfo *info, +- char *update, ++ enum update_opt update, + char *devname, int verbose, + int uuid_set, char *homehost) + { +@@ -502,20 +502,19 @@ static int update_super0(struct supertype *st, struct mdinfo *info, + int rv = 0; + int uuid[4]; + mdp_super_t *sb = st->sb; +- enum update_opt update_enum = map_name(update_options, update); + +- if (update_enum == UOPT_HOMEHOST && homehost) { ++ if (update == UOPT_HOMEHOST && homehost) { + /* + * note that 'homehost' is special as it is really + * a "uuid" update. + */ + uuid_set = 0; +- update_enum = UOPT_UUID; ++ update = UOPT_UUID; + info->uuid[0] = sb->set_uuid0; + info->uuid[1] = sb->set_uuid1; + } + +- switch (update_enum) { ++ switch (update) { + case UOPT_UUID: + if (!uuid_set && homehost) { + char buf[20]; +diff --git a/super1.c b/super1.c +index b0a97016..f7020320 100644 +--- a/super1.c ++++ b/super1.c +@@ -1208,7 +1208,7 @@ static struct mdinfo *container_content1(struct supertype *st, char *subarray) + } + + static int update_super1(struct supertype *st, struct mdinfo *info, +- char *update, char *devname, int verbose, ++ enum update_opt update, char *devname, int verbose, + int uuid_set, char *homehost) + { + /* NOTE: for 'assemble' and 'force' we need to return non-zero +@@ -1218,15 +1218,14 @@ static int update_super1(struct supertype *st, struct mdinfo *info, + int rv = 0; + struct mdp_superblock_1 *sb = st->sb; + bitmap_super_t *bms = (bitmap_super_t*)(((char*)sb) + MAX_SB_SIZE); +- enum update_opt update_enum = map_name(update_options, update); + +- if (update_enum == UOPT_HOMEHOST && homehost) { ++ if (update == UOPT_HOMEHOST && homehost) { + /* + * Note that 'homehost' is special as it is really + * a "name" update. + */ + char *c; +- update_enum = UOPT_NAME; ++ update = UOPT_NAME; + c = strchr(sb->set_name, ':'); + if (c) + snprintf(info->name, sizeof(info->name), "%s", c+1); +@@ -1234,7 +1233,7 @@ static int update_super1(struct supertype *st, struct mdinfo *info, + snprintf(info->name, sizeof(info->name), "%s", sb->set_name); + } + +- switch (update_enum) { ++ switch (update) { + case UOPT_NAME: { + int namelen; + +@@ -1534,7 +1533,7 @@ static int update_super1(struct supertype *st, struct mdinfo *info, + * If that couldn't happen, the "-nobackup" version + * will be used. + */ +- if (update_enum == UOPT_SPEC_REVERT_RESHAPE_NOBACKUP && ++ if (update == UOPT_SPEC_REVERT_RESHAPE_NOBACKUP && + sb->reshape_position == 0 && + (__le32_to_cpu(sb->delta_disks) > 0 || + (__le32_to_cpu(sb->delta_disks) == 0 && +@@ -1618,14 +1617,14 @@ static int update_super1(struct supertype *st, struct mdinfo *info, + case UOPT_LAYOUT_UNSPECIFIED: + if (__le32_to_cpu(sb->level) != 0) { + pr_err("%s: %s only supported for RAID0\n", +- devname ?: "", map_num(update_options, update_enum)); ++ devname ?: "", map_num(update_options, update)); + rv = -1; +- } else if (update_enum == UOPT_LAYOUT_UNSPECIFIED) { ++ } else if (update == UOPT_LAYOUT_UNSPECIFIED) { + sb->feature_map &= ~__cpu_to_le32(MD_FEATURE_RAID0_LAYOUT); + sb->layout = 0; + } else { + sb->feature_map |= __cpu_to_le32(MD_FEATURE_RAID0_LAYOUT); +- sb->layout = __cpu_to_le32(update_enum == UOPT_LAYOUT_ORIGINAL ? 1 : 2); ++ sb->layout = __cpu_to_le32(update == UOPT_LAYOUT_ORIGINAL ? 1 : 2); + } + break; + default: +-- +2.38.1 + diff --git a/SOURCES/0075-Manage-Incremental-code-refactor-string-to-enum.patch b/SOURCES/0075-Manage-Incremental-code-refactor-string-to-enum.patch new file mode 100644 index 0000000..d4b20ff --- /dev/null +++ b/SOURCES/0075-Manage-Incremental-code-refactor-string-to-enum.patch @@ -0,0 +1,279 @@ +From f2e8393bd7223c419aaa33c45feeb5c75440b986 Mon Sep 17 00:00:00 2001 +From: Mateusz Kusiak +Date: Mon, 2 Jan 2023 09:35:23 +0100 +Subject: [PATCH 75/83] Manage&Incremental: code refactor, string to enum + +Prepare Manage and Incremental for later changing context->update to enum. +Change update from string to enum in multiple functions and pass enum +where already possible. + +Signed-off-by: Mateusz Kusiak +Signed-off-by: Jes Sorensen +--- + Grow.c | 8 ++++---- + Incremental.c | 8 ++++---- + Manage.c | 35 +++++++++++++++++------------------ + mdadm.c | 23 ++++++++++++++++++----- + mdadm.h | 4 ++-- + 5 files changed, 45 insertions(+), 33 deletions(-) + +diff --git a/Grow.c b/Grow.c +index 82d5d2ea..8f5cf07d 100644 +--- a/Grow.c ++++ b/Grow.c +@@ -605,12 +605,12 @@ int Grow_consistency_policy(char *devname, int fd, struct context *c, struct sha + } + + if (subarray) { +- char *update; ++ enum update_opt update; + + if (s->consistency_policy == CONSISTENCY_POLICY_PPL) +- update = "ppl"; ++ update = UOPT_PPL; + else +- update = "no-ppl"; ++ update = UOPT_NO_PPL; + + sprintf(container_dev, "/dev/%s", st->container_devnm); + +@@ -3243,7 +3243,7 @@ static int reshape_array(char *container, int fd, char *devname, + * level and frozen, we can safely add them. + */ + if (devlist) { +- if (Manage_subdevs(devname, fd, devlist, verbose, 0, NULL, 0)) ++ if (Manage_subdevs(devname, fd, devlist, verbose, 0, UOPT_UNDEFINED, 0)) + goto release; + } + +diff --git a/Incremental.c b/Incremental.c +index 5a5f4c4c..ff3548c0 100644 +--- a/Incremental.c ++++ b/Incremental.c +@@ -1025,7 +1025,7 @@ static int array_try_spare(char *devname, int *dfdp, struct dev_policy *pol, + close(dfd); + *dfdp = -1; + rv = Manage_subdevs(chosen->sys_name, mdfd, &devlist, +- -1, 0, NULL, 0); ++ -1, 0, UOPT_UNDEFINED, 0); + close(mdfd); + } + if (verbose > 0) { +@@ -1666,7 +1666,7 @@ static void remove_from_member_array(struct mdstat_ent *memb, + + if (subfd >= 0) { + rv = Manage_subdevs(memb->devnm, subfd, devlist, verbose, +- 0, NULL, 0); ++ 0, UOPT_UNDEFINED, 0); + if (rv & 2) { + if (sysfs_init(&mmdi, -1, memb->devnm)) + pr_err("unable to initialize sysfs for: %s\n", +@@ -1758,7 +1758,7 @@ int IncrementalRemove(char *devname, char *id_path, int verbose) + free_mdstat(mdstat); + } else { + rv |= Manage_subdevs(ent->devnm, mdfd, &devlist, +- verbose, 0, NULL, 0); ++ verbose, 0, UOPT_UNDEFINED, 0); + if (rv & 2) { + /* Failed due to EBUSY, try to stop the array. + * Give udisks a chance to unmount it first. +@@ -1770,7 +1770,7 @@ int IncrementalRemove(char *devname, char *id_path, int verbose) + + devlist.disposition = 'r'; + rv = Manage_subdevs(ent->devnm, mdfd, &devlist, +- verbose, 0, NULL, 0); ++ verbose, 0, UOPT_UNDEFINED, 0); + end: + close(mdfd); + free_mdstat(ent); +diff --git a/Manage.c b/Manage.c +index 87b8aa0c..594e3d2c 100644 +--- a/Manage.c ++++ b/Manage.c +@@ -598,14 +598,12 @@ static void add_set(struct mddev_dev *dv, int fd, char set_char) + + int attempt_re_add(int fd, int tfd, struct mddev_dev *dv, + struct supertype *dev_st, struct supertype *tst, +- unsigned long rdev, +- char *update, char *devname, int verbose, +- mdu_array_info_t *array) ++ unsigned long rdev, enum update_opt update, ++ char *devname, int verbose, mdu_array_info_t *array) + { + struct mdinfo mdi; + int duuid[4]; + int ouuid[4]; +- enum update_opt update_enum = map_name(update_options, update); + + dev_st->ss->getinfo_super(dev_st, &mdi, NULL); + dev_st->ss->uuid_from_super(dev_st, ouuid); +@@ -683,7 +681,7 @@ int attempt_re_add(int fd, int tfd, struct mddev_dev *dv, + devname, verbose, 0, NULL); + if (update) + rv = dev_st->ss->update_super( +- dev_st, NULL, update_enum, ++ dev_st, NULL, update, + devname, verbose, 0, NULL); + if (rv == 0) + rv = dev_st->ss->store_super(dev_st, tfd); +@@ -715,8 +713,8 @@ skip_re_add: + int Manage_add(int fd, int tfd, struct mddev_dev *dv, + struct supertype *tst, mdu_array_info_t *array, + int force, int verbose, char *devname, +- char *update, unsigned long rdev, unsigned long long array_size, +- int raid_slot) ++ enum update_opt update, unsigned long rdev, ++ unsigned long long array_size, int raid_slot) + { + unsigned long long ldsize; + struct supertype *dev_st; +@@ -1332,7 +1330,7 @@ bool is_remove_safe(mdu_array_info_t *array, const int fd, char *devname, const + + int Manage_subdevs(char *devname, int fd, + struct mddev_dev *devlist, int verbose, int test, +- char *update, int force) ++ enum update_opt update, int force) + { + /* Do something to each dev. + * devmode can be +@@ -1727,12 +1725,13 @@ int autodetect(void) + return rv; + } + +-int Update_subarray(char *dev, char *subarray, char *update, struct mddev_ident *ident, int verbose) ++int Update_subarray(char *dev, char *subarray, enum update_opt update, ++ struct mddev_ident *ident, int verbose) + { + struct supertype supertype, *st = &supertype; + int fd, rv = 2; + struct mdinfo *info = NULL; +- enum update_opt update_enum = map_name(update_options, update); ++ char *update_verb = map_num(update_options, update); + + memset(st, 0, sizeof(*st)); + +@@ -1750,7 +1749,7 @@ int Update_subarray(char *dev, char *subarray, char *update, struct mddev_ident + if (is_subarray_active(subarray, st->devnm)) { + if (verbose >= 0) + pr_err("Subarray %s in %s is active, cannot update %s\n", +- subarray, dev, update); ++ subarray, dev, update_verb); + goto free_super; + } + +@@ -1759,23 +1758,23 @@ int Update_subarray(char *dev, char *subarray, char *update, struct mddev_ident + + info = st->ss->container_content(st, subarray); + +- if (strncmp(update, "ppl", 3) == 0 && !is_level456(info->array.level)) { ++ if (update == UOPT_PPL && !is_level456(info->array.level)) { + pr_err("RWH policy ppl is supported only for raid4, raid5 and raid6.\n"); + goto free_super; + } + +- rv = st->ss->update_subarray(st, subarray, update_enum, ident); ++ rv = st->ss->update_subarray(st, subarray, update, ident); + + if (rv) { + if (verbose >= 0) + pr_err("Failed to update %s of subarray-%s in %s\n", +- update, subarray, dev); ++ update_verb, subarray, dev); + } else if (st->update_tail) + flush_metadata_updates(st); + else + st->ss->sync_metadata(st); + +- if (rv == 0 && strcmp(update, "name") == 0 && verbose >= 0) ++ if (rv == 0 && update == UOPT_NAME && verbose >= 0) + pr_err("Updated subarray-%s name from %s, UUIDs may have changed\n", + subarray, dev); + +@@ -1816,10 +1815,10 @@ int move_spare(char *from_devname, char *to_devname, dev_t devid) + sprintf(devname, "%d:%d", major(devid), minor(devid)); + + devlist.disposition = 'r'; +- if (Manage_subdevs(from_devname, fd2, &devlist, -1, 0, NULL, 0) == 0) { ++ if (Manage_subdevs(from_devname, fd2, &devlist, -1, 0, UOPT_UNDEFINED, 0) == 0) { + devlist.disposition = 'a'; + if (Manage_subdevs(to_devname, fd1, &devlist, -1, 0, +- NULL, 0) == 0) { ++ UOPT_UNDEFINED, 0) == 0) { + /* make sure manager is aware of changes */ + ping_manager(to_devname); + ping_manager(from_devname); +@@ -1829,7 +1828,7 @@ int move_spare(char *from_devname, char *to_devname, dev_t devid) + } + else + Manage_subdevs(from_devname, fd2, &devlist, +- -1, 0, NULL, 0); ++ -1, 0, UOPT_UNDEFINED, 0); + } + close(fd1); + close(fd2); +diff --git a/mdadm.c b/mdadm.c +index f5f505fe..d06e2820 100644 +--- a/mdadm.c ++++ b/mdadm.c +@@ -1402,10 +1402,22 @@ int main(int argc, char *argv[]) + /* readonly, add/remove, readwrite, runstop */ + if (c.readonly > 0) + rv = Manage_ro(devlist->devname, mdfd, c.readonly); +- if (!rv && devs_found>1) +- rv = Manage_subdevs(devlist->devname, mdfd, +- devlist->next, c.verbose, c.test, +- c.update, c.force); ++ if (!rv && devs_found > 1) { ++ /* ++ * This is temporary and will be removed in next patches ++ * Null c.update will cause segfault ++ */ ++ if (c.update) ++ rv = Manage_subdevs(devlist->devname, mdfd, ++ devlist->next, c.verbose, c.test, ++ map_name(update_options, c.update), ++ c.force); ++ else ++ rv = Manage_subdevs(devlist->devname, mdfd, ++ devlist->next, c.verbose, c.test, ++ UOPT_UNDEFINED, ++ c.force); ++ } + if (!rv && c.readonly < 0) + rv = Manage_ro(devlist->devname, mdfd, c.readonly); + if (!rv && c.runstop > 0) +@@ -1931,7 +1943,8 @@ static int misc_list(struct mddev_dev *devlist, + continue; + } + rv |= Update_subarray(dv->devname, c->subarray, +- c->update, ident, c->verbose); ++ map_name(update_options, c->update), ++ ident, c->verbose); + continue; + case Dump: + rv |= Dump_metadata(dv->devname, dump_directory, c, ss); +diff --git a/mdadm.h b/mdadm.h +index 5dc94390..924f4b63 100644 +--- a/mdadm.h ++++ b/mdadm.h +@@ -1478,7 +1478,7 @@ extern int Manage_stop(char *devname, int fd, int quiet, + int will_retry); + extern int Manage_subdevs(char *devname, int fd, + struct mddev_dev *devlist, int verbose, int test, +- char *update, int force); ++ enum update_opt update, int force); + extern int autodetect(void); + extern int Grow_Add_device(char *devname, int fd, char *newdev); + extern int Grow_addbitmap(char *devname, int fd, +@@ -1532,7 +1532,7 @@ extern int Monitor(struct mddev_dev *devlist, + + extern int Kill(char *dev, struct supertype *st, int force, int verbose, int noexcl); + extern int Kill_subarray(char *dev, char *subarray, int verbose); +-extern int Update_subarray(char *dev, char *subarray, char *update, struct mddev_ident *ident, int quiet); ++extern int Update_subarray(char *dev, char *subarray, enum update_opt update, struct mddev_ident *ident, int quiet); + extern int Wait(char *dev); + extern int WaitClean(char *dev, int verbose); + extern int SetAction(char *dev, char *action); +-- +2.38.1 + diff --git a/SOURCES/0076-Change-char-to-enum-in-context-update-refactor-code.patch b/SOURCES/0076-Change-char-to-enum-in-context-update-refactor-code.patch new file mode 100644 index 0000000..a18f8d1 --- /dev/null +++ b/SOURCES/0076-Change-char-to-enum-in-context-update-refactor-code.patch @@ -0,0 +1,289 @@ +From 3a87fa67112dc2c2c3664aeecd0b49cb4b6ceaa9 Mon Sep 17 00:00:00 2001 +From: Mateusz Kusiak +Date: Mon, 2 Jan 2023 09:35:24 +0100 +Subject: [PATCH 76/83] Change char* to enum in context->update & refactor code + +Storing update option in string is bad for frequent comparisons and +error prone. +Replace char array with enum so already existing enum is passed around +instead of string. +Adapt code to changes. + +Signed-off-by: Mateusz Kusiak +Signed-off-by: Jes Sorensen +--- + Assemble.c | 40 +++++++++++++++++----------------------- + mdadm.c | 52 +++++++++++++++++++--------------------------------- + mdadm.h | 2 +- + 3 files changed, 37 insertions(+), 57 deletions(-) + +diff --git a/Assemble.c b/Assemble.c +index dba910cd..49804941 100644 +--- a/Assemble.c ++++ b/Assemble.c +@@ -135,17 +135,17 @@ static int ident_matches(struct mddev_ident *ident, + struct mdinfo *content, + struct supertype *tst, + char *homehost, int require_homehost, +- char *update, char *devname) ++ enum update_opt update, char *devname) + { + +- if (ident->uuid_set && (!update || strcmp(update, "uuid")!= 0) && ++ if (ident->uuid_set && update != UOPT_UUID && + same_uuid(content->uuid, ident->uuid, tst->ss->swapuuid)==0 && + memcmp(content->uuid, uuid_zero, sizeof(int[4])) != 0) { + if (devname) + pr_err("%s has wrong uuid.\n", devname); + return 0; + } +- if (ident->name[0] && (!update || strcmp(update, "name")!= 0) && ++ if (ident->name[0] && update != UOPT_NAME && + name_matches(content->name, ident->name, homehost, require_homehost)==0) { + if (devname) + pr_err("%s has wrong name.\n", devname); +@@ -648,11 +648,10 @@ static int load_devices(struct devs *devices, char *devmap, + int err; + fstat(mdfd, &stb2); + +- if (strcmp(c->update, "uuid") == 0 && !ident->uuid_set) ++ if (c->update == UOPT_UUID && !ident->uuid_set) + random_uuid((__u8 *)ident->uuid); + +- if (strcmp(c->update, "ppl") == 0 && +- ident->bitmap_fd >= 0) { ++ if (c->update == UOPT_PPL && ident->bitmap_fd >= 0) { + pr_err("PPL is not compatible with bitmap\n"); + close(mdfd); + free(devices); +@@ -684,34 +683,30 @@ static int load_devices(struct devs *devices, char *devmap, + strcpy(content->name, ident->name); + content->array.md_minor = minor(stb2.st_rdev); + +- if (strcmp(c->update, "byteorder") == 0) ++ if (c->update == UOPT_BYTEORDER) + err = 0; +- else if (strcmp(c->update, "home-cluster") == 0) { ++ else if (c->update == UOPT_HOME_CLUSTER) { + tst->cluster_name = c->homecluster; + err = tst->ss->write_bitmap(tst, dfd, NameUpdate); +- } else if (strcmp(c->update, "nodes") == 0) { ++ } else if (c->update == UOPT_NODES) { + tst->nodes = c->nodes; + err = tst->ss->write_bitmap(tst, dfd, NodeNumUpdate); +- } else if (strcmp(c->update, "revert-reshape") == 0 && +- c->invalid_backup) ++ } else if (c->update == UOPT_REVERT_RESHAPE && c->invalid_backup) + err = tst->ss->update_super(tst, content, + UOPT_SPEC_REVERT_RESHAPE_NOBACKUP, + devname, c->verbose, + ident->uuid_set, + c->homehost); + else +- /* +- * Mapping is temporary, will be removed in this patchset +- */ + err = tst->ss->update_super(tst, content, +- map_name(update_options, c->update), ++ c->update, + devname, c->verbose, + ident->uuid_set, + c->homehost); + if (err < 0) { + if (err == -1) + pr_err("--update=%s not understood for %s metadata\n", +- c->update, tst->ss->name); ++ map_num(update_options, c->update), tst->ss->name); + tst->ss->free_super(tst); + free(tst); + close(mdfd); +@@ -721,7 +716,7 @@ static int load_devices(struct devs *devices, char *devmap, + *stp = st; + return -1; + } +- if (strcmp(c->update, "uuid")==0 && ++ if (c->update == UOPT_UUID && + !ident->uuid_set) { + ident->uuid_set = 1; + memcpy(ident->uuid, content->uuid, 16); +@@ -730,7 +725,7 @@ static int load_devices(struct devs *devices, char *devmap, + pr_err("Could not re-write superblock on %s.\n", + devname); + +- if (strcmp(c->update, "uuid")==0 && ++ if (c->update == UOPT_UUID && + ident->bitmap_fd >= 0 && !bitmap_done) { + if (bitmap_update_uuid(ident->bitmap_fd, + content->uuid, +@@ -1188,8 +1183,7 @@ static int start_array(int mdfd, + pr_err("%s: Need a backup file to complete reshape of this array.\n", + mddev); + pr_err("Please provided one with \"--backup-file=...\"\n"); +- if (c->update && +- strcmp(c->update, "revert-reshape") == 0) ++ if (c->update == UOPT_REVERT_RESHAPE) + pr_err("(Don't specify --update=revert-reshape again, that part succeeded.)\n"); + return 1; + } +@@ -1487,7 +1481,7 @@ try_again: + */ + if (map_lock(&map)) + pr_err("failed to get exclusive lock on mapfile - continue anyway...\n"); +- if (c->update && strcmp(c->update,"uuid") == 0) ++ if (c->update == UOPT_UUID) + mp = NULL; + else + mp = map_by_uuid(&map, content->uuid); +@@ -1634,7 +1628,7 @@ try_again: + goto out; + } + +- if (c->update && strcmp(c->update, "byteorder")==0) ++ if (c->update == UOPT_BYTEORDER) + st->minor_version = 90; + + st->ss->getinfo_super(st, content, NULL); +@@ -1902,7 +1896,7 @@ try_again: + /* First, fill in the map, so that udev can find our name + * as soon as we become active. + */ +- if (c->update && strcmp(c->update, "metadata")==0) { ++ if (c->update == UOPT_METADATA) { + content->array.major_version = 1; + content->array.minor_version = 0; + strcpy(content->text_version, "1.0"); +diff --git a/mdadm.c b/mdadm.c +index d06e2820..57e8e6fa 100644 +--- a/mdadm.c ++++ b/mdadm.c +@@ -724,13 +724,12 @@ int main(int argc, char *argv[]) + + case O(ASSEMBLE,'U'): /* update the superblock */ + case O(MISC,'U'): { +- enum update_opt updateopt = map_name(update_options, c.update); + enum update_opt print_mode = UOPT_HELP; + const char *error_addon = "update option"; + + if (c.update) { + pr_err("Can only update one aspect of superblock, both %s and %s given.\n", +- c.update, optarg); ++ map_num(update_options, c.update), optarg); + exit(2); + } + if (mode == MISC && !c.subarray) { +@@ -738,20 +737,20 @@ int main(int argc, char *argv[]) + exit(2); + } + +- c.update = optarg; ++ c.update = map_name(update_options, optarg); + + if (devmode == UpdateSubarray) { + print_mode = UOPT_SUBARRAY_ONLY; + error_addon = "update-subarray option"; + +- if (updateopt > UOPT_SUBARRAY_ONLY && updateopt < UOPT_HELP) +- updateopt = UOPT_UNDEFINED; ++ if (c.update > UOPT_SUBARRAY_ONLY && c.update < UOPT_HELP) ++ c.update = UOPT_UNDEFINED; + } + +- switch (updateopt) { ++ switch (c.update) { + case UOPT_UNDEFINED: + pr_err("'--update=%s' is invalid %s. ", +- c.update, error_addon); ++ optarg, error_addon); + outf = stderr; + case UOPT_HELP: + if (!outf) +@@ -776,14 +775,14 @@ int main(int argc, char *argv[]) + } + if (c.update) { + pr_err("Can only update one aspect of superblock, both %s and %s given.\n", +- c.update, optarg); ++ map_num(update_options, c.update), optarg); + exit(2); + } +- c.update = optarg; +- if (strcmp(c.update, "devicesize") != 0 && +- strcmp(c.update, "bbl") != 0 && +- strcmp(c.update, "force-no-bbl") != 0 && +- strcmp(c.update, "no-bbl") != 0) { ++ c.update = map_name(update_options, optarg); ++ if (c.update != UOPT_DEVICESIZE && ++ c.update != UOPT_BBL && ++ c.update != UOPT_NO_BBL && ++ c.update != UOPT_FORCE_NO_BBL) { + pr_err("only 'devicesize', 'bbl', 'no-bbl', and 'force-no-bbl' can be updated with --re-add\n"); + exit(2); + } +@@ -1357,7 +1356,7 @@ int main(int argc, char *argv[]) + } + } + +- if (c.update && strcmp(c.update, "nodes") == 0 && c.nodes == 0) { ++ if (c.update && c.update == UOPT_NODES && c.nodes == 0) { + pr_err("Please specify nodes number with --nodes\n"); + exit(1); + } +@@ -1402,22 +1401,10 @@ int main(int argc, char *argv[]) + /* readonly, add/remove, readwrite, runstop */ + if (c.readonly > 0) + rv = Manage_ro(devlist->devname, mdfd, c.readonly); +- if (!rv && devs_found > 1) { +- /* +- * This is temporary and will be removed in next patches +- * Null c.update will cause segfault +- */ +- if (c.update) +- rv = Manage_subdevs(devlist->devname, mdfd, +- devlist->next, c.verbose, c.test, +- map_name(update_options, c.update), +- c.force); +- else +- rv = Manage_subdevs(devlist->devname, mdfd, +- devlist->next, c.verbose, c.test, +- UOPT_UNDEFINED, +- c.force); +- } ++ if (!rv && devs_found > 1) ++ rv = Manage_subdevs(devlist->devname, mdfd, ++ devlist->next, c.verbose, ++ c.test, c.update, c.force); + if (!rv && c.readonly < 0) + rv = Manage_ro(devlist->devname, mdfd, c.readonly); + if (!rv && c.runstop > 0) +@@ -1937,14 +1924,13 @@ static int misc_list(struct mddev_dev *devlist, + rv |= Kill_subarray(dv->devname, c->subarray, c->verbose); + continue; + case UpdateSubarray: +- if (c->update == NULL) { ++ if (!c->update) { + pr_err("-U/--update must be specified with --update-subarray\n"); + rv |= 1; + continue; + } + rv |= Update_subarray(dv->devname, c->subarray, +- map_name(update_options, c->update), +- ident, c->verbose); ++ c->update, ident, c->verbose); + continue; + case Dump: + rv |= Dump_metadata(dv->devname, dump_directory, c, ss); +diff --git a/mdadm.h b/mdadm.h +index 924f4b63..13f8b4cb 100644 +--- a/mdadm.h ++++ b/mdadm.h +@@ -616,7 +616,7 @@ struct context { + int export; + int test; + char *subarray; +- char *update; ++ enum update_opt update; + int scan; + int SparcAdjust; + int autof; +-- +2.38.1 + diff --git a/SOURCES/0077-mdmon-fix-segfault.patch b/SOURCES/0077-mdmon-fix-segfault.patch new file mode 100644 index 0000000..980ceda --- /dev/null +++ b/SOURCES/0077-mdmon-fix-segfault.patch @@ -0,0 +1,86 @@ +From 9b429fc0a4ffd7028b3b336589d38e32fb9045dc Mon Sep 17 00:00:00 2001 +From: Mateusz Kusiak +Date: Mon, 2 Jan 2023 09:46:21 +0100 +Subject: [PATCH 77/83] 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 +Signed-off-by: Jes Sorensen +--- + Makefile | 2 +- + mdmon.c | 26 ++++++++++++-------------- + 2 files changed, 13 insertions(+), 15 deletions(-) + +diff --git a/Makefile b/Makefile +index ec1f99ed..5eac1a4e 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 e9d035eb..ecf52dc8 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.38.1 + diff --git a/SOURCES/0078-util-remove-obsolete-code-from-get_md_name.patch b/SOURCES/0078-util-remove-obsolete-code-from-get_md_name.patch new file mode 100644 index 0000000..b371d39 --- /dev/null +++ b/SOURCES/0078-util-remove-obsolete-code-from-get_md_name.patch @@ -0,0 +1,116 @@ +From b938519e7719c992dae2d61c796c45fe49e6b71b Mon Sep 17 00:00:00 2001 +From: Mateusz Kusiak +Date: Mon, 2 Jan 2023 09:46:22 +0100 +Subject: [PATCH 78/83] 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 +Signed-off-by: Jes Sorensen +--- + mdmon.c | 8 +++----- + util.c | 51 +++++++++++++++++---------------------------------- + 2 files changed, 20 insertions(+), 39 deletions(-) + +diff --git a/mdmon.c b/mdmon.c +index ecf52dc8..60ba3182 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 26ffdcea..9cd89fa4 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.38.1 + diff --git a/SOURCES/0079-mdadm-udev-Don-t-handle-change-event-on-raw-devices.patch b/SOURCES/0079-mdadm-udev-Don-t-handle-change-event-on-raw-devices.patch new file mode 100644 index 0000000..f888a09 --- /dev/null +++ b/SOURCES/0079-mdadm-udev-Don-t-handle-change-event-on-raw-devices.patch @@ -0,0 +1,54 @@ +From 24d329fc97a64ec185ef27e59730f3f058c09029 Mon Sep 17 00:00:00 2001 +From: Xiao Ni +Date: Thu, 5 Jan 2023 00:29:20 +0800 +Subject: [PATCH 79/83] mdadm/udev: Don't handle change event on raw devices + +The raw devices are ready when add event happpens and the raid +can be assembled. So there is no need to handle change events. +And it can cause some inconvenient problems. + +For example, the OS is installed on md0(/root) and md1(/home). +md0 and md1 are created on partitions. When it wants to re-install +OS, anaconda can't clear the storage configure. It deletes one +partition and does some jobs. The change event happens. Now +the raid device is assembled again. It can't delete the other +partitions. + +So in this patch, we don't handle change event on raw devices +anymore. + +Signed-off-by: Xiao Ni +Signed-off-by: Jes Sorensen +--- + udev-md-raid-assembly.rules | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/udev-md-raid-assembly.rules b/udev-md-raid-assembly.rules +index 39b4344b..d4a7f0a5 100644 +--- a/udev-md-raid-assembly.rules ++++ b/udev-md-raid-assembly.rules +@@ -11,6 +11,11 @@ SUBSYSTEM!="block", GOTO="md_inc_end" + ENV{SYSTEMD_READY}=="0", GOTO="md_inc_end" + + # handle potential components of arrays (the ones supported by md) ++# For member devices which are md/dm devices, we don't need to ++# handle add event. Because md/dm devices need to do some init jobs. ++# Then the change event happens. ++# When adding md/dm devices, ID_FS_TYPE can only be linux_raid_member ++# after change event happens. + ENV{ID_FS_TYPE}=="linux_raid_member", GOTO="md_inc" + + # "noiswmd" on kernel command line stops mdadm from handling +@@ -28,6 +33,9 @@ GOTO="md_inc_end" + + LABEL="md_inc" + ++# Bare disks are ready when add event happens, the raid can be assembled. ++ACTION=="change", KERNEL!="dm-*|md*", GOTO="md_inc_end" ++ + # remember you can limit what gets auto/incrementally assembled by + # mdadm.conf(5)'s 'AUTO' and selectively whitelist using 'ARRAY' + ACTION!="remove", IMPORT{program}="BINDIR/mdadm --incremental --export $devnode --offroot $env{DEVLINKS}" +-- +2.38.1 + diff --git a/SOURCES/0080-Manage-do-not-check-array-state-when-drive-is-remove.patch b/SOURCES/0080-Manage-do-not-check-array-state-when-drive-is-remove.patch new file mode 100644 index 0000000..e2c1179 --- /dev/null +++ b/SOURCES/0080-Manage-do-not-check-array-state-when-drive-is-remove.patch @@ -0,0 +1,33 @@ +From b3e7b7eb1dfedd7cbd9a3800e884941f67d94c96 Mon Sep 17 00:00:00 2001 +From: Kinga Tanska +Date: Tue, 27 Dec 2022 06:50:42 +0100 +Subject: [PATCH 80/83] Manage: do not check array state when drive is removed + +Array state doesn't need to be checked when drive is +removed, but until now clean state was required. Result +of the is_remove_safe() function will be independent +from array state. + +Signed-off-by: Kinga Tanska +Signed-off-by: Jes Sorensen +--- + Manage.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/Manage.c b/Manage.c +index 594e3d2c..4d6e54b1 100644 +--- a/Manage.c ++++ b/Manage.c +@@ -1321,8 +1321,7 @@ bool is_remove_safe(mdu_array_info_t *array, const int fd, char *devname, const + sysfs_free(mdi); + + bool is_enough = enough(array->level, array->raid_disks, +- array->layout, (array->state & 1), +- avail); ++ array->layout, 1, avail); + + free(avail); + return is_enough; +-- +2.38.1 + diff --git a/SOURCES/0081-incremental-manage-do-not-verify-if-remove-is-safe.patch b/SOURCES/0081-incremental-manage-do-not-verify-if-remove-is-safe.patch new file mode 100644 index 0000000..4e0169c --- /dev/null +++ b/SOURCES/0081-incremental-manage-do-not-verify-if-remove-is-safe.patch @@ -0,0 +1,59 @@ +From 461fae7e7809670d286cc19aac5bfa861c29f93a Mon Sep 17 00:00:00 2001 +From: Kinga Tanska +Date: Tue, 27 Dec 2022 06:50:43 +0100 +Subject: [PATCH 81/83] incremental, manage: do not verify if remove is safe + +Function is_remove_safe() was introduced to verify if removing +member device won't cause failed state of the array. This +verification should be used only with set-faulty command. Add +special mode indicating that Incremental removal was executed. +If this mode is used do not execute is_remove_safe() routine. + +Signed-off-by: Kinga Tanska +Signed-off-by: Jes Sorensen +--- + Incremental.c | 2 +- + Manage.c | 7 ++++--- + 2 files changed, 5 insertions(+), 4 deletions(-) + +diff --git a/Incremental.c b/Incremental.c +index ff3548c0..09b94b9f 100644 +--- a/Incremental.c ++++ b/Incremental.c +@@ -1744,7 +1744,7 @@ int IncrementalRemove(char *devname, char *id_path, int verbose) + + memset(&devlist, 0, sizeof(devlist)); + devlist.devname = devname; +- devlist.disposition = 'f'; ++ devlist.disposition = 'I'; + /* for a container, we must fail each member array */ + if (ent->metadata_version && + strncmp(ent->metadata_version, "external:", 9) == 0) { +diff --git a/Manage.c b/Manage.c +index 4d6e54b1..6184d3f7 100644 +--- a/Manage.c ++++ b/Manage.c +@@ -1494,8 +1494,9 @@ int Manage_subdevs(char *devname, int fd, + /* Assume this is a kernel-internal name like 'sda1' */ + int found = 0; + char dname[55]; +- if (dv->disposition != 'r' && dv->disposition != 'f') { +- pr_err("%s only meaningful with -r or -f, not -%c\n", ++ if (dv->disposition != 'r' && dv->disposition != 'f' && ++ dv->disposition != 'I') { ++ pr_err("%s only meaningful with -r, -f or -I, not -%c\n", + dv->devname, dv->disposition); + goto abort; + } +@@ -1647,7 +1648,7 @@ int Manage_subdevs(char *devname, int fd, + close(sysfd); + goto abort; + } +- ++ case 'I': /* incremental fail */ + if ((sysfd >= 0 && write(sysfd, "faulty", 6) != 6) || + (sysfd < 0 && ioctl(fd, SET_DISK_FAULTY, + rdev))) { +-- +2.38.1 + diff --git a/SOURCES/0082-super-intel-make-freesize-not-required-for-chunk-siz.patch b/SOURCES/0082-super-intel-make-freesize-not-required-for-chunk-siz.patch new file mode 100644 index 0000000..0035c89 --- /dev/null +++ b/SOURCES/0082-super-intel-make-freesize-not-required-for-chunk-siz.patch @@ -0,0 +1,52 @@ +From 071f839ea549e2a384cd13bba445245cd87e48b1 Mon Sep 17 00:00:00 2001 +From: Kinga Tanska +Date: Fri, 28 Oct 2022 04:51:17 +0200 +Subject: [PATCH 82/83] super-intel: make freesize not required for chunk size + migration + +Freesize is needed to be set for migrations where size of RAID could +be changed - expand. It tells how many free space is determined for +members. In chunk size migartion freesize is not needed to be set, +pointer shouldn't be checked if exists. This commit moves check to +condition which contains size calculations, instead of checking it +always at the first step. +Fix return value when superblock is not set. + +Signed-off-by: Kinga Tanska +Signed-off-by: Jes Sorensen +--- + super-intel.c | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/super-intel.c b/super-intel.c +index 1f5f6eda..89fac626 100644 +--- a/super-intel.c ++++ b/super-intel.c +@@ -7719,11 +7719,11 @@ static int validate_geometry_imsm(struct supertype *st, int level, int layout, + struct intel_super *super = st->sb; + + /* +- * Autolayout mode, st->sb and freesize must be set. ++ * Autolayout mode, st->sb must be set. + */ +- if (!super || !freesize) { +- pr_vrb("freesize and superblock must be set for autolayout, aborting\n"); +- return 1; ++ if (!super) { ++ pr_vrb("superblock must be set for autolayout, aborting\n"); ++ return 0; + } + + if (!validate_geometry_imsm_orom(st->sb, level, layout, +@@ -7731,7 +7731,7 @@ static int validate_geometry_imsm(struct supertype *st, int level, int layout, + verbose)) + return 0; + +- if (super->orom) { ++ if (super->orom && freesize) { + imsm_status_t rv; + int count = count_volumes(super->hba, super->orom->dpa, + verbose); +-- +2.38.1 + diff --git a/SOURCES/0083-manage-move-comment-with-function-description.patch b/SOURCES/0083-manage-move-comment-with-function-description.patch new file mode 100644 index 0000000..091854f --- /dev/null +++ b/SOURCES/0083-manage-move-comment-with-function-description.patch @@ -0,0 +1,105 @@ +From 36a707824eb1dafbb990f5daf1cbbe0e37dbbefb Mon Sep 17 00:00:00 2001 +From: Kinga Tanska +Date: Thu, 5 Jan 2023 06:31:25 +0100 +Subject: [PATCH 83/83] manage: move comment with function description + +Move the function description from the function body to outside +to obey kernel coding style. + +Signed-off-by: Kinga Tanska +Acked-by: Coly Li +Signed-off-by: Jes Sorensen +--- + Manage.c | 72 ++++++++++++++++++++++++++++++++++---------------------- + 1 file changed, 44 insertions(+), 28 deletions(-) + +diff --git a/Manage.c b/Manage.c +index 6184d3f7..fde6aba3 100644 +--- a/Manage.c ++++ b/Manage.c +@@ -1327,38 +1327,54 @@ bool is_remove_safe(mdu_array_info_t *array, const int fd, char *devname, const + return is_enough; + } + ++/** ++ * Manage_subdevs() - Execute operation depending on devmode. ++ * ++ * @devname: name of the device. ++ * @fd: file descriptor. ++ * @devlist: list of sub-devices to manage. ++ * @verbose: verbose level. ++ * @test: test flag. ++ * @update: type of update. ++ * @force: force flag. ++ * ++ * This function executes operation defined by devmode ++ * for each dev from devlist. ++ * Devmode can be: ++ * 'a' - add the device ++ * 'S' - add the device as a spare - don't try re-add ++ * 'j' - add the device as a journal device ++ * 'A' - re-add the device ++ * 'r' - remove the device: HOT_REMOVE_DISK ++ * device can be 'faulty' or 'detached' in which case all ++ * matching devices are removed. ++ * 'f' - set the device faulty SET_DISK_FAULTY ++ * device can be 'detached' in which case any device that ++ * is inaccessible will be marked faulty. ++ * 'I' - remove device by using incremental fail ++ * which is executed when device is removed surprisingly. ++ * 'R' - mark this device as wanting replacement. ++ * 'W' - this device is added if necessary and activated as ++ * a replacement for a previous 'R' device. ++ * ----- ++ * 'w' - 'W' will be changed to 'w' when it is paired with ++ * a 'R' device. If a 'W' is found while walking the list ++ * it must be unpaired, and is an error. ++ * 'M' - this is created by a 'missing' target. It is a slight ++ * variant on 'A' ++ * 'F' - Another variant of 'A', where the device was faulty ++ * so must be removed from the array first. ++ * 'c' - confirm the device as found (for clustered environments) ++ * ++ * For 'f' and 'r', the device can also be a kernel-internal ++ * name such as 'sdb'. ++ * ++ * Return: 0 on success, otherwise 1 or 2. ++ */ + int Manage_subdevs(char *devname, int fd, + struct mddev_dev *devlist, int verbose, int test, + enum update_opt update, int force) + { +- /* Do something to each dev. +- * devmode can be +- * 'a' - add the device +- * 'S' - add the device as a spare - don't try re-add +- * 'j' - add the device as a journal device +- * 'A' - re-add the device +- * 'r' - remove the device: HOT_REMOVE_DISK +- * device can be 'faulty' or 'detached' in which case all +- * matching devices are removed. +- * 'f' - set the device faulty SET_DISK_FAULTY +- * device can be 'detached' in which case any device that +- * is inaccessible will be marked faulty. +- * 'R' - mark this device as wanting replacement. +- * 'W' - this device is added if necessary and activated as +- * a replacement for a previous 'R' device. +- * ----- +- * 'w' - 'W' will be changed to 'w' when it is paired with +- * a 'R' device. If a 'W' is found while walking the list +- * it must be unpaired, and is an error. +- * 'M' - this is created by a 'missing' target. It is a slight +- * variant on 'A' +- * 'F' - Another variant of 'A', where the device was faulty +- * so must be removed from the array first. +- * 'c' - confirm the device as found (for clustered environments) +- * +- * For 'f' and 'r', the device can also be a kernel-internal +- * name such as 'sdb'. +- */ + mdu_array_info_t array; + unsigned long long array_size; + struct mddev_dev *dv; +-- +2.38.1 + diff --git a/SOURCES/mdadm-udev.patch b/SOURCES/mdadm-udev.patch index 2e2612e..a9d4d93 100644 --- a/SOURCES/mdadm-udev.patch +++ b/SOURCES/mdadm-udev.patch @@ -1,5 +1,5 @@ ---- mdadm/udev-md-raid-assembly.rules.orig 2022-10-25 08:34:58.137936285 +0800 -+++ mdadm/udev-md-raid-assembly.rules 2022-10-25 09:28:23.453154190 +0800 +--- mdadm/udev-md-raid-assembly.rules.orig 2023-01-06 16:37:03.780756100 +0800 ++++ mdadm/udev-md-raid-assembly.rules 2023-01-06 17:04:09.536159980 +0800 @@ -5,6 +5,9 @@ ENV{ANACONDA}=="?*", GOTO="md_inc_end" # assemble md arrays @@ -10,17 +10,17 @@ SUBSYSTEM!="block", GOTO="md_inc_end" # skip non-initialized devices -@@ -28,6 +31,13 @@ +@@ -33,6 +36,13 @@ LABEL="md_inc" +# Make sure we don't handle dm devices when some limits are set. +# And linux_raid_member only be set when change/remove event happen. -+# So we don't need to consider add event here ++# So we don't need to consider add event here. +KERNEL=="dm-*", ENV{DM_UDEV_RULES_VSN}!="?*", GOTO="md_inc_end" +KERNEL=="dm-*", ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}=="1", GOTO="md_inc_end" +KERNEL=="dm-*", ENV{DM_SUSPENDED}=="1", GOTO="md_inc_end" + - # remember you can limit what gets auto/incrementally assembled by - # mdadm.conf(5)'s 'AUTO' and selectively whitelist using 'ARRAY' - ACTION!="remove", IMPORT{program}="BINDIR/mdadm --incremental --export $devnode --offroot $env{DEVLINKS}" + # Bare disks are ready when add event happens, the raid can be assembled. + ACTION=="change", KERNEL!="dm-*|md*", GOTO="md_inc_end" + diff --git a/SPECS/mdadm.spec b/SPECS/mdadm.spec index 9b4df8a..0b6c23b 100644 --- a/SPECS/mdadm.spec +++ b/SPECS/mdadm.spec @@ -2,7 +2,7 @@ Summary: The mdadm program controls Linux md devices (software RAID arrays) Name: mdadm Version: 4.2 # extraversion is used to define rhel internal version -%define extraversion 6 +%define extraversion 7 Release: %{extraversion}%{?dist} Source: http://www.kernel.org/pub/linux/utils/raid/mdadm/mdadm-%{version}%{?subversion:-%{subversion}}.tar.xz Source1: mdmonitor.init @@ -76,8 +76,28 @@ Patch056: 0058-mdadm-Add-Documentation-entries-to-systemd-services.patch Patch057: 0059-ReadMe-fix-command-line-help.patch Patch058: 0060-mdadm-replace-container-level-checking-with-inline.patch Patch059: 0061-Mdmonitor-Omit-non-md-devices.patch -Patch060: 0062-Create-goto-abort_locked-instead-of-return-1-in-erro.patch -Patch061: 0063-Create-remove-safe_mode_delay-local-variable.patch +Patch060: 0062-Mdmonitor-Split-alert-into-separate-functions.patch +Patch061: 0063-Monitor-block-if-monitor-modes-are-combined.patch +Patch062: 0064-Update-mdadm-Monitor-manual.patch +Patch063: 0065-Grow-fix-possible-memory-leak.patch +Patch064: 0066-mdadm-create-ident_init.patch +Patch065: 0067-mdadm-Add-option-validation-for-update-subarray.patch +Patch066: 0068-Fix-update-subarray-on-active-volume.patch +Patch067: 0069-Add-code-specific-update-options-to-enum.patch +Patch068: 0070-super-ddf-Remove-update_super_ddf.patch +Patch069: 0071-super0-refactor-the-code-for-enum.patch +Patch070: 0072-super1-refactor-the-code-for-enum.patch +Patch071: 0073-super-intel-refactor-the-code-for-enum.patch +Patch072: 0074-Change-update-to-enum-in-update_super-and-update_sub.patch +Patch073: 0075-Manage-Incremental-code-refactor-string-to-enum.patch +Patch074: 0076-Change-char-to-enum-in-context-update-refactor-code.patch +Patch075: 0077-mdmon-fix-segfault.patch +Patch076: 0078-util-remove-obsolete-code-from-get_md_name.patch +Patch077: 0079-mdadm-udev-Don-t-handle-change-event-on-raw-devices.patch +Patch078: 0080-Manage-do-not-check-array-state-when-drive-is-remove.patch +Patch079: 0081-incremental-manage-do-not-verify-if-remove-is-safe.patch +Patch080: 0082-super-intel-make-freesize-not-required-for-chunk-siz.patch +Patch081: 0083-manage-move-comment-with-function-description.patch # RHEL customization patches Patch200: mdadm-udev.patch @@ -171,6 +191,26 @@ file can be used to help with some common tasks. %patch059 -p1 -b .0061 %patch060 -p1 -b .0062 %patch061 -p1 -b .0063 +%patch062 -p1 -b .0064 +%patch063 -p1 -b .0065 +%patch064 -p1 -b .0066 +%patch065 -p1 -b .0067 +%patch066 -p1 -b .0068 +%patch067 -p1 -b .0069 +%patch068 -p1 -b .0070 +%patch069 -p1 -b .0071 +%patch070 -p1 -b .0072 +%patch071 -p1 -b .0073 +%patch072 -p1 -b .0074 +%patch073 -p1 -b .0075 +%patch074 -p1 -b .0076 +%patch075 -p1 -b .0077 +%patch076 -p1 -b .0078 +%patch077 -p1 -b .0079 +%patch078 -p1 -b .0080 +%patch079 -p1 -b .0081 +%patch080 -p1 -b .0082 +%patch081 -p1 -b .0083 # RHEL customization patches %patch200 -p1 -b .udev @@ -242,6 +282,10 @@ rm -rf %{buildroot} /usr/lib/mdadm/mdadm_env.sh %changelog +* Fri Jan 6 2023 Xiao Ni - 4.2-7 +- Update to latest to upstream to fix some bugs +- Resolves rhbz#2149307, rhbz#2149473, rhbz#2151208, rhbz#2127096 + * Thu Sep 8 2022 Xiao Ni - 4.2-6 - Keep udev rule close to upstream and update to latest upstream - Resolves rhbz#1991596, rhbz#2129088, rhbz#2107150