From aa49e0e895407807a9678db00cce9a70ab140043 Mon Sep 17 00:00:00 2001 From: wguanghao Date: Mon, 20 Jun 2022 10:37:30 +0800 Subject: [PATCH 1/4] fix segfault of --monitor -r (cherry picked from commit 2445ded0d240fa7407cbe0499f8f4eba67a708d6) --- ...dadm-fix-coredump-of-mdadm-monitor-r.patch | 39 +++++++++ ...ix-mdadm-r-remove-option-regresision.patch | 82 +++++++++++++++++++ mdadm.spec | 7 +- 3 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 0028-mdadm-fix-coredump-of-mdadm-monitor-r.patch create mode 100644 0029-mdadm-Fix-mdadm-r-remove-option-regresision.patch diff --git a/0028-mdadm-fix-coredump-of-mdadm-monitor-r.patch b/0028-mdadm-fix-coredump-of-mdadm-monitor-r.patch new file mode 100644 index 0000000..cb86a71 --- /dev/null +++ b/0028-mdadm-fix-coredump-of-mdadm-monitor-r.patch @@ -0,0 +1,39 @@ +From 546047688e1c64638f462147c755b58119cabdc8 Mon Sep 17 00:00:00 2001 +From: Wu Guanghao +Date: Mon, 16 Aug 2021 15:24:51 +0800 +Subject: [PATCH] mdadm: fix coredump of mdadm --monitor -r + +The --monitor -r option requires a parameter, otherwise a null pointer will be manipulated +when converting to integer data, and a coredump will appear. + +Segmentation fault (core dumped) + +Signed-off-by: Wu Guanghao +Acked-by: Mariusz Tkaczyk +Signed-off-by: Jes Sorensen +--- + ReadMe.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/ReadMe.c b/ReadMe.c +index 978796ac..37d84625 100644 +--- a/ReadMe.c ++++ b/ReadMe.c +@@ -81,11 +81,11 @@ char Version[] = "mdadm - v" VERSION " - " VERS_DATE EXTRAVERSION "\n"; + * found, it is started. + */ + +-char short_options[]="-ABCDEFGIQhVXYWZ:vqbc:i:l:p:m:n:x:u:c:d:z:U:N:sarfRSow1tye:k:"; ++char short_options[]="-ABCDEFGIQhVXYWZ:vqbc:i:l:p:m:r:n:x:u:c:d:z:U:N:safRSow1tye:k"; + char short_bitmap_options[]= +- "-ABCDEFGIQhVXYWZ:vqb:c:i:l:p:m:n:x:u:c:d:z:U:N:sarfRSow1tye:k:"; ++ "-ABCDEFGIQhVXYWZ:vqb:c:i:l:p:m:r:n:x:u:c:d:z:U:N:sarfRSow1tye:k:"; + char short_bitmap_auto_options[]= +- "-ABCDEFGIQhVXYWZ:vqb:c:i:l:p:m:n:x:u:c:d:z:U:N:sa:rfRSow1tye:k:"; ++ "-ABCDEFGIQhVXYWZ:vqb:c:i:l:p:m:r:n:x:u:c:d:z:U:N:sa:rfRSow1tye:k:"; + + struct option long_options[] = { + {"manage", 0, 0, ManageOpt}, +-- +2.27.0 + diff --git a/0029-mdadm-Fix-mdadm-r-remove-option-regresision.patch b/0029-mdadm-Fix-mdadm-r-remove-option-regresision.patch new file mode 100644 index 0000000..4ae6c08 --- /dev/null +++ b/0029-mdadm-Fix-mdadm-r-remove-option-regresision.patch @@ -0,0 +1,82 @@ +From 7b94dd6398bc08ec58088c3ca93a8bcd6e4c2c04 Mon Sep 17 00:00:00 2001 +From: Logan Gunthorpe +Date: Thu, 12 May 2022 10:30:55 -0600 +Subject: [PATCH] mdadm: Fix mdadm -r remove option regresision + +The commit noted below globally adds a parameter to the -r option but missed +the fact that -r is used for another purpose: --remove. + +After that commit, a command such as: + + mdadm /dev/md0 -r /dev/loop0 + +will do nothing seeing the device parameter will be consumed as a +argument to the -r option; thus, there will only be one device +seen one the command line, devs_found will only be 1 and nothing will +happen. + +This caused the 01r5integ and 01raid6integ tests to hang indefinitely +as mdadm did not remove the failed device. With the device not removed, +it would not be readded. Then the loop waiting for the array status to +change would loop forever. + +To fix this, revert the changes in the noted patch and create a new subopt +type for the monitor mode with parameters required for -r. + +Fixes: 546047688e1c ("mdadm: fix coredump of mdadm --monitor -r") +Cc: Wu Guanghao +Cc: Mariusz Tkaczyk +Signed-off-by: Logan Gunthorpe +--- + ReadMe.c | 7 ++++--- + mdadm.c | 1 + + mdadm.h | 1 + + 3 files changed, 6 insertions(+), 3 deletions(-) + +diff --git a/ReadMe.c b/ReadMe.c +index 8f873c48..556104f7 100644 +--- a/ReadMe.c ++++ b/ReadMe.c +@@ -81,11 +81,12 @@ char Version[] = "mdadm - v" VERSION " - " VERS_DATE EXTRAVERSION "\n"; + * found, it is started. + */ + +-char short_options[]="-ABCDEFGIQhVXYWZ:vqbc:i:l:p:m:r:n:x:u:c:d:z:U:N:safRSow1tye:k"; ++char short_options[]="-ABCDEFGIQhVXYWZ:vqbc:i:l:p:m:n:x:u:c:d:z:U:N:sarfRSow1tye:k"; ++char short_monitor_options[]="-ABCDEFGIQhVXYWZ:vqbc:i:l:p:m:r:n:x:u:c:d:z:U:N:safRSow1tye:k"; + char short_bitmap_options[]= +- "-ABCDEFGIQhVXYWZ:vqb:c:i:l:p:m:r:n:x:u:c:d:z:U:N:sarfRSow1tye:k:"; ++ "-ABCDEFGIQhVXYWZ:vqb:c:i:l:p:m:n:x:u:c:d:z:U:N:sarfRSow1tye:k:"; + char short_bitmap_auto_options[]= +- "-ABCDEFGIQhVXYWZ:vqb:c:i:l:p:m:r:n:x:u:c:d:z:U:N:sa:rfRSow1tye:k:"; ++ "-ABCDEFGIQhVXYWZ:vqb:c:i:l:p:m:n:x:u:c:d:z:U:N:sa:rfRSow1tye:k:"; + + struct option long_options[] = { + {"manage", 0, 0, ManageOpt}, +diff --git a/mdadm.c b/mdadm.c +index be40686c..d0c5e6de 100644 +--- a/mdadm.c ++++ b/mdadm.c +@@ -227,6 +227,7 @@ int main(int argc, char *argv[]) + shortopt = short_bitmap_auto_options; + break; + case 'F': newmode = MONITOR; ++ shortopt = short_monitor_options; + break; + case 'G': newmode = GROW; + shortopt = short_bitmap_options; +diff --git a/mdadm.h b/mdadm.h +index 09915a00..559da3f6 100644 +--- a/mdadm.h ++++ b/mdadm.h +@@ -419,6 +419,7 @@ enum mode { + }; + + extern char short_options[]; ++extern char short_monitor_options[]; + extern char short_bitmap_options[]; + extern char short_bitmap_auto_options[]; + extern struct option long_options[]; +-- +2.27.0 + diff --git a/mdadm.spec b/mdadm.spec index 3ec31a5..69176ce 100644 --- a/mdadm.spec +++ b/mdadm.spec @@ -1,6 +1,6 @@ Name: mdadm Version: 4.1 -Release: 5 +Release: 6 Summary: The software RAID arrays user manage tools License: GPLv2+ URL: http://www.kernel.org/pub/linux/utils/raid/mdadm/ @@ -37,6 +37,8 @@ Patch24: 0024-Block-overwriting-existing-links-while-manual-assemb.patch Patch25: 0025-Detect-too-small-device-error-rather-than-underflow-.patch Patch26: 0026-mdadm-Grow-prevent-md-s-fd-from-being-occupied-durin.patch Patch27: 0027-mdadm-remove-Werror-to-fix-Werror-address-of-packed-.patch +Patch28: 0028-mdadm-fix-coredump-of-mdadm-monitor-r.patch +Patch29: 0029-mdadm-Fix-mdadm-r-remove-option-regresision.patch BuildRequires: systemd gcc binutils Requires(post): systemd coreutils @@ -102,6 +104,9 @@ install -d -m 710 %{buildroot}/var/run/mdadm/ %{_mandir}/man*/* %changelog +* Sat Jun 25 2022 wuguanghao - 4.1-6 +- fix segfault of --monitor -r + * Wed Nov 4 2020 lixiaokeng - 4.1-5 - add make test -- Gitee From 511217d4ad3cedf5626a37ae11965992ee5a4db6 Mon Sep 17 00:00:00 2001 From: wguanghao Date: Mon, 17 Oct 2022 23:13:02 +0800 Subject: [PATCH 2/4] upgrade version to 4.2 (cherry picked from commit 41edfb191345668fb267c2b14985e7d60963e776) --- ..._DISK_FAILFAST-and-MD_DISK_WRITEMOST.patch | 39 ------- ...ror-to-fix-Werror-address-of-packed-.patch | 14 +-- 0002-Document-PART-POLICY-lines.patch | 77 ------------- ...ix-mdadm-r-remove-option-regresision.patch | 0 ...id-overflow-in-compute_backup_blocks.patch | 34 ------ 0004-Grow-report-correct-new-chunk-size.patch | 30 ------ 0005-Fix-spelling-typos.patch | 101 ------------------ ...skip-first-character-when-calling-xs.patch | 46 -------- ...x-reshape-for-decreasing-data-offset.patch | 70 ------------ ...mpt-to-manage-new-arrays-when-termin.patch | 50 --------- ...revious-mdmon-to-exit-during-takeove.patch | 57 ---------- ...rting-array-with-initial-reshape-che.patch | 52 --------- 0011-add-missing-units-to-examine.patch | 59 ---------- 0012-Create-Block-rounding-size-to-max.patch | 94 ---------------- ...-Fix-issue-with-abs-being-irrelevant.patch | 38 ------- 0014-imsm-close-removed-drive-fd.patch | 44 -------- ...dadm-force-a-uuid-swap-on-big-endian.patch | 40 ------- 0016-Init-devlist-as-an-array.patch | 35 ------ ...eck-recovery-after-re-add-when-no-I-.patch | 31 ------ ...e-legacy-code-for-md-driver-prior-to.patch | 52 --------- 0019-imsm-Correct-minimal-device-size.patch | 32 ------ ...ect-bitmap-info-for-cluster-raid-dev.patch | 30 ------ ...rror-message-if-mdadm-fails-assembli.patch | 57 ---------- ...r-0-character-when-using-strncpy-to-.patch | 34 ------ ...oring-return-value-of-read-and-lseek.patch | 53 --------- ...g-existing-links-while-manual-assemb.patch | 32 ------ ...-device-error-rather-than-underflow-.patch | 76 ------------- ...nt-md-s-fd-from-being-occupied-durin.patch | 64 ----------- ...dadm-fix-coredump-of-mdadm-monitor-r.patch | 39 ------- mdadm-4.1.tar.xz | Bin 440756 -> 0 bytes mdadm-4.2.tar.xz | Bin 0 -> 453624 bytes mdadm.spec | 42 ++------ 32 files changed, 16 insertions(+), 1406 deletions(-) delete mode 100644 0001-Assemble-keep-MD_DISK_FAILFAST-and-MD_DISK_WRITEMOST.patch rename 0027-mdadm-remove-Werror-to-fix-Werror-address-of-packed-.patch => 0001-mdadm-remove-Werror-to-fix-Werror-address-of-packed-.patch (75%) delete mode 100644 0002-Document-PART-POLICY-lines.patch rename 0029-mdadm-Fix-mdadm-r-remove-option-regresision.patch => 0002-mdadm-Fix-mdadm-r-remove-option-regresision.patch (100%) delete mode 100644 0003-Grow-avoid-overflow-in-compute_backup_blocks.patch delete mode 100644 0004-Grow-report-correct-new-chunk-size.patch delete mode 100644 0005-Fix-spelling-typos.patch delete mode 100644 0006-Detail.c-do-not-skip-first-character-when-calling-xs.patch delete mode 100644 0007-Fix-reshape-for-decreasing-data-offset.patch delete mode 100644 0008-mdmon-don-t-attempt-to-manage-new-arrays-when-termin.patch delete mode 100644 0009-mdmon-wait-for-previous-mdmon-to-exit-during-takeove.patch delete mode 100644 0010-Assemble-Fix-starting-array-with-initial-reshape-che.patch delete mode 100644 0011-add-missing-units-to-examine.patch delete mode 100644 0012-Create-Block-rounding-size-to-max.patch delete mode 100644 0013-super-intel-Fix-issue-with-abs-being-irrelevant.patch delete mode 100644 0014-imsm-close-removed-drive-fd.patch delete mode 100644 0015-mdadm-force-a-uuid-swap-on-big-endian.patch delete mode 100644 0016-Init-devlist-as-an-array.patch delete mode 100644 0017-Don-t-need-to-check-recovery-after-re-add-when-no-I-.patch delete mode 100644 0018-Manage-Remove-the-legacy-code-for-md-driver-prior-to.patch delete mode 100644 0019-imsm-Correct-minimal-device-size.patch delete mode 100644 0020-Detail-show-correct-bitmap-info-for-cluster-raid-dev.patch delete mode 100644 0021-Assemble-print-error-message-if-mdadm-fails-assembli.patch delete mode 100644 0022-Include-count-for-0-character-when-using-strncpy-to-.patch delete mode 100644 0023-restripe-fix-ignoring-return-value-of-read-and-lseek.patch delete mode 100644 0024-Block-overwriting-existing-links-while-manual-assemb.patch delete mode 100644 0025-Detect-too-small-device-error-rather-than-underflow-.patch delete mode 100644 0026-mdadm-Grow-prevent-md-s-fd-from-being-occupied-durin.patch delete mode 100644 0028-mdadm-fix-coredump-of-mdadm-monitor-r.patch delete mode 100644 mdadm-4.1.tar.xz create mode 100644 mdadm-4.2.tar.xz diff --git a/0001-Assemble-keep-MD_DISK_FAILFAST-and-MD_DISK_WRITEMOST.patch b/0001-Assemble-keep-MD_DISK_FAILFAST-and-MD_DISK_WRITEMOST.patch deleted file mode 100644 index e0423f9..0000000 --- a/0001-Assemble-keep-MD_DISK_FAILFAST-and-MD_DISK_WRITEMOST.patch +++ /dev/null @@ -1,39 +0,0 @@ -From d164718cc46b5b2ca3096829f385c935c5d99776 Mon Sep 17 00:00:00 2001 -From: Gioh Kim -Date: Tue, 6 Nov 2018 15:27:42 +0100 -Subject: [PATCH 01/27] Assemble: keep MD_DISK_FAILFAST and MD_DISK_WRITEMOSTLY - flag - -Before updating superblock of slave disks, desired_state value -is set for the target state of the slave disks. But it forgets -to check MD_DISK_FAILFAST and MD_DISK_WRITEMOSTLY flags. Then -start_arrays() calls ADD_NEW_DISK ioctl-call and pass the state -without MD_DISK_FAILFAST and MD_DISK_WRITEMOSTLY. - -Currenlty it does not generate any problem because kernel does not -care MD_DISK_FAILFAST or MD_DISK_WRITEMOSTLY flags. - -Reviewed-by: NeilBrown -Signed-off-by: Gioh Kim -Signed-off-by: Jes Sorensen ---- - Assemble.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/Assemble.c b/Assemble.c -index a79466c..f39c9e1 100644 ---- a/Assemble.c -+++ b/Assemble.c -@@ -1704,6 +1704,9 @@ try_again: - else - desired_state = (1< Date: Mon, 29 Jun 2020 21:33:22 +0800 -Subject: [PATCH 27/27] mdadm: remove -Werror to fix +Subject: [PATCH] mdadm: remove -Werror to fix [-Werror=address-of-packed-member] problem gcc reports [-Werror=address-of-packed-member] error when building @@ -14,12 +14,12 @@ Signed-off-by: Zhiqiang Liu 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile -index 2767ac6..5e24cbd 100644 +index 2a51d81..ee5bdad 100644 --- a/Makefile +++ b/Makefile -@@ -48,7 +48,7 @@ endif - - CC ?= $(CROSS_COMPILE)gcc +@@ -50,7 +50,7 @@ ifeq ($(origin CC),default) + CC := $(CROSS_COMPILE)gcc + endif CXFLAGS ?= -ggdb -CWFLAGS = -Wall -Werror -Wstrict-prototypes -Wextra -Wno-unused-parameter +CWFLAGS = -Wall -Wstrict-prototypes -Wextra -Wno-unused-parameter @@ -27,5 +27,5 @@ index 2767ac6..5e24cbd 100644 CWFLAGS += -Wp,-D_FORTIFY_SOURCE=2 -O3 endif -- -2.21.1 (Apple Git-122.3) +2.33.0 diff --git a/0002-Document-PART-POLICY-lines.patch b/0002-Document-PART-POLICY-lines.patch deleted file mode 100644 index 1576de5..0000000 --- a/0002-Document-PART-POLICY-lines.patch +++ /dev/null @@ -1,77 +0,0 @@ -From 3a5189df04c3bfa74e59014de1bf7b4d1acd2c10 Mon Sep 17 00:00:00 2001 -From: NeilBrown -Date: Fri, 9 Nov 2018 17:12:33 +1100 -Subject: [PATCH 02/27] Document PART-POLICY lines - -PART-POLICY has been accepted in mdadm.conf since the same -time that POLICY was accepted, but it was never documented. -So add the missing documentation. - -Also fix a bug which would have stopped it from working if -anyone had ever tried to use it. - -Signed-off-by: NeilBrown -Signed-off-by: Jes Sorensen ---- - mdadm.conf.5 | 24 +++++++++++++++++++++++- - policy.c | 2 +- - 2 files changed, 24 insertions(+), 2 deletions(-) - -diff --git a/mdadm.conf.5 b/mdadm.conf.5 -index 18512cb..47c962a 100644 ---- a/mdadm.conf.5 -+++ b/mdadm.conf.5 -@@ -501,7 +501,7 @@ To update hot plug configuration it is necessary to execute - .B mdadm \-\-udev\-rules - command after changing the config file - --Key words used in the -+Keywords used in the - .I POLICY - line and supported values are: - -@@ -565,6 +565,28 @@ be automatically added to that array (or it's container) - as above and the disk will become a spare in remaining cases - .RE - -+.TP -+.B PART-POLICY -+This is similar to -+.B POLICY -+and accepts the same keyword assignments. It allows a consistent set -+of policies to applied to each of the partitions of a device. -+ -+A -+.B PART-POLICY -+line should set -+.I type=disk -+and identify the path to one or more disk devices. Each partition on -+these disks will be treated according to the -+.I action= -+setting from this line. If a -+.I domain -+is set in the line, then the domain associated with each patition will -+be based on the domain, but with -+.RB \(dq -part N\(dq -+appended, when N is the partition number for the partition that was -+found. -+ - .SH EXAMPLE - DEVICE /dev/sd[bcdjkl]1 - .br -diff --git a/policy.c b/policy.c -index c0d18a7..258f393 100644 ---- a/policy.c -+++ b/policy.c -@@ -300,7 +300,7 @@ static int path_has_part(char *path, char **part) - l--; - if (l < 5 || strncmp(path+l-5, "-part", 5) != 0) - return 0; -- *part = path+l-4; -+ *part = path+l-5; - return 1; - } - --- -2.21.1 (Apple Git-122.3) - diff --git a/0029-mdadm-Fix-mdadm-r-remove-option-regresision.patch b/0002-mdadm-Fix-mdadm-r-remove-option-regresision.patch similarity index 100% rename from 0029-mdadm-Fix-mdadm-r-remove-option-regresision.patch rename to 0002-mdadm-Fix-mdadm-r-remove-option-regresision.patch diff --git a/0003-Grow-avoid-overflow-in-compute_backup_blocks.patch b/0003-Grow-avoid-overflow-in-compute_backup_blocks.patch deleted file mode 100644 index 90da939..0000000 --- a/0003-Grow-avoid-overflow-in-compute_backup_blocks.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 488555f211b2bae7f54670e6f3fc3aef14215f44 Mon Sep 17 00:00:00 2001 -From: NeilBrown -Date: Thu, 6 Dec 2018 10:35:41 +1100 -Subject: [PATCH 03/27] Grow: avoid overflow in compute_backup_blocks() - -With a chunk size of 16Meg and data drive count of 8, -this calculate can easily overflow the 'int' type that -is used for the multiplications. -So force it to use "long" instead. - -Reported-and-tested-by: Ed Spiridonov -Signed-off-by: NeilBrown -Signed-off-by: Jes Sorensen ---- - Grow.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/Grow.c b/Grow.c -index 4436a4d..76f82c0 100644 ---- a/Grow.c -+++ b/Grow.c -@@ -1196,7 +1196,8 @@ unsigned long compute_backup_blocks(int nchunk, int ochunk, - /* Find GCD */ - a = GCD(a, b); - /* LCM == product / GCD */ -- blocks = (ochunk/512) * (nchunk/512) * odata * ndata / a; -+ blocks = (unsigned long)(ochunk/512) * (unsigned long)(nchunk/512) * -+ odata * ndata / a; - - return blocks; - } --- -2.21.1 (Apple Git-122.3) - diff --git a/0004-Grow-report-correct-new-chunk-size.patch b/0004-Grow-report-correct-new-chunk-size.patch deleted file mode 100644 index 9fcecc9..0000000 --- a/0004-Grow-report-correct-new-chunk-size.patch +++ /dev/null @@ -1,30 +0,0 @@ -From a3afc5af0cdf29652c8350d03b6d7fbb28f4ccf9 Mon Sep 17 00:00:00 2001 -From: NeilBrown -Date: Thu, 6 Dec 2018 10:36:28 +1100 -Subject: [PATCH 04/27] Grow: report correct new chunk size. - -When using "--grow --chunk=" to change chunk -size, the old chunksize is reported instead of the new. - -Signed-off-by: NeilBrown -Signed-off-by: Jes Sorensen ---- - Grow.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/Grow.c b/Grow.c -index 76f82c0..363b209 100644 ---- a/Grow.c -+++ b/Grow.c -@@ -3286,7 +3286,7 @@ static int reshape_array(char *container, int fd, char *devname, - goto release; - } else if (verbose >= 0) - printf("chunk size for %s set to %d\n", -- devname, array.chunk_size); -+ devname, info->new_chunk); - } - unfreeze(st); - return 0; --- -2.21.1 (Apple Git-122.3) - diff --git a/0005-Fix-spelling-typos.patch b/0005-Fix-spelling-typos.patch deleted file mode 100644 index 165c888..0000000 --- a/0005-Fix-spelling-typos.patch +++ /dev/null @@ -1,101 +0,0 @@ -From 73b33b805f386c1aee582b2579d82ae5cbbd0f98 Mon Sep 17 00:00:00 2001 -From: Dimitri John Ledkov -Date: Tue, 15 Jan 2019 19:08:37 +0000 -Subject: [PATCH 05/27] Fix spelling typos. - -Signed-off-by: Dimitri John Ledkov -Signed-off-by: Jes Sorensen ---- - Assemble.c | 2 +- - Create.c | 2 +- - Grow.c | 6 +++--- - super-ddf.c | 2 +- - super-intel.c | 2 +- - 5 files changed, 7 insertions(+), 7 deletions(-) - -diff --git a/Assemble.c b/Assemble.c -index f39c9e1..3fa996f 100644 ---- a/Assemble.c -+++ b/Assemble.c -@@ -876,7 +876,7 @@ static int force_array(struct mdinfo *content, - current_events = devices[chosen_drive].i.events; - add_another: - if (c->verbose >= 0) -- pr_err("forcing event count in %s(%d) from %d upto %d\n", -+ pr_err("forcing event count in %s(%d) from %d up to %d\n", - devices[chosen_drive].devname, - devices[chosen_drive].i.disk.raid_disk, - (int)(devices[chosen_drive].i.events), -diff --git a/Create.c b/Create.c -index 04b1dfc..6f1b228 100644 ---- a/Create.c -+++ b/Create.c -@@ -823,7 +823,7 @@ int Create(struct supertype *st, char *mddev, - } - bitmap_fd = open(s->bitmap_file, O_RDWR); - if (bitmap_fd < 0) { -- pr_err("weird: %s cannot be openned\n", -+ pr_err("weird: %s cannot be opened\n", - s->bitmap_file); - goto abort_locked; - } -diff --git a/Grow.c b/Grow.c -index 363b209..6d32661 100644 ---- a/Grow.c -+++ b/Grow.c -@@ -446,7 +446,7 @@ int Grow_addbitmap(char *devname, int fd, struct context *c, struct shape *s) - if (offset_setable) { - st->ss->getinfo_super(st, mdi, NULL); - if (sysfs_init(mdi, fd, NULL)) { -- pr_err("failed to intialize sysfs.\n"); -+ pr_err("failed to initialize sysfs.\n"); - free(mdi); - } - rv = sysfs_set_num_signed(mdi, NULL, "bitmap/location", -@@ -2178,7 +2178,7 @@ size_change_error: - memset(&info, 0, sizeof(info)); - info.array = array; - if (sysfs_init(&info, fd, NULL)) { -- pr_err("failed to intialize sysfs.\n"); -+ pr_err("failed to initialize sysfs.\n"); - rv = 1; - goto release; - } -@@ -2903,7 +2903,7 @@ static int impose_level(int fd, int level, char *devname, int verbose) - struct mdinfo info; - - if (sysfs_init(&info, fd, NULL)) { -- pr_err("failed to intialize sysfs.\n"); -+ pr_err("failed to initialize sysfs.\n"); - return 1; - } - -diff --git a/super-ddf.c b/super-ddf.c -index 618542c..c095e8a 100644 ---- a/super-ddf.c -+++ b/super-ddf.c -@@ -1900,7 +1900,7 @@ static struct vd_config *find_vdcr(struct ddf_super *ddf, unsigned int inst, - return conf; - } - bad: -- pr_err("Could't find disk %d in array %u\n", n, inst); -+ pr_err("Couldn't find disk %d in array %u\n", n, inst); - return NULL; - } - -diff --git a/super-intel.c b/super-intel.c -index 6438987..401a3ea 100644 ---- a/super-intel.c -+++ b/super-intel.c -@@ -9956,7 +9956,7 @@ static void imsm_process_update(struct supertype *st, - break; - } - default: -- pr_err("error: unsuported process update type:(type: %d)\n", type); -+ pr_err("error: unsupported process update type:(type: %d)\n", type); - } - } - --- -2.21.1 (Apple Git-122.3) - diff --git a/0006-Detail.c-do-not-skip-first-character-when-calling-xs.patch b/0006-Detail.c-do-not-skip-first-character-when-calling-xs.patch deleted file mode 100644 index 60cdd88..0000000 --- a/0006-Detail.c-do-not-skip-first-character-when-calling-xs.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 3f772cd2f7c81f7475b425f0128e97f2cc142490 Mon Sep 17 00:00:00 2001 -From: Coly Li -Date: Tue, 12 Feb 2019 12:53:18 +0800 -Subject: [PATCH 06/27] Detail.c: do not skip first character when calling - xstrdup in Detail() - -'Commit b9c9bd9bacaa ("Detail: ensure --export names are acceptable as -shell variables")' duplicates mdi->sys_name to sysdev string by, - char *sysdev = xstrdup(mdi->sys_name + 1); -which skips the first character of mdi->sys_name. Then when running -mdadm --detail --export, the output looks like, - MD_DEVICE_ev_sda2_ROLE=1 - MD_DEVICE_ev_sda2_DEV=/dev/sda2 -The first character of md device (between MD_DEVICE and _ROLE/_DEV) -is dropped. The expected output should be, - MD_DEVICE_dev_sda2_ROLE=1 - MD_DEVICE_dev_sda2_DEV=/dev/sda2 - -This patch removes the '+ 1' from calling xstrdup() in Detail(), which -gets the dropped first character back. - -Reported-by: Arvin Schnell -Fixes: b9c9bd9bacaa ("Detail: ensure --export names are acceptable as 4 shell variables") -Signed-off-by: Coly Li -Cc: NeilBrown -Signed-off-by: Jes Sorensen ---- - Detail.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/Detail.c b/Detail.c -index b3e857a..20ea03a 100644 ---- a/Detail.c -+++ b/Detail.c -@@ -284,7 +284,7 @@ int Detail(char *dev, struct context *c) - struct mdinfo *mdi; - for (mdi = sra->devs; mdi; mdi = mdi->next) { - char *path; -- char *sysdev = xstrdup(mdi->sys_name + 1); -+ char *sysdev = xstrdup(mdi->sys_name); - char *cp; - - path = map_dev(mdi->disk.major, --- -2.21.1 (Apple Git-122.3) - diff --git a/0007-Fix-reshape-for-decreasing-data-offset.patch b/0007-Fix-reshape-for-decreasing-data-offset.patch deleted file mode 100644 index e9d68fd..0000000 --- a/0007-Fix-reshape-for-decreasing-data-offset.patch +++ /dev/null @@ -1,70 +0,0 @@ -From 896bd7389840921f586bb52d9d6b73a5cae13f52 Mon Sep 17 00:00:00 2001 -From: Corey Hickey -Date: Mon, 11 Feb 2019 17:18:38 -0800 -Subject: [PATCH 07/27] Fix reshape for decreasing data offset - -...when not changing the number of disks. - -This patch needs context to explain. These are the relevant parts of -the original code (condensed and annotated): - -if (dir > 0) { - /* Increase data offset (reshape backwards) */ - if (data_offset < sd->data_offset + min) { - pr_err("--data-offset too small on %s\n", - dn); - goto release; - } -} else { - /* Decrease data offset (reshape forwards) */ - if (data_offset < sd->data_offset - min) { - pr_err("--data-offset too small on %s\n", - dn); - goto release; - } -} - -When this code is reached, mdadm has already decided on a reshape -direction. When increasing the data offset, the reshape runs backwards -(dir==1); when decreasing the data offset, the reshape runs forwards -(dir==-1). - -The conditional within the backwards reshape is correct: the requested -offset must be larger than the old offset plus a minimum delta; thus the -reshape has room to work. - -For the forwards reshape, the requested offset needs to be smaller than -the old offset minus a minimum delta; to do this correctly, the -comparison must be reversed. - -Also update the error message. - -Note: I have tested this change on a RAID 5 on Linux 4.18.0 and verified -that there were no errors from the kernel and that the device data -remained intact. I do not know if there are considerations for different -RAID levels. - -Signed-off-by: Corey Hickey -Signed-off-by: Jes Sorensen ---- - Grow.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/Grow.c b/Grow.c -index 6d32661..764374f 100644 ---- a/Grow.c -+++ b/Grow.c -@@ -2613,8 +2613,8 @@ static int set_new_data_offset(struct mdinfo *sra, struct supertype *st, - goto release; - } - if (data_offset != INVALID_SECTORS && -- data_offset < sd->data_offset - min) { -- pr_err("--data-offset too small on %s\n", -+ data_offset > sd->data_offset - min) { -+ pr_err("--data-offset too large on %s\n", - dn); - goto release; - } --- -2.21.1 (Apple Git-122.3) - diff --git a/0008-mdmon-don-t-attempt-to-manage-new-arrays-when-termin.patch b/0008-mdmon-don-t-attempt-to-manage-new-arrays-when-termin.patch deleted file mode 100644 index 4a45fda..0000000 --- a/0008-mdmon-don-t-attempt-to-manage-new-arrays-when-termin.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 195b937685f1076d9e418d01b77e3274dffb29dc Mon Sep 17 00:00:00 2001 -From: Artur Paszkiewicz -Date: Fri, 22 Feb 2019 10:15:45 +0100 -Subject: [PATCH 08/27] mdmon: don't attempt to manage new arrays when - terminating - -When mdmon gets a SIGTERM, it stops managing arrays that are clean. If -there is more that one array in the container and one of them is dirty -and the clean one is still present in mdstat, mdmon will treat it as a -new array and start managing it again. This leads to a cycle of -remove_old() / manage_new() calls for the clean array, until the other -one also becomes clean. - -Prevent this by not calling manage_new() if sigterm is set. Also, remove -a check for sigterm in manage_new() because the condition will never be -true. - -Signed-off-by: Artur Paszkiewicz -Signed-off-by: Jes Sorensen ---- - managemon.c | 6 ++---- - 1 file changed, 2 insertions(+), 4 deletions(-) - -diff --git a/managemon.c b/managemon.c -index 101231c..29b91ba 100644 ---- a/managemon.c -+++ b/managemon.c -@@ -727,9 +727,7 @@ static void manage_new(struct mdstat_ent *mdstat, - dprintf("inst: %s action: %d state: %d\n", inst, - new->action_fd, new->info.state_fd); - -- if (sigterm) -- new->info.safe_mode_delay = 1; -- else if (mdi->safe_mode_delay >= 50) -+ if (mdi->safe_mode_delay >= 50) - /* Normal start, mdadm set this. */ - new->info.safe_mode_delay = mdi->safe_mode_delay; - else -@@ -803,7 +801,7 @@ void manage(struct mdstat_ent *mdstat, struct supertype *container) - break; - } - } -- if (a == NULL || !a->container) -+ if ((a == NULL || !a->container) && !sigterm) - manage_new(mdstat, container, a); - } - } --- -2.21.1 (Apple Git-122.3) - diff --git a/0009-mdmon-wait-for-previous-mdmon-to-exit-during-takeove.patch b/0009-mdmon-wait-for-previous-mdmon-to-exit-during-takeove.patch deleted file mode 100644 index 653b1db..0000000 --- a/0009-mdmon-wait-for-previous-mdmon-to-exit-during-takeove.patch +++ /dev/null @@ -1,57 +0,0 @@ -From ba21bae7f771a7e1ac9b9eaa0e0357fa597447e8 Mon Sep 17 00:00:00 2001 -From: Pawel Baldysiak -Date: Fri, 22 Feb 2019 13:30:27 +0100 -Subject: [PATCH 09/27] mdmon: wait for previous mdmon to exit during takeover - -Since the patch c76242c5("mdmon: get safe mode delay file descriptor -early"), safe_mode_dalay is set properly by initrd mdmon. But in some -cases with filesystem traffic since the very start of the system, it -might take a while to transit to clean state. Due to fact that new -mdmon does not wait for the old one to exit - it might happen that the -new one switches safe_mode_delay back to seconds, before old one exits. -As the result two mdmons are running concurrently on same array. - -Wait for the old mdmon to exit by pinging it with SIGUSR1 signal, just -in case it is sleeping. - -Signed-off-by: Pawel Baldysiak -Signed-off-by: Jes Sorensen ---- - mdmon.c | 14 +++++++++++--- - 1 file changed, 11 insertions(+), 3 deletions(-) - -diff --git a/mdmon.c b/mdmon.c -index 0955fcc..ff985d2 100644 ---- a/mdmon.c -+++ b/mdmon.c -@@ -171,6 +171,7 @@ static void try_kill_monitor(pid_t pid, char *devname, int sock) - int fd; - int n; - long fl; -+ int rv; - - /* first rule of survival... don't off yourself */ - if (pid == getpid()) -@@ -201,9 +202,16 @@ static void try_kill_monitor(pid_t pid, char *devname, int sock) - fl &= ~O_NONBLOCK; - fcntl(sock, F_SETFL, fl); - n = read(sock, buf, 100); -- /* Ignore result, it is just the wait that -- * matters -- */ -+ -+ /* If there is I/O going on it might took some time to get to -+ * clean state. Wait for monitor to exit fully to avoid races. -+ * Ping it with SIGUSR1 in case that it is sleeping */ -+ for (n = 0; n < 25; n++) { -+ rv = kill(pid, SIGUSR1); -+ if (rv < 0) -+ break; -+ usleep(200000); -+ } - } - - void remove_pidfile(char *devname) --- -2.21.1 (Apple Git-122.3) - diff --git a/0010-Assemble-Fix-starting-array-with-initial-reshape-che.patch b/0010-Assemble-Fix-starting-array-with-initial-reshape-che.patch deleted file mode 100644 index 498b93f..0000000 --- a/0010-Assemble-Fix-starting-array-with-initial-reshape-che.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 428f76d7aa74c7980cf4dbda3714a25b0d4b48ee Mon Sep 17 00:00:00 2001 -From: Pawel Baldysiak -Date: Fri, 22 Feb 2019 12:56:27 +0100 -Subject: [PATCH 10/27] Assemble: Fix starting array with initial reshape - checkpoint - -If array was stopped during reshape initialization, -there might be a "0" checkpoint recorded in metadata. -If array with such condition (reshape with position 0) -is passed to kernel - it will refuse to start such array. - -Treat such array as normal during assemble, Grow_continue() will -reinitialize and start the reshape. - -Signed-off-by: Pawel Baldysiak -Signed-off-by: Jes Sorensen ---- - Assemble.c | 18 ++++++++++++++++-- - 1 file changed, 16 insertions(+), 2 deletions(-) - -diff --git a/Assemble.c b/Assemble.c -index 3fa996f..bcf6487 100644 ---- a/Assemble.c -+++ b/Assemble.c -@@ -2058,8 +2058,22 @@ int assemble_container_content(struct supertype *st, int mdfd, - spare, &c->backup_file, c->verbose) == 1) - return 1; - -- err = sysfs_set_str(content, NULL, -- "array_state", "readonly"); -+ if (content->reshape_progress == 0) { -+ /* If reshape progress is 0 - we are assembling the -+ * array that was stopped, before reshape has started. -+ * Array needs to be started as active, Grow_continue() -+ * will start the reshape. -+ */ -+ sysfs_set_num(content, NULL, "reshape_position", -+ MaxSector); -+ err = sysfs_set_str(content, NULL, -+ "array_state", "active"); -+ sysfs_set_num(content, NULL, "reshape_position", 0); -+ } else { -+ err = sysfs_set_str(content, NULL, -+ "array_state", "readonly"); -+ } -+ - if (err) - return 1; - --- -2.21.1 (Apple Git-122.3) - diff --git a/0011-add-missing-units-to-examine.patch b/0011-add-missing-units-to-examine.patch deleted file mode 100644 index 8fdcac4..0000000 --- a/0011-add-missing-units-to-examine.patch +++ /dev/null @@ -1,59 +0,0 @@ -From 4e01454a7f340e09559f3c229f9a67381906119d Mon Sep 17 00:00:00 2001 -From: Corey Hickey -Date: Mon, 11 Feb 2019 17:42:27 -0800 -Subject: [PATCH 11/27] add missing units to --examine - -Within the output of "mdadm --examine", there are three sizes reported -on adjacent lines. For example: - -$ sudo mdadm --examine /dev/md3 -[...] - Avail Dev Size : 17580545024 (8383.06 GiB 9001.24 GB) - Array Size : 17580417024 (16765.99 GiB 18002.35 GB) - Used Dev Size : 11720278016 (5588.66 GiB 6000.78 GB) -[...] - -This can be confusing, since the first and third line are in 512-byte -sectors, and the second is in KiB. - -Add units to avoid ambiguity. - -(I don't particularly like the "KiB" notation, but it is at least -unambiguous.) - -Signed-off-by: Corey Hickey -Signed-off-by: Jes Sorensen ---- - super1.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/super1.c b/super1.c -index 636a286..b85dc20 100644 ---- a/super1.c -+++ b/super1.c -@@ -360,7 +360,7 @@ static void examine_super1(struct supertype *st, char *homehost) - printf(" Raid Level : %s\n", c?c:"-unknown-"); - printf(" Raid Devices : %d\n", __le32_to_cpu(sb->raid_disks)); - printf("\n"); -- printf(" Avail Dev Size : %llu%s\n", -+ printf(" Avail Dev Size : %llu sectors%s\n", - (unsigned long long)__le64_to_cpu(sb->data_size), - human_size(__le64_to_cpu(sb->data_size)<<9)); - if (__le32_to_cpu(sb->level) > 0) { -@@ -378,11 +378,11 @@ static void examine_super1(struct supertype *st, char *homehost) - if (ddsks) { - long long asize = __le64_to_cpu(sb->size); - asize = (asize << 9) * ddsks / ddsks_denom; -- printf(" Array Size : %llu%s\n", -+ printf(" Array Size : %llu KiB%s\n", - asize >> 10, human_size(asize)); - } - if (sb->size != sb->data_size) -- printf(" Used Dev Size : %llu%s\n", -+ printf(" Used Dev Size : %llu sectors%s\n", - (unsigned long long)__le64_to_cpu(sb->size), - human_size(__le64_to_cpu(sb->size)<<9)); - } --- -2.21.1 (Apple Git-122.3) - diff --git a/0012-Create-Block-rounding-size-to-max.patch b/0012-Create-Block-rounding-size-to-max.patch deleted file mode 100644 index a802936..0000000 --- a/0012-Create-Block-rounding-size-to-max.patch +++ /dev/null @@ -1,94 +0,0 @@ -From a03332b6f634b9c504a5bef920141fa63335aeb8 Mon Sep 17 00:00:00 2001 -From: Mariusz Tkaczyk -Date: Mon, 1 Apr 2019 16:53:41 +0200 -Subject: [PATCH 12/27] Create: Block rounding size to max - -When passed size is smaller than chunk, mdadm rounds it to 0 but 0 there -means max available space. -Block it for every metadata. Remove the same check from imsm routine. - -Signed-off-by: Mariusz Tkaczyk -Signed-off-by: Jes Sorensen ---- - Create.c | 23 ++++++++++++++++++++--- - super-intel.c | 5 ++--- - 2 files changed, 22 insertions(+), 6 deletions(-) - -diff --git a/Create.c b/Create.c -index 6f1b228..292f92a 100644 ---- a/Create.c -+++ b/Create.c -@@ -27,6 +27,18 @@ - #include "md_p.h" - #include - -+static int round_size_and_verify(unsigned long long *size, int chunk) -+{ -+ if (*size == 0) -+ return 0; -+ *size &= ~(unsigned long long)(chunk - 1); -+ if (*size == 0) { -+ pr_err("Size cannot be smaller than chunk.\n"); -+ return 1; -+ } -+ return 0; -+} -+ - static int default_layout(struct supertype *st, int level, int verbose) - { - int layout = UnSet; -@@ -248,11 +260,14 @@ int Create(struct supertype *st, char *mddev, - pr_err("unknown level %d\n", s->level); - return 1; - } -+ - if (s->size == MAX_SIZE) - /* use '0' to mean 'max' now... */ - s->size = 0; - if (s->size && s->chunk && s->chunk != UnSet) -- s->size &= ~(unsigned long long)(s->chunk - 1); -+ if (round_size_and_verify(&s->size, s->chunk)) -+ return 1; -+ - newsize = s->size * 2; - if (st && ! st->ss->validate_geometry(st, s->level, s->layout, s->raiddisks, - &s->chunk, s->size*2, -@@ -267,7 +282,8 @@ int Create(struct supertype *st, char *mddev, - /* default chunk was just set */ - if (c->verbose > 0) - pr_err("chunk size defaults to %dK\n", s->chunk); -- s->size &= ~(unsigned long long)(s->chunk - 1); -+ if (round_size_and_verify(&s->size, s->chunk)) -+ return 1; - do_default_chunk = 0; - } - } -@@ -413,7 +429,8 @@ int Create(struct supertype *st, char *mddev, - /* default chunk was just set */ - if (c->verbose > 0) - pr_err("chunk size defaults to %dK\n", s->chunk); -- s->size &= ~(unsigned long long)(s->chunk - 1); -+ if (round_size_and_verify(&s->size, s->chunk)) -+ return 1; - do_default_chunk = 0; - } - } -diff --git a/super-intel.c b/super-intel.c -index 401a3ea..5c3f9cb 100644 ---- a/super-intel.c -+++ b/super-intel.c -@@ -7385,9 +7385,8 @@ static int validate_geometry_imsm(struct supertype *st, int level, int layout, - verbose); - } - -- if (size && ((size < 1024) || (*chunk != UnSet && -- size < (unsigned long long) *chunk))) { -- pr_err("Given size must be greater than 1M and chunk size.\n"); -+ if (size && (size < 1024)) { -+ pr_err("Given size must be greater than 1M.\n"); - /* Depends on algorithm in Create.c : - * if container was given (dev == NULL) return -1, - * if block device was given ( dev != NULL) return 0. --- -2.21.1 (Apple Git-122.3) - diff --git a/0013-super-intel-Fix-issue-with-abs-being-irrelevant.patch b/0013-super-intel-Fix-issue-with-abs-being-irrelevant.patch deleted file mode 100644 index 618a758..0000000 --- a/0013-super-intel-Fix-issue-with-abs-being-irrelevant.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 5d494b2e4a4fc1208e56a78cfdc8bfb20c6ffa83 Mon Sep 17 00:00:00 2001 -From: Jes Sorensen -Date: Tue, 9 Jul 2019 13:26:08 -0400 -Subject: [PATCH 13/27] super-intel: Fix issue with abs() being irrelevant - -gcc9 complains about subtracting unsigned from unsigned and code -assuming the result can be negative. - -Signed-off-by: Jes Sorensen ---- - super-intel.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/super-intel.c b/super-intel.c -index 5c3f9cb..988883e 100644 ---- a/super-intel.c -+++ b/super-intel.c -@@ -2805,7 +2805,7 @@ static unsigned long long calc_component_size(struct imsm_map *map, - { - unsigned long long component_size; - unsigned long long dev_size = imsm_dev_size(dev); -- unsigned long long calc_dev_size = 0; -+ long long calc_dev_size = 0; - unsigned int member_disks = imsm_num_data_members(map); - - if (member_disks == 0) -@@ -2819,7 +2819,7 @@ static unsigned long long calc_component_size(struct imsm_map *map, - * 2048 blocks per each device. If the difference is higher it means - * that array size was expanded and num_data_stripes was not updated. - */ -- if ((unsigned int)abs(calc_dev_size - dev_size) > -+ if (llabs(calc_dev_size - (long long)dev_size) > - (1 << SECT_PER_MB_SHIFT) * member_disks) { - component_size = dev_size / member_disks; - dprintf("Invalid num_data_stripes in metadata; expected=%llu, found=%llu\n", --- -2.21.1 (Apple Git-122.3) - diff --git a/0014-imsm-close-removed-drive-fd.patch b/0014-imsm-close-removed-drive-fd.patch deleted file mode 100644 index 721dadd..0000000 --- a/0014-imsm-close-removed-drive-fd.patch +++ /dev/null @@ -1,44 +0,0 @@ -From 055124106fe3c77db639fd7d315b099c5d52f517 Mon Sep 17 00:00:00 2001 -From: Mariusz Tkaczyk -Date: Mon, 15 Jul 2019 09:25:35 +0200 -Subject: [PATCH 14/27] imsm: close removed drive fd. - -When member drive fails, managemon prepares metadata update and adds -the drive to disk_mgmt_list with DISK_REMOVE flag. It fills only -minor and major. It is enough to recognize the device later. - -Monitor thread while processing this update will remove the drive from -super only if it is a spare. It never removes failed member from -disks list. As a result, it still keeps opened descriptor to -non-existing device. - -If removed drive is not a spare fill fd in disk_cfg structure -(prepared by managemon), monitor will close fd during freeing it. - -Also set this drive fd to -1 in super to avoid double closing because -monitor will close the fd (if needed) while replacing removed drive -in array. - -Signed-off-by: Mariusz Tkaczyk -Signed-off-by: Jes Sorensen ---- - super-intel.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/super-intel.c b/super-intel.c -index 988883e..8b7709f 100644 ---- a/super-intel.c -+++ b/super-intel.c -@@ -9121,6 +9121,9 @@ static int add_remove_disk_update(struct intel_super *super) - remove_disk_super(super, - disk_cfg->major, - disk_cfg->minor); -+ } else { -+ disk_cfg->fd = disk->fd; -+ disk->fd = -1; - } - } - /* release allocate disk structure */ --- -2.21.1 (Apple Git-122.3) - diff --git a/0015-mdadm-force-a-uuid-swap-on-big-endian.patch b/0015-mdadm-force-a-uuid-swap-on-big-endian.patch deleted file mode 100644 index d71cdbd..0000000 --- a/0015-mdadm-force-a-uuid-swap-on-big-endian.patch +++ /dev/null @@ -1,40 +0,0 @@ -From dac0e65954e43bdf93a8cfccc73108c97d060254 Mon Sep 17 00:00:00 2001 -From: Nigel Croxon -Date: Tue, 24 Sep 2019 11:39:24 -0400 -Subject: [PATCH 15/27] mdadm: force a uuid swap on big endian - -The code path for metadata 0.90 calls a common routine -fname_from_uuid that uses metadata 1.2. The code expects member -swapuuid to be setup and usable. But it is only setup when using -metadata 1.2. Since the metadata 0.90 did not create swapuuid -and set it. The test (st->ss == &super1) ? 1 : st->ss->swapuuid -fails. The swapuuid is set at compile time based on byte order. -Any call based on metadata 0.90 and on big endian processors, -the --export uuid will be incorrect. - -Signed-Off-by: Nigel Croxon -Signed-off-by: Jes Sorensen ---- - util.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/util.c b/util.c -index c26cf5f..64dd409 100644 ---- a/util.c -+++ b/util.c -@@ -685,8 +685,12 @@ char *fname_from_uuid(struct supertype *st, struct mdinfo *info, - // work, but can't have it set if we want this printout to match - // all the other uuid printouts in super1.c, so we force swapuuid - // to 1 to make our printout match the rest of super1 -+#if __BYTE_ORDER == BIG_ENDIAN -+ return __fname_from_uuid(info->uuid, 1, buf, sep); -+#else - return __fname_from_uuid(info->uuid, (st->ss == &super1) ? 1 : - st->ss->swapuuid, buf, sep); -+#endif - } - - int check_ext2(int fd, char *name) --- -2.21.1 (Apple Git-122.3) - diff --git a/0016-Init-devlist-as-an-array.patch b/0016-Init-devlist-as-an-array.patch deleted file mode 100644 index ec0e80b..0000000 --- a/0016-Init-devlist-as-an-array.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 13a018075abb72609288d865565ac4f8be34a335 Mon Sep 17 00:00:00 2001 -From: Xiao Ni -Date: Mon, 30 Sep 2019 19:47:59 +0800 -Subject: [PATCH 16/27] Init devlist as an array - -devlist is an string. It will change to an array if there is disk that -is sbd disk. If one device is sbd, it runs devlist=(). -This line code changes devlist from a string to an array. If there is -no sbd device, it can't run this line code. So it will still be a string. -The later codes need an array, rather than an string. So init devlist -as an array to fix this problem. - -Signed-off-by: Xiao Ni -Signed-off-by: Jes Sorensen ---- - clustermd_tests/func.sh | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/clustermd_tests/func.sh b/clustermd_tests/func.sh -index 642cc96..801d604 100644 ---- a/clustermd_tests/func.sh -+++ b/clustermd_tests/func.sh -@@ -39,6 +39,9 @@ fetch_devlist() - devlist=($(ls /dev/disk/by-path/*$ISCSI_ID*)) - fi - # sbd disk cannot use in testing -+ # Init devlist as an array -+ i='' -+ devlist=(${devlist[@]#$i}) - for i in ${devlist[@]} - do - sbd -d $i dump &> /dev/null --- -2.21.1 (Apple Git-122.3) - diff --git a/0017-Don-t-need-to-check-recovery-after-re-add-when-no-I-.patch b/0017-Don-t-need-to-check-recovery-after-re-add-when-no-I-.patch deleted file mode 100644 index d3c55dd..0000000 --- a/0017-Don-t-need-to-check-recovery-after-re-add-when-no-I-.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 3bf7f0b83339a8b76983bbc9b806f4dffa890092 Mon Sep 17 00:00:00 2001 -From: Xiao Ni -Date: Mon, 30 Sep 2019 19:48:00 +0800 -Subject: [PATCH 17/27] Don't need to check recovery after re-add when no I/O - writes to raid - -If there is no write I/O between removing member disk and re-add it, there is no -recovery after re-adding member disk. - -Signed-off-by: Xiao Ni -Signed-off-by: Jes Sorensen ---- - clustermd_tests/02r1_Manage_re-add | 2 -- - 1 file changed, 2 deletions(-) - -diff --git a/clustermd_tests/02r1_Manage_re-add b/clustermd_tests/02r1_Manage_re-add -index dd9c416..d0d13e5 100644 ---- a/clustermd_tests/02r1_Manage_re-add -+++ b/clustermd_tests/02r1_Manage_re-add -@@ -9,8 +9,6 @@ check all state UU - check all dmesg - mdadm --manage $md0 --fail $dev0 --remove $dev0 - mdadm --manage $md0 --re-add $dev0 --check $NODE1 recovery --check all wait - check all state UU - check all dmesg - stop_md all $md0 --- -2.21.1 (Apple Git-122.3) - diff --git a/0018-Manage-Remove-the-legacy-code-for-md-driver-prior-to.patch b/0018-Manage-Remove-the-legacy-code-for-md-driver-prior-to.patch deleted file mode 100644 index f7f1b06..0000000 --- a/0018-Manage-Remove-the-legacy-code-for-md-driver-prior-to.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 5983db9ecae579c1acd7a32e785ecfda5a659f9f Mon Sep 17 00:00:00 2001 -From: Xiao Yang -Date: Wed, 27 Nov 2019 11:59:24 +0800 -Subject: [PATCH 18/27] Manage: Remove the legacy code for md driver prior to - 0.90.03 - -Previous re-add operation only calls ioctl(HOT_ADD_DISK) for array without -metadata(e.g. mdadm -B/--build) when md driver is less than 0.90.02, but -commit 091e8e6 breaks the logic and current re-add operation can call -ioctl(HOT_ADD_DISK) even if md driver is 0.90.03. - -This issue is reproduced by 05r1-re-add-nosuper: ------------------------------------------------- -++ die 'resync or recovery is happening!' -++ echo -e '\n\tERROR: resync or recovery is happening! \n' -ERROR: resync or recovery is happening! ------------------------------------------------- - -Fixes: 091e8e6("Manage: Remove all references to md_get_version()") -Reported-by: kernel test robot -Signed-off-by: Xiao Yang -Signed-off-by: Jes Sorensen ---- - Manage.c | 12 ------------ - 1 file changed, 12 deletions(-) - -diff --git a/Manage.c b/Manage.c -index 21536f5..ffe55f8 100644 ---- a/Manage.c -+++ b/Manage.c -@@ -741,18 +741,6 @@ int Manage_add(int fd, int tfd, struct mddev_dev *dv, - " Adding anyway as --force was given.\n", - dv->devname, devname); - } -- if (!tst->ss->external && array->major_version == 0) { -- if (ioctl(fd, HOT_ADD_DISK, rdev)==0) { -- if (verbose >= 0) -- pr_err("hot added %s\n", -- dv->devname); -- return 1; -- } -- -- pr_err("hot add failed for %s: %s\n", -- dv->devname, strerror(errno)); -- return -1; -- } - - if (array->not_persistent == 0 || tst->ss->external) { - --- -2.21.1 (Apple Git-122.3) - diff --git a/0019-imsm-Correct-minimal-device-size.patch b/0019-imsm-Correct-minimal-device-size.patch deleted file mode 100644 index 2925f6d..0000000 --- a/0019-imsm-Correct-minimal-device-size.patch +++ /dev/null @@ -1,32 +0,0 @@ -From fd91a74b58cecc99872a17883289b12e8cd1f163 Mon Sep 17 00:00:00 2001 -From: Blazej Kucman -Date: Wed, 11 Mar 2020 15:40:13 +0100 -Subject: [PATCH 19/27] imsm: Correct minimal device size. - -Check if given size of member drive is not less than 1 MibiByte. - -Signed-off-by: Blazej Kucman -Signed-off-by: Jes Sorensen ---- - super-intel.c | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -diff --git a/super-intel.c b/super-intel.c -index 8b7709f..5da99d5 100644 ---- a/super-intel.c -+++ b/super-intel.c -@@ -7385,7 +7385,10 @@ static int validate_geometry_imsm(struct supertype *st, int level, int layout, - verbose); - } - -- if (size && (size < 1024)) { -+ /* -+ * Size is given in sectors. -+ */ -+ if (size && (size < 2048)) { - pr_err("Given size must be greater than 1M.\n"); - /* Depends on algorithm in Create.c : - * if container was given (dev == NULL) return -1, --- -2.21.1 (Apple Git-122.3) - diff --git a/0020-Detail-show-correct-bitmap-info-for-cluster-raid-dev.patch b/0020-Detail-show-correct-bitmap-info-for-cluster-raid-dev.patch deleted file mode 100644 index cbf9bd5..0000000 --- a/0020-Detail-show-correct-bitmap-info-for-cluster-raid-dev.patch +++ /dev/null @@ -1,30 +0,0 @@ -From d4f8d99b03fb4f3da105e7f3e52d712a0dea45b7 Mon Sep 17 00:00:00 2001 -From: Lidong Zhong -Date: Mon, 16 Mar 2020 10:16:49 +0800 -Subject: [PATCH 20/27] Detail: show correct bitmap info for cluster raid - device - -Signed-off-by: Lidong Zhong -Signed-off-by: Jes Sorensen ---- - Detail.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/Detail.c b/Detail.c -index 20ea03a..dadcafe 100644 ---- a/Detail.c -+++ b/Detail.c -@@ -467,7 +467,9 @@ int Detail(char *dev, struct context *c) - if (ioctl(fd, GET_BITMAP_FILE, &bmf) == 0 && bmf.pathname[0]) { - printf(" Intent Bitmap : %s\n", bmf.pathname); - printf("\n"); -- } else if (array.state & (1< -Date: Tue, 16 Apr 2019 18:08:17 +0200 -Subject: [PATCH 21/27] Assemble: print error message if mdadm fails assembling - with --uuid option - -When mdadm tries to assemble one working device and one zeroed-out device, -it failed but print successful message because there is --uuid option. - -Following script always reproduce it. - -dd if=/dev/zero of=/dev/ram0 oflag=direct -dd if=/dev/zero of=/dev/ram1 oflag=direct -./mdadm -C /dev/md111 -e 1.2 --uuid="12345678:12345678:12345678:12345678" \ - -l1 -n2 /dev/ram0 /dev/ram1 -./mdadm -S /dev/md111 -dd if=/dev/zero of=/dev/ram1 oflag=direct -./mdadm -A /dev/md111 --uuid="12345678:12345678:12345678:12345678" \ - /dev/ram0 /dev/ram1 - -Following is message from mdadm. - -mdadm: No super block found on /dev/ram1 (Expected magic a92b4efc, got 00000000) -mdadm: no RAID superblock on /dev/ram1 -mdadm: /dev/md111 assembled from 1 drive - need all 2 to start it (use --run to insist). - -The mdadm say that it assembled but mdadm does not create /dev/md111. -The message is wrong. - -After applying this patch, mdadm reports error correctly as following. - -mdadm: No super block found on /dev/ram1 (Expected magic a92b4efc, got 00000000) -mdadm: no RAID superblock on /dev/ram1 -mdadm: /dev/ram1 has no superblock - assembly aborted - -Signed-off-by: Gioh Kim -Signed-off-by: Jes Sorensen ---- - Assemble.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/Assemble.c b/Assemble.c -index bcf6487..f302deb 100644 ---- a/Assemble.c -+++ b/Assemble.c -@@ -269,7 +269,7 @@ static int select_devices(struct mddev_dev *devlist, - if (auto_assem || !inargv) - /* Ignore unrecognised devices during auto-assembly */ - goto loop; -- if (ident->uuid_set || ident->name[0] || -+ if (ident->name[0] || - ident->super_minor != UnSet) - /* Ignore unrecognised device if looking for - * specific array */ --- -2.21.1 (Apple Git-122.3) - diff --git a/0022-Include-count-for-0-character-when-using-strncpy-to-.patch b/0022-Include-count-for-0-character-when-using-strncpy-to-.patch deleted file mode 100644 index efdfb50..0000000 --- a/0022-Include-count-for-0-character-when-using-strncpy-to-.patch +++ /dev/null @@ -1,34 +0,0 @@ -From d62151dfb6ec7f9ede978097421eeba82928710f Mon Sep 17 00:00:00 2001 -From: Jes Sorensen -Date: Mon, 18 May 2020 20:19:53 -0400 -Subject: [PATCH 22/27] Include count for \0 character when using strncpy to - implement strdup. - -We have to include the \0 character in the length when copying a -string with strncpy() for which length was found with strlen(). -Otherwise the destination will not get null terminated - except that -we explicitly zeroed it out earlier. - -This quiets down the compiler's warnings. - -Signed-off-by: Jes Sorensen ---- - dlink.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/dlink.c b/dlink.c -index 3efa94b..69aa7aa 100644 ---- a/dlink.c -+++ b/dlink.c -@@ -63,7 +63,7 @@ char *dl_strndup(char *s, int l) - if (s == NULL) - return NULL; - n = dl_newv(char, l+1); -- strncpy(n, s, l); -+ strncpy(n, s, l+1); - n[l] = 0; - return n; - } --- -2.21.1 (Apple Git-122.3) - diff --git a/0023-restripe-fix-ignoring-return-value-of-read-and-lseek.patch b/0023-restripe-fix-ignoring-return-value-of-read-and-lseek.patch deleted file mode 100644 index bff6b11..0000000 --- a/0023-restripe-fix-ignoring-return-value-of-read-and-lseek.patch +++ /dev/null @@ -1,53 +0,0 @@ -From 0a0051cb0e573d76a1ebd99d4ac0932fc45460d3 Mon Sep 17 00:00:00 2001 -From: Guoqing Jiang -Date: Mon, 18 May 2020 23:53:36 +0200 -Subject: [PATCH 23/27] =?UTF-8?q?restripe:=20fix=20ignoring=20return=20val?= - =?UTF-8?q?ue=20of=20=E2=80=98read=E2=80=99=20and=20lseek?= -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Got below error when run "make everything". - -restripe.c: In function ‘test_stripes’: -restripe.c:870:4: error: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Werror=unused-result] - read(source[i], stripes[i], chunk_size); - ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Fix it by check the return value of ‘read’, and free memory -in the failure case. - -And check the return value of lseek as well per Jes's comment. - -Signed-off-by: Guoqing Jiang -Signed-off-by: Jes Sorensen ---- - restripe.c | 12 ++++++++++-- - 1 file changed, 10 insertions(+), 2 deletions(-) - -diff --git a/restripe.c b/restripe.c -index 31b07e8..86e1d00 100644 ---- a/restripe.c -+++ b/restripe.c -@@ -866,8 +866,16 @@ int test_stripes(int *source, unsigned long long *offsets, - int disk; - - for (i = 0 ; i < raid_disks ; i++) { -- lseek64(source[i], offsets[i]+start, 0); -- read(source[i], stripes[i], chunk_size); -+ if ((lseek64(source[i], offsets[i]+start, 0) < 0) || -+ (read(source[i], stripes[i], chunk_size) != -+ chunk_size)) { -+ free(q); -+ free(p); -+ free(blocks); -+ free(stripes); -+ free(stripe_buf); -+ return -1; -+ } - } - for (i = 0 ; i < data_disks ; i++) { - int disk = geo_map(i, start/chunk_size, raid_disks, --- -2.21.1 (Apple Git-122.3) - diff --git a/0024-Block-overwriting-existing-links-while-manual-assemb.patch b/0024-Block-overwriting-existing-links-while-manual-assemb.patch deleted file mode 100644 index 46cb1bf..0000000 --- a/0024-Block-overwriting-existing-links-while-manual-assemb.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 5d11bd766ee17d3b9a7d96e184704723c11a99d1 Mon Sep 17 00:00:00 2001 -From: Kinga Tanska -Date: Fri, 29 May 2020 08:31:36 +0200 -Subject: [PATCH 24/27] Block overwriting existing links while manual assembly - -Manual assembly with existing link caused overwriting -this link. Add checking link and block this situation. - -Signed-off-by: Kinga Tanska -Signed-off-by: Jes Sorensen ---- - Assemble.c | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/Assemble.c b/Assemble.c -index f302deb..914c193 100644 ---- a/Assemble.c -+++ b/Assemble.c -@@ -1467,6 +1467,10 @@ try_again: - name = content->name; - break; - } -+ if (mddev && map_by_name(&map, mddev) != NULL) { -+ pr_err("Cannot create device with %s because is in use\n", mddev); -+ goto out; -+ } - if (!auto_assem) - /* If the array is listed in mdadm.conf or on - * command line, then we trust the name --- -2.21.1 (Apple Git-122.3) - diff --git a/0025-Detect-too-small-device-error-rather-than-underflow-.patch b/0025-Detect-too-small-device-error-rather-than-underflow-.patch deleted file mode 100644 index 9155cc1..0000000 --- a/0025-Detect-too-small-device-error-rather-than-underflow-.patch +++ /dev/null @@ -1,76 +0,0 @@ -From bcc3a5ea9c631645b792f151e1beb9a4b1a4e34e Mon Sep 17 00:00:00 2001 -From: David Favro -Date: Sat, 23 May 2020 08:24:59 -0400 -Subject: [PATCH 25/27] Detect too-small device: error rather than - underflow/crash - -For 1.x metadata, when the user requested creation of an array on -component devices that were too small even to hold the superblock, -an undetected integer wraparound (underflow) resulted in an enormous -computed size which resulted in various follow-on errors such as -floating-point exception. - -This patch detects this condition, prints a reasonable diagnostic -message, and refuses to continue. - -Signed-off-by: David Favro -Signed-off-by: Jes Sorensen ---- - super1.c | 19 ++++++++++++++----- - 1 file changed, 14 insertions(+), 5 deletions(-) - -diff --git a/super1.c b/super1.c -index b85dc20..06bc145 100644 ---- a/super1.c -+++ b/super1.c -@@ -2715,6 +2715,7 @@ static int validate_geometry1(struct supertype *st, int level, - unsigned long long ldsize, devsize; - int bmspace; - unsigned long long headroom; -+ unsigned long long overhead; - int fd; - - if (level == LEVEL_CONTAINER) { -@@ -2747,10 +2748,6 @@ static int validate_geometry1(struct supertype *st, int level, - close(fd); - - devsize = ldsize >> 9; -- if (devsize < 24) { -- *freesize = 0; -- return 0; -- } - - /* creating: allow suitable space for bitmap or PPL */ - if (consistency_policy == CONSISTENCY_POLICY_PPL) -@@ -2791,15 +2788,27 @@ static int validate_geometry1(struct supertype *st, int level, - case 0: /* metadata at end. Round down and subtract space to reserve */ - devsize = (devsize & ~(4ULL*2-1)); - /* space for metadata, bblog, bitmap/ppl */ -- devsize -= 8*2 + 8 + bmspace; -+ overhead = 8*2 + 8 + bmspace; -+ if (devsize < overhead) /* detect underflow */ -+ goto dev_too_small_err; -+ devsize -= overhead; - break; - case 1: - case 2: -+ if (devsize < data_offset) /* detect underflow */ -+ goto dev_too_small_err; - devsize -= data_offset; - break; - } - *freesize = devsize; - return 1; -+ -+/* Error condition, device cannot even hold the overhead. */ -+dev_too_small_err: -+ fprintf(stderr, "device %s is too small (%lluK) for " -+ "required metadata!\n", subdev, devsize>>1); -+ *freesize = 0; -+ return 0; - } - - void *super1_make_v0(struct supertype *st, struct mdinfo *info, mdp_super_t *sb0) --- -2.21.1 (Apple Git-122.3) - diff --git a/0026-mdadm-Grow-prevent-md-s-fd-from-being-occupied-durin.patch b/0026-mdadm-Grow-prevent-md-s-fd-from-being-occupied-durin.patch deleted file mode 100644 index db462f5..0000000 --- a/0026-mdadm-Grow-prevent-md-s-fd-from-being-occupied-durin.patch +++ /dev/null @@ -1,64 +0,0 @@ -From 17ee1b8ebaf51b117e17578f48ffb1ad293ff117 Mon Sep 17 00:00:00 2001 -From: allenpeng -Date: Fri, 12 Jun 2020 17:00:39 +0800 -Subject: [PATCH 26/27] mdadm/Grow: prevent md's fd from being occupied during - delayed time - -If we start reshaping on md which shares sub-devices with another -resyncing md, it may be forced to wait for others to complete. mdadm -occupies the md's fd during this time, which causes the md can not be -stopped and the filesystem can not be mounted on the md. We can close -md's fd earlier to solve this problem. - -Reproducible Steps: - -1. create two partitions on sda, sdb, sdc, sdd -2. create raid1 with sda1, sdb1 -mdadm -C /dev/md1 --assume-clean -l1 -n2 /dev/sda1 /dev/sdb1 -3. create raid5 with sda2, sdb2, sdc2 -mdadm -C /dev/md2 --assume-clean -l5 -n3 /dev/sda2 /dev/sdb2 /dev/sdc2 -4. start resync at md1 -echo repair > /sys/block/md1/md/sync_action -5. reshape raid5 to raid6 -mdadm -a /dev/md2 /dev/sdd2 -mdadm --grow /dev/md2 -n4 -l6 --backup-file=/root/md2-backup - -Now mdadm is occupying the fd of md2, causing md2 unable to be stopped - -6.Try to stop md2, an error message shows -mdadm -S /dev/md2 -mdadm: Cannot get exclusive access to /dev/md3:Perhaps a running process, -mounted filesystem or active volume group? - -Reviewed-by: Alex Wu -Reviewed-by: BingJing Chang -Reviewed-by: Danny Shih -Signed-off-by: ChangSyun Peng -Signed-off-by: Jes Sorensen ---- - Grow.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/Grow.c b/Grow.c -index 764374f..57db7d4 100644 ---- a/Grow.c -+++ b/Grow.c -@@ -3517,6 +3517,7 @@ started: - return 0; - } - -+ close(fd); - /* Now we just need to kick off the reshape and watch, while - * handling backups of the data... - * This is all done by a forked background process. -@@ -3569,7 +3570,6 @@ started: - mdstat_wait(30 - (delayed-1) * 25); - } while (delayed); - mdstat_close(); -- close(fd); - if (check_env("MDADM_GROW_VERIFY")) - fd = open(devname, O_RDONLY | O_DIRECT); - else --- -2.21.1 (Apple Git-122.3) - diff --git a/0028-mdadm-fix-coredump-of-mdadm-monitor-r.patch b/0028-mdadm-fix-coredump-of-mdadm-monitor-r.patch deleted file mode 100644 index cb86a71..0000000 --- a/0028-mdadm-fix-coredump-of-mdadm-monitor-r.patch +++ /dev/null @@ -1,39 +0,0 @@ -From 546047688e1c64638f462147c755b58119cabdc8 Mon Sep 17 00:00:00 2001 -From: Wu Guanghao -Date: Mon, 16 Aug 2021 15:24:51 +0800 -Subject: [PATCH] mdadm: fix coredump of mdadm --monitor -r - -The --monitor -r option requires a parameter, otherwise a null pointer will be manipulated -when converting to integer data, and a coredump will appear. - -Segmentation fault (core dumped) - -Signed-off-by: Wu Guanghao -Acked-by: Mariusz Tkaczyk -Signed-off-by: Jes Sorensen ---- - ReadMe.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/ReadMe.c b/ReadMe.c -index 978796ac..37d84625 100644 ---- a/ReadMe.c -+++ b/ReadMe.c -@@ -81,11 +81,11 @@ char Version[] = "mdadm - v" VERSION " - " VERS_DATE EXTRAVERSION "\n"; - * found, it is started. - */ - --char short_options[]="-ABCDEFGIQhVXYWZ:vqbc:i:l:p:m:n:x:u:c:d:z:U:N:sarfRSow1tye:k:"; -+char short_options[]="-ABCDEFGIQhVXYWZ:vqbc:i:l:p:m:r:n:x:u:c:d:z:U:N:safRSow1tye:k"; - char short_bitmap_options[]= -- "-ABCDEFGIQhVXYWZ:vqb:c:i:l:p:m:n:x:u:c:d:z:U:N:sarfRSow1tye:k:"; -+ "-ABCDEFGIQhVXYWZ:vqb:c:i:l:p:m:r:n:x:u:c:d:z:U:N:sarfRSow1tye:k:"; - char short_bitmap_auto_options[]= -- "-ABCDEFGIQhVXYWZ:vqb:c:i:l:p:m:n:x:u:c:d:z:U:N:sa:rfRSow1tye:k:"; -+ "-ABCDEFGIQhVXYWZ:vqb:c:i:l:p:m:r:n:x:u:c:d:z:U:N:sa:rfRSow1tye:k:"; - - struct option long_options[] = { - {"manage", 0, 0, ManageOpt}, --- -2.27.0 - diff --git a/mdadm-4.1.tar.xz b/mdadm-4.1.tar.xz deleted file mode 100644 index 169dfc02fc7d1412813f76a19f16c7cafa6cb262..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 440756 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