diff --git a/SOURCES/0067-mdadm-Change-main-repository-to-Github.patch b/SOURCES/0067-mdadm-Change-main-repository-to-Github.patch new file mode 100644 index 0000000..ae729f5 --- /dev/null +++ b/SOURCES/0067-mdadm-Change-main-repository-to-Github.patch @@ -0,0 +1,193 @@ +From 3f90be087fa62c0c7ed76c2ac26752f0ac3a89e7 Mon Sep 17 00:00:00 2001 +From: Mariusz Tkaczyk +Date: Tue, 7 May 2024 17:35:09 +0200 +Subject: [PATCH 067/201] mdadm: Change main repository to Github + +Now github will be used for tracking mdadm, adjust README.md. +Daily routines will be automated on Github, there is not need to +decribe them. + +Adjust release process, it must be published to both repositories. + +Signed-off-by: Mariusz Tkaczyk +--- + MAINTAINERS.md | 41 ++++++++---------------- + README.md | 86 ++++++++++++++++++++++++++++---------------------- + 2 files changed, 61 insertions(+), 66 deletions(-) + +diff --git a/MAINTAINERS.md b/MAINTAINERS.md +index 9c79ba87..e5b635f0 100644 +--- a/MAINTAINERS.md ++++ b/MAINTAINERS.md +@@ -1,44 +1,29 @@ + # Maintainer tools + +-Useful tools used in daily routines: ++Useful tools for mdadm maintenance: + - [checkpatch](https://docs.kernel.org/dev-tools/checkpatch.html) + - [kup](https://korg.docs.kernel.org/kup.html) + - [Auto-publishing](https://korg.docs.kernel.org/kup.html#auto-publishing-with-git-archive-signer) + - [b4](https://b4.docs.kernel.org/en/latest/) + +-# Checklist before applying patch +- +-We don't have CI testing yet, so all those steps must be performed manually: +-- Style check with [checkpatch](https://docs.kernel.org/dev-tools/checkpatch.html): +- +- This is the current code style follows. We are not strict to all rules. It must be run +- by **checkpatch --no-tree**, see README.md. +- +-- [Commit style](https://www.kernel.org/doc/html/v4.10/process/submitting-patches.html): +- +- It doesn't need to be followed as strictly as is in kernel but changes should be logically +- separated. Submitter should care at least to mention "It is used in next patches" if unused +- externs/files are added in patch. We love: *Reported-by:*, *Suggested-by:*, *Fixes:* tags. +- +-- Compilation, ideally on various gcc versions. +-- Mdadm test suite execution. +-- Consider requesting new tests from submitter, especially for new functionalities. +-- Ensure that maintainer *sign-off* is added, before pushing. +- + # Making a release + + Assuming that maintainer is certain that release is safe, following steps must be done: + +-- Update versions strings in release commit, please refer to previous releases for examples. ++- Make and push release commit: ++ - Update versions strings, refer to previous releases for examples. ++ - Update CHANGELOG.md. ++ ++- Create GPG signed tag and push it to both remotes. Use same format as was used previously, ++ prefixed by **mdadm-**, e.g. **mdadm-3.1.2**, **mdadm-4.1**. + +-- Create GPG signed tag and push it to repo. Use same format as was used previously, prefixed by +- **mdadm-**, e.g. **mdadm-3.1.2**, **mdadm-4.1**. ++- Run kernel.org ++ [Auto-publishing](https://korg.docs.kernel.org/kup.html#auto-publishing-with-git-archive-signer): + +-- [Auto-publishing](https://korg.docs.kernel.org/kup.html#auto-publishing-with-git-archive-signer): ++ Adopt script to our release tag model. When ready, push signed note to kernel.org repository. If ++ it is done correctly, then *(sig)* is added to the package automatically generated by ++ kernel.org automation. There is no need to upload archive manually. + +- Adopt script to our release tag model. When ready, push signed note to repository. If it is done +- correctly, then *(sig)* is added to the package automatically generated by kernel.org automation. +- There is no need to upload archive manually. ++- Add release entry on Github. + +-- Update CHANGELOG.md. + - Write "ANNOUNCE" mail to linux-raid@kernel.org to notify community. +diff --git a/README.md b/README.md +index 64f2ecec..486c8929 100644 +--- a/README.md ++++ b/README.md +@@ -20,58 +20,68 @@ + **IMPORTANT:** DDF is in **maintenance only** mode. There is no active development around it. + Please do not use it in new solutions. + +-# How to Contribute +- +- **mdadm** is hosted on [kernel.org](https://kernel.org/). You can access repository +-[here](https://git.kernel.org/pub/scm/utils/mdadm/mdadm.git). ++# Questions and Support ++ ++This Github site is **not** right place to ask if your are looking for: ++- support from Linux Raid Community; ++- support with kernel issues; ++ ++This is the place where development of mdadm application is done. Please, do not use for ++looking for support. You should always ask on [Mailing List](https://lore.kernel.org/linux-raid/). ++ ++Please use issues if you have confirmation that issue you are experiencing is related to mdadm ++components: ++- mdadm; ++- mdmon; ++- raid6check; ++- swap_super; ++- test_stripe; ++- systemd services ( see systemd/); ++- udev rules; ++- manual pages (including md.man) ++ ++For example: ++- mdadm issues (e.g segfaults, memory leaks, crashes, bad communication with MD driver); ++- feature requests for mdadm; ++- suggestions or minor fixes requested (e.g. better error messages); ++ ++Generally, if you are not sure it is better to ask on ++[Mailing List](https://lore.kernel.org/linux-raid/) first. + +-It is maintained similarly to kernel, using *mailing list*. Patches must be send through email. +-Please familiarize with general kernel +-[submitting patches](https://www.kernel.org/doc/html/v4.17/process/submitting-patches.html) +-documentation. Formatting, tags and commit message guidelines applies to **mdadm**. ++# How to Contribute + +-## Sending patches step-by-step ++Effective immediately [Github](https://github.com/md-raid-utilities/mdadm) is the primary ++location for **mdadm**. Use pull request to contribute. + +-To maximize change of patches being taken, follow this instruction when submitting: ++It was originally hosted on [kernel.org](https://kernel.org/). You can access the old repository ++[here](https://git.kernel.org/pub/scm/utils/mdadm/mdadm.git). + +-1. Create possibly logically separated commits and generate patches: ++Patches sent through Mailing list are accepted but Github is preferred. Sent then to ML only ++if you cannot use Github. Please add "mdadm:" to the subject to allow automation to create Github ++Pull Request and run checks. + +- Use ``git format-patch --cover-letter --signoff -v `` to create patches: +- * ``--cover-letter`` can be skipped if it is only one patch; +- * ``--signoff`` adds sign-off tag; +- * ``-v `` indicates review revision number, sender should increment it before resending. ++**NOTE:** Maintainers may ask you to send RFC to mailing list if the proposed code requires ++consultation with kernel developers. + +-2. Check style of every patch with kernel +- [checkpatch](https://docs.kernel.org/dev-tools/checkpatch.html) script: ++Kernel coding style is used. Please familiarize with general kernel ++[submitting patches](https://www.kernel.org/doc/html/v4.17/process/submitting-patches.html) ++documentation. Formatting, tags and commit message guidelines applies to **mdadm**. + +- It is important to keep same coding style that is why in **mdadm** +- [kernel coding style](https://www.kernel.org/doc/html/v4.10/process/coding-style.html) +- is preferred. ``checkpath --no-tree `` can be used to verify patches. +- Following checkpatch issues can be ignored: +- - New typedefs. +- - comparing with *True/False*. +- - kernel *MAINTAINERS* file warning. +- - *extern* keyword in headers. ++[Checkpatch](https://docs.kernel.org/dev-tools/checkpatch.html) script is run on ++every patch in pull request so be sure that your commits are not generating ++issues. There are some excludes, so the best is to follow github checkpatch action result. + +-3. Send patches using ``git send-mail --to=linux-raid@vger.kernel.org (...)`` ++Pull Request are closed by `Rebase and Merge` option, so it requires to keep every commit ++meaningful. Kernel style requires that. The review changes must be pushed with **push --force** ++to the chosen branch, then Pull Request will be automatically updated. + +-# Maintainers ++# Maintainers of mdadm repository on kernel.org + +-It is good practice to add **mdadm maintainers** to recipients for patches: ++If there are differences between github and kernel.org, please contact kernel.org mdadm maintainers: + + - Jes Sorensen ; + - Mariusz Tkaczyk ; + +-Adding **MD maintainers** could be reasonable, especially if patches may affect MD driver: +- +-- Song Liu ; +-- Yu Kuai ; +- +-# Reviewers +- +-**mdadm** utility is not part of kernel tree, so there is no certificated *Reviewers* list. Everyone +-can comment on mailing list, last decision (and merging) belongs to maintainers. +- + # Minimal supported kernel version + + We do not support kernel versions below **v3.10**. Please be aware that maintainers may remove +-- +2.41.0 + diff --git a/SOURCES/0158-md.4-replace-wrong-word.patch b/SOURCES/0158-md.4-replace-wrong-word.patch new file mode 100644 index 0000000..c510a3f --- /dev/null +++ b/SOURCES/0158-md.4-replace-wrong-word.patch @@ -0,0 +1,28 @@ +From 1f49ecbf3d2ab8003d37eb1c0454c5cfbe335ee5 Mon Sep 17 00:00:00 2001 +From: Nicolas Roeser +Date: Sun, 4 Aug 2024 14:34:44 +0200 +Subject: [PATCH 158/201] md.4: replace wrong word + +There is a wrong word in the md(4) man page, this commit corrects it. + +Signed-off-by: Nicolas Roeser +--- + md.4 | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/md.4 b/md.4 +index 7a0bc7e6..7aef1577 100644 +--- a/md.4 ++++ b/md.4 +@@ -224,7 +224,7 @@ option. If you use this option to + while running a newer kernel, the array will NOT assemble, but the + metadata will be update so that it can be assembled on an older kernel. + +-No that setting the layout to "unspecified" removes protections against ++Note that setting the layout to "unspecified" removes protections against + this bug, and you must be sure that the kernel you use matches the + layout of the array. + +-- +2.41.0 + diff --git a/SOURCES/0159-mdadm-util.c-fix-coverity-issues.patch b/SOURCES/0159-mdadm-util.c-fix-coverity-issues.patch new file mode 100644 index 0000000..b2bc66a --- /dev/null +++ b/SOURCES/0159-mdadm-util.c-fix-coverity-issues.patch @@ -0,0 +1,134 @@ +From ea076e7c4bc8b3122ad9d7131098c4b85902a299 Mon Sep 17 00:00:00 2001 +From: Nigel Croxon +Date: Wed, 7 Aug 2024 11:33:23 -0400 +Subject: [PATCH 159/201] mdadm: util.c fix coverity issues + +Fixing the following coding errors the coverity tools found: + +* Event check_return: Calling "open" without checking return value +* Event check_return: Calling "lseek(fd, sector_size, 0)" without +checking return value. +* Event leaked_handle: Handle variable "fd" going out of scope leaks +the handle. +* Event leaked_storage: Variable "dir" going out of scope leaks the +storage it points to. +* Event fixed_size_dest: You might overrun the 32-character fixed-size +string "st->devnm" by copying "_devnm" without checking the length. +* Event fixed_size_dest: You might overrun the 32-character fixed-size +string "container" by copying "dev" without checking the length. + +Signed-off-by: Nigel Croxon +--- + util.c | 41 +++++++++++++++++++++++++---------------- + 1 file changed, 25 insertions(+), 16 deletions(-) + +diff --git a/util.c b/util.c +index 83d42833..1cee0feb 100644 +--- a/util.c ++++ b/util.c +@@ -1253,7 +1253,7 @@ struct supertype *super_by_fd(int fd, char **subarrayp) + *subarray++ = '\0'; + subarray = xstrdup(subarray); + } +- strcpy(container, dev); ++ snprintf(container, sizeof(container), "%s", dev); + sysfs_free(sra); + sra = sysfs_read(-1, container, GET_VERSION); + if (sra && sra->text_version[0]) +@@ -1430,7 +1430,8 @@ static int get_gpt_last_partition_end(int fd, unsigned long long *endofpart) + /* skip protective MBR */ + if (!get_dev_sector_size(fd, NULL, §or_size)) + return 0; +- lseek(fd, sector_size, SEEK_SET); ++ if (lseek(fd, sector_size, SEEK_SET) == -1L) ++ return 0; + /* read GPT header */ + if (read(fd, &gpt, 512) != 512) + return 0; +@@ -1451,7 +1452,8 @@ static int get_gpt_last_partition_end(int fd, unsigned long long *endofpart) + part = (struct GPT_part_entry *)buf; + + /* set offset to third block (GPT entries) */ +- lseek(fd, sector_size*2, SEEK_SET); ++ if (lseek(fd, sector_size*2, SEEK_SET) == -1L) ++ return 0; + for (part_nr = 0; part_nr < all_partitions; part_nr++) { + /* read partition entry */ + if (read(fd, buf, entry_size) != (ssize_t)entry_size) +@@ -1486,7 +1488,8 @@ static int get_last_partition_end(int fd, unsigned long long *endofpart) + + BUILD_BUG_ON(sizeof(boot_sect) != 512); + /* read MBR */ +- lseek(fd, 0, 0); ++ if (lseek(fd, 0, 0) == -1L) ++ goto abort; + if (read(fd, &boot_sect, 512) != 512) + goto abort; + +@@ -1715,7 +1718,7 @@ int open_subarray(char *dev, char *subarray, struct supertype *st, int quiet) + dev); + goto close_fd; + } +- strcpy(st->devnm, _devnm); ++ snprintf(st->devnm, sizeof(st->devnm), "%s", _devnm); + + mdi = sysfs_read(fd, st->devnm, GET_VERSION|GET_LEVEL); + if (!mdi) { +@@ -2293,14 +2296,16 @@ void manage_fork_fds(int close_all) + { + DIR *dir; + struct dirent *dirent; ++ int fd = open("/dev/null", O_RDWR); + +- close(0); +- open("/dev/null", O_RDWR); +- ++ if (is_fd_valid(fd)) { ++ dup2(fd, 0); + #ifndef DEBUG + dup2(0, 1); + dup2(0, 2); ++ close_fd(&fd); + #endif ++ } + + if (close_all == 0) + return; +@@ -2319,8 +2324,10 @@ void manage_fork_fds(int close_all) + + fd = strtol(dirent->d_name, NULL, 10); + if (fd > 2) +- close(fd); ++ close_fd(&fd); + } ++ closedir(dir); ++ return; + } + + /* In a systemd/udev world, it is best to get systemd to +@@ -2367,13 +2374,15 @@ void reopen_mddev(int mdfd) + /* Re-open without any O_EXCL, but keep + * the same fd + */ +- char *devnm; +- int fd; +- devnm = fd2devnm(mdfd); +- close(mdfd); +- fd = open_dev(devnm); +- if (fd >= 0 && fd != mdfd) +- dup2(fd, mdfd); ++ char *devnm = fd2devnm(mdfd); ++ int fd = open_dev(devnm); ++ ++ if (!is_fd_valid(fd)) ++ return; ++ ++ dup2(fd, mdfd); ++ ++ close_fd(&fd); + } + + static struct cmap_hooks *cmap_hooks = NULL; +-- +2.41.0 + diff --git a/SOURCES/0160-mdadm-sysfs.c-fix-coverity-issues.patch b/SOURCES/0160-mdadm-sysfs.c-fix-coverity-issues.patch new file mode 100644 index 0000000..03f3d39 --- /dev/null +++ b/SOURCES/0160-mdadm-sysfs.c-fix-coverity-issues.patch @@ -0,0 +1,56 @@ +From 18eaf6c5206a37ad059c930d1ee2dbc9b7297513 Mon Sep 17 00:00:00 2001 +From: Nigel Croxon +Date: Thu, 18 Jul 2024 13:05:57 -0400 +Subject: [PATCH 160/201] mdadm: sysfs.c fix coverity issues + +Fixing the following coding errors the coverity tools found: + +* Event fixed_size_dest: You might overrun the 32-character +fixed-size string "mdi->sys_name" by copying "devnm" without +checking the length + +* Event fixed_size_dest: You might overrun the 50-character +fixed-size string "sra->text_version" by copying "buf + 9" +without checking the length. + +* Event string_overflow: You might overrun the 32-character +destination string "dev->sys_name" by writing 256 characters +from "de->d_name". + +Signed-off-by: Nigel Croxon +--- + sysfs.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/sysfs.c b/sysfs.c +index 20fe1e9e..b3c8b10d 100644 +--- a/sysfs.c ++++ b/sysfs.c +@@ -139,7 +139,7 @@ int sysfs_init(struct mdinfo *mdi, int fd, char *devnm) + goto out; + if (!S_ISDIR(stb.st_mode)) + goto out; +- strcpy(mdi->sys_name, devnm); ++ strncpy(mdi->sys_name, devnm, sizeof(mdi->sys_name) - 1); + + retval = 0; + out: +@@ -179,6 +179,7 @@ struct mdinfo *sysfs_read(int fd, char *devnm, unsigned long options) + sra->array.major_version = -1; + sra->array.minor_version = -2; + strcpy(sra->text_version, buf+9); ++ sra->text_version[sizeof(sra->text_version) - 1] = '\0'; + } else { + sscanf(buf, "%d.%d", + &sra->array.major_version, +@@ -340,6 +341,7 @@ struct mdinfo *sysfs_read(int fd, char *devnm, unsigned long options) + + } + strcpy(dev->sys_name, de->d_name); ++ dev->sys_name[sizeof(dev->sys_name) - 1] = '\0'; + dev->disk.raid_disk = strtoul(buf, &ep, 10); + if (*ep) dev->disk.raid_disk = -1; + +-- +2.41.0 + diff --git a/SOURCES/0161-imsm-add-read-OROM-form-ACPI-UEFI-tables.patch b/SOURCES/0161-imsm-add-read-OROM-form-ACPI-UEFI-tables.patch new file mode 100644 index 0000000..586fa4c --- /dev/null +++ b/SOURCES/0161-imsm-add-read-OROM-form-ACPI-UEFI-tables.patch @@ -0,0 +1,405 @@ +From 91845dab52c3f9ab56710338c0c38e9c1473df1d Mon Sep 17 00:00:00 2001 +From: Blazej Kucman +Date: Thu, 11 Jul 2024 18:45:41 +0200 +Subject: [PATCH 161/201] imsm: add read OROM form ACPI UEFI tables + +OROM - IMSM hardware capabilities + +EFI vars depends on userspace, they need to be mounted to be accessible. +Sporadic problems have been observed with availability at an early +assemble stage. It is not possible to fully synchronize EFI vars mounts +with udev rules processing. + +For the reason above, read of IMSM OROM from ACPI tables as secondary +option is added. This method will be used for SATA and VMD family +controllers. + +ACPI tables are generated by sysfs, earlier in the boot process, before +the stage of RAID assembly. The way of loading OROM via EFI vars is +retained, ACPI tables will be a backup way. + +Two paths will be maintained, because IMSM hardware capabilities are +necessary for RAID assembly during booting, so access to them must be +provided. + +Signed-off-by: Blazej Kucman +--- + platform-intel.c | 324 +++++++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 299 insertions(+), 25 deletions(-) + +diff --git a/platform-intel.c b/platform-intel.c +index d6a53533..9705c925 100644 +--- a/platform-intel.c ++++ b/platform-intel.c +@@ -577,6 +577,9 @@ static const struct imsm_orom *find_imsm_hba_orom(struct sys_dev *hba) + + #define SYS_EFI_VAR_PATH "/sys/firmware/efi/vars" + #define SYS_EFIVARS_PATH "/sys/firmware/efi/efivars" ++#define ACPI_TABLES_PATH "/sys/firmware/acpi/tables/" ++#define ACPI_UEFI_TABLE_BASE_NAME "UEFI" ++#define ACPI_UEFI_DATA_OFFSET 52 + #define SCU_PROP "RstScuV" + #define AHCI_PROP "RstSataV" + #define AHCI_SSATA_PROP "RstsSatV" +@@ -584,10 +587,73 @@ static const struct imsm_orom *find_imsm_hba_orom(struct sys_dev *hba) + #define VROC_VMD_PROP "RstUefiV" + #define RST_VMD_PROP "RstVmdV" + +-#define VENDOR_GUID \ ++#define PCI_CLASS_RAID_CNTRL 0x010400 ++ ++/* GUID length in Bytes */ ++#define GUID_LENGTH 16 ++ ++/* GUID entry in 'UEFI' for Sata controller. */ ++#define RST_SATA_V_GUID \ ++ EFI_GUID(0xe4dd92e0, 0xac7d, 0x11df, 0x94, 0xe2, 0x08, 0x00, 0x20, 0x0c, 0x9a, 0x66) ++ ++/* GUID entry in 'UEFI' for sSata controller. */ ++#define RST_SSATA_V_GUID \ ++ EFI_GUID(0xb002be42, 0x901d, 0x4018, 0xb4, 0x1e, 0xd7, 0x04, 0xab, 0x3a, 0x0f, 0x15) ++ ++/* GUID entry in 'UEFI' for tSata controller. */ ++#define RST_TSATA_V_GUID \ ++ EFI_GUID(0x101ce8f1, 0xb873, 0x4362, 0xa9, 0x76, 0xb5, 0x54, 0x31, 0x74, 0x52, 0x7e) ++ ++/* GUID entry in 'UEFI' for Intel(R) VROC VMD. */ ++#define RST_UEFI_V_GUID \ ++ EFI_GUID(0x4bf2da96, 0xde6e, 0x4d8a, 0xa8, 0x8b, 0xb3, 0xd, 0x33, 0xf6, 0xf, 0x3e) ++ ++/** ++ * GUID entry in 'UEFI' for Intel(R) RST VMD. ++ * Currently is the same like in 'UEFI' for Sata controller. ++ */ ++#define RST_VMD_V_GUID RST_SATA_V_GUID ++ ++/* GUID of intel RST vendor EFI var. */ ++#define INTEL_RST_VENDOR_GUID \ + EFI_GUID(0x193dfefa, 0xa445, 0x4302, 0x99, 0xd8, 0xef, 0x3a, 0xad, 0x1a, 0x04, 0xc6) + +-#define PCI_CLASS_RAID_CNTRL 0x010400 ++/* ++ * Unified Extensible Firmware Interface (UEFI) Specification Release 2.10 ++ * UEFI ACPI DATA TABLE, Table O.1 ++ */ ++typedef struct uefi_acpi_table { ++ char signature[4]; ++ __u32 length; ++ __u8 revision; ++ __u8 checksum; ++ char oemid[6]; ++ /* controller name */ ++ char oem_table_id[8]; ++ __u32 oem_revision; ++ __u32 creator_id; ++ __u32 creator_revision; ++ /* controller GUID */ ++ struct efi_guid identifier; ++ /* OROM data offeset */ ++ __u16 dataOffset; ++} uefi_acpi_table_t; ++ ++typedef struct uefi_acpi_table_with_orom { ++ struct uefi_acpi_table table; ++ struct imsm_orom orom; ++} uefi_acpi_table_with_orom_t; ++ ++/* imsm_orom_id - Identifier used to match imsm efi var or acpi table ++ * @name: name of the UEFI property, it is part of efivar name or ACPI table oem_table_id ++ * @guid: acpi table guid identifier ++ * ++ * vendor guid (second part of evifar name) is not added here because it is cost. ++ */ ++typedef struct imsm_orom_id { ++ char *name; ++ struct efi_guid guid; ++} imsm_orom_id_t; + + static int read_efi_var(void *buffer, ssize_t buf_size, + const char *variable_name, struct efi_guid guid) +@@ -669,14 +735,238 @@ static int read_efi_variable(void *buffer, ssize_t buf_size, + return 0; + } + ++/** ++ * is_efi_guid_equal() - check if EFI guids are equal. ++ * @guid: EFI guid. ++ * @guid1: EFI guid to compare. ++ * ++ * Return: %true if guid are equal, %false otherwise. ++ */ ++static inline bool is_efi_guid_equal(struct efi_guid guid, struct efi_guid guid1) ++{ ++ if (memcmp(guid.b, guid1.b, GUID_LENGTH) == 0) ++ return true; ++ return false; ++} ++ ++/** ++ * acpi_any_imsm_orom_id_matching() - match ACPI table with any of given imsm_orom_id. ++ * @imsm_orom_ids: array of IMSM OROM Identifiers. ++ * @imsm_orom_ids_number: number of IMSM OROM Identifiers. ++ * @table: struct with read ACPI UEFI table. ++ * ++ * Check if read UEFI table contains requested OROM id. ++ * EFI GUID and controller name are compared with expected. ++ * ++ * Return: %true if length is proper table, %false otherwise. ++ */ ++bool acpi_any_imsm_orom_id_matching(imsm_orom_id_t *imsm_orom_ids, int imsm_orom_ids_number, ++ struct uefi_acpi_table table) ++{ ++ int index; ++ ++ for (index = 0; index < imsm_orom_ids_number; index++) ++ if (strncmp(table.oem_table_id, imsm_orom_ids[index].name, ++ strlen(imsm_orom_ids[index].name)) == 0 && ++ is_efi_guid_equal(table.identifier, ++ imsm_orom_ids[index].guid) == true) ++ return true; ++ return false; ++} ++ ++/** ++ * read_uefi_acpi_orom_data() - read OROM data from UEFI ACPI table. ++ * @fd: file descriptor. ++ * @uefi_table: struct to fill out. ++ * ++ * Read OROM from ACPI UEFI table under given file descriptor. ++ * Table must have the appropriate OROM data, which should be confirmed before call this function. ++ * In case of success, &orom in structure in &uefi_table will be filled.. ++ * ++ * Return: %MDADM_STATUS_SUCCESS on success, %MDADM_STATUS_ERROR otherwise. ++ */ ++mdadm_status_t ++read_uefi_acpi_orom_data(int fd, uefi_acpi_table_with_orom_t *uefi_table) ++{ ++ assert(is_fd_valid(fd)); ++ ++ if (lseek(fd, uefi_table->table.dataOffset, 0) == -1L) ++ return MDADM_STATUS_ERROR; ++ ++ if (read(fd, &uefi_table->orom, sizeof(uefi_table->orom)) == -1) ++ return MDADM_STATUS_ERROR; ++ ++ return MDADM_STATUS_SUCCESS; ++} ++ ++/** ++ * verify_uefi_acpi_table_length() - verify if ACPI UEFI table have correct length with focus at ++ * OROM. ++ * @table: struct with UEFI table. ++ * ++ * Verify if ACPI UEFI table have correct length with focus at OROM. Make sure that the file is ++ * correct and contains the appropriate length data based on the length of the OROM. ++ * ++ * Return: %true if length is correct, %false otherwise. ++ */ ++bool verify_uefi_acpi_table_length(struct uefi_acpi_table table) ++{ ++ if (table.length < ACPI_UEFI_DATA_OFFSET) ++ return false; ++ ++ if (table.length - table.dataOffset != sizeof(struct imsm_orom)) ++ return false; ++ return true; ++} ++ ++/** ++ * find_orom_in_acpi_uefi_tables() - find OROM in UEFI ACPI tables based on requested OROM ids. ++ * @imsm_orom_ids: array of IMSM OROM Identifiers. ++ * @imsm_orom_ids_number: number of IMSM OROM Identifiers. ++ * @orom: OROM struct buffer to fill out. ++ * ++ * Find OROM in UEFI ACPI tables provided by Intel, based on requested controllers. ++ * The first one to be matched, will be used. ++ * If found, the buffer with the OROM structure will be filled. ++ * ++ * Return: %MDADM_STATUS_SUCCESS on success, %MDADM_STATUS_ERROR otherwise. ++ */ ++mdadm_status_t ++find_orom_in_acpi_uefi_tables(imsm_orom_id_t *imsm_orom_ids, int imsm_orom_ids_number, ++ struct imsm_orom *orom) ++{ ++ mdadm_status_t status = MDADM_STATUS_ERROR; ++ uefi_acpi_table_with_orom_t uefi_table; ++ char path[PATH_MAX]; ++ struct dirent *ent; ++ int fd = -1; ++ DIR *dir; ++ ++ dir = opendir(ACPI_TABLES_PATH); ++ if (!dir) ++ return MDADM_STATUS_ERROR; ++ ++ for (ent = readdir(dir); ent; ent = readdir(dir)) { ++ close_fd(&fd); ++ ++ /* Check if file is a UEFI table */ ++ if (strncmp(ent->d_name, ACPI_UEFI_TABLE_BASE_NAME, ++ strlen(ACPI_UEFI_TABLE_BASE_NAME)) != 0) ++ continue; ++ ++ snprintf(path, PATH_MAX, "%s/%s", ACPI_TABLES_PATH, ent->d_name); ++ ++ fd = open(path, O_RDONLY); ++ if (!is_fd_valid(fd)) { ++ pr_err("Fail to open ACPI UEFI table file. File: %s, Error: %s\n", ++ ent->d_name, strerror(errno)); ++ continue; ++ } ++ ++ if (read(fd, &uefi_table.table, sizeof(struct uefi_acpi_table)) == -1) { ++ pr_err("Fail to read IMSM OROM from ACPI UEFI table file. File: %s\n", ++ ent->d_name); ++ continue; ++ } ++ ++ if (!acpi_any_imsm_orom_id_matching(imsm_orom_ids, imsm_orom_ids_number, ++ uefi_table.table)) ++ continue; ++ ++ if (!verify_uefi_acpi_table_length(uefi_table.table)) ++ continue; ++ ++ if (read_uefi_acpi_orom_data(fd, &uefi_table)) { ++ pr_err("Fail to read IMSM OROM from ACPI UEFI table file. File: %s\n", ++ ent->d_name); ++ continue; ++ } ++ ++ memcpy(orom, &uefi_table.orom, sizeof(uefi_table.orom)); ++ status = MDADM_STATUS_SUCCESS; ++ break; ++ } ++ ++ close_fd(&fd); ++ closedir(dir); ++ return status; ++} ++ ++/** ++ * find_orom_in_efi_variables() - find first IMSM OROM in EFI vars that matches any imsm_orom_id. ++ * @imsm_orom_ids: array of IMSM OROM Identifiers. ++ * @imsm_orom_ids_number: number of IMSM OROM Identifiers. ++ * @orom: OROM struct buffer to fill out. ++ * ++ * Find IMSM OROM that matches on of imsm_orom_id in EFI variables. The first match is used. ++ * If found, the buffer with the OROM structure is filled. ++ * ++ * Return: %MDADM_STATUS_SUCCESS on success, %MDADM_STATUS_ERROR otherwise. ++ */ ++mdadm_status_t ++find_orom_in_efi_variables(imsm_orom_id_t *imsm_orom_ids, int imsm_orom_ids_number, ++ struct imsm_orom *orom) ++{ ++ int index; ++ ++ for (index = 0; index < imsm_orom_ids_number; index++) ++ if (!read_efi_variable(orom, sizeof(struct imsm_orom), imsm_orom_ids[index].name, ++ INTEL_RST_VENDOR_GUID)) ++ return MDADM_STATUS_SUCCESS; ++ return MDADM_STATUS_ERROR; ++} ++ ++/** ++ * find_imsm_efi_orom() - find OROM for requested controller. ++ * @orom: buffer for OROM. ++ * @controller_type: requested controller type. ++ * ++ * Based on controller type, function first search in EFI vars then in ACPI UEFI tables. ++ * For each controller there is defined an array of OROM ids from which we can read OROM, ++ * the first one to be matched, will be used. ++ * In case of success, the structure &orom will be filed out. ++ * ++ * Return: %MDADM_STATUS_SUCCESS on success. ++ */ ++static mdadm_status_t ++find_imsm_efi_orom(struct imsm_orom *orom, enum sys_dev_type controller_type) ++{ ++ static imsm_orom_id_t sata_imsm_orrom_ids[] = { ++ {AHCI_PROP, RST_SATA_V_GUID}, ++ {AHCI_SSATA_PROP, RST_SSATA_V_GUID}, ++ {AHCI_TSATA_PROP, RST_TSATA_V_GUID}, ++ }; ++ static imsm_orom_id_t vmd_imsm_orom_ids[] = { ++ {VROC_VMD_PROP, RST_UEFI_V_GUID}, ++ {RST_VMD_PROP, RST_VMD_V_GUID}, ++ }; ++ static imsm_orom_id_t *imsm_orom_ids; ++ int imsm_orom_ids_number; ++ ++ switch (controller_type) { ++ case SYS_DEV_SATA: ++ imsm_orom_ids = sata_imsm_orrom_ids; ++ imsm_orom_ids_number = ARRAY_SIZE(sata_imsm_orrom_ids); ++ break; ++ case SYS_DEV_VMD: ++ case SYS_DEV_SATA_VMD: ++ imsm_orom_ids = vmd_imsm_orom_ids; ++ imsm_orom_ids_number = ARRAY_SIZE(vmd_imsm_orom_ids); ++ break; ++ default: ++ return MDADM_STATUS_UNDEF; ++ } ++ ++ if (!find_orom_in_efi_variables(imsm_orom_ids, imsm_orom_ids_number, orom)) ++ return MDADM_STATUS_SUCCESS; ++ ++ return find_orom_in_acpi_uefi_tables(imsm_orom_ids, imsm_orom_ids_number, orom); ++} ++ + const struct imsm_orom *find_imsm_efi(struct sys_dev *hba) + { + struct imsm_orom orom; + struct orom_entry *ret; +- static const char * const sata_efivars[] = {AHCI_PROP, AHCI_SSATA_PROP, +- AHCI_TSATA_PROP}; +- static const char * const vmd_efivars[] = {VROC_VMD_PROP, RST_VMD_PROP}; +- unsigned long i; + + if (check_env("IMSM_TEST_AHCI_EFI") || check_env("IMSM_TEST_SCU_EFI")) + return imsm_platform_test(hba); +@@ -687,36 +977,20 @@ const struct imsm_orom *find_imsm_efi(struct sys_dev *hba) + + switch (hba->type) { + case SYS_DEV_SAS: +- if (!read_efi_variable(&orom, sizeof(orom), SCU_PROP, +- VENDOR_GUID)) ++ if (!read_efi_variable(&orom, sizeof(orom), SCU_PROP, INTEL_RST_VENDOR_GUID)) + break; +- + return NULL; + case SYS_DEV_SATA: + if (hba->class != PCI_CLASS_RAID_CNTRL) + return NULL; + +- for (i = 0; i < ARRAY_SIZE(sata_efivars); i++) { +- if (!read_efi_variable(&orom, sizeof(orom), +- sata_efivars[i], VENDOR_GUID)) +- break; +- +- } +- if (i == ARRAY_SIZE(sata_efivars)) ++ if (find_imsm_efi_orom(&orom, hba->type)) + return NULL; +- + break; + case SYS_DEV_VMD: + case SYS_DEV_SATA_VMD: +- for (i = 0; i < ARRAY_SIZE(vmd_efivars); i++) { +- if (!read_efi_variable(&orom, sizeof(orom), +- vmd_efivars[i], VENDOR_GUID)) +- break; +- } +- +- if (i == ARRAY_SIZE(vmd_efivars)) ++ if (find_imsm_efi_orom(&orom, hba->type)) + return NULL; +- + break; + default: + return NULL; +-- +2.41.0 + diff --git a/SOURCES/0162-imsm-get-bus-from-VMD-driver-directory.patch b/SOURCES/0162-imsm-get-bus-from-VMD-driver-directory.patch new file mode 100644 index 0000000..3f34550 --- /dev/null +++ b/SOURCES/0162-imsm-get-bus-from-VMD-driver-directory.patch @@ -0,0 +1,146 @@ +From 6e793aeace463d7687656f7ac6968300ba106228 Mon Sep 17 00:00:00 2001 +From: Mariusz Tkaczyk +Date: Thu, 8 Aug 2024 13:07:50 +0200 +Subject: [PATCH 162/201] imsm: get bus from VMD driver directory + +Enumeration of VMD child devices is started early, kernel is not waiting +for VMD enumeration to finish. It causes that: +/sys/bus/pci/drivers/vmd/{dev}/domain/device link might be not yet ready. + +With PCI gen5 devices we can observe that mdadm is failing to start IMSM +raid arrays because of that. In that case, it needs to find bus path +manually. + +Look for bus device in VMD driver directory if realpath() failed with +ENOENT. + +Signed-off-by: Mariusz Tkaczyk +--- + platform-intel.c | 88 ++++++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 77 insertions(+), 11 deletions(-) + +diff --git a/platform-intel.c b/platform-intel.c +index 9705c925..d0ef9111 100644 +--- a/platform-intel.c ++++ b/platform-intel.c +@@ -105,12 +105,75 @@ static void free_sys_dev(struct sys_dev **list) + } + } + ++/** ++ * vmd_find_pci_bus() - look for PCI bus created by VMD. ++ * @vmd_path: path to vmd driver. ++ * @buf: return buffer, must be PATH_MAX. ++ * ++ * Each VMD device represents one domain and each VMD device adds separate PCI bus. ++ * IMSM must know VMD domains, therefore it needs to determine and follow buses. ++ * ++ */ ++mdadm_status_t vmd_find_pci_bus(char *vmd_path, char *buf) ++{ ++ char tmp[PATH_MAX]; ++ struct dirent *ent; ++ DIR *vmd_dir; ++ char *rp_ret; ++ ++ snprintf(tmp, PATH_MAX, "%s/domain/device", vmd_path); ++ ++ rp_ret = realpath(tmp, buf); ++ ++ if (rp_ret) ++ return MDADM_STATUS_SUCCESS; ++ ++ if (errno != ENOENT) ++ return MDADM_STATUS_ERROR; ++ ++ /* ++ * If it is done early, there is a chance that kernel is still enumerating VMD device but ++ * kernel did enough to start enumerating child devices, {vmd_path}/domain/device link may ++ * not exist yet. We have to look into @vmd_path directory and find it ourselves. ++ */ ++ ++ vmd_dir = opendir(vmd_path); ++ ++ if (!vmd_dir) ++ return MDADM_STATUS_ERROR; ++ ++ for (ent = readdir(vmd_dir); ent; ent = readdir(vmd_dir)) { ++ static const char pci[] = "pci"; ++ ++ /** ++ * Pci bus must have form pciXXXXX:XX, where X is a digit i.e pci10000:00. ++ * We do not check digits here, it is sysfs so it should be safe to check ++ * length and ':' position only. ++ */ ++ if (strncmp(ent->d_name, pci, strlen(pci)) != 0) ++ continue; ++ ++ if (ent->d_name[8] != ':' || ent->d_name[11] != 0) ++ continue; ++ break; ++ } ++ ++ if (!ent) { ++ closedir(vmd_dir); ++ return MDADM_STATUS_ERROR; ++ } ++ ++ snprintf(buf, PATH_MAX, "%s/%s", vmd_path, ent->d_name); ++ closedir(vmd_dir); ++ return MDADM_STATUS_SUCCESS; ++} ++ + struct sys_dev *find_driver_devices(const char *bus, const char *driver) + { + /* search sysfs for devices driven by 'driver' */ + char path[PATH_MAX]; + char link[PATH_MAX]; +- char *c, *p; ++ char *c; + DIR *driver_dir; + struct dirent *de; + struct sys_dev *head = NULL; +@@ -142,8 +205,9 @@ struct sys_dev *find_driver_devices(const char *bus, const char *driver) + return NULL; + } + for (de = readdir(driver_dir); de; de = readdir(driver_dir)) { +- int n; + int skip = 0; ++ char *p; ++ int n; + + /* is 'de' a device? check that the 'subsystem' link exists and + * that its target matches 'bus' +@@ -195,18 +259,20 @@ struct sys_dev *find_driver_devices(const char *bus, const char *driver) + if (devpath_to_ll(path, "class", &class) != 0) + continue; + +- /* +- * Each VMD device (domain) adds separate PCI bus, it is better +- * to store path as a path to that bus (easier further +- * determination which NVMe dev is connected to this particular +- * VMD domain). +- */ + if (type == SYS_DEV_VMD) { +- sprintf(path, "/sys/bus/%s/drivers/%s/%s/domain/device", +- bus, driver, de->d_name); ++ char vmd_path[PATH_MAX]; ++ ++ sprintf(vmd_path, "/sys/bus/%s/drivers/%s/%s", bus, driver, de->d_name); ++ ++ if (vmd_find_pci_bus(vmd_path, path)) { ++ pr_err("Cannot determine VMD bus for %s\n", vmd_path); ++ continue; ++ } + } ++ + p = realpath(path, NULL); +- if (p == NULL) { ++ ++ if (!p) { + pr_err("Unable to get real path for '%s'\n", path); + continue; + } +-- +2.41.0 + diff --git a/SOURCES/0163-platform-intel-refactor-path_attached_to_hba.patch b/SOURCES/0163-platform-intel-refactor-path_attached_to_hba.patch new file mode 100644 index 0000000..038c16c --- /dev/null +++ b/SOURCES/0163-platform-intel-refactor-path_attached_to_hba.patch @@ -0,0 +1,129 @@ +From a6392b419f38a0144a03df90371d6890540a55cf Mon Sep 17 00:00:00 2001 +From: Mateusz Kusiak +Date: Tue, 7 May 2024 12:05:43 -0400 +Subject: [PATCH 163/201] platform-intel: refactor path_attached_to_hba() + +dprintf() call in path_attached_to_hba() is too noisy. Remove the call +and refactor the function. Remove obsolete env variables check. + +Signed-off-by: Mateusz Kusiak +--- + platform-intel.c | 31 ++++++++++++++----------------- + platform-intel.h | 2 +- + super-intel.c | 8 ++++---- + 3 files changed, 19 insertions(+), 22 deletions(-) + +diff --git a/platform-intel.c b/platform-intel.c +index d0ef9111..3a86f785 100644 +--- a/platform-intel.c ++++ b/platform-intel.c +@@ -1331,31 +1331,28 @@ char *diskfd_to_devpath(int fd, int dev_level, char *buf) + + return devt_to_devpath(st.st_rdev, dev_level, buf); + } +- +-int path_attached_to_hba(const char *disk_path, const char *hba_path) ++/** ++ * is_path_attached_to_hba() - Check if disk is attached to hba ++ * ++ * @disk_path: Path to disk. ++ * @hba_path: Path to hba. ++ * ++ * Returns: true if disk is attached to hba, false otherwise. ++ */ ++bool is_path_attached_to_hba(const char *disk_path, const char *hba_path) + { +- int rc; +- +- if (check_env("IMSM_TEST_AHCI_DEV") || +- check_env("IMSM_TEST_SCU_DEV")) { +- return 1; +- } +- + if (!disk_path || !hba_path) +- return 0; +- dprintf("hba: %s - disk: %s\n", hba_path, disk_path); ++ return false; + if (strncmp(disk_path, hba_path, strlen(hba_path)) == 0) +- rc = 1; +- else +- rc = 0; ++ return true; + +- return rc; ++ return false; + } + + int devt_attached_to_hba(dev_t dev, const char *hba_path) + { + char *disk_path = devt_to_devpath(dev, 1, NULL); +- int rc = path_attached_to_hba(disk_path, hba_path); ++ int rc = is_path_attached_to_hba(disk_path, hba_path); + + if (disk_path) + free(disk_path); +@@ -1366,7 +1363,7 @@ int devt_attached_to_hba(dev_t dev, const char *hba_path) + int disk_attached_to_hba(int fd, const char *hba_path) + { + char *disk_path = diskfd_to_devpath(fd, 1, NULL); +- int rc = path_attached_to_hba(disk_path, hba_path); ++ int rc = is_path_attached_to_hba(disk_path, hba_path); + + if (disk_path) + free(disk_path); +diff --git a/platform-intel.h b/platform-intel.h +index dcc5aaa7..344624d7 100644 +--- a/platform-intel.h ++++ b/platform-intel.h +@@ -257,7 +257,7 @@ const struct imsm_orom *find_imsm_orom(void); + int disk_attached_to_hba(int fd, const char *hba_path); + int devt_attached_to_hba(dev_t dev, const char *hba_path); + char *devt_to_devpath(dev_t dev, int dev_level, char *buf); +-int path_attached_to_hba(const char *disk_path, const char *hba_path); ++bool is_path_attached_to_hba(const char *disk_path, const char *hba_path); + const struct orom_entry *get_orom_entry_by_device_id(__u16 dev_id); + const struct imsm_orom *get_orom_by_device_id(__u16 device_id); + struct sys_dev *device_by_id(__u16 device_id); +diff --git a/super-intel.c b/super-intel.c +index 354c292a..75d7c060 100644 +--- a/super-intel.c ++++ b/super-intel.c +@@ -800,7 +800,7 @@ static struct sys_dev* find_disk_attached_hba(int fd, const char *devname) + return 0; + + for (elem = list; elem; elem = elem->next) +- if (path_attached_to_hba(disk_path, elem->path)) ++ if (is_path_attached_to_hba(disk_path, elem->path)) + break; + + if (disk_path != devname) +@@ -2412,7 +2412,7 @@ static int ahci_enumerate_ports(struct sys_dev *hba, unsigned long port_count, i + path = devt_to_devpath(makedev(major, minor), 1, NULL); + if (!path) + continue; +- if (!path_attached_to_hba(path, hba->path)) { ++ if (!is_path_attached_to_hba(path, hba->path)) { + free(path); + path = NULL; + continue; +@@ -2563,7 +2563,7 @@ static int print_nvme_info(struct sys_dev *hba) + !diskfd_to_devpath(fd, 1, cntrl_path)) + goto skip; + +- if (!path_attached_to_hba(cntrl_path, hba->path)) ++ if (!is_path_attached_to_hba(cntrl_path, hba->path)) + goto skip; + + if (!imsm_is_nvme_namespace_supported(fd, 0)) +@@ -7077,7 +7077,7 @@ get_devices(const char *hba_path) + path = devt_to_devpath(makedev(major, minor), 1, NULL); + if (!path) + continue; +- if (!path_attached_to_hba(path, hba_path)) { ++ if (!is_path_attached_to_hba(path, hba_path)) { + free(path); + path = NULL; + continue; +-- +2.41.0 + diff --git a/SOURCES/0164-mdadm-Change-displaying-of-devices-in-detail.patch b/SOURCES/0164-mdadm-Change-displaying-of-devices-in-detail.patch new file mode 100644 index 0000000..02ba8d3 --- /dev/null +++ b/SOURCES/0164-mdadm-Change-displaying-of-devices-in-detail.patch @@ -0,0 +1,44 @@ +From bd5511c792ecc73de8897fbd8713e8c6eaf3e835 Mon Sep 17 00:00:00 2001 +From: Anna Sztukowska +Date: Wed, 28 Aug 2024 12:04:35 +0200 +Subject: [PATCH 164/201] mdadm: Change displaying of devices in --detail + +The counts of active, working, failed and spare devices were not +printed when the number was zero. + +Refactor the code to always display the counts of all device types, +regardless of their number. This way, it is more reliable for users. + +Signed-off-by: Anna Sztukowska +--- + Detail.c | 14 ++++---------- + 1 file changed, 4 insertions(+), 10 deletions(-) + +diff --git a/Detail.c b/Detail.c +index f8b9e847..331e1da3 100644 +--- a/Detail.c ++++ b/Detail.c +@@ -549,16 +549,10 @@ int Detail(char *dev, struct context *c) + } else if (inactive && !is_container) { + printf(" State : inactive\n"); + } +- if (array.raid_disks) +- printf(" Active Devices : %d\n", array.active_disks); +- if (array.working_disks > 0) +- printf(" Working Devices : %d\n", +- array.working_disks); +- if (array.raid_disks) { +- printf(" Failed Devices : %d\n", array.failed_disks); +- if (!external) +- printf(" Spare Devices : %d\n", array.spare_disks); +- } ++ printf(" Active Devices : %d\n", array.active_disks); ++ printf(" Working Devices : %d\n", array.working_disks); ++ printf(" Failed Devices : %d\n", array.failed_disks); ++ printf(" Spare Devices : %d\n", array.spare_disks); + printf("\n"); + if (array.level == 5) { + str = map_num(r5layout, array.layout); +-- +2.41.0 + diff --git a/SOURCES/0165-imsm-Remove-warning-and-refactor-add_to_super_imsm-c.patch b/SOURCES/0165-imsm-Remove-warning-and-refactor-add_to_super_imsm-c.patch new file mode 100644 index 0000000..6501c61 --- /dev/null +++ b/SOURCES/0165-imsm-Remove-warning-and-refactor-add_to_super_imsm-c.patch @@ -0,0 +1,196 @@ +From 734e7db4dfc502044d2a3dacfab67aeab0081cf9 Mon Sep 17 00:00:00 2001 +From: Mariusz Tkaczyk +Date: Thu, 22 Aug 2024 11:55:15 +0200 +Subject: [PATCH 165/201] imsm: Remove warning and refactor add_to_super_imsm + code + +Intel x8 drives are not supported, remove unnecessary warning and +refactor add_to_super_imsm code. + +Signed-off-by: Mariusz Tkaczyk +--- + super-intel.c | 102 +++++++++++++++++++------------------------------- + 1 file changed, 39 insertions(+), 63 deletions(-) + +diff --git a/super-intel.c b/super-intel.c +index 75d7c060..50fd56d0 100644 +--- a/super-intel.c ++++ b/super-intel.c +@@ -5976,12 +5976,12 @@ static int add_to_super_imsm(struct supertype *st, mdu_disk_info_t *dk, + unsigned long long data_offset) + { + struct intel_super *super = st->sb; +- struct dl *dd; +- unsigned long long size; + unsigned int member_sector_size; ++ unsigned long long size; ++ struct stat stb; ++ struct dl *dd; + __u32 id; + int rv; +- struct stat stb; + + /* If we are on an RAID enabled platform check that the disk is + * attached to the raid controller. +@@ -5991,114 +5991,86 @@ static int add_to_super_imsm(struct supertype *st, mdu_disk_info_t *dk, + rv = find_intel_hba_capability(fd, super, devname); + /* no orom/efi or non-intel hba of the disk */ + if (rv != 0) { +- dprintf("capability: %p fd: %d ret: %d\n", +- super->orom, fd, rv); +- return 1; ++ dprintf("capability: %p fd: %d ret: %d\n", super->orom, fd, rv); ++ return MDADM_STATUS_ERROR; + } + + if (super->current_vol >= 0) + return add_to_super_imsm_volume(st, dk, fd, devname); + + if (fstat(fd, &stb) != 0) +- return 1; ++ return MDADM_STATUS_ERROR; ++ + dd = xcalloc(sizeof(*dd), 1); ++ ++ if (devname) ++ dd->devname = xstrdup(devname); ++ ++ if (sysfs_disk_to_scsi_id(fd, &id) == 0) ++ dd->disk.scsi_id = __cpu_to_le32(id); ++ + dd->major = major(stb.st_rdev); + dd->minor = minor(stb.st_rdev); +- dd->devname = devname ? xstrdup(devname) : NULL; +- dd->fd = fd; +- dd->e = NULL; + dd->action = DISK_ADD; ++ dd->fd = fd; ++ + rv = imsm_read_serial(fd, devname, dd->serial, MAX_RAID_SERIAL_LEN); + if (rv) { + pr_err("failed to retrieve scsi serial, aborting\n"); +- __free_imsm_disk(dd, 0); +- abort(); ++ goto error; + } + + if (super->hba && ((super->hba->type == SYS_DEV_NVME) || + (super->hba->type == SYS_DEV_VMD))) { +- int i; +- char cntrl_path[PATH_MAX]; +- char *cntrl_name; + char pci_dev_path[PATH_MAX]; ++ char cntrl_path[PATH_MAX]; + + if (!diskfd_to_devpath(fd, 2, pci_dev_path) || + !diskfd_to_devpath(fd, 1, cntrl_path)) { + pr_err("failed to get dev paths, aborting\n"); +- __free_imsm_disk(dd, 0); +- return 1; ++ goto error; + } + +- cntrl_name = basename(cntrl_path); + if (is_multipath_nvme(fd)) + pr_err("%s controller supports Multi-Path I/O, Intel (R) VROC does not support multipathing\n", +- cntrl_name); ++ basename(cntrl_path)); + +- if (devpath_to_vendor(pci_dev_path) == 0x8086) { +- /* +- * If Intel's NVMe drive has serial ended with +- * "-A","-B","-1" or "-2" it means that this is "x8" +- * device (double drive on single PCIe card). +- * User should be warned about potential data loss. +- */ +- for (i = MAX_RAID_SERIAL_LEN-1; i > 0; i--) { +- /* Skip empty character at the end */ +- if (dd->serial[i] == 0) +- continue; +- +- if (((dd->serial[i] == 'A') || +- (dd->serial[i] == 'B') || +- (dd->serial[i] == '1') || +- (dd->serial[i] == '2')) && +- (dd->serial[i-1] == '-')) +- pr_err("\tThe action you are about to take may put your data at risk.\n" +- "\tPlease note that x8 devices may consist of two separate x4 devices " +- "located on a single PCIe port.\n" +- "\tRAID 0 is the only supported configuration for this type of x8 device.\n"); +- break; +- } +- } else if (super->hba->type == SYS_DEV_VMD && super->orom && ++ if (super->hba->type == SYS_DEV_VMD && super->orom && + !imsm_orom_has_tpv_support(super->orom)) { + pr_err("\tPlatform configuration does not support non-Intel NVMe drives.\n" + "\tPlease refer to Intel(R) RSTe/VROC user guide.\n"); +- __free_imsm_disk(dd, 0); +- return 1; ++ goto error; + } + } + +- get_dev_size(fd, NULL, &size); +- if (!get_dev_sector_size(fd, NULL, &member_sector_size)) { +- __free_imsm_disk(dd, 0); +- return 1; +- } ++ if (!get_dev_size(fd, NULL, &size) || !get_dev_sector_size(fd, NULL, &member_sector_size)) ++ goto error; + +- if (super->sector_size == 0) { ++ if (super->sector_size == 0) + /* this a first device, so sector_size is not set yet */ + super->sector_size = member_sector_size; +- } + + /* clear migr_rec when adding disk to container */ +- memset(super->migr_rec_buf, 0, MIGR_REC_BUF_SECTORS*MAX_SECTOR_SIZE); +- if (lseek64(fd, size - MIGR_REC_SECTOR_POSITION*member_sector_size, +- SEEK_SET) >= 0) { +- if ((unsigned int)write(fd, super->migr_rec_buf, +- MIGR_REC_BUF_SECTORS*member_sector_size) != +- MIGR_REC_BUF_SECTORS*member_sector_size) ++ memset(super->migr_rec_buf, 0, MIGR_REC_BUF_SECTORS * MAX_SECTOR_SIZE); ++ ++ if (lseek64(fd, (size - MIGR_REC_SECTOR_POSITION * member_sector_size), SEEK_SET) >= 0) { ++ unsigned int nbytes = MIGR_REC_BUF_SECTORS * member_sector_size; ++ ++ if ((unsigned int)write(fd, super->migr_rec_buf, nbytes) != nbytes) + perror("Write migr_rec failed"); + } + + size /= 512; + serialcpy(dd->disk.serial, dd->serial); + set_total_blocks(&dd->disk, size); ++ + if (__le32_to_cpu(dd->disk.total_blocks_hi) > 0) { + struct imsm_super *mpb = super->anchor; ++ + mpb->attributes |= MPB_ATTRIB_2TB_DISK; + } ++ + mark_spare(dd); +- if (sysfs_disk_to_scsi_id(fd, &id) == 0) +- dd->disk.scsi_id = __cpu_to_le32(id); +- else +- dd->disk.scsi_id = __cpu_to_le32(0); + + if (st->update_tail) { + dd->next = super->disk_mgmt_list; +@@ -6113,7 +6085,11 @@ static int add_to_super_imsm(struct supertype *st, mdu_disk_info_t *dk, + write_super_imsm_spare(super, dd); + } + +- return 0; ++ return MDADM_STATUS_SUCCESS; ++ ++error: ++ __free_imsm_disk(dd, 0); ++ return MDADM_STATUS_ERROR; + } + + static int remove_from_super_imsm(struct supertype *st, mdu_disk_info_t *dk) +-- +2.41.0 + diff --git a/SOURCES/0166-imsm-add-IMSM_OROM_CAPABILITIES_TPV-to-nvme-orom.patch b/SOURCES/0166-imsm-add-IMSM_OROM_CAPABILITIES_TPV-to-nvme-orom.patch new file mode 100644 index 0000000..3545f0b --- /dev/null +++ b/SOURCES/0166-imsm-add-IMSM_OROM_CAPABILITIES_TPV-to-nvme-orom.patch @@ -0,0 +1,192 @@ +From b1d38b512aa3162b5089fbf6b02357ed5fdf5760 Mon Sep 17 00:00:00 2001 +From: Mariusz Tkaczyk +Date: Thu, 22 Aug 2024 12:18:06 +0200 +Subject: [PATCH 166/201] imsm: add IMSM_OROM_CAPABILITIES_TPV to nvme orom + +Add it to avoid excluding. It has some value for users even if it is +always true for nvme virtual orom. + +Rework detail-platform printing code, move printing 3rd party nvmes +to print_imsm_capability (as it should be), but keep it meaningful +only for nvme controllers (NVME and VMD hba types). Pass whole +orom_entry instead of orom there. + +Squash code responsible for printing NVME and VMD hbas. + +Signed-off-by: Mariusz Tkaczyk +--- + platform-intel.c | 3 +- + super-intel.c | 76 +++++++++++++++++++++++------------------------- + 2 files changed, 39 insertions(+), 40 deletions(-) + +diff --git a/platform-intel.c b/platform-intel.c +index 3a86f785..21591317 100644 +--- a/platform-intel.c ++++ b/platform-intel.c +@@ -1089,7 +1089,8 @@ const struct imsm_orom *find_imsm_nvme(struct sys_dev *hba) + .vpa = IMSM_OROM_VOLUMES_PER_ARRAY, + .vphba = IMSM_OROM_TOTAL_DISKS_NVME / 2 * IMSM_OROM_VOLUMES_PER_ARRAY, + .attr = IMSM_OROM_ATTR_2TB | IMSM_OROM_ATTR_2TB_DISK, +- .driver_features = IMSM_OROM_CAPABILITIES_EnterpriseSystem ++ .driver_features = IMSM_OROM_CAPABILITIES_EnterpriseSystem | ++ IMSM_OROM_CAPABILITIES_TPV + }; + nvme_orom = add_orom(&nvme_orom_compat); + } +diff --git a/super-intel.c b/super-intel.c +index 50fd56d0..744715d5 100644 +--- a/super-intel.c ++++ b/super-intel.c +@@ -2663,9 +2663,12 @@ static void print_imsm_chunk_size_capability(const struct imsm_orom *orom) + } + + +-static void print_imsm_capability(const struct imsm_orom *orom) ++static void print_imsm_capability(const struct orom_entry *entry) + { ++ const struct imsm_orom *orom = &entry->orom; ++ + printf(" Platform : Intel(R) "); ++ + if (orom->capabilities == 0 && orom->driver_features == 0) + printf("Matrix Storage Manager\n"); + else if (imsm_orom_is_enterprise(orom) && orom->major_ver >= 6) +@@ -2673,6 +2676,7 @@ static void print_imsm_capability(const struct imsm_orom *orom) + else + printf("Rapid Storage Technology%s\n", + imsm_orom_is_enterprise(orom) ? " enterprise" : ""); ++ + if (orom->major_ver || orom->minor_ver || orom->hotfix_ver || orom->build) { + if (imsm_orom_is_vmd_without_efi(orom)) + printf(" Version : %d.%d\n", orom->major_ver, orom->minor_ver); +@@ -2690,11 +2694,19 @@ static void print_imsm_capability(const struct imsm_orom *orom) + printf("\n"); + + printf(" 2TB volumes :%s supported\n", (orom->attr & IMSM_OROM_ATTR_2TB) ? "" : " not"); ++ + printf(" 2TB disks :%s supported\n", + (orom->attr & IMSM_OROM_ATTR_2TB_DISK) ? "" : " not"); ++ + printf(" Max Disks : %d\n", orom->tds); ++ + printf(" Max Volumes : %d per array, %d per %s\n", orom->vpa, orom->vphba, + imsm_orom_is_nvme(orom) ? "platform" : "controller"); ++ ++ if (entry->type == SYS_DEV_VMD || entry->type == SYS_DEV_NVME) ++ /* This is only meaningful for controllers with nvme support */ ++ printf(" 3rd party NVMe :%s supported\n", ++ imsm_orom_has_tpv_support(&entry->orom) ? "" : " not"); + return; + } + +@@ -2733,26 +2745,25 @@ static int detail_platform_imsm(int verbose, int enumerate_only, char *controlle + * platform capabilities. If raid support is disabled in the BIOS the + * option-rom capability structure will not be available. + */ ++ const struct orom_entry *entry; + struct sys_dev *list, *hba; +- int host_base = 0; ++ struct devid_list *devid; + int port_count = 0; +- int result=1; ++ int host_base = 0; ++ int result = 1; + + if (enumerate_only) { + if (check_no_platform()) + return 0; ++ + list = find_intel_devices(); + if (!list) + return 2; +- for (hba = list; hba; hba = hba->next) { +- if (find_imsm_capability(hba)) { +- result = 0; +- break; +- } +- else +- result = 2; +- } +- return result; ++ ++ for (hba = list; hba; hba = hba->next) ++ if (find_imsm_capability(hba)) ++ return 0; ++ return 2; + } + + list = find_intel_devices(); +@@ -2768,6 +2779,7 @@ static int detail_platform_imsm(int verbose, int enumerate_only, char *controlle + continue; + if (!find_imsm_capability(hba)) { + char buf[PATH_MAX]; ++ + pr_err("imsm capabilities not found for controller: %s (type %s)\n", + hba->type == SYS_DEV_VMD || hba->type == SYS_DEV_SATA_VMD ? + vmd_domain_to_controller(hba, buf) : +@@ -2783,40 +2795,27 @@ static int detail_platform_imsm(int verbose, int enumerate_only, char *controlle + return result; + } + +- const struct orom_entry *entry; +- + for (entry = orom_entries; entry; entry = entry->next) { +- if (entry->type == SYS_DEV_VMD) { +- print_imsm_capability(&entry->orom); +- printf(" 3rd party NVMe :%s supported\n", +- imsm_orom_has_tpv_support(&entry->orom)?"":" not"); ++ print_imsm_capability(entry); ++ ++ if (entry->type == SYS_DEV_VMD || entry->type == SYS_DEV_NVME) { + for (hba = list; hba; hba = hba->next) { +- if (hba->type == SYS_DEV_VMD) { +- char buf[PATH_MAX]; ++ char buf[PATH_MAX]; ++ ++ if (hba->type != entry->type) ++ continue; ++ ++ if (hba->type == SYS_DEV_VMD) + printf(" I/O Controller : %s (%s)\n", +- vmd_domain_to_controller(hba, buf), get_sys_dev_type(hba->type)); +- if (print_nvme_info(hba)) { +- if (verbose > 0) +- pr_err("failed to get devices attached to VMD domain.\n"); +- result |= 2; +- } +- } +- } +- printf("\n"); +- continue; +- } ++ vmd_domain_to_controller(hba, buf), ++ get_sys_dev_type(hba->type)); + +- print_imsm_capability(&entry->orom); +- if (entry->type == SYS_DEV_NVME) { +- for (hba = list; hba; hba = hba->next) { +- if (hba->type == SYS_DEV_NVME) +- print_nvme_info(hba); ++ print_nvme_info(hba); + } + printf("\n"); + continue; + } + +- struct devid_list *devid; + for (devid = entry->devid_list; devid; devid = devid->next) { + hba = device_by_id(devid->devid); + if (!hba) +@@ -6035,8 +6034,7 @@ static int add_to_super_imsm(struct supertype *st, mdu_disk_info_t *dk, + pr_err("%s controller supports Multi-Path I/O, Intel (R) VROC does not support multipathing\n", + basename(cntrl_path)); + +- if (super->hba->type == SYS_DEV_VMD && super->orom && +- !imsm_orom_has_tpv_support(super->orom)) { ++ if (super->orom && !imsm_orom_has_tpv_support(super->orom)) { + pr_err("\tPlatform configuration does not support non-Intel NVMe drives.\n" + "\tPlease refer to Intel(R) RSTe/VROC user guide.\n"); + goto error; +-- +2.41.0 + diff --git a/SOURCES/0167-mdadm-Increase-number-limit-in-md-device-name-to-102.patch b/SOURCES/0167-mdadm-Increase-number-limit-in-md-device-name-to-102.patch new file mode 100644 index 0000000..9be51ba --- /dev/null +++ b/SOURCES/0167-mdadm-Increase-number-limit-in-md-device-name-to-102.patch @@ -0,0 +1,33 @@ +From f786072a3e2928766a9b4f1b7d3372a601c259ea Mon Sep 17 00:00:00 2001 +From: Shminderjit Singh +Date: Mon, 26 Aug 2024 10:06:50 +0000 +Subject: [PATCH 167/201] mdadm: Increase number limit in md device name to + 1024. + +Updated the maximum device number in md device names from 127 to 1024. +The previous limit was causing issues in the automation framework. +This change ensures backward compatibility and allows for future +scalability. + +Fixes: 25aa7329141c ("mdadm: numbered names verification") +Signed-off-by: Shminderjit Singh +--- + util.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/util.c b/util.c +index 1cee0feb..2fc0e9f8 100644 +--- a/util.c ++++ b/util.c +@@ -1003,7 +1003,7 @@ static bool is_devname_numbered(const char *devname, const char *pref, const int + if (parse_num(&val, devname + pref_len) != 0) + return false; + +- if (val > 127) ++ if (val > 1024) + return false; + + return true; +-- +2.41.0 + diff --git a/SOURCES/0168-imsm-save-checkpoint-prior-to-exit.patch b/SOURCES/0168-imsm-save-checkpoint-prior-to-exit.patch new file mode 100644 index 0000000..01791e4 --- /dev/null +++ b/SOURCES/0168-imsm-save-checkpoint-prior-to-exit.patch @@ -0,0 +1,44 @@ +From dd0d193ad8722140e240c95a4fd1e214077dd719 Mon Sep 17 00:00:00 2001 +From: Mateusz Kusiak +Date: Mon, 2 Sep 2024 12:27:56 -0400 +Subject: [PATCH 168/201] imsm: save checkpoint prior to exit + +If reshape (eg. chunksize migration) is gracefully stopped via SIGTERM +the checkpoint is not saved and reshape cannot be resumed due to "data +being present in copy area". This is because UNIT_SRC_NORMAL isn't set +if SIGTERM occurred. + +Move SIGTERM handling at the end of the loop to allow saving checkpoint +(and state) so reshapes can be properly resumed. + +Signed-off-by: Mateusz Kusiak +--- + super-intel.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/super-intel.c b/super-intel.c +index 744715d5..30c2939a 100644 +--- a/super-intel.c ++++ b/super-intel.c +@@ -12631,8 +12631,6 @@ static int imsm_manage_reshape( + dprintf("wait_for_reshape_imsm returned error!\n"); + goto abort; + } +- if (sigterm) +- goto abort; + + if (save_checkpoint_imsm(st, sra, UNIT_SRC_NORMAL) == 1) { + /* ignore error == 2, this can mean end of reshape here +@@ -12641,6 +12639,9 @@ static int imsm_manage_reshape( + goto abort; + } + ++ if (sigterm) ++ goto abort; ++ + } + + /* clear migr_rec on disks after successful migration */ +-- +2.41.0 + diff --git a/SOURCES/0169-Examine.c-Fix-memory-leaks-in-Examine.patch b/SOURCES/0169-Examine.c-Fix-memory-leaks-in-Examine.patch new file mode 100644 index 0000000..826f343 --- /dev/null +++ b/SOURCES/0169-Examine.c-Fix-memory-leaks-in-Examine.patch @@ -0,0 +1,116 @@ +From da26064bfe4457d5037f3a1f1bb83a54225c6375 Mon Sep 17 00:00:00 2001 +From: Anna Sztukowska +Date: Thu, 8 Aug 2024 17:02:38 +0200 +Subject: [PATCH 169/201] Examine.c: Fix memory leaks in Examine() + +Fix memory leaks in Examine() reported by SAST analysis. Implement a +method to traverse and free all the nodes of the doubly linked list. +Replace for loop with while loop in order to improve redability of the +code and free allocated memory correctly. + +Signed-off-by: Anna Sztukowska +--- + Examine.c | 22 +++++++++++++++++----- + dlink.c | 15 +++++++++++++++ + dlink.h | 1 + + 3 files changed, 33 insertions(+), 5 deletions(-) + +diff --git a/Examine.c b/Examine.c +index c9605a60..fe162167 100644 +--- a/Examine.c ++++ b/Examine.c +@@ -111,8 +111,10 @@ int Examine(struct mddev_dev *devlist, + close(fd); + + if (err) { +- if (st) ++ if (st) { + st->ss->free_super(st); ++ free(st); ++ } + continue; + } + +@@ -152,19 +154,24 @@ int Examine(struct mddev_dev *devlist, + if (st->ss->export_examine_super) + st->ss->export_examine_super(st); + st->ss->free_super(st); ++ free(st); + } else { + printf("%s:\n",devlist->devname); + st->ss->examine_super(st, c->homehost); + st->ss->free_super(st); ++ free(st); + } + } + if (c->brief) { +- struct array *ap; +- for (ap = arrays; ap; ap = ap->next) { ++ struct array *ap = arrays, *next; ++ ++ while (ap) { + char sep='='; + char *d; + int newline = 0; + ++ next = ap->next; ++ + ap->st->ss->brief_examine_super(ap->st, c->verbose > 0); + if (ap->spares && !ap->st->ss->external) + newline += printf(" spares=%d", ap->spares); +@@ -182,10 +189,15 @@ int Examine(struct mddev_dev *devlist, + printf("\n"); + ap->st->ss->brief_examine_subarrays(ap->st, c->verbose); + } +- ap->st->ss->free_super(ap->st); +- /* FIXME free ap */ + if (ap->spares || c->verbose > 0) + printf("\n"); ++ ++ ap->st->ss->free_super(ap->st); ++ free(ap->st); ++ dl_free_all(ap->devs); ++ free(ap); ++ ++ ap = next; + } + } + return rv; +diff --git a/dlink.c b/dlink.c +index 69aa7aa3..34633672 100644 +--- a/dlink.c ++++ b/dlink.c +@@ -26,6 +26,21 @@ void dl_free(void *v) + free(vv-1); + } + ++void dl_free_all(void *head) ++{ ++ /* The list head is linked with the list tail so in order to free ++ * all the elements properly there is a need to keep starting point. ++ */ ++ void *d = dl_next(head), *next; ++ ++ while (d != head) { ++ next = dl_next(d); ++ dl_free(d); ++ d = next; ++ } ++ dl_free(head); ++} ++ + void dl_init(void *v) + { + dl_next(v) = v; +diff --git a/dlink.h b/dlink.h +index ab2a9459..ce667839 100644 +--- a/dlink.h ++++ b/dlink.h +@@ -23,3 +23,4 @@ void dl_add(void*, void*); + void dl_del(void*); + void dl_free(void*); + void dl_init(void*); ++void dl_free_all(void *head); +-- +2.41.0 + diff --git a/SOURCES/0170-dlink.h-Fix-checkpatch-warnings-for-function-args.patch b/SOURCES/0170-dlink.h-Fix-checkpatch-warnings-for-function-args.patch new file mode 100644 index 0000000..13038b1 --- /dev/null +++ b/SOURCES/0170-dlink.h-Fix-checkpatch-warnings-for-function-args.patch @@ -0,0 +1,39 @@ +From be1b4ff0957b287b2d8494967a7f0a1e3401dd8a Mon Sep 17 00:00:00 2001 +From: Anna Sztukowska +Date: Mon, 9 Sep 2024 09:36:47 +0200 +Subject: [PATCH 170/201] dlink.h: Fix checkpatch warnings for function args + +Checkpatch issued a warning due to missing function argument names. +Add the names to resolve the warnings. + +Signed-off-by: Anna Sztukowska +--- + dlink.h | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +diff --git a/dlink.h b/dlink.h +index ce667839..18cc294a 100644 +--- a/dlink.h ++++ b/dlink.h +@@ -16,11 +16,11 @@ struct __dl_head + #define dl_prev(p) *(&(((struct __dl_head*)(p))[-1].dh_prev)) + + void *dl_head(void); +-char *dl_strdup(char *); +-char *dl_strndup(char *, int); +-void dl_insert(void*, void*); +-void dl_add(void*, void*); +-void dl_del(void*); +-void dl_free(void*); +-void dl_init(void*); ++char *dl_strdup(char *s); ++char *dl_strndup(char *s, int l); ++void dl_insert(void *head, void *val); ++void dl_add(void *head, void *val); ++void dl_del(void *val); ++void dl_free(void *v); ++void dl_init(void *v); + void dl_free_all(void *head); +-- +2.41.0 + diff --git a/SOURCES/0171-Incremental-support-devnode-in-IncrementalRemove.patch b/SOURCES/0171-Incremental-support-devnode-in-IncrementalRemove.patch new file mode 100644 index 0000000..c31cfb8 --- /dev/null +++ b/SOURCES/0171-Incremental-support-devnode-in-IncrementalRemove.patch @@ -0,0 +1,151 @@ +From 9b8933bb6dbfcae1bd5a2f933c87684de99412de Mon Sep 17 00:00:00 2001 +From: Mariusz Tkaczyk +Date: Tue, 25 Jun 2024 12:53:46 +0200 +Subject: [PATCH 171/201] Incremental: support devnode in IncrementalRemove. + +There are no reasons to keep this interface different than others. +Allow to use devnode but keep old way for backward compatibility. +Method is added to verify that only devnode or kernel name is used. + +Signed-off-by: Mariusz Tkaczyk +--- + Incremental.c | 60 ++++++++++++++++++++++++------------- + mdadm.h | 5 ++++ + udev-md-raid-assembly.rules | 4 +-- + 3 files changed, 46 insertions(+), 23 deletions(-) + +diff --git a/Incremental.c b/Incremental.c +index fc4e68ff..c1389a15 100644 +--- a/Incremental.c ++++ b/Incremental.c +@@ -1674,33 +1674,52 @@ static void remove_from_member_array(struct mdstat_ent *memb, + } + } + +-/* +- * IncrementalRemove - Attempt to see if the passed in device belongs to any +- * raid arrays, and if so first fail (if needed) and then remove the device. ++/** ++ * is_devnode_path() - check if the devname passed might be devnode path. ++ * @devnode: the path to check. + * +- * @devname - The device we want to remove +- * @id_path - name as found in /dev/disk/by-path for this device ++ * Devnode must be located directly in /dev directory. It is not checking existence of the file ++ * because the device might no longer exist during removal from raid array. ++ */ ++static bool is_devnode_path(char *devnode) ++{ ++ char *devnm = strrchr(devnode, '/'); ++ ++ if (!devnm || *(devnm + 1) == 0) ++ return false; ++ ++ if (strncmp(devnode, DEV_DIR, DEV_DIR_LEN) == 0 && devnode + DEV_DIR_LEN - 1 == devnm) ++ return true; ++ ++ return false; ++} ++ ++/** ++ * IncrementalRemove() - Remove the device from all raid arrays. ++ * @devname: the device we want to remove, it could be kernel device name or devnode. ++ * @id_path: optional, /dev/disk/by-path path to save for bare scenarios support. ++ * @verbose: verbose flag. + * +- * Note: the device name must be a kernel name like "sda", so +- * that we can find it in /proc/mdstat ++ * First, fail the device (if needed) and then remove the device from native raid array or external ++ * container. If it is external container, the device is removed from each subarray first. + */ + int IncrementalRemove(char *devname, char *id_path, int verbose) + { +- struct mdstat_ent *ent = NULL; ++ char *devnm = basename(devname); ++ struct mddev_dev devlist = {0}; + char buf[SYSFS_MAX_BUF_SIZE]; + struct mdstat_ent *mdstat; +- struct mddev_dev devlist; ++ struct mdstat_ent *ent; + struct mdinfo mdi; + int rv = 1; + int mdfd; + +- if (!id_path) +- dprintf("incremental removal without --path lacks the possibility to re-add new device in this port\n"); +- +- if (strchr(devname, '/')) { +- pr_err("incremental removal requires a kernel device name, not a file: %s\n", devname); +- return 1; +- } ++ if (strcmp(devnm, devname) != 0) ++ if (!is_devnode_path(devname)) { ++ pr_err("Cannot remove \"%s\", devnode path or kernel device name is allowed.\n", ++ devname); ++ return 1; ++ } + + mdstat = mdstat_read(0, 0); + if (!mdstat) { +@@ -1708,15 +1727,15 @@ int IncrementalRemove(char *devname, char *id_path, int verbose) + return 1; + } + +- ent = mdstat_find_by_member_name(mdstat, devname); ++ ent = mdstat_find_by_member_name(mdstat, devnm); + if (!ent) { + if (verbose >= 0) +- pr_err("%s does not appear to be a component of any array\n", devname); ++ pr_vrb("%s does not appear to be a component of any array\n", devnm); + goto out; + } + + if (sysfs_init(&mdi, -1, ent->devnm)) { +- pr_err("unable to initialize sysfs for: %s\n", devname); ++ pr_err("unable to initialize sysfs for: %s\n", devnm); + goto out; + } + +@@ -1746,8 +1765,7 @@ int IncrementalRemove(char *devname, char *id_path, int verbose) + map_free(map); + } + +- memset(&devlist, 0, sizeof(devlist)); +- devlist.devname = devname; ++ devlist.devname = devnm; + devlist.disposition = 'I'; + /* for a container, we must fail each member array */ + if (is_mdstat_ent_external(ent)) { +diff --git a/mdadm.h b/mdadm.h +index 5c3a9836..f3b9f54c 100644 +--- a/mdadm.h ++++ b/mdadm.h +@@ -100,6 +100,11 @@ struct dlm_lksb { + #define DEFAULT_BITMAP_DELAY 5 + #define DEFAULT_MAX_WRITE_BEHIND 256 + ++#ifndef DEV_DIR ++#define DEV_DIR "/dev/" ++#define DEV_DIR_LEN (sizeof(DEV_DIR) - 1) ++#endif /* DEV_DIR */ ++ + /* DEV_NUM_PREF is a subpath to numbered MD devices, e.g. /dev/md1 or directory name. + * DEV_NUM_PREF_LEN is a length with Null byte excluded. + */ +diff --git a/udev-md-raid-assembly.rules b/udev-md-raid-assembly.rules +index d4a7f0a5..4cd2c6f4 100644 +--- a/udev-md-raid-assembly.rules ++++ b/udev-md-raid-assembly.rules +@@ -41,7 +41,7 @@ ACTION=="change", KERNEL!="dm-*|md*", GOTO="md_inc_end" + ACTION!="remove", IMPORT{program}="BINDIR/mdadm --incremental --export $devnode --offroot $env{DEVLINKS}" + ACTION!="remove", ENV{MD_STARTED}=="*unsafe*", ENV{MD_FOREIGN}=="no", ENV{SYSTEMD_WANTS}+="mdadm-last-resort@$env{MD_DEVICE}.timer" + +-ACTION=="remove", ENV{ID_PATH}=="?*", RUN+="BINDIR/mdadm -If $name --path $env{ID_PATH}" +-ACTION=="remove", ENV{ID_PATH}!="?*", RUN+="BINDIR/mdadm -If $name" ++ACTION=="remove", ENV{ID_PATH}=="?*", RUN+="BINDIR/mdadm -If $devnode --path $env{ID_PATH}" ++ACTION=="remove", ENV{ID_PATH}!="?*", RUN+="BINDIR/mdadm -If $devnode" + + LABEL="md_inc_end" +-- +2.41.0 + diff --git a/SOURCES/0172-Detail.c-Fix-divide_by_zero-issue.patch b/SOURCES/0172-Detail.c-Fix-divide_by_zero-issue.patch new file mode 100644 index 0000000..59d92d8 --- /dev/null +++ b/SOURCES/0172-Detail.c-Fix-divide_by_zero-issue.patch @@ -0,0 +1,75 @@ +From 7b65dd6d71dfff35847440e19d309990dfcb29d3 Mon Sep 17 00:00:00 2001 +From: Anna Sztukowska +Date: Mon, 29 Jul 2024 07:47:39 +0200 +Subject: [PATCH 172/201] Detail.c: Fix divide_by_zero issue + +Fix divide_by_zero issue reported by SAST analysis in Detail.c when +calling enough() from util.c. Also add missing spaces for better code +readability. + +Signed-off-by: Anna Sztukowska +--- + util.c | 15 +++++++++------ + 1 file changed, 9 insertions(+), 6 deletions(-) + +diff --git a/util.c b/util.c +index 2fc0e9f8..cc162278 100644 +--- a/util.c ++++ b/util.c +@@ -513,6 +513,9 @@ int enough(int level, int raid_disks, int layout, int clean, char *avail) + int i; + int avail_disks = 0; + ++ if (raid_disks <= 0) ++ return 0; ++ + for (i = 0; i < raid_disks; i++) + avail_disks += !!avail[i]; + +@@ -521,7 +524,7 @@ int enough(int level, int raid_disks, int layout, int clean, char *avail) + /* This is the tricky one - we need to check + * which actual disks are present. + */ +- copies = (layout&255)* ((layout>>8) & 255); ++ copies = (layout & 255) * ((layout >> 8) & 255); + first = 0; + do { + /* there must be one of the 'copies' form 'first' */ +@@ -531,16 +534,16 @@ int enough(int level, int raid_disks, int layout, int clean, char *avail) + while (n--) { + if (avail[this]) + cnt++; +- this = (this+1) % raid_disks; ++ this = (this + 1) % raid_disks; + } + if (cnt == 0) + return 0; +- first = (first+(layout&255)) % raid_disks; ++ first = (first + (layout & 255)) % raid_disks; + } while (first != 0); + return 1; + + case LEVEL_MULTIPATH: +- return avail_disks>= 1; ++ return avail_disks >= 1; + case LEVEL_LINEAR: + case 0: + return avail_disks == raid_disks; +@@ -556,12 +559,12 @@ int enough(int level, int raid_disks, int layout, int clean, char *avail) + /* FALL THROUGH */ + case 5: + if (clean) +- return avail_disks >= raid_disks-1; ++ return avail_disks >= raid_disks - 1; + else + return avail_disks >= raid_disks; + case 6: + if (clean) +- return avail_disks >= raid_disks-2; ++ return avail_disks >= raid_disks - 2; + else + return avail_disks >= raid_disks; + default: +-- +2.41.0 + diff --git a/SOURCES/0173-mdadm-Add-compilation-process-to-README.md.patch b/SOURCES/0173-mdadm-Add-compilation-process-to-README.md.patch new file mode 100644 index 0000000..cfb5064 --- /dev/null +++ b/SOURCES/0173-mdadm-Add-compilation-process-to-README.md.patch @@ -0,0 +1,81 @@ +From 983e9226fb02a91692c2c55a19b5cd06d8ddd005 Mon Sep 17 00:00:00 2001 +From: Anna Sztukowska +Date: Tue, 6 Aug 2024 10:44:01 +0200 +Subject: [PATCH 173/201] mdadm: Add compilation process to README.md + +Add compilation process and dependencies to README.md. + +Signed-off-by: Anna Sztukowska +--- + README.md | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 55 insertions(+) + +diff --git a/README.md b/README.md +index 486c8929..870ecb7e 100644 +--- a/README.md ++++ b/README.md +@@ -87,6 +87,61 @@ If there are differences between github and kernel.org, please contact kernel.or + We do not support kernel versions below **v3.10**. Please be aware that maintainers may remove + workarounds and fixes for legacy issues. + ++# Dependencies ++ ++The following packages are required for compilation: ++ ++| RHEL | SLES | Debian/Ubuntu | ++| :---: | :---: | :---: | ++| `pkgconf` | `pkg-config` | `pkg-config` | ++| `gcc` | `gcc` | `gcc` | ++| `make` | `make` | `make` | ++| `libudev-devel` | `libudev-devel` | `libudev-dev` | ++ ++# Compiling mdadm ++ ++Run `make` command to compile mdadm. ++ ++Specifying more jobs e.g. `make -j4` can decrease compilation time significantly. ++ ++Various values can be specified for the `CXFLAGS` variable to customize the build process: ++- Run `make CXFLAGS=-ggdb` to include gdb debugging information. ++- Run `make CXFLAGS=-DDEBUG` to enable additional debug information through dprintf statements ++and call traces. ++- Run `make CXFLAGS=-DNO_LIBUDEV` to compile without `libudev`. ++ ++To build with more than one option specified in `CXFLAGS`, separate each option with a space, e.g. ++`make CXFLAGS="-ggdb -DDEBUG"`. ++ ++Additionally, the `EXTRAVERSION` variable can be set to build with user-friendly version label, ++useful when customizing mdadm builds or labeling some instance in between major releases, ++e.g. `make EXTRAVERSION="custom-label"`. ++ ++# Installing mdadm ++ ++Before installing mdadm, it is advised to uninstall vendor-provided packages (mdadm.deb, mdadm.rpm ++etc.) in order to avoid configuration issues. ++ ++Run `make install` command to install mdadm. This command invokes the following targets: ++- `install-bin` ++- `install-man` ++- `install-udev` ++ ++After installing mdadm, consider rebuilding initramfs to ensure the changes take effect. ++ ++List of installation targets: ++- Run `make install-bin` to install the mdadm and mdmon binary files. ++- Run `make install-systemd` to install the systemd services. ++- Run `make install-udev` to install the udev rules. ++- Run `make install-man` to install the manual pages (`mdadm.8`, `md.4`, `mdadm.conf.5`, ++`mdmon.8`). ++ ++The following targets are deprecated and should not be used: ++- `install-static` ++- `install-tcc` ++- `install-uclibc` ++- `install-klibc` ++ + # License + + It is released under the terms of the **GNU General Public License version 2** as published +-- +2.41.0 + diff --git a/SOURCES/0174-mdadm-Grow-Update-new-level-when-starting-reshape.patch b/SOURCES/0174-mdadm-Grow-Update-new-level-when-starting-reshape.patch new file mode 100644 index 0000000..0541434 --- /dev/null +++ b/SOURCES/0174-mdadm-Grow-Update-new-level-when-starting-reshape.patch @@ -0,0 +1,53 @@ +From 21212f6ad7c634f5f114f342ca84fe8c42a13f40 Mon Sep 17 00:00:00 2001 +From: Xiao Ni +Date: Wed, 11 Sep 2024 16:54:23 +0800 +Subject: [PATCH 174/201] mdadm/Grow: Update new level when starting reshape + +Reshape needs to specify a backup file when it can't update data offset +of member disks. For this situation, first, it starts reshape and then +it kicks off mdadm-grow-continue service which does backup job and +monitors the reshape process. The service is a new process, so it needs +to read superblock from member disks to get information. + +But in the first step, it doesn't update new level in superblock. So +it can't change level after reshape finishes, because the new level is +not right. So records the new level in the first step. + +Signed-off-by: Xiao Ni +Signed-off-by: Mariusz Tkaczyk +--- + Grow.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/Grow.c b/Grow.c +index 5810b128..533f3014 100644 +--- a/Grow.c ++++ b/Grow.c +@@ -2941,15 +2941,24 @@ static int impose_reshape(struct mdinfo *sra, + * persists from some earlier problem. + */ + int err = 0; ++ + if (sysfs_set_num(sra, NULL, "chunk_size", info->new_chunk) < 0) + err = errno; ++ + if (!err && sysfs_set_num(sra, NULL, "layout", + reshape->after.layout) < 0) + err = errno; ++ ++ /* new_level is introduced in kernel 6.12 */ ++ if (!err && get_linux_version() >= 6012000 && ++ sysfs_set_num(sra, NULL, "new_level", info->new_level) < 0) ++ err = errno; ++ + if (!err && subarray_set_num(container, sra, "raid_disks", + reshape->after.data_disks + + reshape->parity) < 0) + err = errno; ++ + if (err) { + pr_err("Cannot set device shape for %s\n", devname); + +-- +2.41.0 + diff --git a/SOURCES/0175-mdadm-Grow-Update-reshape_progress-to-need_back-afte.patch b/SOURCES/0175-mdadm-Grow-Update-reshape_progress-to-need_back-afte.patch new file mode 100644 index 0000000..dc5a889 --- /dev/null +++ b/SOURCES/0175-mdadm-Grow-Update-reshape_progress-to-need_back-afte.patch @@ -0,0 +1,57 @@ +From 568259859cafeefbf54354c19405cf2292da4b4a Mon Sep 17 00:00:00 2001 +From: Xiao Ni +Date: Wed, 11 Sep 2024 16:54:24 +0800 +Subject: [PATCH 175/201] mdadm/Grow: Update reshape_progress to need_back + after reshape finishes + +It tries to update data offset when kicking off reshape. If it can't +change data offset, it needs to use child_monitor to monitor reshape +progress and do back up job. And it needs to update reshape_progress +to need_back when reshape finishes. If not, it will be in a infinite +loop. + +Signed-off-by: Xiao Ni +Signed-off-by: Mariusz Tkaczyk +--- + Grow.c | 14 ++++++++++---- + 1 file changed, 10 insertions(+), 4 deletions(-) + +diff --git a/Grow.c b/Grow.c +index 533f3014..3b9f9942 100644 +--- a/Grow.c ++++ b/Grow.c +@@ -4148,8 +4148,8 @@ int progress_reshape(struct mdinfo *info, struct reshape *reshape, + * waiting forever on a dead array + */ + char action[SYSFS_MAX_BUF_SIZE]; +- if (sysfs_get_str(info, NULL, "sync_action", action, sizeof(action)) <= 0 || +- strncmp(action, "reshape", 7) != 0) ++ ++ if (sysfs_get_str(info, NULL, "sync_action", action, sizeof(action)) <= 0) + break; + /* Some kernels reset 'sync_completed' to zero + * before setting 'sync_action' to 'idle'. +@@ -4157,12 +4157,18 @@ int progress_reshape(struct mdinfo *info, struct reshape *reshape, + */ + if (completed == 0 && advancing && + strncmp(action, "idle", 4) == 0 && +- info->reshape_progress > 0) ++ info->reshape_progress > 0) { ++ info->reshape_progress = need_backup; + break; ++ } + if (completed == 0 && !advancing && + strncmp(action, "idle", 4) == 0 && + info->reshape_progress < +- (info->component_size * reshape->after.data_disks)) ++ (info->component_size * reshape->after.data_disks)) { ++ info->reshape_progress = need_backup; ++ break; ++ } ++ if (strncmp(action, "reshape", 7) != 0) + break; + sysfs_wait(fd, NULL); + if (sysfs_fd_get_ll(fd, &completed) < 0) +-- +2.41.0 + diff --git a/SOURCES/0176-mdadm-Grow-Can-t-open-raid-when-running-grow-continu.patch b/SOURCES/0176-mdadm-Grow-Can-t-open-raid-when-running-grow-continu.patch new file mode 100644 index 0000000..ebe0d4a --- /dev/null +++ b/SOURCES/0176-mdadm-Grow-Can-t-open-raid-when-running-grow-continu.patch @@ -0,0 +1,38 @@ +From cd94b9adf7d53457d86cdc39b983b18713f24032 Mon Sep 17 00:00:00 2001 +From: Xiao Ni +Date: Wed, 11 Sep 2024 16:54:25 +0800 +Subject: [PATCH 176/201] mdadm/Grow: Can't open raid when running --grow + --continue + +It passes 'array' as devname in Grow_continue. So it fails to +open raid device. Use mdinfo to open raid device. + +Signed-off-by: Xiao Ni +Signed-off-by: Mariusz Tkaczyk +--- + Grow.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +diff --git a/Grow.c b/Grow.c +index 3b9f9942..ebb53a0d 100644 +--- a/Grow.c ++++ b/Grow.c +@@ -3694,9 +3694,12 @@ started: + set_array_size(st, info, info->text_version); + + if (info->new_level != reshape.level) { +- if (fd < 0) +- fd = open(devname, O_RDONLY); +- impose_level(fd, info->new_level, devname, verbose); ++ fd = open_dev(sra->sys_name); ++ if (fd < 0) { ++ pr_err("Can't open %s\n", sra->sys_name); ++ goto out; ++ } ++ impose_level(fd, info->new_level, sra->sys_name, verbose); + close(fd); + if (info->new_level == 0) + st->update_tail = NULL; +-- +2.41.0 + diff --git a/SOURCES/0177-mdadm-Grow-sleep-a-while-after-removing-disk-in-impo.patch b/SOURCES/0177-mdadm-Grow-sleep-a-while-after-removing-disk-in-impo.patch new file mode 100644 index 0000000..7e60aca --- /dev/null +++ b/SOURCES/0177-mdadm-Grow-sleep-a-while-after-removing-disk-in-impo.patch @@ -0,0 +1,39 @@ +From 166e5e2fc4b634df100ccc0010035f925bb2ad63 Mon Sep 17 00:00:00 2001 +From: Xiao Ni +Date: Wed, 11 Sep 2024 16:54:26 +0800 +Subject: [PATCH 177/201] mdadm/Grow: sleep a while after removing disk in + impose_level + +It needs to remove disks when reshaping from raid456 to raid0. In +kernel space it sets MD_RECOVERY_RUNNING. And it will fail to change +level. So wait sometime to let md thread to clear this flag. + +This is found by test case 05r6tor0. + +Signed-off-by: Xiao Ni +Signed-off-by: Mariusz Tkaczyk +--- + Grow.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/Grow.c b/Grow.c +index ebb53a0d..60076f56 100644 +--- a/Grow.c ++++ b/Grow.c +@@ -3034,6 +3034,13 @@ static int impose_level(int fd, int level, char *devname, int verbose) + makedev(disk.major, disk.minor)); + hot_remove_disk(fd, makedev(disk.major, disk.minor), 1); + } ++ /* ++ * hot_remove_disk lets kernel set MD_RECOVERY_RUNNING ++ * and it can't set level. It needs to wait sometime ++ * to let md thread to clear the flag. ++ */ ++ pr_info("wait 5 seconds to give kernel space to finish job\n"); ++ sleep_for(5, 0, true); + } + c = map_num(pers, level); + if (c) { +-- +2.41.0 + diff --git a/SOURCES/0178-mdadm-tests-wait-until-level-changes.patch b/SOURCES/0178-mdadm-tests-wait-until-level-changes.patch new file mode 100644 index 0000000..3437de6 --- /dev/null +++ b/SOURCES/0178-mdadm-tests-wait-until-level-changes.patch @@ -0,0 +1,33 @@ +From 098337f31de3f0683cd99727104c81db81fda9cd Mon Sep 17 00:00:00 2001 +From: Xiao Ni +Date: Wed, 11 Sep 2024 16:54:27 +0800 +Subject: [PATCH 178/201] mdadm/tests: wait until level changes + +check wait waits reshape finishes, but it doesn't wait level changes. +The level change happens in a forked child progress. So we need to +search the child progress and monitor it. + +Signed-off-by: Xiao Ni +Signed-off-by: Mariusz Tkaczyk +--- + tests/05r6tor0 | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/tests/05r6tor0 b/tests/05r6tor0 +index 2fd51f2e..b2685b72 100644 +--- a/tests/05r6tor0 ++++ b/tests/05r6tor0 +@@ -13,6 +13,10 @@ check raid5 + testdev $md0 3 19456 512 + mdadm -G $md0 -l0 + check wait; sleep 1 ++while ps auxf | grep "mdadm -G" | grep -v grep ++do ++ sleep 1 ++done + check raid0 + testdev $md0 3 19456 512 + mdadm -G $md0 -l5 --add $dev3 $dev4 +-- +2.41.0 + diff --git a/SOURCES/0179-mdadm-tests-07changelevels-fix.patch b/SOURCES/0179-mdadm-tests-07changelevels-fix.patch new file mode 100644 index 0000000..68805a4 --- /dev/null +++ b/SOURCES/0179-mdadm-tests-07changelevels-fix.patch @@ -0,0 +1,179 @@ +From f5b2dddd258084836634e169c84400e82825996c Mon Sep 17 00:00:00 2001 +From: Xiao Ni +Date: Wed, 11 Sep 2024 16:54:28 +0800 +Subject: [PATCH 179/201] mdadm/tests: 07changelevels fix + +There are five changes to this case. + +1. remove testdev check. It can't work anymore and check if it's a +block device directly. + +2. It can't change level and chunk size at the same time + +3. Sleep more than 10s before check wait. +The test devices are small. Sometimes it can finish so quickly once +the reshape just starts. mdadm will be stuck before it waits reshape +to start. So the sync speed is limited. And it restores the sync speed +when it waits reshape to finish. It's good for case without backup +file. + +It uses systemd service mdadm-grow-continue to monitor reshape +progress when specifying backup file. If reshape finishes so quickly +before it starts monitoring reshape progress, the daemon will be stuck +too. Because reshape_progress is 0 which means the reshape hasn't been +started. So give more time to let service can get right information +from kernel space. + +But before getting these information. It needs to suspend array. At +the same time the reshape is running. The kernel reshape daemon will +update metadata 10s. So it needs to limit the sync speed more than 10s +before restoring sync speed. Then systemd service can suspend array +and start monitoring reshape progress. + +4. Wait until mdadm-grow-continue service exits +mdadm --wait doesn't wait systemd service. For the case that needs +backup file, systemd service deletes the backup file after reshape +finishes. In this test case, it runs next case when reshape finishes. +And it fails because it can't create backup file because the backup +file exits. + +5. Don't reshape from raid5 to raid1. It can't work now. + +Signed-off-by: Xiao Ni +Signed-off-by: Mariusz Tkaczyk +--- + dev/null | 0 + tests/07changelevels | 27 ++++++++++++--------------- + tests/07changelevels.broken | 9 --------- + tests/func.sh | 4 ++++ + 4 files changed, 16 insertions(+), 24 deletions(-) + create mode 100644 dev/null + delete mode 100644 tests/07changelevels.broken + +diff --git a/dev/null b/dev/null +new file mode 100644 +index 00000000..e69de29b +diff --git a/tests/07changelevels b/tests/07changelevels +index a328874a..3df8660e 100644 +--- a/tests/07changelevels ++++ b/tests/07changelevels +@@ -10,7 +10,6 @@ export MDADM_GROW_VERIFY=1 + dotest() { + sleep 2 + check wait +- testdev $md0 $1 19968 64 nd + blockdev --flushbufs $md0 + cmp -s -n $[textK*1024] $md0 /tmp/RandFile || { echo cmp failed; exit 2; } + # write something new - shift chars 4 space +@@ -24,7 +23,7 @@ checkgeo() { + # level raid_disks chunk_size layout + dev=$1 + shift +- sleep 0.5 ++ sleep 15 + check wait + sleep 1 + for attr in level raid_disks chunk_size layout +@@ -43,22 +42,25 @@ checkgeo() { + + bu=/tmp/md-test-backup + rm -f $bu +-mdadm -CR $md0 -l1 -n2 -x1 $dev0 $dev1 $dev2 -z 19968 +-testdev $md0 1 $mdsize1a 64 ++mdadm -CR $md0 -l1 -n2 -x1 $dev0 $dev1 $dev2 ++[ -b $md0 ] || die "$1 isn't a block device." + dd if=/tmp/RandFile of=$md0 + dotest 1 + +-mdadm --grow $md0 -l5 -n3 --chunk 64 ++mdadm --grow $md0 -l5 -n3 ++checkgeo md0 raid5 3 + dotest 2 + + mdadm $md0 --add $dev3 $dev4 + mdadm --grow $md0 -n4 --chunk 32 ++checkgeo md0 raid5 4 $[32*1024] + dotest 3 + + mdadm -G $md0 -l6 --backup-file $bu ++checkgeo md0 raid6 5 $[32*1024] + dotest 3 + +-mdadm -G /dev/md0 --array-size 39936 ++mdadm -G /dev/md0 --array-size 37888 + mdadm -G $md0 -n4 --backup-file $bu + checkgeo md0 raid6 4 $[32*1024] + dotest 2 +@@ -67,14 +69,11 @@ mdadm -G $md0 -l5 --backup-file $bu + checkgeo md0 raid5 3 $[32*1024] + dotest 2 + +-mdadm -G /dev/md0 --array-size 19968 ++mdadm -G /dev/md0 --array-size 18944 + mdadm -G $md0 -n2 --backup-file $bu + checkgeo md0 raid5 2 $[32*1024] + dotest 1 + +-mdadm -G --level=1 $md0 +-dotest 1 +- + # now repeat that last few steps only with a degraded array. + mdadm -S $md0 + mdadm -CR $md0 -l6 -n5 $dev0 $dev1 $dev2 $dev3 $dev4 +@@ -83,7 +82,7 @@ dotest 3 + + mdadm $md0 --fail $dev0 + +-mdadm -G /dev/md0 --array-size 37888 ++mdadm -G /dev/md0 --array-size 35840 + mdadm -G $md0 -n4 --backup-file $bu + dotest 2 + checkgeo md0 raid6 4 $[512*1024] +@@ -103,12 +102,10 @@ dotest 2 + mdadm -G $md0 -l5 --backup-file $bu + dotest 2 + +-mdadm -G /dev/md0 --array-size 18944 ++mdadm -G /dev/md0 --array-size 17920 + mdadm -G $md0 -n2 --backup-file $bu + dotest 1 + checkgeo md0 raid5 2 $[512*1024] + mdadm $md0 --fail $dev2 + +-mdadm -G --level=1 $md0 +-dotest 1 +-checkgeo md0 raid1 2 ++mdadm -S $md0 +diff --git a/tests/07changelevels.broken b/tests/07changelevels.broken +deleted file mode 100644 +index 9b930d93..00000000 +--- a/tests/07changelevels.broken ++++ /dev/null +@@ -1,9 +0,0 @@ +-always fails +- +-Fails with errors: +- +- mdadm: /dev/loop0 is smaller than given size. 18976K < 19968K + metadata +- mdadm: /dev/loop1 is smaller than given size. 18976K < 19968K + metadata +- mdadm: /dev/loop2 is smaller than given size. 18976K < 19968K + metadata +- +- ERROR: /dev/md0 isn't a block device. +diff --git a/tests/func.sh b/tests/func.sh +index e7ccc4fc..567d91d9 100644 +--- a/tests/func.sh ++++ b/tests/func.sh +@@ -362,6 +362,10 @@ check() { + do + sleep 0.5 + done ++ while ps auxf | grep "mdadm --grow --continue" | grep -v grep ++ do ++ sleep 1 ++ done + echo $min > /proc/sys/dev/raid/speed_limit_min + echo $max > /proc/sys/dev/raid/speed_limit_max + ;; +-- +2.41.0 + diff --git a/SOURCES/0180-mdadm-tests-Remove-07reshape5intr.broken.patch b/SOURCES/0180-mdadm-tests-Remove-07reshape5intr.broken.patch new file mode 100644 index 0000000..901ac9f --- /dev/null +++ b/SOURCES/0180-mdadm-tests-Remove-07reshape5intr.broken.patch @@ -0,0 +1,68 @@ +From 01f5aefd830d6ad5357de4d6f5ce139b415a62b9 Mon Sep 17 00:00:00 2001 +From: Xiao Ni +Date: Wed, 11 Sep 2024 16:54:29 +0800 +Subject: [PATCH 180/201] mdadm/tests: Remove 07reshape5intr.broken + +07reshape5intr can run successfully now. + +Signed-off-by: Xiao Ni +Signed-off-by: Mariusz Tkaczyk +--- + tests/07reshape5intr.broken | 45 ------------------------------------- + 1 file changed, 45 deletions(-) + delete mode 100644 tests/07reshape5intr.broken + +diff --git a/tests/07reshape5intr.broken b/tests/07reshape5intr.broken +deleted file mode 100644 +index efe52a66..00000000 +--- a/tests/07reshape5intr.broken ++++ /dev/null +@@ -1,45 +0,0 @@ +-always fails +- +-This patch, recently added to md-next causes the test to always fail: +- +-7e6ba434cc60 ("md: don't unregister sync_thread with reconfig_mutex +-held") +- +-The new error is simply: +- +- ERROR: no reshape happening +- +-Before the patch, the error seen is below. +- +--- +- +-fails infrequently +- +-Fails roughly 1 in 4 runs with errors: +- +- mdadm: Merging with already-assembled /dev/md/0 +- mdadm: cannot re-read metadata from /dev/loop6 - aborting +- +- ERROR: no reshape happening +- +-Also have seen a random deadlock: +- +- INFO: task mdadm:109702 blocked for more than 30 seconds. +- Not tainted 5.18.0-rc3-eid-vmlocalyes-dbg-00095-g3c2b5427979d #2040 +- "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. +- task:mdadm state:D stack: 0 pid:109702 ppid: 1 flags:0x00004000 +- Call Trace: +- +- __schedule+0x67e/0x13b0 +- schedule+0x82/0x110 +- mddev_suspend+0x2e1/0x330 +- suspend_lo_store+0xbd/0x140 +- md_attr_store+0xcb/0x130 +- sysfs_kf_write+0x89/0xb0 +- kernfs_fop_write_iter+0x202/0x2c0 +- new_sync_write+0x222/0x330 +- vfs_write+0x3bc/0x4d0 +- ksys_write+0xd9/0x180 +- __x64_sys_write+0x43/0x50 +- do_syscall_64+0x3b/0x90 +- entry_SYSCALL_64_after_hwframe+0x44/0xae +-- +2.41.0 + diff --git a/SOURCES/0181-mdadm-tests-07testreshape5-fix.patch b/SOURCES/0181-mdadm-tests-07testreshape5-fix.patch new file mode 100644 index 0000000..fb4e2c4 --- /dev/null +++ b/SOURCES/0181-mdadm-tests-07testreshape5-fix.patch @@ -0,0 +1,48 @@ +From fe3e4809476ab4e2e0e905e36f6bb1a45c16a2c3 Mon Sep 17 00:00:00 2001 +From: Xiao Ni +Date: Wed, 11 Sep 2024 16:54:30 +0800 +Subject: [PATCH 181/201] mdadm/tests: 07testreshape5 fix + +Init dir to avoid test failure. + +Signed-off-by: Xiao Ni +Signed-off-by: Mariusz Tkaczyk +--- + tests/07testreshape5 | 1 + + tests/07testreshape5.broken | 12 ------------ + 2 files changed, 1 insertion(+), 12 deletions(-) + delete mode 100644 tests/07testreshape5.broken + +diff --git a/tests/07testreshape5 b/tests/07testreshape5 +index 0e1f25f9..d90fd15e 100644 +--- a/tests/07testreshape5 ++++ b/tests/07testreshape5 +@@ -4,6 +4,7 @@ + # kernel md code to move data into and out of variously + # shaped md arrays. + set -x ++dir="." + layouts=(la ra ls rs) + for level in 5 6 + do +diff --git a/tests/07testreshape5.broken b/tests/07testreshape5.broken +deleted file mode 100644 +index a8ce03e4..00000000 +--- a/tests/07testreshape5.broken ++++ /dev/null +@@ -1,12 +0,0 @@ +-always fails +- +-Test seems to run 'test_stripe' at $dir directory, but $dir is never +-set. If $dir is adjusted to $PWD, the test still fails with: +- +- mdadm: /dev/loop2 is not suitable for this array. +- mdadm: create aborted +- ++ return 1 +- ++ cmp -s -n 8192 /dev/md0 /tmp/RandFile +- ++ echo cmp failed +- cmp failed +- ++ exit 2 +-- +2.41.0 + diff --git a/SOURCES/0182-mdadm-tests-remove-09imsm-assemble.broken.patch b/SOURCES/0182-mdadm-tests-remove-09imsm-assemble.broken.patch new file mode 100644 index 0000000..1ded516 --- /dev/null +++ b/SOURCES/0182-mdadm-tests-remove-09imsm-assemble.broken.patch @@ -0,0 +1,29 @@ +From 5cafbc8b3a7f352be80c5dc22d59d26b06f57680 Mon Sep 17 00:00:00 2001 +From: Xiao Ni +Date: Wed, 11 Sep 2024 16:54:31 +0800 +Subject: [PATCH 182/201] mdadm/tests: remove 09imsm-assemble.broken + +09imsm-assemble can run successfully. + +Signed-off-by: Xiao Ni +Signed-off-by: Mariusz Tkaczyk +--- + tests/09imsm-assemble.broken | 6 ------ + 1 file changed, 6 deletions(-) + delete mode 100644 tests/09imsm-assemble.broken + +diff --git a/tests/09imsm-assemble.broken b/tests/09imsm-assemble.broken +deleted file mode 100644 +index a6d4d5cf..00000000 +--- a/tests/09imsm-assemble.broken ++++ /dev/null +@@ -1,6 +0,0 @@ +-fails infrequently +- +-Fails roughly 1 in 10 runs with errors: +- +- mdadm: /dev/loop2 is still in use, cannot remove. +- /dev/loop2 removal from /dev/md/container should have succeeded +-- +2.41.0 + diff --git a/SOURCES/0183-mdadm-Manage-record-errno.patch b/SOURCES/0183-mdadm-Manage-record-errno.patch new file mode 100644 index 0000000..f37f629 --- /dev/null +++ b/SOURCES/0183-mdadm-Manage-record-errno.patch @@ -0,0 +1,56 @@ +From e3c3cfb64b8ec8b616e2eefbc69fbc3de29b64b6 Mon Sep 17 00:00:00 2001 +From: Xiao Ni +Date: Wed, 11 Sep 2024 16:54:32 +0800 +Subject: [PATCH 183/201] mdadm/Manage: record errno + +Sometimes it reports: +mdadm: failed to stop array /dev/md0: Success +It's the reason the errno is reset. So record errno during the loop. + +Signed-off-by: Xiao Ni +Signed-off-by: Mariusz Tkaczyk +--- + Manage.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/Manage.c b/Manage.c +index 241de055..aba97df8 100644 +--- a/Manage.c ++++ b/Manage.c +@@ -238,13 +238,14 @@ int Manage_stop(char *devname, int fd, int verbose, int will_retry) + "array_state", + "inactive")) < 0 && + errno == EBUSY) { ++ err = errno; + sleep_for(0, MSEC_TO_NSEC(200), true); + count--; + } + if (err) { + if (verbose >= 0) + pr_err("failed to stop array %s: %s\n", +- devname, strerror(errno)); ++ devname, strerror(err)); + rv = 1; + goto out; + } +@@ -438,14 +439,15 @@ done: + count = 25; err = 0; + while (count && fd >= 0 && + (err = ioctl(fd, STOP_ARRAY, NULL)) < 0 && errno == EBUSY) { ++ err = errno; + sleep_for(0, MSEC_TO_NSEC(200), true); + count --; + } + if (fd >= 0 && err) { + if (verbose >= 0) { + pr_err("failed to stop array %s: %s\n", +- devname, strerror(errno)); +- if (errno == EBUSY) ++ devname, strerror(err)); ++ if (err == EBUSY) + cont_err("Perhaps a running process, mounted filesystem or active volume group?\n"); + } + rv = 1; +-- +2.41.0 + diff --git a/SOURCES/0184-Remove-INSTALL-and-dev-null.patch b/SOURCES/0184-Remove-INSTALL-and-dev-null.patch new file mode 100644 index 0000000..551bd64 --- /dev/null +++ b/SOURCES/0184-Remove-INSTALL-and-dev-null.patch @@ -0,0 +1,43 @@ +From 2c2a9d63d07102e54608ad7691072ebbed0f8be8 Mon Sep 17 00:00:00 2001 +From: Mariusz Tkaczyk +Date: Mon, 23 Sep 2024 11:12:53 +0200 +Subject: [PATCH 184/201] Remove INSTALL and dev/null + +INSTALL is not needed because it added to README.md +dev/null was created accidentally. + +Remove them. + +Signed-off-by: Mariusz Tkaczyk +--- + INSTALL | 13 ------------- + dev/null | 0 + 2 files changed, 13 deletions(-) + delete mode 100644 INSTALL + delete mode 100644 dev/null + +diff --git a/INSTALL b/INSTALL +deleted file mode 100644 +index f7bcc3e6..00000000 +--- a/INSTALL ++++ /dev/null +@@ -1,13 +0,0 @@ +- +-To build mdadm, simply run: +- +- make +- +-to install, run +- +- make install +- +-as root. +- +- +-No configuration is necessary. +diff --git a/dev/null b/dev/null +deleted file mode 100644 +index e69de29b..00000000 +-- +2.41.0 + diff --git a/SOURCES/0186-Incremental-Rename-IncrementalRemove.patch b/SOURCES/0186-Incremental-Rename-IncrementalRemove.patch new file mode 100644 index 0000000..0aa8bef --- /dev/null +++ b/SOURCES/0186-Incremental-Rename-IncrementalRemove.patch @@ -0,0 +1,67 @@ +From 60923d5cae78447902e9ec10c44504e0588cf447 Mon Sep 17 00:00:00 2001 +From: Mariusz Tkaczyk +Date: Mon, 23 Sep 2024 14:15:31 +0200 +Subject: [PATCH 186/201] Incremental: Rename IncrementalRemove + +Rename it to Incremental_remove for better readability. +No functional changes. + +Signed-off-by: Mariusz Tkaczyk +--- + Incremental.c | 4 ++-- + mdadm.c | 3 +-- + mdadm.h | 2 +- + 3 files changed, 4 insertions(+), 5 deletions(-) + +diff --git a/Incremental.c b/Incremental.c +index c1389a15..e7987d1d 100644 +--- a/Incremental.c ++++ b/Incremental.c +@@ -1695,7 +1695,7 @@ static bool is_devnode_path(char *devnode) + } + + /** +- * IncrementalRemove() - Remove the device from all raid arrays. ++ * Incremental_remove() - Remove the device from all raid arrays. + * @devname: the device we want to remove, it could be kernel device name or devnode. + * @id_path: optional, /dev/disk/by-path path to save for bare scenarios support. + * @verbose: verbose flag. +@@ -1703,7 +1703,7 @@ static bool is_devnode_path(char *devnode) + * First, fail the device (if needed) and then remove the device from native raid array or external + * container. If it is external container, the device is removed from each subarray first. + */ +-int IncrementalRemove(char *devname, char *id_path, int verbose) ++int Incremental_remove(char *devname, char *id_path, int verbose) + { + char *devnm = basename(devname); + struct mddev_dev devlist = {0}; +diff --git a/mdadm.c b/mdadm.c +index 0b99fad4..90fd1575 100644 +--- a/mdadm.c ++++ b/mdadm.c +@@ -1703,8 +1703,7 @@ int main(int argc, char *argv[]) + rv = 1; + break; + } +- rv = IncrementalRemove(devlist->devname, remove_path, +- c.verbose); ++ rv = Incremental_remove(devlist->devname, remove_path, c.verbose); + } else + rv = Incremental(devlist, &c, ss); + break; +diff --git a/mdadm.h b/mdadm.h +index f3b9f54c..d4f5702c 100644 +--- a/mdadm.h ++++ b/mdadm.h +@@ -1606,7 +1606,7 @@ extern int Incremental(struct mddev_dev *devlist, struct context *c, + struct supertype *st); + extern void RebuildMap(void); + extern int IncrementalScan(struct context *c, char *devnm); +-extern int IncrementalRemove(char *devname, char *path, int verbose); ++extern int Incremental_remove(char *devname, char *path, int verbose); + extern int CreateBitmap(char *filename, int force, char uuid[16], + unsigned long chunksize, unsigned long daemon_sleep, + unsigned long write_behind, +-- +2.41.0 + diff --git a/SOURCES/0187-sysfs-add-function-for-writing-to-sysfs-fd.patch b/SOURCES/0187-sysfs-add-function-for-writing-to-sysfs-fd.patch new file mode 100644 index 0000000..7740007 --- /dev/null +++ b/SOURCES/0187-sysfs-add-function-for-writing-to-sysfs-fd.patch @@ -0,0 +1,315 @@ +From d95edceb362a6b647ec454c2a83add11c4ed4e64 Mon Sep 17 00:00:00 2001 +From: Mariusz Tkaczyk +Date: Tue, 24 Sep 2024 15:53:18 +0200 +Subject: [PATCH 187/201] sysfs: add function for writing to sysfs fd + +Proposed function sysfs_wrte_descriptor() unifies error handling for +write() done to sysfs files. Main purpose is to use it with MD sysfs +file but it can be used elsewhere. + +No functional changes. + +Signed-off-by: Mariusz Tkaczyk +--- + Manage.c | 45 +++++++++++++++++++++---------------- + managemon.c | 13 +++-------- + mdadm.h | 3 +++ + monitor.c | 12 ++-------- + sysfs.c | 65 +++++++++++++++++++++++++++++++++++++++++++---------- + util.c | 19 +++++++++++----- + 6 files changed, 101 insertions(+), 56 deletions(-) + +diff --git a/Manage.c b/Manage.c +index aba97df8..0f232a57 100644 +--- a/Manage.c ++++ b/Manage.c +@@ -1439,7 +1439,7 @@ int Manage_subdevs(char *devname, int fd, + + for (dv = devlist; dv; dv = dv->next) { + dev_t rdev = 0; /* device to add/remove etc */ +- int rv; ++ int rv, err = 0; + int mj,mn; + + raid_slot = -1; +@@ -1670,9 +1670,8 @@ int Manage_subdevs(char *devname, int fd, + rv = Manage_remove(tst, fd, dv, sysfd, + rdev, verbose, force, + devname); +- if (sysfd >= 0) +- close_fd(&sysfd); +- sysfd = -1; ++ close_fd(&sysfd); ++ + if (rv < 0) + goto abort; + if (rv > 0) +@@ -1686,23 +1685,31 @@ int Manage_subdevs(char *devname, int fd, + close_fd(&sysfd); + goto abort; + } +- case 'I': /* incremental fail */ +- if ((sysfd >= 0 && write(sysfd, "faulty", 6) != 6) || +- (sysfd < 0 && ioctl(fd, SET_DISK_FAULTY, +- rdev))) { +- if (errno == EBUSY) +- busy = 1; +- pr_err("set device faulty failed for %s: %s\n", +- dv->devname, strerror(errno)); +- close_fd(&sysfd); +- goto abort; ++ case 'I': ++ if (is_fd_valid(sysfd)) { ++ static const char val[] = "faulty"; ++ ++ rv = sysfs_write_descriptor(sysfd, val, strlen(val), &err); ++ } else { ++ rv = ioctl(fd, SET_DISK_FAULTY, rdev); ++ if (rv) ++ err = errno; + } ++ + close_fd(&sysfd); +- count++; +- if (verbose >= 0) +- pr_err("set %s faulty in %s\n", +- dv->devname, devname); +- break; ++ ++ if (rv == MDADM_STATUS_SUCCESS) { ++ count++; ++ ++ pr_vrb("set %s faulty in %s\n", dv->devname, devname); ++ break; ++ } ++ ++ if (err == EBUSY) ++ busy = 1; ++ ++ pr_err("set device faulty failed for %s: %s\n", dv->devname, strerror(err)); ++ goto abort; + case 'R': /* Mark as replaceable */ + if (subarray) { + pr_err("Cannot replace disks in a \'member\' array, perform this operation on the parent container\n"); +diff --git a/managemon.c b/managemon.c +index add6a79e..877e8605 100644 +--- a/managemon.c ++++ b/managemon.c +@@ -512,16 +512,9 @@ static void manage_member(struct mdstat_ent *mdstat, + if (a->container == NULL) + return; + +- if (sigterm && a->info.safe_mode_delay != 1 && +- a->safe_mode_delay_fd >= 0) { +- long int new_delay = 1; +- char delay[10]; +- ssize_t len; +- +- len = snprintf(delay, sizeof(delay), "0.%03ld\n", new_delay); +- if (write(a->safe_mode_delay_fd, delay, len) == len) +- a->info.safe_mode_delay = new_delay; +- } ++ if (sigterm && a->info.safe_mode_delay != 1 && a->safe_mode_delay_fd >= 0) ++ if (write_attr("0.001", a->safe_mode_delay_fd) == MDADM_STATUS_SUCCESS) ++ a->info.safe_mode_delay = 1; + + /* We don't check the array while any update is pending, as it + * might container a change (such as a spare assignment) which +diff --git a/mdadm.h b/mdadm.h +index d4f5702c..ce8155b5 100644 +--- a/mdadm.h ++++ b/mdadm.h +@@ -803,6 +803,9 @@ enum sysfs_read_flags { + + #define SYSFS_MAX_BUF_SIZE 64 + ++extern mdadm_status_t sysfs_write_descriptor(const int fd, const char *value, ++ const ssize_t len, int *errno_p); ++extern mdadm_status_t write_attr(const char *value, const int fd); + extern void sysfs_get_container_devnm(struct mdinfo *mdi, char *buf); + + /* If fd >= 0, get the array it is open on, +diff --git a/monitor.c b/monitor.c +index be0bec78..a4f707cc 100644 +--- a/monitor.c ++++ b/monitor.c +@@ -35,11 +35,6 @@ enum bb_action { + COMPARE_BB, + }; + +-static int write_attr(char *attr, int fd) +-{ +- return write(fd, attr, strlen(attr)); +-} +- + static void add_fd(fd_set *fds, int *maxfd, int fd) + { + struct stat st; +@@ -173,7 +168,7 @@ int process_ubb(struct active_array *a, struct mdinfo *mdi, const unsigned long + * via sysfs file + */ + if ((ss->record_bad_block(a, mdi->disk.raid_disk, sector, length)) && +- (write(mdi->bb_fd, buf, buf_len) == buf_len)) ++ (sysfs_write_descriptor(mdi->bb_fd, buf, buf_len, NULL) == MDADM_STATUS_SUCCESS)) + return 1; + + /* +@@ -622,14 +617,11 @@ static int read_and_act(struct active_array *a, fd_set *fds) + } + + if ((mdi->next_state & DS_REMOVE) && mdi->state_fd >= 0) { +- int remove_result; +- + /* The kernel may not be able to immediately remove the + * disk. In that case we wait a little while and + * try again. + */ +- remove_result = write_attr("remove", mdi->state_fd); +- if (remove_result > 0) { ++ if (write_attr("remove", mdi->state_fd) == MDADM_STATUS_SUCCESS) { + dprintf_cont(" %d:removed", mdi->disk.raid_disk); + close(mdi->state_fd); + close(mdi->recovery_fd); +diff --git a/sysfs.c b/sysfs.c +index b3c8b10d..7a81cc5b 100644 +--- a/sysfs.c ++++ b/sysfs.c +@@ -73,6 +73,47 @@ void sysfs_free(struct mdinfo *sra) + sra = sra2; + } + } ++/** ++ * write_attr() - write value to fd, don't check errno. ++ * @attr: value to write. ++ * @fd: file descriptor write to. ++ * ++ * Size to write is calculated by strlen(). ++ */ ++mdadm_status_t write_attr(const char *value, const int fd) ++{ ++ return sysfs_write_descriptor(fd, value, strlen(value), NULL); ++} ++ ++/** ++ * sysfs_write_descriptor()- wrapper for write(), projected to be used with sysfs. ++ * @fd: file descriptor. ++ * @value: value to set. ++ * @len: length of the value. ++ * @errno_p: On write() failure, buffer to copy errno value, might be NULL. ++ * ++ * Errors are differentiated, because (at least theoretically) kernel may not process whole string ++ * and it may or may not be a problem (it depends on implementation in kernel). Decision belongs to ++ * caller then. ++ * Generally, it should be safe to check if @errno_p changed to determine if error occurred. ++ */ ++mdadm_status_t sysfs_write_descriptor(const int fd, const char *value, const ssize_t len, ++ int *errno_p) ++{ ++ ssize_t ret; ++ ++ ret = write(fd, value, len); ++ if (ret == -1) { ++ if (errno_p) ++ *errno_p = errno; ++ return MDADM_STATUS_ERROR; ++ } ++ ++ if (ret != len) ++ return MDADM_STATUS_UNDEF; ++ ++ return MDADM_STATUS_SUCCESS; ++} + + /** + * sysfs_get_container_devnm() - extract container device name. +@@ -486,7 +527,6 @@ int sysfs_set_str(struct mdinfo *sra, struct mdinfo *dev, + char *name, char *val) + { + char fname[MAX_SYSFS_PATH_LEN]; +- unsigned int n; + int fd; + + snprintf(fname, MAX_SYSFS_PATH_LEN, "/sys/block/%s/md/%s/%s", +@@ -494,13 +534,14 @@ int sysfs_set_str(struct mdinfo *sra, struct mdinfo *dev, + fd = open(fname, O_WRONLY); + if (fd < 0) + return -1; +- n = write(fd, val, strlen(val)); +- close(fd); +- if (n != strlen(val)) { +- dprintf("failed to write '%s' to '%s' (%s)\n", +- val, fname, strerror(errno)); ++ ++ if (write_attr(val, fd)) { ++ pr_err("failed to write '%s' to '%s' (%s)\n", val, fname, strerror(errno)); ++ close(fd); + return -1; + } ++ ++ close(fd); + return 0; + } + +@@ -523,7 +564,6 @@ int sysfs_set_num_signed(struct mdinfo *sra, struct mdinfo *dev, + int sysfs_uevent(struct mdinfo *sra, char *event) + { + char fname[MAX_SYSFS_PATH_LEN]; +- int n; + int fd; + + snprintf(fname, MAX_SYSFS_PATH_LEN, "/sys/block/%s/uevent", +@@ -531,13 +571,14 @@ int sysfs_uevent(struct mdinfo *sra, char *event) + fd = open(fname, O_WRONLY); + if (fd < 0) + return -1; +- n = write(fd, event, strlen(event)); +- close(fd); +- if (n != (int)strlen(event)) { +- dprintf("failed to write '%s' to '%s' (%s)\n", +- event, fname, strerror(errno)); ++ ++ if (write_attr(event, fd)) { ++ pr_err("failed to write '%s' to '%s' (%s)\n", event, fname, strerror(errno)); ++ close(fd); + return -1; + } ++ ++ close(fd); + return 0; + } + +diff --git a/util.c b/util.c +index cc162278..2b660725 100644 +--- a/util.c ++++ b/util.c +@@ -1854,13 +1854,22 @@ int hot_remove_disk(int mdfd, unsigned long dev, int force) + int sys_hot_remove_disk(int statefd, int force) + { + int cnt = force ? 500 : 5; +- int ret; ++ static const char val[] = "faulty"; ++ ++ while (cnt--) { ++ int err = 0; ++ int ret = sysfs_write_descriptor(statefd, val, strlen(val), &err); ++ ++ if (ret == MDADM_STATUS_SUCCESS) ++ return 0; ++ ++ if (err != EBUSY) ++ break; + +- while ((ret = write(statefd, "remove", 6)) == -1 && +- errno == EBUSY && +- cnt-- > 0) + sleep_for(0, MSEC_TO_NSEC(10), true); +- return ret == 6 ? 0 : -1; ++ } ++ ++ return -1; + } + + int set_array_info(int mdfd, struct supertype *st, struct mdinfo *info) +-- +2.41.0 + diff --git a/SOURCES/0188-Mdmonitor-Fix-startup-with-missing-directory.patch b/SOURCES/0188-Mdmonitor-Fix-startup-with-missing-directory.patch new file mode 100644 index 0000000..4cc9e5e --- /dev/null +++ b/SOURCES/0188-Mdmonitor-Fix-startup-with-missing-directory.patch @@ -0,0 +1,61 @@ +From 344690313ae4e66f760b14afafda663ec750dfe0 Mon Sep 17 00:00:00 2001 +From: Anna Sztukowska +Date: Tue, 3 Sep 2024 13:01:04 +0200 +Subject: [PATCH 188/201] Mdmonitor: Fix startup with missing directory + +Commit 0a07dea8d3b78 ("Mdmonitor: Refactor check_one_sharer() for +better error handling") introduced an issue, if directory /run/mdadm +is missing, monitor fails to start. Move the directory creation +earlier to ensure it is always created. + +Signed-off-by: Anna Sztukowska +--- + Monitor.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +diff --git a/Monitor.c b/Monitor.c +index cf14fbb3..d260b0f1 100644 +--- a/Monitor.c ++++ b/Monitor.c +@@ -225,6 +225,11 @@ int Monitor(struct mddev_dev *devlist, + return 1; + } + ++ if (mkdir(MDMON_DIR, 0700) < 0 && errno != EEXIST) { ++ pr_err("Failed to create directory " MDMON_DIR ": %s\n", strerror(errno)); ++ return 1; ++ } ++ + if (share){ + if (check_one_sharer(c->scan) == 2) + return 1; +@@ -432,12 +437,12 @@ static int make_daemon(char *pidfile) + } + + /* +- * check_one_sharer() - Checks for other mdmon processes running. ++ * check_one_sharer() - Checks for other mdmonitor processes running. + * + * Return: + * 0 - no other processes running, + * 1 - warning, +- * 2 - error, or when scan mode is enabled, and one mdmon process already exists ++ * 2 - error, or when scan mode is enabled, and one mdmonitor process already exists + */ + static int check_one_sharer(int scan) + { +@@ -513,11 +518,6 @@ static int write_autorebuild_pid(void) + FILE *fp; + int fd; + +- if (mkdir(MDMON_DIR, 0700) < 0 && errno != EEXIST) { +- pr_err("%s: %s\n", strerror(errno), MDMON_DIR); +- return 1; +- } +- + if (!is_directory(MDMON_DIR)) { + pr_err("%s is not a regular directory.\n", MDMON_DIR); + return 1; +-- +2.41.0 + diff --git a/SOURCES/0189-mdadm-add-xmalloc.h.patch b/SOURCES/0189-mdadm-add-xmalloc.h.patch new file mode 100644 index 0000000..c0b8ca1 --- /dev/null +++ b/SOURCES/0189-mdadm-add-xmalloc.h.patch @@ -0,0 +1,590 @@ +From ee3a6cab09c8acaf6706b3710f5652e9be43b57e Mon Sep 17 00:00:00 2001 +From: Mariusz Tkaczyk +Date: Wed, 25 Sep 2024 13:16:10 +0200 +Subject: [PATCH 189/201] mdadm: add xmalloc.h + +Move memory declaration helpers outside mdadm.h. They seems to be +useful so keep them but include separatelly. Rework them to not reffer +to Name[] declared internally in mdadm/mdmon. + +This is first step to start decomplexing mdadm.h. + +Signed-off-by: Mariusz Tkaczyk +--- + Assemble.c | 2 ++ + Create.c | 4 +++- + Detail.c | 2 ++ + Examine.c | 8 ++++--- + Grow.c | 2 ++ + Incremental.c | 2 ++ + Manage.c | 2 ++ + Monitor.c | 4 +++- + bitmap.c | 1 + + config.c | 2 ++ + lib.c | 2 ++ + managemon.c | 2 ++ + mapfile.c | 2 ++ + mdadm.c | 2 ++ + mdadm.h | 5 ---- + mdmon.c | 1 + + mdopen.c | 2 ++ + mdstat.c | 2 ++ + msg.c | 1 + + platform-intel.c | 2 ++ + policy.c | 2 ++ + restripe.c | 2 ++ + super-ddf.c | 2 ++ + super-gpt.c | 1 + + super-intel.c | 2 ++ + super-mbr.c | 1 + + super0.c | 2 ++ + super1.c | 2 ++ + sysfs.c | 4 +++- + udev.c | 2 ++ + util.c | 2 ++ + xmalloc.c | 59 +++++++++++++++++++++--------------------------- + xmalloc.h | 13 +++++++++++ + 33 files changed, 100 insertions(+), 44 deletions(-) + create mode 100644 xmalloc.h + +diff --git a/Assemble.c b/Assemble.c +index a2bb7b64..d3dbfbc6 100644 +--- a/Assemble.c ++++ b/Assemble.c +@@ -23,6 +23,8 @@ + */ + + #include "mdadm.h" ++#include "xmalloc.h" ++ + #include + + mapping_t assemble_statuses[] = { +diff --git a/Create.c b/Create.c +index 7fde1c16..1640f21e 100644 +--- a/Create.c ++++ b/Create.c +@@ -23,9 +23,11 @@ + */ + + #include "mdadm.h" +-#include "udev.h" + #include "md_u.h" + #include "md_p.h" ++#include "udev.h" ++#include "xmalloc.h" ++ + #include + #include + #include +diff --git a/Detail.c b/Detail.c +index 331e1da3..5819ced9 100644 +--- a/Detail.c ++++ b/Detail.c +@@ -25,6 +25,8 @@ + #include "mdadm.h" + #include "md_p.h" + #include "md_u.h" ++#include "xmalloc.h" ++ + #include + #include + +diff --git a/Examine.c b/Examine.c +index fe162167..036b7a56 100644 +--- a/Examine.c ++++ b/Examine.c +@@ -22,14 +22,16 @@ + * Email: + */ + +-#include "mdadm.h" + #include "dlink.h" ++#include "mdadm.h" ++#include "md_u.h" ++#include "md_p.h" ++#include "xmalloc.h" + + #if ! defined(__BIG_ENDIAN) && ! defined(__LITTLE_ENDIAN) + #error no endian defined + #endif +-#include "md_u.h" +-#include "md_p.h" ++ + int Examine(struct mddev_dev *devlist, + struct context *c, + struct supertype *forcest) +diff --git a/Grow.c b/Grow.c +index 60076f56..ef1285ec 100644 +--- a/Grow.c ++++ b/Grow.c +@@ -23,6 +23,8 @@ + */ + #include "mdadm.h" + #include "dlink.h" ++#include "xmalloc.h" ++ + #include + #include + #include +diff --git a/Incremental.c b/Incremental.c +index e7987d1d..8c915783 100644 +--- a/Incremental.c ++++ b/Incremental.c +@@ -29,6 +29,8 @@ + */ + + #include "mdadm.h" ++#include "xmalloc.h" ++ + #include + #include + #include +diff --git a/Manage.c b/Manage.c +index 0f232a57..246ef319 100644 +--- a/Manage.c ++++ b/Manage.c +@@ -26,6 +26,8 @@ + #include "md_u.h" + #include "md_p.h" + #include "udev.h" ++#include "xmalloc.h" ++ + #include + + int Manage_ro(char *devname, int fd, int readonly) +diff --git a/Monitor.c b/Monitor.c +index d260b0f1..d1cfbf94 100644 +--- a/Monitor.c ++++ b/Monitor.c +@@ -23,9 +23,11 @@ + */ + + #include "mdadm.h" +-#include "udev.h" + #include "md_p.h" + #include "md_u.h" ++#include "udev.h" ++#include "xmalloc.h" ++ + #include + #include + #include +diff --git a/bitmap.c b/bitmap.c +index 9a7ffe3b..5110ae2f 100644 +--- a/bitmap.c ++++ b/bitmap.c +@@ -19,6 +19,7 @@ + */ + + #include "mdadm.h" ++#include "xmalloc.h" + + static inline void sb_le_to_cpu(bitmap_super_t *sb) + { +diff --git a/config.c b/config.c +index 5411a480..022fb2a0 100644 +--- a/config.c ++++ b/config.c +@@ -24,6 +24,8 @@ + + #include "mdadm.h" + #include "dlink.h" ++#include "xmalloc.h" ++ + #include + #include + #include +diff --git a/lib.c b/lib.c +index 13d4e4f1..f36ae03a 100644 +--- a/lib.c ++++ b/lib.c +@@ -24,6 +24,8 @@ + + #include "mdadm.h" + #include "dlink.h" ++#include "xmalloc.h" ++ + #include + #include + +diff --git a/managemon.c b/managemon.c +index 877e8605..6ca592b1 100644 +--- a/managemon.c ++++ b/managemon.c +@@ -104,6 +104,8 @@ + #endif + #include "mdadm.h" + #include "mdmon.h" ++#include "xmalloc.h" ++ + #include + #include + +diff --git a/mapfile.c b/mapfile.c +index 632cf5e8..33d40d9e 100644 +--- a/mapfile.c ++++ b/mapfile.c +@@ -43,6 +43,8 @@ + * at compile time via MAP_DIR and MAP_FILE. + */ + #include "mdadm.h" ++#include "xmalloc.h" ++ + #include + #include + +diff --git a/mdadm.c b/mdadm.c +index 90fd1575..de7cde07 100644 +--- a/mdadm.c ++++ b/mdadm.c +@@ -27,6 +27,8 @@ + + #include "mdadm.h" + #include "md_p.h" ++#include "xmalloc.h" ++ + #include + + /** +diff --git a/mdadm.h b/mdadm.h +index ce8155b5..bbc1b97f 100644 +--- a/mdadm.h ++++ b/mdadm.h +@@ -1937,11 +1937,6 @@ static inline int xasprintf(char **strp, const char *fmt, ...) { + + #define pr_vrb(fmt, arg...) ((void)(verbose && pr_err(fmt, ##arg))) + +-void *xmalloc(size_t len); +-void *xrealloc(void *ptr, size_t len); +-void *xcalloc(size_t num, size_t size); +-char *xstrdup(const char *str); +- + #define LEVEL_MULTIPATH (-4) + #define LEVEL_LINEAR (-1) + #define LEVEL_FAULTY (-5) +diff --git a/mdmon.c b/mdmon.c +index 6e28b56e..a16647c6 100644 +--- a/mdmon.c ++++ b/mdmon.c +@@ -65,6 +65,7 @@ + + #include "mdadm.h" + #include "mdmon.h" ++#include "xmalloc.h" + + char const Name[] = "mdmon"; + +diff --git a/mdopen.c b/mdopen.c +index e49defb6..8587524b 100644 +--- a/mdopen.c ++++ b/mdopen.c +@@ -25,6 +25,8 @@ + #include "mdadm.h" + #include "udev.h" + #include "md_p.h" ++#include "xmalloc.h" ++ + #include + + void make_parts(char *dev, int cnt) +diff --git a/mdstat.c b/mdstat.c +index 29e78362..8d97a2fc 100644 +--- a/mdstat.c ++++ b/mdstat.c +@@ -80,6 +80,8 @@ + + #include "mdadm.h" + #include "dlink.h" ++#include "xmalloc.h" ++ + #include + #include + +diff --git a/msg.c b/msg.c +index b6da91d3..0cc7fc5d 100644 +--- a/msg.c ++++ b/msg.c +@@ -30,6 +30,7 @@ + #include + #include "mdadm.h" + #include "mdmon.h" ++#include "xmalloc.h" + + static const __u32 start_magic = 0x5a5aa5a5; + static const __u32 end_magic = 0xa5a55a5a; +diff --git a/platform-intel.c b/platform-intel.c +index 21591317..95bc4929 100644 +--- a/platform-intel.c ++++ b/platform-intel.c +@@ -19,6 +19,8 @@ + #include "mdadm.h" + #include "platform-intel.h" + #include "probe_roms.h" ++#include "xmalloc.h" ++ + #include + #include + #include +diff --git a/policy.c b/policy.c +index 4d4b248d..f417a9af 100644 +--- a/policy.c ++++ b/policy.c +@@ -23,6 +23,8 @@ + */ + + #include "mdadm.h" ++#include "xmalloc.h" ++ + #include + #include + #include +diff --git a/restripe.c b/restripe.c +index a7a7229f..5e126eb7 100644 +--- a/restripe.c ++++ b/restripe.c +@@ -23,6 +23,8 @@ + */ + + #include "mdadm.h" ++#include "xmalloc.h" ++ + #include + + /* To restripe, we read from old geometry to a buffer, and +diff --git a/super-ddf.c b/super-ddf.c +index d870102d..6cd099ab 100644 +--- a/super-ddf.c ++++ b/super-ddf.c +@@ -29,6 +29,8 @@ + #include "mdadm.h" + #include "mdmon.h" + #include "sha1.h" ++#include "xmalloc.h" ++ + #include + #include + +diff --git a/super-gpt.c b/super-gpt.c +index ec3cf53f..50c267f6 100644 +--- a/super-gpt.c ++++ b/super-gpt.c +@@ -40,6 +40,7 @@ + + #include "mdadm.h" + #include "part.h" ++#include "xmalloc.h" + + static void free_gpt(struct supertype *st) + { +diff --git a/super-intel.c b/super-intel.c +index 30c2939a..7c5119c5 100644 +--- a/super-intel.c ++++ b/super-intel.c +@@ -23,6 +23,8 @@ + #include "dlink.h" + #include "sha1.h" + #include "platform-intel.h" ++#include "xmalloc.h" ++ + #include + #include + #include +diff --git a/super-mbr.c b/super-mbr.c +index 839f0003..98810170 100644 +--- a/super-mbr.c ++++ b/super-mbr.c +@@ -41,6 +41,7 @@ + + #include "mdadm.h" + #include "part.h" ++#include "xmalloc.h" + + static void free_mbr(struct supertype *st) + { +diff --git a/super0.c b/super0.c +index c428e2a6..ff4905b9 100644 +--- a/super0.c ++++ b/super0.c +@@ -25,6 +25,8 @@ + #define HAVE_STDINT_H 1 + #include "mdadm.h" + #include "sha1.h" ++#include "xmalloc.h" ++ + /* + * All handling for the 0.90.0 version superblock is in + * this file. +diff --git a/super1.c b/super1.c +index 9c9c7dd1..fe3c4c64 100644 +--- a/super1.c ++++ b/super1.c +@@ -24,6 +24,8 @@ + + #include + #include "mdadm.h" ++#include "xmalloc.h" ++ + /* + * The version-1 superblock : + * All numeric fields are little-endian. +diff --git a/sysfs.c b/sysfs.c +index 7a81cc5b..0f0506ca 100644 +--- a/sysfs.c ++++ b/sysfs.c +@@ -24,9 +24,11 @@ + */ + + #include "mdadm.h" ++#include "dlink.h" ++#include "xmalloc.h" ++ + #include + #include +-#include "dlink.h" + + #define MAX_SYSFS_PATH_LEN 120 + +diff --git a/udev.c b/udev.c +index 066e6ab1..88a99781 100644 +--- a/udev.c ++++ b/udev.c +@@ -22,6 +22,8 @@ + #include "udev.h" + #include "md_p.h" + #include "md_u.h" ++#include "xmalloc.h" ++ + #include + #include + #include +diff --git a/util.c b/util.c +index 2b660725..4dfe757d 100644 +--- a/util.c ++++ b/util.c +@@ -24,6 +24,8 @@ + + #include "mdadm.h" + #include "md_p.h" ++#include "xmalloc.h" ++ + #include + #include + #include +diff --git a/xmalloc.c b/xmalloc.c +index 8b3f78a6..dac30eb6 100644 +--- a/xmalloc.c ++++ b/xmalloc.c +@@ -21,64 +21,57 @@ + * Email: + */ + +-#include "mdadm.h" +-/*#include +-#include +-#include +-#include +-#include +-#include +-#include +-*/ ++#include "xmalloc.h" ++ ++#include ++#include ++#include ++#include ++ ++static void *exit_memory_alloc_failure(void) ++{ ++ fprintf(stderr, "Memory allocation failure - aborting\n"); ++ ++ /* TODO: replace with MDADM_STATUS_MEM_FAIL */ ++ exit(1); ++} + + void *xmalloc(size_t len) + { + void *rv = malloc(len); +- char *msg; +- int n; ++ + if (rv) + return rv; +- msg = ": memory allocation failure - aborting\n"; +- n = write(2, Name, strlen(Name)); +- n += write(2, msg, strlen(msg)); +- exit(4+!!n); ++ ++ return exit_memory_alloc_failure(); + } + + void *xrealloc(void *ptr, size_t len) + { + void *rv = realloc(ptr, len); +- char *msg; +- int n; ++ + if (rv) + return rv; +- msg = ": memory allocation failure - aborting\n"; +- n = write(2, Name, strlen(Name)); +- n += write(2, msg, strlen(msg)); +- exit(4+!!n); ++ ++ return exit_memory_alloc_failure(); + } + + void *xcalloc(size_t num, size_t size) + { + void *rv = calloc(num, size); +- char *msg; +- int n; ++ + if (rv) + return rv; +- msg = ": memory allocation failure - aborting\n"; +- n = write(2, Name, strlen(Name)); +- n += write(2, msg, strlen(msg)); +- exit(4+!!n); ++ ++ return exit_memory_alloc_failure(); + } + + char *xstrdup(const char *str) + { + char *rv = strdup(str); +- char *msg; +- int n; ++ + if (rv) + return rv; +- msg = ": memory allocation failure - aborting\n"; +- n = write(2, Name, strlen(Name)); +- n += write(2, msg, strlen(msg)); +- exit(4+!!n); ++ ++ return exit_memory_alloc_failure(); + } +diff --git a/xmalloc.h b/xmalloc.h +new file mode 100644 +index 00000000..0904b0ab +--- /dev/null ++++ b/xmalloc.h +@@ -0,0 +1,13 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++ ++#ifndef XMALLOC_H ++#define XMALLOC_H ++ ++#include ++ ++void *xmalloc(size_t len); ++void *xrealloc(void *ptr, size_t len); ++void *xcalloc(size_t num, size_t size); ++char *xstrdup(const char *str); ++ ++#endif +-- +2.41.0 + diff --git a/SOURCES/0190-md.man-update-refference-to-raid5-ppl.rst.patch b/SOURCES/0190-md.man-update-refference-to-raid5-ppl.rst.patch new file mode 100644 index 0000000..613570a --- /dev/null +++ b/SOURCES/0190-md.man-update-refference-to-raid5-ppl.rst.patch @@ -0,0 +1,43 @@ +From 4157e8da40ce976883c5b6e51e2352732e709b52 Mon Sep 17 00:00:00 2001 +From: Mariusz Tkaczyk +Date: Tue, 10 Sep 2024 14:17:58 +0200 +Subject: [PATCH 190/201] md.man: update refference to raid5-ppl.rst + +Documentation/md has moved to Documentation/driver-api/md. +Update and and rework sentence. + +Remove refference to not supported kernel close to updated text. + +Signed-off-by: Mariusz Tkaczyk +--- + md.4 | 10 ++-------- + 1 file changed, 2 insertions(+), 8 deletions(-) + +diff --git a/md.4 b/md.4 +index 7aef1577..9d5e55bf 100644 +--- a/md.4 ++++ b/md.4 +@@ -937,18 +937,12 @@ Partial parity for a write operation is the XOR of stripe data chunks not + modified by the write. PPL is stored in the metadata region of RAID member drives, + no additional journal drive is needed. + After crashes, if one of the not modified data disks of +-the stripe is missing, this updated parity can be used to recover its +-data. ++the stripe is missing, this updated parity can be used to recover its data. + +-This mechanism is documented more fully in the file +-Documentation/md/raid5-ppl.rst ++See Documentation/driver-api/md/raid5-ppl.rst for implementation details. + + .SS WRITE-BEHIND + +-From Linux 2.6.14, +-.I md +-supports WRITE-BEHIND on RAID1 arrays. +- + This allows certain devices in the array to be flagged as + .IR write-mostly . + MD will only read from such devices if there is no +-- +2.41.0 + diff --git a/SOURCES/0191-util-fix-sys_hot_remove_disk.patch b/SOURCES/0191-util-fix-sys_hot_remove_disk.patch new file mode 100644 index 0000000..70c389e --- /dev/null +++ b/SOURCES/0191-util-fix-sys_hot_remove_disk.patch @@ -0,0 +1,30 @@ +From 6f227de0a17369d3d6667591241c49140d5239b2 Mon Sep 17 00:00:00 2001 +From: Mariusz Tkaczyk +Date: Fri, 4 Oct 2024 13:57:48 +0200 +Subject: [PATCH 191/201] util: fix sys_hot_remove_disk() + +Instead of "remove", "faulty" was called. + +Fixes: d95edceb362a ("sysfs: add function for writing to sysfs fd") +Signed-off-by: Mariusz Tkaczyk +--- + util.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/util.c b/util.c +index 4dfe757d..7c5c5c8f 100644 +--- a/util.c ++++ b/util.c +@@ -1855,8 +1855,8 @@ int hot_remove_disk(int mdfd, unsigned long dev, int force) + + int sys_hot_remove_disk(int statefd, int force) + { ++ static const char val[] = "remove"; + int cnt = force ? 500 : 5; +- static const char val[] = "faulty"; + + while (cnt--) { + int err = 0; +-- +2.41.0 + diff --git a/SOURCES/0192-Rename-Monitor.c-to-mdmonitor.c.patch b/SOURCES/0192-Rename-Monitor.c-to-mdmonitor.c.patch new file mode 100644 index 0000000..1d4a5fd --- /dev/null +++ b/SOURCES/0192-Rename-Monitor.c-to-mdmonitor.c.patch @@ -0,0 +1,35 @@ +From da826501c708b49a6e03394cf56f070160ea59d9 Mon Sep 17 00:00:00 2001 +From: Kinga Stefaniuk +Date: Mon, 30 Sep 2024 15:48:11 +0200 +Subject: [PATCH 192/201] Rename Monitor.c to mdmonitor.c + +Rename Monitor.c to mdmonitor.c to avoid errors during compilation on +case-insensitive filesystems. + +Signed-off-by: Kinga Stefaniuk +--- + Makefile | 2 +- + Monitor.c => mdmonitor.c | 0 + 2 files changed, 1 insertion(+), 1 deletion(-) + rename Monitor.c => mdmonitor.c (100%) + +diff --git a/Makefile b/Makefile +index a914b178..32f579de 100644 +--- a/Makefile ++++ b/Makefile +@@ -186,7 +186,7 @@ endif + + OBJS = mdadm.o config.o policy.o mdstat.o ReadMe.o uuid.o util.o maps.o lib.o udev.o \ + Manage.o Assemble.o Build.o \ +- Create.o Detail.o Examine.o Grow.o Monitor.o dlink.o Kill.o Query.o \ ++ Create.o Detail.o Examine.o Grow.o mdmonitor.o dlink.o Kill.o Query.o \ + Incremental.o Dump.o \ + mdopen.o super0.o super1.o super-ddf.o super-intel.o bitmap.o \ + super-mbr.o super-gpt.o \ +diff --git a/Monitor.c b/mdmonitor.c +similarity index 100% +rename from Monitor.c +rename to mdmonitor.c +-- +2.41.0 + diff --git a/SOURCES/0193-super-intel-move-scsi_get_serial-from-sg_io.patch b/SOURCES/0193-super-intel-move-scsi_get_serial-from-sg_io.patch new file mode 100644 index 0000000..5adf215 --- /dev/null +++ b/SOURCES/0193-super-intel-move-scsi_get_serial-from-sg_io.patch @@ -0,0 +1,178 @@ +From bafa5ccfa56d776d431f766c765178eda0a4900d Mon Sep 17 00:00:00 2001 +From: Kinga Stefaniuk +Date: Fri, 4 Oct 2024 10:23:57 +0200 +Subject: [PATCH 193/201] super-intel: move scsi_get_serial from sg_io + +scsi_get_serial() function is used only by super-intel.c. Move function +to this file and remove sg_io.c file. + +Signed-off-by: Kinga Stefaniuk +--- + Makefile | 4 ++-- + sg_io.c | 60 --------------------------------------------------- + super-intel.c | 47 ++++++++++++++++++++++++++++++++++++---- + 3 files changed, 45 insertions(+), 66 deletions(-) + delete mode 100644 sg_io.c + +diff --git a/Makefile b/Makefile +index 32f579de..24367b0f 100644 +--- a/Makefile ++++ b/Makefile +@@ -190,7 +190,7 @@ OBJS = mdadm.o config.o policy.o mdstat.o ReadMe.o uuid.o util.o maps.o lib.o u + Incremental.o Dump.o \ + mdopen.o super0.o super1.o super-ddf.o super-intel.o bitmap.o \ + super-mbr.o super-gpt.o \ +- restripe.o sysfs.o sha1.o mapfile.o crc32.o sg_io.o msg.o xmalloc.o \ ++ restripe.o sysfs.o sha1.o mapfile.o crc32.o msg.o xmalloc.o \ + platform-intel.o probe_roms.o crc32c.o drive_encryption.o + + CHECK_OBJS = restripe.o uuid.o sysfs.o maps.o lib.o xmalloc.o dlink.o +@@ -201,7 +201,7 @@ 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 config.o mapfile.o mdopen.o\ + policy.o lib.o udev.o \ +- Kill.o sg_io.o dlink.o ReadMe.o super-intel.o \ ++ Kill.o dlink.o ReadMe.o super-intel.o \ + super-mbr.o super-gpt.o \ + super-ddf.o sha1.o crc32.o msg.o bitmap.o xmalloc.o \ + platform-intel.o probe_roms.o crc32c.o drive_encryption.o +diff --git a/sg_io.c b/sg_io.c +deleted file mode 100644 +index 7889a95e..00000000 +--- a/sg_io.c ++++ /dev/null +@@ -1,60 +0,0 @@ +-/* +- * Copyright (C) 2007-2008 Intel Corporation +- * +- * Retrieve drive serial numbers for scsi disks +- * +- * This program is free software; you can redistribute it and/or modify it +- * under the terms and conditions of the GNU General Public License, +- * version 2, as published by the Free Software Foundation. +- * +- * This program is distributed in the hope it will be useful, but WITHOUT +- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +- * more details. +- * +- * You should have received a copy of the GNU General Public License along with +- * this program; if not, write to the Free Software Foundation, Inc., +- * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. +- */ +-#include +-#include +-#include +-#include +- +-int scsi_get_serial(int fd, void *buf, size_t buf_len) +-{ +- unsigned char rsp_buf[255]; +- unsigned char inq_cmd[] = {INQUIRY, 1, 0x80, 0, sizeof(rsp_buf), 0}; +- unsigned char sense[32]; +- struct sg_io_hdr io_hdr; +- int rv; +- unsigned int rsp_len; +- +- memset(&io_hdr, 0, sizeof(io_hdr)); +- io_hdr.interface_id = 'S'; +- io_hdr.cmdp = inq_cmd; +- io_hdr.cmd_len = sizeof(inq_cmd); +- io_hdr.dxferp = rsp_buf; +- io_hdr.dxfer_len = sizeof(rsp_buf); +- io_hdr.dxfer_direction = SG_DXFER_FROM_DEV; +- io_hdr.sbp = sense; +- io_hdr.mx_sb_len = sizeof(sense); +- io_hdr.timeout = 5000; +- +- rv = ioctl(fd, SG_IO, &io_hdr); +- +- if (rv) +- return rv; +- +- if ((io_hdr.info & SG_INFO_OK_MASK) != SG_INFO_OK) +- return -1; +- +- rsp_len = rsp_buf[3]; +- +- if (!rsp_len || buf_len < rsp_len) +- return -1; +- +- memcpy(buf, &rsp_buf[4], rsp_len); +- +- return 0; +-} +diff --git a/super-intel.c b/super-intel.c +index 7c5119c5..3b856ad0 100644 +--- a/super-intel.c ++++ b/super-intel.c +@@ -21,15 +21,18 @@ + #include "mdadm.h" + #include "mdmon.h" + #include "dlink.h" ++#include "drive_encryption.h" + #include "sha1.h" + #include "platform-intel.h" + #include "xmalloc.h" + +-#include +-#include + #include + #include +-#include "drive_encryption.h" ++#include ++#include ++#include ++#include ++#include + + /* MPB == Metadata Parameter Block */ + #define MPB_SIGNATURE "Intel Raid ISM Cfg Sig. " +@@ -4131,7 +4134,43 @@ static int nvme_get_serial(int fd, void *buf, size_t buf_len) + return devpath_to_char(path, "serial", buf, buf_len, 0); + } + +-extern int scsi_get_serial(int fd, void *buf, size_t buf_len); ++mdadm_status_t scsi_get_serial(int fd, void *buf, size_t buf_len) ++{ ++ struct sg_io_hdr io_hdr = {0}; ++ unsigned char rsp_buf[255]; ++ unsigned char inq_cmd[] = {INQUIRY, 1, 0x80, 0, sizeof(rsp_buf), 0}; ++ unsigned char sense[32]; ++ unsigned int rsp_len; ++ int rv; ++ ++ io_hdr.interface_id = 'S'; ++ io_hdr.cmdp = inq_cmd; ++ io_hdr.cmd_len = sizeof(inq_cmd); ++ io_hdr.dxferp = rsp_buf; ++ io_hdr.dxfer_len = sizeof(rsp_buf); ++ io_hdr.dxfer_direction = SG_DXFER_FROM_DEV; ++ io_hdr.sbp = sense; ++ io_hdr.mx_sb_len = sizeof(sense); ++ io_hdr.timeout = 5000; ++ ++ rv = ioctl(fd, SG_IO, &io_hdr); ++ ++ if (rv) ++ return MDADM_STATUS_ERROR; ++ ++ if ((io_hdr.info & SG_INFO_OK_MASK) != SG_INFO_OK) ++ return MDADM_STATUS_ERROR; ++ ++ rsp_len = rsp_buf[3]; ++ ++ if (!rsp_len || buf_len < rsp_len) ++ return MDADM_STATUS_ERROR; ++ ++ memcpy(buf, &rsp_buf[4], rsp_len); ++ ++ return MDADM_STATUS_SUCCESS; ++} ++ + + static int imsm_read_serial(int fd, char *devname, + __u8 *serial, size_t serial_buf_len) +-- +2.41.0 + diff --git a/SOURCES/0194-mdmonitor-Abandon-custom-configuration-files.patch b/SOURCES/0194-mdmonitor-Abandon-custom-configuration-files.patch new file mode 100644 index 0000000..4b598fb --- /dev/null +++ b/SOURCES/0194-mdmonitor-Abandon-custom-configuration-files.patch @@ -0,0 +1,120 @@ +From a7a5e676a7eb2ac97acd31b13f75515e9573f891 Mon Sep 17 00:00:00 2001 +From: Mariusz Tkaczyk +Date: Thu, 26 Sep 2024 09:01:55 +0200 +Subject: [PATCH 194/201] mdmonitor: Abandon custom configuration files + +Operating system vendors are customizing mdmonitor service beacause +the default form is not satifying for them (expect SUSE). As a result, +support is complicated (maintainers have to check the system) and man page +is not detailed. + +I propose to abandon custom configuration files via sysconfig and keep +it inside mdadm.conf only. + +Detailed comment in service for OSV maintainers is added to help with +transition. + +Signed-off-by: Mariusz Tkaczyk +--- + Makefile | 1 - + systemd/SUSE-mdadm_env.sh | 48 --------------------------------------- + systemd/mdmonitor.service | 19 ++++++++++++---- + 3 files changed, 15 insertions(+), 53 deletions(-) + delete mode 100644 systemd/SUSE-mdadm_env.sh + +diff --git a/Makefile b/Makefile +index 24367b0f..bcd092de 100644 +--- a/Makefile ++++ b/Makefile +@@ -341,7 +341,6 @@ install-systemd: systemd/mdmon@.service + $(INSTALL) -D -m 755 .install.tmp.3 $(DESTDIR)$(SYSTEMD_DIR)-shutdown/$$file ; \ + rm -f .install.tmp.3; \ + done +- if [ -f /etc/SuSE-release -o -n "$(SUSE)" ] ;then $(INSTALL) -D -m 755 systemd/SUSE-mdadm_env.sh $(DESTDIR)$(LIB_DIR)/mdadm_env.sh ;fi + + install-bin: mdadm mdmon + $(INSTALL) -D $(STRIP) -m 755 mdadm $(DESTDIR)$(BINDIR)/mdadm +diff --git a/systemd/SUSE-mdadm_env.sh b/systemd/SUSE-mdadm_env.sh +deleted file mode 100644 +index c13b48ab..00000000 +--- a/systemd/SUSE-mdadm_env.sh ++++ /dev/null +@@ -1,48 +0,0 @@ +-#!/bin/sh +- +-# extract configuration from /etc/sysconfig/mdadm and write +-# environment to /run/sysconfig/mdadm to be used by +-# systemd unit files. +- +-MDADM_SCAN="yes" +- +-# Following adapted from /etc/init.d/mdadmd on openSUSE +- +-mdadmd_CONFIG=/etc/sysconfig/mdadm +-if test -r $mdadmd_CONFIG; then +- . $mdadmd_CONFIG +-fi +- +-if [ x$MDADM_DELAY != x"" ]; then +- MDADM_DELAY="-d "$MDADM_DELAY; +-fi +- +-if [ x$MDADM_MAIL != x"" ]; then +- MDADM_MAIL="-m \"$MDADM_MAIL\"" +-fi +- +-if [ x$MDADM_PROGRAM != x"" ]; then +- MDADM_PROGRAM="-p \"$MDADM_PROGRAM\"" +-fi +- +-if [ x$MDADM_SCAN = x"yes" ]; then +- MDADM_SCAN="--scan" +-else +- MDADM_SCAN="" +-fi +- +-if [ x$MDADM_SEND_MAIL_ON_START = x"yes" ]; then +- MDADM_SEND_MAIL="-t" +-else +- MDADM_SEND_MAIL="" +-fi +- +-if [ x$MDADM_CONFIG != x"" ]; then +- MDADM_CONFIG="-c \"$MDADM_CONFIG\"" +-fi +- +-mkdir -p /run/sysconfig +-echo "MDADM_MONITOR_ARGS=$MDADM_RAIDDEVICES $MDADM_DELAY $MDADM_MAIL $MDADM_PROGRAM $MDADM_SCAN $MDADM_SEND_MAIL $MDADM_CONFIG" > /run/sysconfig/mdadm +-if [ -n "$MDADM_CHECK_DURATION" ]; then +- echo "MDADM_CHECK_DURATION=$MDADM_CHECK_DURATION" >> /run/sysconfig/mdadm +-fi +diff --git a/systemd/mdmonitor.service b/systemd/mdmonitor.service +index 9c364785..6d0c0039 100644 +--- a/systemd/mdmonitor.service ++++ b/systemd/mdmonitor.service +@@ -11,7 +11,18 @@ DefaultDependencies=no + Documentation=man:mdadm(8) + + [Service] +-Environment= MDADM_MONITOR_ARGS=--scan +-EnvironmentFile=-/run/sysconfig/mdadm +-ExecStartPre=-/usr/lib/mdadm/mdadm_env.sh +-ExecStart=BINDIR/mdadm --monitor $MDADM_MONITOR_ARGS ++# For Maintainers: ++# We need to provide consistent mdmonitor configuration man page to the users. We don't want to get ++# asked continuously how it can be configured. ++# /etc/sysconfig/mdadm or /etc/sysconfig/mdmonitor or whatever else, should be abandoned. ++# Following parameters should be customized via mdadm.conf only: ++# - MONITORDELAY (do not set --delay in service) ++# - MAILADDR (do not set --mail in service) ++# - MAILFROM (not settable from cmdline) ++# - PROGRAM (do not set --program or --alert in service) ++# ++# Following parameters can be customized in service: ++# - --syslog (configure syslog logging) ++# - --fork (Type=forking must be added, not recommended and not needed with systemd) ++# - --pid-file (allowed only when --fork selected) ++ExecStart=BINDIR/mdadm --monitor --scan +-- +2.41.0 + diff --git a/SOURCES/0195-mdadm.man-elaborate-more-about-mdmonitor.service.patch b/SOURCES/0195-mdadm.man-elaborate-more-about-mdmonitor.service.patch new file mode 100644 index 0000000..157cff4 --- /dev/null +++ b/SOURCES/0195-mdadm.man-elaborate-more-about-mdmonitor.service.patch @@ -0,0 +1,131 @@ +From 70f3a1bcb0ff3b740f986b5819931b93c8bed24d Mon Sep 17 00:00:00 2001 +From: Mariusz Tkaczyk +Date: Tue, 10 Sep 2024 15:35:03 +0200 +Subject: [PATCH 195/201] mdadm.man: elaborate more about mdmonitor.service + +Describe how it behaves and how it can be configured to work. + +Signed-off-by: Mariusz Tkaczyk +--- + mdadm.8.in | 52 ++++++++++++++++++++------------------- + systemd/mdmonitor.service | 11 ++++++--- + 2 files changed, 34 insertions(+), 29 deletions(-) + +diff --git a/mdadm.8.in b/mdadm.8.in +index aa0c5403..ee5b9bd4 100644 +--- a/mdadm.8.in ++++ b/mdadm.8.in +@@ -1878,11 +1878,15 @@ script. + .SH For Monitor mode: + .TP + .BR \-m ", " \-\-mail +-Give a mail address to send alerts to. ++Give an mail address to send alerts to. Can be configured in ++.B mdadm.conf ++as MAILADDR. + + .TP + .BR \-p ", " \-\-program ", " \-\-alert +-Give a program to be run whenever an event is detected. ++Give a program to be run whenever an event is detected. Can be configured in ++.B mdadm.conf ++as PROGRAM. + + .TP + .BR \-y ", " \-\-syslog +@@ -1891,13 +1895,12 @@ facility of 'daemon' and varying priorities. + + .TP + .BR \-d ", " \-\-delay +-Give a delay in seconds. +-.I mdadm +-polls the md arrays and then waits this many seconds before polling +-again. The default is 60 seconds. Since 2.6.16, there is no need to +-reduce this as the kernel alerts ++Give a delay in seconds. The default is 60 seconds. + .I mdadm +-immediately when there is any change. ++polls the md arrays and then waits this many seconds before polling again if no event happened. ++Can be configured in ++.B mdadm.conf ++as MONITORDELAY. + + .TP + .BR \-r ", " \-\-increment +@@ -2595,30 +2598,29 @@ 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 ++address must be specified on the command line or in the config file. If neither are available, then + .I mdadm +-will not monitor anything. +-For devices given directly in command line, without ++will not monitor anything. 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. ++Note: On systems where mdadm monitoring is managed through systemd, the mdmonitor.service ++should be present. This service is designed to be the primary solution for array monitoring. ++It is configured to operate in system-wide mode. It is initiated by udev when start criteria are ++met, e.g. ++.B mdadm.conf ++exists and necessary configuration parameters are set. ++It is kept alive as long as a redundant RAID array is active; it stops otherwise. User should ++customize MAILADDR in ++.B mdadm.conf ++to receive mail notifications. MONITORDELAY, MAILFROM and PROGRAM are optional. See ++.BR mdadm.conf (5) ++for detailed description of these options. ++Use systemctl status mdmonitor.service to verify status or determine if additional configuration ++is needed. + + The different events are: + +diff --git a/systemd/mdmonitor.service b/systemd/mdmonitor.service +index 6d0c0039..95046bc5 100644 +--- a/systemd/mdmonitor.service ++++ b/systemd/mdmonitor.service +@@ -12,10 +12,12 @@ Documentation=man:mdadm(8) + + [Service] + # For Maintainers: +-# We need to provide consistent mdmonitor configuration man page to the users. We don't want to get +-# asked continuously how it can be configured. +-# /etc/sysconfig/mdadm or /etc/sysconfig/mdmonitor or whatever else, should be abandoned. +-# Following parameters should be customized via mdadm.conf only: ++# We need to ensure that the mdmonitor configuration aligns with the guidelines provided ++# in the man page for users. ++# /etc/sysconfig/mdadm, /etc/sysconfig/mdmonitor, or any other similar configuration file should ++# not be supported because non upstream components are not described in man pages. ++ ++# Parameters designed to be customized by user, should be settable via mdadm.conf: + # - MONITORDELAY (do not set --delay in service) + # - MAILADDR (do not set --mail in service) + # - MAILFROM (not settable from cmdline) +@@ -25,4 +27,5 @@ Documentation=man:mdadm(8) + # - --syslog (configure syslog logging) + # - --fork (Type=forking must be added, not recommended and not needed with systemd) + # - --pid-file (allowed only when --fork selected) ++ + ExecStart=BINDIR/mdadm --monitor --scan +-- +2.41.0 + diff --git a/SOURCES/0196-mdadm-Add-mdadm_status.h.patch b/SOURCES/0196-mdadm-Add-mdadm_status.h.patch new file mode 100644 index 0000000..6b5c0e2 --- /dev/null +++ b/SOURCES/0196-mdadm-Add-mdadm_status.h.patch @@ -0,0 +1,85 @@ +From f2f938b0b2755bb2c558eef87f5767beb2ff2ca1 Mon Sep 17 00:00:00 2001 +From: Anna Sztukowska +Date: Wed, 9 Oct 2024 08:14:05 +0200 +Subject: [PATCH 196/201] mdadm: Add mdadm_status.h + +Move mdadm_status_t to mdadm_status.h file. Add status for memory +allocation failure. + +Signed-off-by: Anna Sztukowska +--- + mdadm.h | 7 +------ + mdadm_status.h | 13 +++++++++++++ + xmalloc.c | 4 ++-- + 3 files changed, 16 insertions(+), 8 deletions(-) + create mode 100644 mdadm_status.h + +diff --git a/mdadm.h b/mdadm.h +index bbc1b97f..5781948e 100644 +--- a/mdadm.h ++++ b/mdadm.h +@@ -166,6 +166,7 @@ struct dlm_lksb { + #include "md_p.h" + #include "bitmap.h" + #include "msg.h" ++#include "mdadm_status.h" + + #include + /* Redhat don't like to #include , and +@@ -449,12 +450,6 @@ struct spare_criteria { + struct dev_policy *pols; + }; + +-typedef enum mdadm_status { +- MDADM_STATUS_SUCCESS = 0, +- MDADM_STATUS_ERROR, +- MDADM_STATUS_UNDEF, +-} mdadm_status_t; +- + enum mode { + ASSEMBLE=1, + BUILD, +diff --git a/mdadm_status.h b/mdadm_status.h +new file mode 100644 +index 00000000..905105e2 +--- /dev/null ++++ b/mdadm_status.h +@@ -0,0 +1,13 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++ ++#ifndef MDADM_STATUS_H ++#define MDADM_STATUS_H ++ ++typedef enum mdadm_status { ++ MDADM_STATUS_SUCCESS = 0, ++ MDADM_STATUS_ERROR, ++ MDADM_STATUS_UNDEF, ++ MDADM_STATUS_MEM_FAIL ++} mdadm_status_t; ++ ++#endif +diff --git a/xmalloc.c b/xmalloc.c +index dac30eb6..e28d3bd6 100644 +--- a/xmalloc.c ++++ b/xmalloc.c +@@ -22,6 +22,7 @@ + */ + + #include "xmalloc.h" ++#include "mdadm_status.h" + + #include + #include +@@ -32,8 +33,7 @@ static void *exit_memory_alloc_failure(void) + { + fprintf(stderr, "Memory allocation failure - aborting\n"); + +- /* TODO: replace with MDADM_STATUS_MEM_FAIL */ +- exit(1); ++ exit(MDADM_STATUS_MEM_FAIL); + } + + void *xmalloc(size_t len) +-- +2.41.0 + diff --git a/SOURCES/0197-mdadm.conf.man-Explain-udev-rule.patch b/SOURCES/0197-mdadm.conf.man-Explain-udev-rule.patch new file mode 100644 index 0000000..2fd711e --- /dev/null +++ b/SOURCES/0197-mdadm.conf.man-Explain-udev-rule.patch @@ -0,0 +1,67 @@ +From 13378ba880c251aa65dac12a5d366230cb7ea039 Mon Sep 17 00:00:00 2001 +From: Andre Paiusco +Date: Sat, 12 Oct 2024 16:28:29 +0200 +Subject: [PATCH 197/201] mdadm.conf.man: Explain udev rule + +Clarify a filename is accepted and the need of reloading the +udev rules. + +Small correction on example order. + +Signed-off-by: Andre Paiusco +--- + mdadm.conf.5.in | 24 ++++++++++++++---------- + 1 file changed, 14 insertions(+), 10 deletions(-) + +diff --git a/mdadm.conf.5.in b/mdadm.conf.5.in +index 14302a91..97862fdb 100644 +--- a/mdadm.conf.5.in ++++ b/mdadm.conf.5.in +@@ -506,8 +506,12 @@ of the new disk or if both arrays have the same + .IR spare-group . + + To update hot plug configuration it is necessary to execute +-.B mdadm \-\-udev\-rules +-command after changing the config file ++.B mdadm \-\-udev\-rules\= ++e.g. ++.B /etc/udev/rules.d/65-md-bare.rules ++command after changing the config file. And also run ++.B udevadm control \-\-reload ++otherwise, a reboot is needed. + + Keywords used in the + .I POLICY +@@ -724,14 +728,6 @@ ARRAY /dev/md/home UUID=9187a482:5dde19d9:eea3cc4a:d646ab8b + .br + auto=part + .br +-POLICY domain=domain1 metadata=imsm path=pci-0000:00:1f.2-scsi-* +-.br +- action=spare +-.br +-POLICY domain=domain1 metadata=imsm path=pci-0000:04:00.0-scsi-[01]* +-.br +- action=include +-.br + # One domain comprising of devices attached to specified paths is defined. + .br + # Bare device matching first path will be made an imsm spare on hot plug. +@@ -742,6 +738,14 @@ POLICY domain=domain1 metadata=imsm path=pci-0000:04:00.0-scsi-[01]* + .br + # given domain name can be migrated. + .br ++POLICY domain=domain1 metadata=imsm path=pci-0000:00:1f.2-scsi-* ++.br ++ action=spare ++.br ++POLICY domain=domain1 metadata=imsm path=pci-0000:04:00.0-scsi-[01]* ++.br ++ action=include ++.br + MAILADDR root@mydomain.tld + .br + PROGRAM /usr/sbin/handle\-mdadm\-events +-- +2.41.0 + diff --git a/SOURCES/0198-mdadm.man-Add-udev-rules-flag.patch b/SOURCES/0198-mdadm.man-Add-udev-rules-flag.patch new file mode 100644 index 0000000..a4ba75e --- /dev/null +++ b/SOURCES/0198-mdadm.man-Add-udev-rules-flag.patch @@ -0,0 +1,37 @@ +From cb4acfa372a8d66703706ef54f985bd588d8bb99 Mon Sep 17 00:00:00 2001 +From: Andre Paiusco +Date: Sat, 12 Oct 2024 16:29:01 +0200 +Subject: [PATCH 198/201] mdadm.man: Add udev-rules flag + +--udev-rules flag is added and point to mdadm.conf man page +for further explanations about POLICY. + +Signed-off-by: Andre Paiusco +--- + mdadm.8.in | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/mdadm.8.in b/mdadm.8.in +index ee5b9bd4..43d6fe05 100644 +--- a/mdadm.8.in ++++ b/mdadm.8.in +@@ -1830,6 +1830,16 @@ can be found it + under + .BR "SCRUBBING AND MISMATCHES" . + ++.TP ++.B \-\-udev\-rules= ++it generates the udev rules to the file that handles hot-plug bare devices. ++Given the POLICYs defined under ++.IR {CONFFILE}\ (or {CONFFILE2}) ++ ++See ++.BR mdadm.conf (5) ++for more details and usage examples about POLICY. ++ + .SH For Incremental Assembly mode: + .TP + .BR \-\-rebuild\-map ", " \-r +-- +2.41.0 + diff --git a/SOURCES/0199-util-use-only-dev-directory-in-open_dev.patch b/SOURCES/0199-util-use-only-dev-directory-in-open_dev.patch new file mode 100644 index 0000000..e2c3d53 --- /dev/null +++ b/SOURCES/0199-util-use-only-dev-directory-in-open_dev.patch @@ -0,0 +1,40 @@ +From 0d29e12553cd9f51c1d4428ea373cdb8c62fbcf2 Mon Sep 17 00:00:00 2001 +From: Kinga Stefaniuk +Date: Wed, 9 Oct 2024 08:48:20 +0200 +Subject: [PATCH 199/201] util: use only /dev directory in open_dev() + +Previously, open_dev() tried to open device in two ways - using /dev and +/tmp directory. This method could be used by users which have no access +to /tmp directory (e.g. udev) and dev_open() fails which may affect many +processes. Remove try to open in /tmp directory. + +Signed-off-by: Kinga Stefaniuk +--- + util.c | 11 ----------- + 1 file changed, 11 deletions(-) + +diff --git a/util.c b/util.c +index 7c5c5c8f..f05392a2 100644 +--- a/util.c ++++ b/util.c +@@ -1111,17 +1111,6 @@ int dev_open(char *dev, int flags) + fd = open(devname, flags); + unlink(devname); + } +- if (fd < 0) { +- /* Try /tmp as /dev appear to be read-only */ +- snprintf(devname, sizeof(devname), +- "/tmp/.tmp.md.%d:%d:%d", +- (int)getpid(), major, minor); +- if (mknod(devname, S_IFBLK|0600, +- makedev(major, minor)) == 0) { +- fd = open(devname, flags); +- unlink(devname); +- } +- } + } else + fd = open(dev, flags); + return fd; +-- +2.41.0 + diff --git a/SOURCES/0200-mdadm-Manage-Clear-superblock-if-adding-new-device-f.patch b/SOURCES/0200-mdadm-Manage-Clear-superblock-if-adding-new-device-f.patch new file mode 100644 index 0000000..033987b --- /dev/null +++ b/SOURCES/0200-mdadm-Manage-Clear-superblock-if-adding-new-device-f.patch @@ -0,0 +1,47 @@ +From c6ca5b31e18f92490e639de0e5eae88985628633 Mon Sep 17 00:00:00 2001 +From: Xiao Ni +Date: Fri, 18 Oct 2024 16:48:16 +0800 +Subject: [PATCH 200/201] mdadm/Manage: Clear superblock if adding new device + fails + +The superblock is kept if adding new device fails. It should clear the +superblock if it fails to add a new disk. + +Signed-off-by: Xiao Ni +Signed-off-by: Mariusz Tkaczyk +--- + Manage.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/Manage.c b/Manage.c +index 246ef319..8c58683b 100644 +--- a/Manage.c ++++ b/Manage.c +@@ -793,6 +793,7 @@ int Manage_add(int fd, int tfd, struct mddev_dev *dv, + int j; + mdu_disk_info_t disc; + struct map_ent *map = NULL; ++ bool add_new_super = false; + + if (!get_dev_size(tfd, dv->devname, &ldsize)) { + if (dv->disposition == 'M') +@@ -1011,6 +1012,7 @@ int Manage_add(int fd, int tfd, struct mddev_dev *dv, + goto unlock; + if (tst->ss->write_init_super(tst)) + goto unlock; ++ add_new_super = true; + } else if (dv->disposition == 'A') { + /* this had better be raid1. + * As we are "--re-add"ing we must find a spare slot +@@ -1078,6 +1080,8 @@ int Manage_add(int fd, int tfd, struct mddev_dev *dv, + map_unlock(&map); + return 1; + unlock: ++ if (add_new_super) ++ Kill(dv->devname, tst, 0, -1, 0); + map_unlock(&map); + return -1; + } +-- +2.41.0 + diff --git a/SOURCES/0201-mdadm-Grow-Check-new_level-interface-rather-than-ker.patch b/SOURCES/0201-mdadm-Grow-Check-new_level-interface-rather-than-ker.patch new file mode 100644 index 0000000..f0a9152 --- /dev/null +++ b/SOURCES/0201-mdadm-Grow-Check-new_level-interface-rather-than-ker.patch @@ -0,0 +1,31 @@ +From b278b2fc172bb8d50f607adef4d515af1f52d913 Mon Sep 17 00:00:00 2001 +From: Xiao Ni +Date: Fri, 18 Oct 2024 16:48:17 +0800 +Subject: [PATCH 201/201] mdadm/Grow: Check new_level interface rather than + kernel version + +Different os distributions have different kernel version themselves. +Check new_level sysfs interface rather than kernel version. + +Signed-off-by: Xiao Ni +Signed-off-by: Mariusz Tkaczyk +--- + Grow.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/Grow.c b/Grow.c +index ef1285ec..9032c3e9 100644 +--- a/Grow.c ++++ b/Grow.c +@@ -2952,7 +2952,7 @@ static int impose_reshape(struct mdinfo *sra, + err = errno; + + /* new_level is introduced in kernel 6.12 */ +- if (!err && get_linux_version() >= 6012000 && ++ if (!err && sysfs_attribute_available(sra, NULL, "new_level") && + sysfs_set_num(sra, NULL, "new_level", info->new_level) < 0) + err = errno; + +-- +2.41.0 + diff --git a/SPECS/mdadm.spec b/SPECS/mdadm.spec index dfbe627..f43ff6f 100644 --- a/SPECS/mdadm.spec +++ b/SPECS/mdadm.spec @@ -3,7 +3,7 @@ Name: mdadm Version: 4.3 # extraversion is used to define rhel internal version -%define extraversion 3 +%define extraversion 4 Release: %{extraversion}%{?dist} Summary: The mdadm program controls Linux md devices (software RAID arrays) URL: http://www.kernel.org/pub/linux/utils/raid/mdadm/ @@ -87,90 +87,134 @@ Patch062: 0063-Makefile-Move-pie-to-LDFLAGS.patch Patch063: 0064-tests-23rdev-lifetime-fix-a-typo.patch Patch064: 0065-util.c-change-devnm-to-const-in-mdmon-functions.patch Patch065: 0066-Wait-for-mdmon-when-it-is-stared-via-systemd.patch -Patch066: 0069-mdadm-Fix-compilation-for-32-bit-arch.patch -Patch067: 0070-add-checking-of-return-status-on-fstat-calls.patch -Patch068: 0071-super-intel-fix-typo-in-error-msg.patch -Patch069: 0072-mdadm-super-intel-remove-dead-code.patch -Patch070: 0073-mdadm-super-intel-fix-bad-shift.patch -Patch071: 0074-mdadm-deprecate-bitmap-custom-file.patch -Patch072: 0075-Makefile-fix-make-s-detection.patch -Patch073: 0076-Change-some-error-messages-to-info-level.patch -Patch074: 0077-mdadm-Start-update_opt-from-0.patch -Patch075: 0078-Don-t-control-reshape-speed-in-daemon.patch -Patch076: 0079-mdadm-tests-test-enhance.patch -Patch077: 0080-mdadm-tests-test-don-t-fail-when-systemd-reports-err.patch -Patch078: 0081-mdadm-tests-names_template-enhance.patch -Patch079: 0082-mdadm-tests-03assem-incr-enhance.patch -Patch080: 0083-mdadm-tests-03r0assem-enhance.patch -Patch081: 0084-mdadm-tests-remove-03r5assem-failed.patch -Patch082: 0085-mdadm-tests-03r5assemV1.patch -Patch083: 0086-mdadm-tests-remove-04r5swap.broken.patch -Patch084: 0087-tests-04update-metadata-skip-linear.patch -Patch085: 0088-mdadm-tests-05r5-internalbitmap.patch -Patch086: 0089-mdadm-tests-06name-enhance.patch -Patch087: 0090-mdadm-tests-07autoassemble.patch -Patch088: 0091-mdadm-tests-07autodetect.broken-can-be-removed.patch -Patch089: 0092-mdadm-tests-07changelevelintr.patch -Patch090: 0093-mdadm-tests-disable-selinux.patch -Patch091: 0094-mdadm-platform-intel-buffer-overflow-detected.patch -Patch092: 0095-mdadm-tests-bitmap-cases-enhance.patch -Patch093: 0096-mdadm-tests-04update-uuid.patch -Patch094: 0097-mdadm-tests-05r1-re-add-nosuper.patch -Patch095: 0098-mdadm-tests-remove-strace-test.patch -Patch096: 0099-mdadm.h-provide-basename-if-GLIBC-is-not-avialable.patch -Patch097: 0100-imsm-fix-first-volume-autolayout-with-IMSM_NO_PLATFO.patch -Patch098: 0101-imsm-make-freesize-required-to-volume-autolayout.patch -Patch099: 0102-mdadm-Fix-hang-race-condition-in-wait_for_zero_forks.patch -Patch100: 0103-mdadm-Block-SIGCHLD-processes-before-starting-childr.patch -Patch101: 0104-test-pass-flags-to-services.patch -Patch102: 0105-mdadm-Fix-socket-connection-failure-when-mdmon-runs-.patch -Patch103: 0106-Makefile-Do-not-call-gcc-directly.patch -Patch104: 0107-mdadm-tests-judge-foreign-array-in-test-cases.patch -Patch105: 0108-Revert-mdadm-Fix-socket-connection-failure-when-mdmo.patch -Patch106: 0109-mdadm-Assemble.c-fix-coverity-issues.patch -Patch107: 0111-mdadm-Fix-socket-connection-failure-when-mdmon-runs-.patch -Patch108: 0113-config.c-Fix-memory-leak-in-load_containers.patch -Patch109: 0114-mdadm-Build.c-fix-coverity-issues.patch -Patch110: 0115-mdadm-Create.c-fix-coverity-issues.patch -Patch111: 0116-mdadm-super-ddf.c-fix-coverity-issues.patch -Patch112: 0117-mdadm-clustermd_tests-add-some-APIs-in-func.sh-to-su.patch -Patch113: 0118-mdadm-clustermd_tests-adjust-test-cases-to-support-m.patch -Patch114: 0119-mapfile.c-Fix-STRING_OVERFLOW-issue.patch -Patch115: 0120-mdadm-Manage.c-fix-coverity-issues.patch -Patch116: 0121-Manage-fix-is_remove_safe.patch -Patch117: 0122-imsm-add-indent-for-encryption-details.patch -Patch118: 0123-mdadm-Monitor.c-fix-coverity-issues.patch -Patch119: 0124-mdadm-Query.c-fix-coverity-issues.patch -Patch120: 0125-mdadm-lib.c-fix-coverity-issues.patch -Patch121: 0126-mdadm-do-not-allow-leading-dot-in-MD-device-name.patch -Patch122: 0128-Detail-fix-detail-export-for-uuid_zero.patch -Patch123: 0129-drive_encryption-Fix-ata-passthrough12-verify.patch -Patch124: 0130-super0-use-define-for-char-array-in-examine_super0.patch -Patch125: 0131-Makefile-add-more-compiler-flags.patch -Patch126: 0133-mdstat-Rework-mdstat-external-arrays-handling.patch -Patch127: 0134-mdadm-managemon.c-fix-coverity-issues.patch -Patch128: 0135-mdadm-msg.c-fix-coverity-issues.patch -Patch129: 0136-imsm-refactor-chunk-size-print.patch -Patch130: 0137-mdadm-Grow-fix-coverity-issue-CHECKED_RETURN.patch -Patch131: 0138-mdadm-Grow-fix-coverity-issue-RESOURCE_LEAK.patch -Patch132: 0139-mdadm-Grow-fix-coverity-issue-STRING_OVERFLOW.patch -Patch133: 0140-mdadm-Incremental-fix-coverity-issues.patch -Patch134: 0141-mdadm-mdmon-fix-coverity-issue-CHECKED_RETURN.patch -Patch135: 0142-mdadm-mdmon-fix-coverity-issue-RESOURCE_LEAK.patch -Patch136: 0143-mdadm-mdopen-fix-coverity-issue-CHECKED_RETURN.patch -Patch137: 0144-mdadm-mdopen-fix-coverity-issue-STRING_OVERFLOW.patch -Patch138: 0145-mdadm-mdstat-fix-coverity-issue-CHECKED_RETURN.patch -Patch139: 0146-mdadm-super0-fix-coverity-issue-CHECKED_RETURN-and-E.patch -Patch140: 0147-mdadm-super1-fix-coverity-issue-CHECKED_RETURN.patch -Patch141: 0148-mdadm-super1-fix-coverity-issue-DEADCODE.patch -Patch142: 0149-mdadm-super1-fix-coverity-issue-EVALUATION_ORDER.patch -Patch143: 0150-mdadm-super1-fix-coverity-issue-RESOURCE_LEAK.patch -Patch144: 0151-policy.c-Fix-check_return-issue-in-Write_rules.patch -Patch145: 0152-super-gpt.c-Fix-check_return-issue-in-load_gpt.patch -Patch146: 0153-super-intel-fix-compilation-error.patch -Patch147: 0154-super-intel-add-define-for-migr_state.patch -Patch148: 0156-Grow_reshape-set-only-component_size-for-size-grow.patch -Patch149: 0157-mdstat-fix-list-detach-issues.patch +Patch066: 0067-mdadm-Change-main-repository-to-Github.patch +Patch067: 0069-mdadm-Fix-compilation-for-32-bit-arch.patch +Patch068: 0070-add-checking-of-return-status-on-fstat-calls.patch +Patch069: 0071-super-intel-fix-typo-in-error-msg.patch +Patch070: 0072-mdadm-super-intel-remove-dead-code.patch +Patch071: 0073-mdadm-super-intel-fix-bad-shift.patch +Patch072: 0074-mdadm-deprecate-bitmap-custom-file.patch +Patch073: 0075-Makefile-fix-make-s-detection.patch +Patch074: 0076-Change-some-error-messages-to-info-level.patch +Patch075: 0077-mdadm-Start-update_opt-from-0.patch +Patch076: 0078-Don-t-control-reshape-speed-in-daemon.patch +Patch077: 0079-mdadm-tests-test-enhance.patch +Patch078: 0080-mdadm-tests-test-don-t-fail-when-systemd-reports-err.patch +Patch079: 0081-mdadm-tests-names_template-enhance.patch +Patch080: 0082-mdadm-tests-03assem-incr-enhance.patch +Patch081: 0083-mdadm-tests-03r0assem-enhance.patch +Patch082: 0084-mdadm-tests-remove-03r5assem-failed.patch +Patch083: 0085-mdadm-tests-03r5assemV1.patch +Patch084: 0086-mdadm-tests-remove-04r5swap.broken.patch +Patch085: 0087-tests-04update-metadata-skip-linear.patch +Patch086: 0088-mdadm-tests-05r5-internalbitmap.patch +Patch087: 0089-mdadm-tests-06name-enhance.patch +Patch088: 0090-mdadm-tests-07autoassemble.patch +Patch089: 0091-mdadm-tests-07autodetect.broken-can-be-removed.patch +Patch090: 0092-mdadm-tests-07changelevelintr.patch +Patch091: 0093-mdadm-tests-disable-selinux.patch +Patch092: 0094-mdadm-platform-intel-buffer-overflow-detected.patch +Patch093: 0095-mdadm-tests-bitmap-cases-enhance.patch +Patch094: 0096-mdadm-tests-04update-uuid.patch +Patch095: 0097-mdadm-tests-05r1-re-add-nosuper.patch +Patch096: 0098-mdadm-tests-remove-strace-test.patch +Patch097: 0099-mdadm.h-provide-basename-if-GLIBC-is-not-avialable.patch +Patch098: 0100-imsm-fix-first-volume-autolayout-with-IMSM_NO_PLATFO.patch +Patch099: 0101-imsm-make-freesize-required-to-volume-autolayout.patch +Patch100: 0102-mdadm-Fix-hang-race-condition-in-wait_for_zero_forks.patch +Patch101: 0103-mdadm-Block-SIGCHLD-processes-before-starting-childr.patch +Patch102: 0104-test-pass-flags-to-services.patch +Patch103: 0105-mdadm-Fix-socket-connection-failure-when-mdmon-runs-.patch +Patch104: 0106-Makefile-Do-not-call-gcc-directly.patch +Patch105: 0107-mdadm-tests-judge-foreign-array-in-test-cases.patch +Patch106: 0108-Revert-mdadm-Fix-socket-connection-failure-when-mdmo.patch +Patch107: 0109-mdadm-Assemble.c-fix-coverity-issues.patch +Patch108: 0111-mdadm-Fix-socket-connection-failure-when-mdmon-runs-.patch +Patch109: 0113-config.c-Fix-memory-leak-in-load_containers.patch +Patch110: 0114-mdadm-Build.c-fix-coverity-issues.patch +Patch111: 0115-mdadm-Create.c-fix-coverity-issues.patch +Patch112: 0116-mdadm-super-ddf.c-fix-coverity-issues.patch +Patch113: 0117-mdadm-clustermd_tests-add-some-APIs-in-func.sh-to-su.patch +Patch114: 0118-mdadm-clustermd_tests-adjust-test-cases-to-support-m.patch +Patch115: 0119-mapfile.c-Fix-STRING_OVERFLOW-issue.patch +Patch116: 0120-mdadm-Manage.c-fix-coverity-issues.patch +Patch117: 0121-Manage-fix-is_remove_safe.patch +Patch118: 0122-imsm-add-indent-for-encryption-details.patch +Patch119: 0123-mdadm-Monitor.c-fix-coverity-issues.patch +Patch120: 0124-mdadm-Query.c-fix-coverity-issues.patch +Patch121: 0125-mdadm-lib.c-fix-coverity-issues.patch +Patch122: 0126-mdadm-do-not-allow-leading-dot-in-MD-device-name.patch +Patch123: 0128-Detail-fix-detail-export-for-uuid_zero.patch +Patch124: 0129-drive_encryption-Fix-ata-passthrough12-verify.patch +Patch125: 0130-super0-use-define-for-char-array-in-examine_super0.patch +Patch126: 0131-Makefile-add-more-compiler-flags.patch +Patch127: 0133-mdstat-Rework-mdstat-external-arrays-handling.patch +Patch128: 0134-mdadm-managemon.c-fix-coverity-issues.patch +Patch129: 0135-mdadm-msg.c-fix-coverity-issues.patch +Patch130: 0136-imsm-refactor-chunk-size-print.patch +Patch131: 0137-mdadm-Grow-fix-coverity-issue-CHECKED_RETURN.patch +Patch132: 0138-mdadm-Grow-fix-coverity-issue-RESOURCE_LEAK.patch +Patch133: 0139-mdadm-Grow-fix-coverity-issue-STRING_OVERFLOW.patch +Patch134: 0140-mdadm-Incremental-fix-coverity-issues.patch +Patch135: 0141-mdadm-mdmon-fix-coverity-issue-CHECKED_RETURN.patch +Patch136: 0142-mdadm-mdmon-fix-coverity-issue-RESOURCE_LEAK.patch +Patch137: 0143-mdadm-mdopen-fix-coverity-issue-CHECKED_RETURN.patch +Patch138: 0144-mdadm-mdopen-fix-coverity-issue-STRING_OVERFLOW.patch +Patch139: 0145-mdadm-mdstat-fix-coverity-issue-CHECKED_RETURN.patch +Patch140: 0146-mdadm-super0-fix-coverity-issue-CHECKED_RETURN-and-E.patch +Patch141: 0147-mdadm-super1-fix-coverity-issue-CHECKED_RETURN.patch +Patch142: 0148-mdadm-super1-fix-coverity-issue-DEADCODE.patch +Patch143: 0149-mdadm-super1-fix-coverity-issue-EVALUATION_ORDER.patch +Patch144: 0150-mdadm-super1-fix-coverity-issue-RESOURCE_LEAK.patch +Patch145: 0151-policy.c-Fix-check_return-issue-in-Write_rules.patch +Patch146: 0152-super-gpt.c-Fix-check_return-issue-in-load_gpt.patch +Patch147: 0153-super-intel-fix-compilation-error.patch +Patch148: 0154-super-intel-add-define-for-migr_state.patch +Patch149: 0156-Grow_reshape-set-only-component_size-for-size-grow.patch +Patch150: 0157-mdstat-fix-list-detach-issues.patch +Patch151: 0158-md.4-replace-wrong-word.patch +Patch152: 0159-mdadm-util.c-fix-coverity-issues.patch +Patch153: 0160-mdadm-sysfs.c-fix-coverity-issues.patch +Patch154: 0161-imsm-add-read-OROM-form-ACPI-UEFI-tables.patch +Patch155: 0162-imsm-get-bus-from-VMD-driver-directory.patch +Patch156: 0163-platform-intel-refactor-path_attached_to_hba.patch +Patch157: 0164-mdadm-Change-displaying-of-devices-in-detail.patch +Patch158: 0165-imsm-Remove-warning-and-refactor-add_to_super_imsm-c.patch +Patch159: 0166-imsm-add-IMSM_OROM_CAPABILITIES_TPV-to-nvme-orom.patch +Patch160: 0167-mdadm-Increase-number-limit-in-md-device-name-to-102.patch +Patch161: 0168-imsm-save-checkpoint-prior-to-exit.patch +Patch162: 0169-Examine.c-Fix-memory-leaks-in-Examine.patch +Patch163: 0170-dlink.h-Fix-checkpatch-warnings-for-function-args.patch +Patch164: 0171-Incremental-support-devnode-in-IncrementalRemove.patch +Patch165: 0172-Detail.c-Fix-divide_by_zero-issue.patch +Patch166: 0173-mdadm-Add-compilation-process-to-README.md.patch +Patch167: 0174-mdadm-Grow-Update-new-level-when-starting-reshape.patch +Patch168: 0175-mdadm-Grow-Update-reshape_progress-to-need_back-afte.patch +Patch169: 0176-mdadm-Grow-Can-t-open-raid-when-running-grow-continu.patch +Patch170: 0177-mdadm-Grow-sleep-a-while-after-removing-disk-in-impo.patch +Patch171: 0178-mdadm-tests-wait-until-level-changes.patch +Patch172: 0179-mdadm-tests-07changelevels-fix.patch +Patch173: 0180-mdadm-tests-Remove-07reshape5intr.broken.patch +Patch174: 0181-mdadm-tests-07testreshape5-fix.patch +Patch175: 0182-mdadm-tests-remove-09imsm-assemble.broken.patch +Patch176: 0183-mdadm-Manage-record-errno.patch +Patch177: 0184-Remove-INSTALL-and-dev-null.patch +Patch178: 0186-Incremental-Rename-IncrementalRemove.patch +Patch179: 0187-sysfs-add-function-for-writing-to-sysfs-fd.patch +Patch180: 0188-Mdmonitor-Fix-startup-with-missing-directory.patch +Patch181: 0189-mdadm-add-xmalloc.h.patch +Patch182: 0190-md.man-update-refference-to-raid5-ppl.rst.patch +Patch183: 0191-util-fix-sys_hot_remove_disk.patch +Patch184: 0192-Rename-Monitor.c-to-mdmonitor.c.patch +Patch185: 0193-super-intel-move-scsi_get_serial-from-sg_io.patch +Patch186: 0194-mdmonitor-Abandon-custom-configuration-files.patch +Patch187: 0195-mdadm.man-elaborate-more-about-mdmonitor.service.patch +Patch188: 0196-mdadm-Add-mdadm_status.h.patch +Patch189: 0197-mdadm.conf.man-Explain-udev-rule.patch +Patch190: 0198-mdadm.man-Add-udev-rules-flag.patch +Patch191: 0199-util-use-only-dev-directory-in-open_dev.patch +Patch192: 0200-mdadm-Manage-Clear-superblock-if-adding-new-device-f.patch +Patch193: 0201-mdadm-Grow-Check-new_level-interface-rather-than-ker.patch # Fedora customization patches Patch197: mdadm-udev.patch @@ -254,9 +298,13 @@ install -m644 %{SOURCE5} %{buildroot}/etc/libreport/events.d /usr/share/mdadm/mdcheck %changelog -* Fri Oct 25 2024 MSVSphere Packaging Team - 4.3-3 +* Fri Oct 25 2024 MSVSphere Packaging Team - 4.3-4 - Rebuilt for MSVSphere 10 +* Sat Oct 19 2024 Xiao Ni - 4.3-4 +- Update to latest upstream +- Resolves: RHEL-59101 + * Sun Aug 11 2024 Xiao Ni - 4.3-3 - Fix coverity issue and update to latest upstream - Resolves: RHEL-34533, RHEL-50776