Update to latest upstream

There some bugs need to be fixed.

bug2127101 Reshape is started with not allowed chunk size
patch (super-intel: make freesize not required for chunk size migration)

bug2139789 Installation hangs after RAID degradation
bug2149292 mdadm: Couldn't open /dev/vda3 for write - not zeroing
patch (mdadm/udev: Don't handle change event on raw devices)

bug2151209 Can't remove disk when unplugging a disk
patch (incremental, manage: do not verify if remove is safe)

bug2148945 mdadm --fail /dev/md0 /dev/pmem1s failed
patch (Manage: do not check array state when drive is removed)

Resolves: rhbz#2127101, rhbz#2139789, rhbz#2149292, rhbz#2151209, rhbz#2148945

Signed-off-by: Xiao Ni <xni@redhat.com>
This commit is contained in:
Xiao Ni 2023-01-06 21:58:10 +08:00
parent f1f5914fae
commit 02e1f69890
86 changed files with 3365 additions and 211 deletions

View File

@ -1,7 +1,7 @@
From f1cc8ab9ab6a92c3cd94ab7590b46285e214681e Mon Sep 17 00:00:00 2001
From: Lukasz Florczak <lukasz.florczak@linux.intel.com>
Date: Tue, 15 Mar 2022 09:30:30 +0100
Subject: [PATCH 01/12] Unify error message.
Subject: [PATCH 01/83] Unify error message.
Provide the same error message for the same error that can occur in Grow.c and super-intel.c.
@ -43,5 +43,5 @@ index d5fad102..5ffa7636 100644
}
}
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 5ce5a15f0bf007e850e15259bba4f53736605fb2 Mon Sep 17 00:00:00 2001
From: Lukasz Florczak <lukasz.florczak@linux.intel.com>
Date: Fri, 25 Mar 2022 12:48:59 +0100
Subject: [PATCH 02/12] mdadm: Fix double free
Subject: [PATCH 02/83] mdadm: Fix double free
If there was a size mismatch after creation it would get fixed on grow
in imsm_fix_size_mismatch(), but due to double free "double free or corruption (fasttop)"
@ -29,5 +29,5 @@ index 5ffa7636..6ff336ee 100644
ret_val = 0;
exit:
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From fea026b4849182fc8413014c81456e7215af28d9 Mon Sep 17 00:00:00 2001
From: Mateusz Kusiak <mateusz.kusiak@intel.com>
Date: Wed, 23 Mar 2022 15:05:19 +0100
Subject: [PATCH 03/12] Grow_reshape: Add r0 grow size error message and update
Subject: [PATCH 03/83] Grow_reshape: Add r0 grow size error message and update
man
Grow size on r0 is not supported for imsm and native metadata.
@ -79,5 +79,5 @@ index be902dba..e2a42425 100644
.BR \-Z ", " \-\-array\-size=
This is only meaningful with
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From cf9a109209aad285372b67306d54118af6fc522b Mon Sep 17 00:00:00 2001
From: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Date: Fri, 14 Jan 2022 16:44:33 +0100
Subject: [PATCH 04/12] udev: adapt rules to systemd v247
Subject: [PATCH 04/83] udev: adapt rules to systemd v247
New events have been added in kernel 4.14 ("bind" and "unbind").
Systemd maintainer suggests to modify "add|change" branches.
@ -63,5 +63,5 @@ index 12bdcaa8..2e185cee 100644
ENV{MD_LEVEL}=="raid[1-9]*", \
TEST=="/sys/block/$parent/device/timeout", \
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 83a379cfbd283b387919fe05d44eb4c49e155ad6 Mon Sep 17 00:00:00 2001
From: Lukasz Florczak <lukasz.florczak@linux.intel.com>
Date: Mon, 21 Feb 2022 13:05:20 +0100
Subject: [PATCH 05/12] Replace error prone signal() with sigaction()
Subject: [PATCH 05/83] Replace error prone signal() with sigaction()
Up to this date signal() was used which implementation could vary [1].
Sigaction() call is preferred. This commit introduces replacement
@ -248,5 +248,5 @@ index 3d05d074..cc94f96e 100644
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From e9dd5644843e2013a7dd1a8a5da2b9fa35837416 Mon Sep 17 00:00:00 2001
From: Lukasz Florczak <lukasz.florczak@linux.intel.com>
Date: Fri, 18 Mar 2022 09:26:04 +0100
Subject: [PATCH 06/12] mdadm: Respect config file location in man
Subject: [PATCH 06/83] mdadm: Respect config file location in man
Default config file location could differ depending on OS (e.g. Debian family).
This patch takes default config file into consideration when creating mdadm.man
@ -1529,5 +1529,5 @@ index 00000000..83edd008
+.BR mdadm (8),
+.BR md (4).
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From c23400377bb3d8e98e810cd92dba478dac1dff82 Mon Sep 17 00:00:00 2001
From: Lukasz Florczak <lukasz.florczak@linux.intel.com>
Date: Fri, 18 Mar 2022 09:26:05 +0100
Subject: [PATCH 07/12] mdadm: Update ReadMe
Subject: [PATCH 07/83] mdadm: Update ReadMe
Instead of hardcoded config file path give reference to config manual.
@ -44,5 +44,5 @@ index 81399765..8f873c48 100644
;
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 24e075c659d0a8718aabefe5af4c97195a188af7 Mon Sep 17 00:00:00 2001
From: Lukasz Florczak <lukasz.florczak@linux.intel.com>
Date: Fri, 18 Mar 2022 09:26:06 +0100
Subject: [PATCH 08/12] mdadm: Update config man regarding default files and
Subject: [PATCH 08/83] mdadm: Update config man regarding default files and
multi-keyword behavior
Simplify default and alternative config file and directory location references
@ -199,5 +199,5 @@ index 83edd008..dd331a6a 100644
.SH EXAMPLE
DEVICE /dev/sd[bcdjkl]1
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From c33bbda5b0e127bb161fd4ad44bcfaa2a5daf153 Mon Sep 17 00:00:00 2001
From: Lukasz Florczak <lukasz.florczak@linux.intel.com>
Date: Fri, 18 Mar 2022 09:26:07 +0100
Subject: [PATCH 09/12] mdadm: Update config manual
Subject: [PATCH 09/83] mdadm: Update config manual
Add missing HOMECLUSTER keyword description.
@ -41,5 +41,5 @@ index dd331a6a..cd4e6a9d 100644
.B AUTO
A list of names of metadata format can be given, each preceded by a
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 913f07d1db4a0078acc26d6ccabe1c315cf9273c Mon Sep 17 00:00:00 2001
From: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Date: Thu, 20 Jan 2022 13:18:32 +0100
Subject: [PATCH 10/12] Create, Build: use default_layout()
Subject: [PATCH 10/83] Create, Build: use default_layout()
This code is duplicated for Build mode so make default_layout() extern
and use it. Simplify the function structure.
@ -149,5 +149,5 @@ index 26e7e5cd..cd72e711 100644
extern int parse_layout_10(char *layout);
extern int parse_layout_faulty(char *layout);
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 5f21d67472ad08c1e96b4385254adba79aa1c467 Mon Sep 17 00:00:00 2001
From: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Date: Thu, 20 Jan 2022 13:18:33 +0100
Subject: [PATCH 11/12] mdadm: add map_num_s()
Subject: [PATCH 11/83] mdadm: add map_num_s()
map_num() returns NULL if key is not defined. This patch adds
alternative, non NULL version for cases where NULL is not expected.
@ -378,5 +378,5 @@ index 2995713d..0d98a65f 100644
info->consistency_policy = CONSISTENCY_POLICY_RESYNC;
}
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 1066ab83dbe9a4cc20f7db44a40aa2cbb9d5eed6 Mon Sep 17 00:00:00 2001
From: Lukasz Florczak <lukasz.florczak@linux.intel.com>
Date: Fri, 13 May 2022 09:19:42 +0200
Subject: [PATCH 13/52] mdmon: Stop parsing duplicate options
Subject: [PATCH 13/83] mdmon: Stop parsing duplicate options
Introduce new function is_duplicate_opt() to check if given option
was already used and prevent setting it again along with an error
@ -118,5 +118,5 @@ index 5570574b..c057da63 100644
struct mdstat_ent *mdstat, *e;
int container_len = strlen(container_name);
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 20e114e334ed6ed3280c37a9a08fb95578393d1a Mon Sep 17 00:00:00 2001
From: Mateusz Kusiak <mateusz.kusiak@intel.com>
Date: Thu, 19 May 2022 09:16:08 +0200
Subject: [PATCH 14/52] Grow: block -n on external volumes.
Subject: [PATCH 14/83] Grow: block -n on external volumes.
Performing --raid-devices on external metadata volume should be blocked
as it causes unwanted behaviour.
@ -37,5 +37,5 @@ index 8a242b0f..f6efbc48 100644
return 1;
}
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From de064c93e3819d72720e4fba6575265ba10e1553 Mon Sep 17 00:00:00 2001
From: Mateusz Grzonka <mateusz.grzonka@intel.com>
Date: Mon, 13 Jun 2022 12:11:25 +0200
Subject: [PATCH 15/52] Incremental: Fix possible memory and resource leaks
Subject: [PATCH 15/83] Incremental: Fix possible memory and resource leaks
map allocated through map_by_uuid() is not freed if mdfd is invalid.
In addition mdfd is not closed, and mdinfo list is not freed too.
@ -86,5 +86,5 @@ index a57fc323..4d0cd9d6 100644
static void run_udisks(char *arg1, char *arg2)
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From e702f392959d1c2ad2089e595b52235ed97b4e18 Mon Sep 17 00:00:00 2001
From: Kinga Tanska <kinga.tanska@intel.com>
Date: Mon, 6 Jun 2022 12:32:12 +0200
Subject: [PATCH 16/52] Mdmonitor: Fix segfault
Subject: [PATCH 16/83] Mdmonitor: Fix segfault
Mdadm with "--monitor" parameter requires md device
as an argument to be monitored. If given argument is
@ -94,5 +94,5 @@ index 245be537..d18c9319 100644
{
static char devnm[32];
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From f5ff2988761625b43eb15555993f2797af29f166 Mon Sep 17 00:00:00 2001
From: Kinga Tanska <kinga.tanska@intel.com>
Date: Mon, 6 Jun 2022 12:32:13 +0200
Subject: [PATCH 17/52] Mdmonitor: Improve logging method
Subject: [PATCH 17/83] Mdmonitor: Improve logging method
Change logging, and as a result, mdmonitor in verbose
mode will report its configuration.
@ -57,5 +57,5 @@ index 4e5802b5..6ca1ebe5 100644
info.mailaddr = mailaddr;
info.mailfrom = mailfrom;
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 626bc45396c4959f2c4685c2faa7c4f553f4efdf Mon Sep 17 00:00:00 2001
From: Mateusz Grzonka <mateusz.grzonka@intel.com>
Date: Mon, 13 Jun 2022 11:59:34 +0200
Subject: [PATCH 18/52] Fix possible NULL ptr dereferences and memory leaks
Subject: [PATCH 18/83] Fix possible NULL ptr dereferences and memory leaks
In Assemble there was a NULL check for sra variable,
which effectively didn't stop the execution in every case.
@ -69,5 +69,5 @@ index 8cda23a7..abbc8b09 100644
}
vc->phys_refnum[i_prim] = ddf->phys->entries[dl->pdnum].refnum;
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 756a15f32338fdf0c562678694bc8991ad6afb90 Mon Sep 17 00:00:00 2001
From: Mateusz Grzonka <mateusz.grzonka@intel.com>
Date: Mon, 13 Jun 2022 12:00:09 +0200
Subject: [PATCH 19/52] imsm: Remove possibility for get_imsm_dev to return
Subject: [PATCH 19/83] imsm: Remove possibility for get_imsm_dev to return
NULL
Returning NULL from get_imsm_dev or __get_imsm_dev will cause segfault.
@ -297,5 +297,5 @@ index ba3bd41f..3788feb9 100644
}
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 190dc029b141c423e724566cbed5d5afbb10b05a Mon Sep 17 00:00:00 2001
From: Nigel Croxon <ncroxon@redhat.com>
Date: Mon, 18 Apr 2022 13:44:23 -0400
Subject: [PATCH 20/52] Revert "mdadm: fix coredump of mdadm --monitor -r"
Subject: [PATCH 20/83] Revert "mdadm: fix coredump of mdadm --monitor -r"
This reverts commit 546047688e1c64638f462147c755b58119cabdc8.
@ -81,5 +81,5 @@ index 8f873c48..bec1be9a 100644
struct option long_options[] = {
{"manage", 0, 0, ManageOpt},
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 953cc7e5a485a91ddec7312c7a5d7779749fad5f Mon Sep 17 00:00:00 2001
From: Kinga Tanska <kinga.tanska@intel.com>
Date: Tue, 21 Jun 2022 00:10:39 +0800
Subject: [PATCH 21/52] util: replace ioctl use with function
Subject: [PATCH 21/83] util: replace ioctl use with function
Replace using of ioctl calling to get md array info with
special function prepared to it.
@ -27,5 +27,5 @@ index cc94f96e..38f0420e 100644
return !ret;
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 63902857b98c37c8ac4b837bb01d006b327a4532 Mon Sep 17 00:00:00 2001
From: Heming Zhao <heming.zhao@suse.com>
Date: Tue, 21 Jun 2022 00:10:40 +0800
Subject: [PATCH 22/52] mdadm/super1: restore commit 45a87c2f31335 to fix
Subject: [PATCH 22/83] mdadm/super1: restore commit 45a87c2f31335 to fix
clustered slot issue
Commit 9d67f6496c71 ("mdadm:check the nodes when operate clustered
@ -106,5 +106,5 @@ index e3e2f954..3a0c69fd 100644
* Since the nodes num is not increased, no
* need to check the space enough or not,
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 76c152ca9851e9fcdf52e8f6e7e6c09b936bdd14 Mon Sep 17 00:00:00 2001
From: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Date: Tue, 21 Jun 2022 00:10:41 +0800
Subject: [PATCH 23/52] imsm: introduce get_disk_slot_in_dev()
Subject: [PATCH 23/83] imsm: introduce get_disk_slot_in_dev()
The routine was added to remove unnecessary get_imsm_dev() and
get_imsm_map() calls, used only to determine disk slot.
@ -118,5 +118,5 @@ index 3788feb9..cd1f1e3d 100644
}
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 6d4d9ab295de165e57b5c30e044028dbffb8f297 Mon Sep 17 00:00:00 2001
From: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Date: Tue, 21 Jun 2022 00:10:42 +0800
Subject: [PATCH 24/52] imsm: use same slot across container
Subject: [PATCH 24/83] imsm: use same slot across container
Autolayout relies on drives order on super->disks list, but
it is not quaranted by readdir() in sysfs_read(). As a result
@ -248,5 +248,5 @@ index cd1f1e3d..deef7c87 100644
*/
max_size = 0;
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 9a7df595bbe360132cb37c8b39aa1fd9ac24b43f Mon Sep 17 00:00:00 2001
From: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Date: Tue, 21 Jun 2022 00:10:43 +0800
Subject: [PATCH 25/52] imsm: block changing slots during creation
Subject: [PATCH 25/83] imsm: block changing slots during creation
If user specifies drives for array creation, then slot order across
volumes is not preserved.
@ -118,5 +118,5 @@ index ff5d2093..00000000
-offset=$((offset+size+4096))
-imsm_check member $member4 $num_disks $level $size 1024 $offset
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 70f1ff4291b0388adca1f4c91918ce1175e8b360 Mon Sep 17 00:00:00 2001
From: Lukasz Florczak <lukasz.florczak@linux.intel.com>
Date: Wed, 15 Jun 2022 14:28:39 +0200
Subject: [PATCH 26/52] mdadm: block update=ppl for non raid456 levels
Subject: [PATCH 26/83] mdadm: block update=ppl for non raid456 levels
Option ppl should be used only for raid levels 4, 5 and 6. Cancel update
for other levels.
@ -173,5 +173,5 @@ index 3a0c69fd..71af860c 100644
__le64_to_cpu(sb->reshape_position);
reshape_chunk = __le32_to_cpu(sb->new_chunk);
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 42e02e613fb0b4a2c0c0d984b9e6e2933875bb44 Mon Sep 17 00:00:00 2001
From: Lukasz Florczak <lukasz.florczak@linux.intel.com>
Date: Fri, 22 Jul 2022 08:43:47 +0200
Subject: [PATCH 27/52] mdadm: Fix array size mismatch after grow
Subject: [PATCH 27/83] mdadm: Fix array size mismatch after grow
imsm_fix_size_mismatch() is invoked to fix the problem, but it couldn't
proceed due to migration check. This patch allows for intended behavior.
@ -26,5 +26,5 @@ index 8ffe485c..76b947f5 100644
/* There is a difference, confirm that imsm_dev_size is
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 751757620afb25a4c02746bf8368a7b5f22352ec Mon Sep 17 00:00:00 2001
From: Lukasz Florczak <lukasz.florczak@linux.intel.com>
Date: Fri, 22 Jul 2022 08:43:48 +0200
Subject: [PATCH 28/52] mdadm: Remove dead code in imsm_fix_size_mismatch
Subject: [PATCH 28/83] mdadm: Remove dead code in imsm_fix_size_mismatch
imsm_create_metadata_update_for_size_change() that returns u_size value
could return 0 in the past. As its behavior changed, and returned value
@ -30,5 +30,5 @@ index 76b947f5..4ddfcf94 100644
if (st->update_tail) {
append_metadata_update(st, update, u_size);
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From c8d1c398505b62d9129a4e711f17e4469f4327ff Mon Sep 17 00:00:00 2001
From: Kinga Tanska <kinga.tanska@intel.com>
Date: Thu, 14 Jul 2022 09:02:10 +0200
Subject: [PATCH 29/52] Monitor: use devname as char array instead of pointer
Subject: [PATCH 29/83] Monitor: use devname as char array instead of pointer
Device name wasn't filled properly due to incorrect use of strcpy.
Strcpy was used twice. Firstly to fill devname with "/dev/md/"
@ -36,5 +36,5 @@ index 6ca1ebe5..a5b11ae2 100644
if (!is_mddev(mdlist->devname))
return 1;
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 84d969be8f6d8a345b75f558fad26e4f62a558f6 Mon Sep 17 00:00:00 2001
From: Kinga Tanska <kinga.tanska@intel.com>
Date: Thu, 14 Jul 2022 09:02:11 +0200
Subject: [PATCH 30/52] Monitor: use snprintf to fill device name
Subject: [PATCH 30/83] Monitor: use snprintf to fill device name
Safe string functions are propagated in Monitor.c.
@ -129,5 +129,5 @@ index a5b11ae2..93f36ac0 100644
*sl = 0;
} else
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 14ae4c37bce9a53da08d59d6c2d7e0946e9c9f47 Mon Sep 17 00:00:00 2001
From: Logan Gunthorpe <logang@deltatee.com>
Date: Wed, 22 Jun 2022 14:25:06 -0600
Subject: [PATCH 31/52] Makefile: Don't build static build with everything and
Subject: [PATCH 31/83] Makefile: Don't build static build with everything and
everything-test
Running the test suite requires building everything, but it seems to be
@ -38,5 +38,5 @@ index bf126033..ec1f99ed 100644
# mdadm.uclibc doesn't work on x86-64
# mdadm.tcc doesn't work..
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 679bd9508a30b2a0a1baecc9a21dd6c7d8d8d7dc Mon Sep 17 00:00:00 2001
From: Logan Gunthorpe <logang@deltatee.com>
Date: Wed, 22 Jun 2022 14:25:07 -0600
Subject: [PATCH 32/52] DDF: Cleanup validate_geometry_ddf_container()
Subject: [PATCH 32/83] DDF: Cleanup validate_geometry_ddf_container()
Move the function up so that the function declaration is not necessary
and remove the unused arguments to the function.
@ -137,5 +137,5 @@ index abbc8b09..9d867f69 100644
int level, int layout, int raiddisks,
int *chunk, unsigned long long size,
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 2b93288a5650bb811932836f67f30d63c5ddcfbd Mon Sep 17 00:00:00 2001
From: Logan Gunthorpe <logang@deltatee.com>
Date: Wed, 22 Jun 2022 14:25:08 -0600
Subject: [PATCH 33/52] DDF: Fix NULL pointer dereference in
Subject: [PATCH 33/83] DDF: Fix NULL pointer dereference in
validate_geometry_ddf()
A relatively recent patch added a call to validate_geometry() in
@ -45,5 +45,5 @@ index 9d867f69..949e7d15 100644
mdu_array_info_t array = {
.level = level,
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 548e9b916f86c06e2cdb50d8f49633f9bec66c7e Mon Sep 17 00:00:00 2001
From: Logan Gunthorpe <logang@deltatee.com>
Date: Wed, 22 Jun 2022 14:25:09 -0600
Subject: [PATCH 34/52] mdadm/Grow: Fix use after close bug by closing after
Subject: [PATCH 34/83] mdadm/Grow: Fix use after close bug by closing after
fork
The test 07reshape-grow fails most of the time. But it succeeds around
@ -81,5 +81,5 @@ index 8c520d42..97f22c75 100644
* reshape will wait for them. This would mean that
* the first section that we suspend will stay suspended
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 9ae62977b51dab0f4bb46b1c8ea5ebd1705b2f4d Mon Sep 17 00:00:00 2001
From: Logan Gunthorpe <logang@deltatee.com>
Date: Wed, 22 Jun 2022 14:25:10 -0600
Subject: [PATCH 35/52] monitor: Avoid segfault when calling NULL
Subject: [PATCH 35/83] monitor: Avoid segfault when calling NULL
get_bad_blocks
Not all struct superswitch implement a get_bad_blocks() function,
@ -32,5 +32,5 @@ index b877e595..820a93d0 100644
* Get a list of bad blocks for an array, then read list of
* acknowledged bad blocks from kernel and compare it against metadata
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 6c9d9260633f2c8491985b0782cf0fbd7e51651b Mon Sep 17 00:00:00 2001
From: Logan Gunthorpe <logang@deltatee.com>
Date: Wed, 22 Jun 2022 14:25:11 -0600
Subject: [PATCH 36/52] mdadm: Fix mdadm -r remove option regression
Subject: [PATCH 36/83] mdadm: Fix mdadm -r remove option regression
The commit noted below globally adds a parameter to the -r option but missed
the fact that -r is used for another purpose: --remove.
@ -74,5 +74,5 @@ index 974415b9..163f4a49 100644
extern char short_bitmap_auto_options[];
extern struct option long_options[];
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 41edf6f45895193f4a523cb0a08d639c9ff9ccc9 Mon Sep 17 00:00:00 2001
From: Logan Gunthorpe <logang@deltatee.com>
Date: Wed, 22 Jun 2022 14:25:12 -0600
Subject: [PATCH 37/52] mdadm: Fix optional --write-behind parameter
Subject: [PATCH 37/83] mdadm: Fix optional --write-behind parameter
The commit noted below changed the behaviour of --write-behind to
require an argument. This broke the 06wrmostly test with the error:
@ -38,5 +38,5 @@ index d0c5e6de..56722ed9 100644
optarg);
exit(2);
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 7539254342bc591717b0051734cc6c09c1b88640 Mon Sep 17 00:00:00 2001
From: Sudhakar Panneerselvam <sudhakar.panneerselvam@oracle.com>
Date: Wed, 22 Jun 2022 14:25:13 -0600
Subject: [PATCH 38/52] tests/00raid0: add a test that validates raid0 with
Subject: [PATCH 38/83] tests/00raid0: add a test that validates raid0 with
layout fails for 0.9
329dfc28debb disallows the creation of raid0 with layouts for 0.9
@ -34,5 +34,5 @@ index 8bc18985..e6b21cc4 100644
# now with no superblock
mdadm -B $md0 -l0 -n5 $dev0 $dev1 $dev2 $dev3 $dev4
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 14c2161edb77d7294199e8aa7daa9f9d1d0ad5d7 Mon Sep 17 00:00:00 2001
From: Sudhakar Panneerselvam <sudhakar.panneerselvam@oracle.com>
Date: Wed, 22 Jun 2022 14:25:14 -0600
Subject: [PATCH 39/52] tests: fix raid0 tests for 0.90 metadata
Subject: [PATCH 39/83] tests: fix raid0 tests for 0.90 metadata
Some of the test cases fail because raid0 creation fails with the error,
"0.90 metadata does not support layouts for RAID0" added by commit,
@ -95,5 +95,5 @@ index 232fc1ff..08c14af7 100644
s=${ls#*/} l=${ls%/*}
mdadm -CR --assume-clean -e 0.90 $md0 --level $l -n 4 -c 64 $dlist
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From de045db607b1ac4b70fc2a8878463e029c2ab1dc Mon Sep 17 00:00:00 2001
From: Sudhakar Panneerselvam <sudhakar.panneerselvam@oracle.com>
Date: Wed, 22 Jun 2022 14:25:15 -0600
Subject: [PATCH 40/52] tests/04update-metadata: avoid passing chunk size to
Subject: [PATCH 40/83] tests/04update-metadata: avoid passing chunk size to
raid1
'04update-metadata' test fails with error, "specifying chunk size is
@ -35,5 +35,5 @@ index 08c14af7..2b72a303 100644
mdadm -S $md0
mdadm -A $md0 --update=metadata $dlist
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From a2c832465fc75202e244327b2081231dfa974617 Mon Sep 17 00:00:00 2001
From: Sudhakar Panneerselvam <sudhakar.panneerselvam@oracle.com>
Date: Wed, 22 Jun 2022 14:25:16 -0600
Subject: [PATCH 41/52] tests/02lineargrow: clear the superblock at every
Subject: [PATCH 41/83] tests/02lineargrow: clear the superblock at every
iteration
This fixes 02lineargrow test as prior metadata causes --add operation
@ -27,5 +27,5 @@ index e05c219d..595bf9f2 100644
+ mdadm --zero /dev/loop3
done
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From a7bfcc716e235664dfb3b6c5a9590273e611ac72 Mon Sep 17 00:00:00 2001
From: Logan Gunthorpe <logang@deltatee.com>
Date: Wed, 22 Jun 2022 14:25:17 -0600
Subject: [PATCH 42/52] mdadm/test: Add a mode to repeat specified tests
Subject: [PATCH 42/83] mdadm/test: Add a mode to repeat specified tests
Many tests fail infrequently or rarely. To help find these, add
an option to run the tests multiple times by specifying --loop=N.
@ -84,5 +84,5 @@ index 711a3c7a..da6db5e0 100755
}
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 28520bf114b3b0515a48ff44fff4ecbe9ed6dfad Mon Sep 17 00:00:00 2001
From: Logan Gunthorpe <logang@deltatee.com>
Date: Wed, 22 Jun 2022 14:25:18 -0600
Subject: [PATCH 43/52] mdadm/test: Mark and ignore broken test failures
Subject: [PATCH 43/83] mdadm/test: Mark and ignore broken test failures
Add functionality to continue if a test marked as broken fails.
@ -116,5 +116,5 @@ index da6db5e0..61d9ee83 100755
fi
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From daa86d6634761796ada1f535c13e47fdd3cc95eb Mon Sep 17 00:00:00 2001
From: Logan Gunthorpe <logang@deltatee.com>
Date: Wed, 22 Jun 2022 14:25:19 -0600
Subject: [PATCH 44/52] tests: Add broken files for all broken tests
Subject: [PATCH 44/83] tests: Add broken files for all broken tests
Each broken file contains the rough frequency of brokeness as well
as a brief explanation of what happens when it breaks. Estimates
@ -443,5 +443,5 @@ index 00000000..e91a1425
+
+ "should detect errors"
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 239b3cc0b5da87e966746533b1873c439db54b16 Mon Sep 17 00:00:00 2001
From: Mateusz Grzonka <mateusz.grzonka@intel.com>
Date: Fri, 12 Aug 2022 16:36:02 +0200
Subject: [PATCH 45/52] mdadm: Replace obsolete usleep with nanosleep
Subject: [PATCH 45/83] mdadm: Replace obsolete usleep with nanosleep
According to POSIX.1-2001, usleep is considered obsolete.
Replace it with a wrapper that uses nanosleep, as recommended in man.
@ -312,5 +312,5 @@ index 38f0420e..ca48d976 100644
+ } while (!wake_after_interrupt && errno == EINTR);
+}
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 39b381252c32275079344d30de18b76fda4bba26 Mon Sep 17 00:00:00 2001
From: Logan Gunthorpe <logang@deltatee.com>
Date: Wed, 27 Jul 2022 15:52:45 -0600
Subject: [PATCH 46/52] tests/00readonly: Run udevadm settle before setting ro
Subject: [PATCH 46/83] tests/00readonly: Run udevadm settle before setting ro
In some recent kernel versions, 00readonly fails with:
@ -32,5 +32,5 @@ index 39202487..afe243b3 100644
check readonly
state=$(cat /sys/block/md0/md/array_state)
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From b7671c82010ffc04dfaecff2dd19ef8b2283e2b6 Mon Sep 17 00:00:00 2001
From: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Date: Tue, 19 Jul 2022 14:48:21 +0200
Subject: [PATCH 47/52] tests: add test for names
Subject: [PATCH 47/83] tests: add test for names
Current behavior is not documented and tested. This test is a base for
future improvements. It is enough to test it only with native metadata,
@ -115,5 +115,5 @@ index 00000000..64b81b92
+_verify "/dev/md0" "empty" "name"
+mdadm -S "/dev/md0"
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From e4a030a0d3a953b8e74c118200e58dc83c2fc608 Mon Sep 17 00:00:00 2001
From: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Date: Tue, 19 Jul 2022 14:48:22 +0200
Subject: [PATCH 48/52] mdadm: remove symlink option
Subject: [PATCH 48/83] mdadm: remove symlink option
The option is not used. Remove it from code.
@ -172,5 +172,5 @@ index add9c0b6..93e72786 100644
Waitclean,
DetailPlatform,
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From ae5dfc56b7a96805d5a0b50eaf93b9fec8604298 Mon Sep 17 00:00:00 2001
From: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Date: Tue, 19 Jul 2022 14:48:23 +0200
Subject: [PATCH 49/52] mdadm: move data_offset to struct shape
Subject: [PATCH 49/83] mdadm: move data_offset to struct shape
Data offset is a shape property so move it there to remove additional
parameter from some functions.
@ -228,5 +228,5 @@ index 93e72786..adb7cdaa 100644
extern int Detail(char *dev, struct context *c);
extern int Detail_Platform(struct superswitch *ss, int scan, int verbose, int export, char *controller_path);
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 27ad4900501c615b7c6b266bf23948e5606dba53 Mon Sep 17 00:00:00 2001
From: Logan Gunthorpe <logang@deltatee.com>
Date: Wed, 27 Jul 2022 15:52:46 -0600
Subject: [PATCH 50/52] mdadm: Don't open md device for CREATE and ASSEMBLE
Subject: [PATCH 50/83] mdadm: Don't open md device for CREATE and ASSEMBLE
The mdadm command tries to open the md device for most modes, first
thing, no matter what. When running to create or assemble an array,
@ -158,5 +158,5 @@ index adb7cdaa..8208b81e 100644
extern void udev_block(char *devnm);
extern void udev_unblock(void);
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 7211116c295ba1f9e1fcbdc2dd2d3762855062e1 Mon Sep 17 00:00:00 2001
From: Mateusz Kusiak <mateusz.kusiak@intel.com>
Date: Thu, 28 Jul 2022 20:20:53 +0800
Subject: [PATCH 51/52] Grow: Split Grow_reshape into helper function
Subject: [PATCH 51/83] Grow: Split Grow_reshape into helper function
Grow_reshape should be split into helper functions given its size.
- Add helper function for preparing reshape on external metadata.
@ -227,5 +227,5 @@ index ca48d976..26ffdcea 100644
{
/* like 'open', but if 'dev' matches %d:%d, create a temp
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 5c3c3df646dd3b7e8df81152f08e9ac4ddccc671 Mon Sep 17 00:00:00 2001
From: Kinga Tanska <kinga.tanska@intel.com>
Date: Fri, 19 Aug 2022 02:55:46 +0200
Subject: [PATCH 52/52] Assemble: check if device is container before
Subject: [PATCH 52/83] Assemble: check if device is container before
scheduling force-clean update
Up to now using assemble with force flag making each array as clean.
@ -32,5 +32,5 @@ index be2160b4..1dd82a8c 100644
devices[chosen_drive].devname, c->verbose,
0, NULL);
--
2.31.1
2.38.1

View File

@ -1,7 +1,7 @@
From 171e9743881edf2dfb163ddff483566fbf913ccd Mon Sep 17 00:00:00 2001
From: NeilBrown <neilb@suse.de>
Date: Fri, 26 Aug 2022 08:55:56 +1000
Subject: [PATCH 53/63] super1: report truncated device
Subject: [PATCH 53/83] super1: report truncated device
When the metadata is at the start of the device, it is possible that it
describes a device large than the one it is actually stored on. When

View File

@ -1,7 +1,7 @@
From 1a386f804d8392b849b3362da6b0157b0db83091 Mon Sep 17 00:00:00 2001
From: Mateusz Grzonka <mateusz.grzonka@intel.com>
Date: Fri, 12 Aug 2022 16:52:12 +0200
Subject: [PATCH 54/63] mdadm: Correct typos, punctuation and grammar in man
Subject: [PATCH 54/83] mdadm: Correct typos, punctuation and grammar in man
Signed-off-by: Mateusz Grzonka <mateusz.grzonka@intel.com>
Reviewed-by: Wol <anthony@youngman.org.uk>

View File

@ -1,7 +1,7 @@
From fc6fd4063769f4194c3fb8f77b32b2819e140fb9 Mon Sep 17 00:00:00 2001
From: Mateusz Kusiak <mateusz.kusiak@intel.com>
Date: Thu, 18 Aug 2022 11:47:21 +0200
Subject: [PATCH 55/63] Manage: Block unsafe member failing
Subject: [PATCH 55/83] Manage: Block unsafe member failing
Kernel may or may not block mdadm from removing member device if it
will cause arrays failed state. It depends on raid personality

View File

@ -1,7 +1,7 @@
From 55c10e4de13abe3e6934895e1fff7d2d20d0b2c2 Mon Sep 17 00:00:00 2001
From: Pawel Baldysiak <pawel.baldysiak@intel.com>
Date: Thu, 1 Sep 2022 11:20:31 +0200
Subject: [PATCH 56/63] Monitor: Fix statelist memory leaks
Subject: [PATCH 56/83] Monitor: Fix statelist memory leaks
Free statelist in error path in Monitor initialization.

View File

@ -1,7 +1,7 @@
From ea7a02a3294aae223e1329aed5da7f4aa3ac05c5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Old=C5=99ich=20Jedli=C4=8Dka?= <oldium.pro@gmail.com>
Date: Wed, 31 Aug 2022 19:57:29 +0200
Subject: [PATCH 57/63] mdadm: added support for Intel Alderlake RST on VMD
Subject: [PATCH 57/83] mdadm: added support for Intel Alderlake RST on VMD
platform
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8

View File

@ -1,7 +1,7 @@
From ea109700563d93704ebdc540c7770d874369f667 Mon Sep 17 00:00:00 2001
From: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Date: Fri, 9 Sep 2022 15:50:33 +0200
Subject: [PATCH 58/63] mdadm: Add Documentation entries to systemd services
Subject: [PATCH 58/83] mdadm: Add Documentation entries to systemd services
Add documentation section.
Copied from Debian.

View File

@ -1,7 +1,7 @@
From f7cbd810b639eb946ba1b3bddb1faefb9696de42 Mon Sep 17 00:00:00 2001
From: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Date: Fri, 9 Sep 2022 15:50:34 +0200
Subject: [PATCH 59/63] ReadMe: fix command-line help
Subject: [PATCH 59/83] ReadMe: fix command-line help
Make command-line help consistent with manual page.
Copied from Debian.

View File

@ -1,7 +1,7 @@
From 6f2af6a48c541f207cb727a31fb86de2cd04fc21 Mon Sep 17 00:00:00 2001
From: Kinga Tanska <kinga.tanska@intel.com>
Date: Fri, 2 Sep 2022 08:49:23 +0200
Subject: [PATCH 60/63] mdadm: replace container level checking with inline
Subject: [PATCH 60/83] mdadm: replace container level checking with inline
To unify all containers checks in code, is_container() function is
added and propagated.

View File

@ -1,7 +1,7 @@
From 8b668d4aa3305af5963162b7499b128bd71f8f29 Mon Sep 17 00:00:00 2001
From: Lukasz Florczak <lukasz.florczak@linux.intel.com>
Date: Thu, 22 Sep 2022 08:29:50 +0200
Subject: [PATCH 61/63] Mdmonitor: Omit non-md devices
Subject: [PATCH 61/83] Mdmonitor: Omit non-md devices
Fix segfault commit [1] introduced check whether given device is
mddevice, but it happend to terminate Mdmonitor if at least one of given

View File

@ -1,31 +0,0 @@
From 75f23f662fdfd6709be3d1d554d435cc0aa33443 Mon Sep 17 00:00:00 2001
From: Logan Gunthorpe <logang@deltatee.com>
Date: Wed, 21 Sep 2022 14:43:50 -0600
Subject: [PATCH 62/63] Create: goto abort_locked instead of return 1 in error
path
The return 1 after the fstat_is_blkdev() check should be replaced
with an error return that goes through the error path to unlock
resources locked by this function.
Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
---
Create.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Create.c b/Create.c
index 953e7372..2e8203ec 100644
--- a/Create.c
+++ b/Create.c
@@ -939,7 +939,7 @@ int Create(struct supertype *st, char *mddev,
goto abort_locked;
}
if (!fstat_is_blkdev(fd, dv->devname, &rdev))
- return 1;
+ goto abort_locked;
inf->disk.major = major(rdev);
inf->disk.minor = minor(rdev);
}
--
2.38.1

View File

@ -0,0 +1,233 @@
From 3698867194f27fdd7824b8bdd172d619a2c087cc Mon Sep 17 00:00:00 2001
From: Mateusz Grzonka <mateusz.grzonka@intel.com>
Date: Wed, 7 Sep 2022 14:56:49 +0200
Subject: [PATCH 62/83] Mdmonitor: Split alert() into separate functions
Signed-off-by: Mateusz Grzonka <mateusz.grzonka@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
---
Monitor.c | 186 ++++++++++++++++++++++++++++--------------------------
1 file changed, 95 insertions(+), 91 deletions(-)
diff --git a/Monitor.c b/Monitor.c
index 7d7dc4d2..0036e8cd 100644
--- a/Monitor.c
+++ b/Monitor.c
@@ -66,7 +66,7 @@ struct alert_info {
static int make_daemon(char *pidfile);
static int check_one_sharer(int scan);
static void write_autorebuild_pid(void);
-static void alert(char *event, char *dev, char *disc, struct alert_info *info);
+static void alert(const char *event, const char *dev, const char *disc, struct alert_info *info);
static int check_array(struct state *st, struct mdstat_ent *mdstat,
int test, struct alert_info *info,
int increments, char *prefer);
@@ -407,111 +407,115 @@ static void write_autorebuild_pid()
}
}
-static void alert(char *event, char *dev, char *disc, struct alert_info *info)
+static void execute_alert_cmd(const char *event, const char *dev, const char *disc, struct alert_info *info)
+{
+ int pid = fork();
+
+ switch (pid) {
+ default:
+ waitpid(pid, NULL, 0);
+ break;
+ case -1:
+ pr_err("Cannot fork to execute alert command");
+ break;
+ case 0:
+ execl(info->alert_cmd, info->alert_cmd, event, dev, disc, NULL);
+ exit(2);
+ }
+}
+
+static void send_event_email(const char *event, const char *dev, const char *disc, struct alert_info *info)
+{
+ FILE *mp, *mdstat;
+ char hname[256];
+ char buf[BUFSIZ];
+ int n;
+
+ mp = popen(Sendmail, "w");
+ if (!mp) {
+ pr_err("Cannot open pipe stream for sendmail.\n");
+ return;
+ }
+
+ gethostname(hname, sizeof(hname));
+ signal(SIGPIPE, SIG_IGN);
+ if (info->mailfrom)
+ fprintf(mp, "From: %s\n", info->mailfrom);
+ else
+ fprintf(mp, "From: %s monitoring <root>\n", Name);
+ fprintf(mp, "To: %s\n", info->mailaddr);
+ fprintf(mp, "Subject: %s event on %s:%s\n\n", event, dev, hname);
+ fprintf(mp, "This is an automatically generated mail message. \n");
+ fprintf(mp, "A %s event had been detected on md device %s.\n\n", event, dev);
+
+ if (disc && disc[0] != ' ')
+ fprintf(mp,
+ "It could be related to component device %s.\n\n", disc);
+ if (disc && disc[0] == ' ')
+ fprintf(mp, "Extra information:%s.\n\n", disc);
+
+ mdstat = fopen("/proc/mdstat", "r");
+ if (!mdstat) {
+ pr_err("Cannot open /proc/mdstat\n");
+ pclose(mp);
+ return;
+ }
+
+ fprintf(mp, "The /proc/mdstat file currently contains the following:\n\n");
+ while ((n = fread(buf, 1, sizeof(buf), mdstat)) > 0)
+ n = fwrite(buf, 1, n, mp);
+ fclose(mdstat);
+ pclose(mp);
+}
+
+static void log_event_to_syslog(const char *event, const char *dev, const char *disc)
{
int priority;
+ /* Log at a different severity depending on the event.
+ *
+ * These are the critical events: */
+ if (strncmp(event, "Fail", 4) == 0 ||
+ strncmp(event, "Degrade", 7) == 0 ||
+ strncmp(event, "DeviceDisappeared", 17) == 0)
+ priority = LOG_CRIT;
+ /* Good to know about, but are not failures: */
+ else if (strncmp(event, "Rebuild", 7) == 0 ||
+ strncmp(event, "MoveSpare", 9) == 0 ||
+ strncmp(event, "Spares", 6) != 0)
+ priority = LOG_WARNING;
+ /* Everything else: */
+ else
+ priority = LOG_INFO;
+ if (disc && disc[0] != ' ')
+ syslog(priority,
+ "%s event detected on md device %s, component device %s", event, dev, disc);
+ else if (disc)
+ syslog(priority, "%s event detected on md device %s: %s", event, dev, disc);
+ else
+ syslog(priority, "%s event detected on md device %s", event, dev);
+}
+
+static void alert(const char *event, const char *dev, const char *disc, struct alert_info *info)
+{
if (!info->alert_cmd && !info->mailaddr && !info->dosyslog) {
time_t now = time(0);
printf("%1.15s: %s on %s %s\n", ctime(&now) + 4,
event, dev, disc?disc:"unknown device");
}
- if (info->alert_cmd) {
- int pid = fork();
- switch(pid) {
- default:
- waitpid(pid, NULL, 0);
- break;
- case -1:
- break;
- case 0:
- execl(info->alert_cmd, info->alert_cmd,
- event, dev, disc, NULL);
- exit(2);
- }
- }
+ if (info->alert_cmd)
+ execute_alert_cmd(event, dev, disc, info);
+
if (info->mailaddr && (strncmp(event, "Fail", 4) == 0 ||
strncmp(event, "Test", 4) == 0 ||
strncmp(event, "Spares", 6) == 0 ||
strncmp(event, "Degrade", 7) == 0)) {
- FILE *mp = popen(Sendmail, "w");
- if (mp) {
- FILE *mdstat;
- char hname[256];
-
- gethostname(hname, sizeof(hname));
- signal_s(SIGPIPE, SIG_IGN);
-
- if (info->mailfrom)
- fprintf(mp, "From: %s\n", info->mailfrom);
- else
- fprintf(mp, "From: %s monitoring <root>\n",
- Name);
- fprintf(mp, "To: %s\n", info->mailaddr);
- fprintf(mp, "Subject: %s event on %s:%s\n\n",
- event, dev, hname);
-
- fprintf(mp,
- "This is an automatically generated mail message from %s\n", Name);
- fprintf(mp, "running on %s\n\n", hname);
-
- fprintf(mp,
- "A %s event had been detected on md device %s.\n\n", event, dev);
-
- if (disc && disc[0] != ' ')
- fprintf(mp,
- "It could be related to component device %s.\n\n", disc);
- if (disc && disc[0] == ' ')
- fprintf(mp, "Extra information:%s.\n\n", disc);
-
- fprintf(mp, "Faithfully yours, etc.\n");
-
- mdstat = fopen("/proc/mdstat", "r");
- if (mdstat) {
- char buf[8192];
- int n;
- fprintf(mp,
- "\nP.S. The /proc/mdstat file currently contains the following:\n\n");
- while ((n = fread(buf, 1, sizeof(buf),
- mdstat)) > 0)
- n = fwrite(buf, 1, n, mp);
- fclose(mdstat);
- }
- pclose(mp);
- }
+ send_event_email(event, dev, disc, info);
}
- /* log the event to syslog maybe */
- if (info->dosyslog) {
- /* Log at a different severity depending on the event.
- *
- * These are the critical events: */
- if (strncmp(event, "Fail", 4) == 0 ||
- strncmp(event, "Degrade", 7) == 0 ||
- strncmp(event, "DeviceDisappeared", 17) == 0)
- priority = LOG_CRIT;
- /* Good to know about, but are not failures: */
- else if (strncmp(event, "Rebuild", 7) == 0 ||
- strncmp(event, "MoveSpare", 9) == 0 ||
- strncmp(event, "Spares", 6) != 0)
- priority = LOG_WARNING;
- /* Everything else: */
- else
- priority = LOG_INFO;
-
- if (disc && disc[0] != ' ')
- syslog(priority,
- "%s event detected on md device %s, component device %s", event, dev, disc);
- else if (disc)
- syslog(priority,
- "%s event detected on md device %s: %s",
- event, dev, disc);
- else
- syslog(priority,
- "%s event detected on md device %s",
- event, dev);
- }
+ if (info->dosyslog)
+ log_event_to_syslog(event, dev, disc);
}
static int check_array(struct state *st, struct mdstat_ent *mdstat,
--
2.38.1

View File

@ -1,59 +0,0 @@
From 249da94563dddb852ccb52164411ff99a6c90489 Mon Sep 17 00:00:00 2001
From: Logan Gunthorpe <logang@deltatee.com>
Date: Wed, 21 Sep 2022 14:43:51 -0600
Subject: [PATCH 63/63] Create: remove safe_mode_delay local variable
All .getinfo_super() call sets the info.safe_mode_delay variables
to a constant value, so no matter what the current state is
that function will always set it to the same value.
Create() calls .getinfo_super() multiple times while creating the array.
The value is stored in a local variable for every disk in the loop
to add disks (so the last disc call takes precedence). The local
variable is then used in the call to sysfs_set_safemode().
This can be simplified by using info.safe_mode_delay directly. The info
variable had .getinfo_super() called on it early in the function so, by the
reasoning above, it will have the same value as the local variable which
can thus be removed.
Doing this allows for factoring out code from Create() in a subsequent
patch.
Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
---
Create.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/Create.c b/Create.c
index 2e8203ec..8ded81dc 100644
--- a/Create.c
+++ b/Create.c
@@ -137,7 +137,6 @@ int Create(struct supertype *st, char *mddev,
int did_default = 0;
int do_default_layout = 0;
int do_default_chunk = 0;
- unsigned long safe_mode_delay = 0;
char chosen_name[1024];
struct map_ent *map = NULL;
unsigned long long newsize;
@@ -952,7 +951,6 @@ int Create(struct supertype *st, char *mddev,
goto abort_locked;
}
st->ss->getinfo_super(st, inf, NULL);
- safe_mode_delay = inf->safe_mode_delay;
if (have_container && c->verbose > 0)
pr_err("Using %s for device %d\n",
@@ -1065,7 +1063,7 @@ int Create(struct supertype *st, char *mddev,
"readonly");
break;
}
- sysfs_set_safemode(&info, safe_mode_delay);
+ sysfs_set_safemode(&info, info.safe_mode_delay);
if (err) {
pr_err("failed to activate array.\n");
ioctl(mdfd, STOP_ARRAY, NULL);
--
2.38.1

View File

@ -0,0 +1,41 @@
From f40ac0e7e6043361ad12e9db97c07e56c3977cf6 Mon Sep 17 00:00:00 2001
From: Blazej Kucman <blazej.kucman@intel.com>
Date: Mon, 19 Dec 2022 11:21:57 +0100
Subject: [PATCH 63/83] Monitor: block if monitor modes are combined.
Block monitoring start if --scan mode and MD devices list are combined.
Signed-off-by: Blazej Kucman <blazej.kucman@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
---
Monitor.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/Monitor.c b/Monitor.c
index 0036e8cd..188cb8be 100644
--- a/Monitor.c
+++ b/Monitor.c
@@ -123,7 +123,7 @@ int Monitor(struct mddev_dev *devlist,
* and if we can get_disk_info and find a name
* Then we hot-remove and hot-add to the other array
*
- * If devlist is NULL, then we can monitor everything because --scan
+ * If devlist is NULL, then we can monitor everything if --scan
* was given. We get an initial list from config file and add anything
* that appears in /proc/mdstat
*/
@@ -136,6 +136,11 @@ int Monitor(struct mddev_dev *devlist,
struct mddev_ident *mdlist;
int delay_for_event = c->delay;
+ if (devlist && c->scan) {
+ pr_err("Devices list and --scan option cannot be combined - not monitoring.\n");
+ return 1;
+ }
+
if (!mailaddr)
mailaddr = conf_get_mailaddr();
--
2.38.1

View File

@ -0,0 +1,119 @@
From 725e37cd14866906ba28c970394b9f7a4cd97413 Mon Sep 17 00:00:00 2001
From: Blazej Kucman <blazej.kucman@intel.com>
Date: Mon, 19 Dec 2022 11:21:58 +0100
Subject: [PATCH 64/83] Update mdadm Monitor manual.
- describe monitor work modes,
- clarify the turning off condition,
- describe the mdmonitor.service as a prefered management way.
Signed-off-by: Blazej Kucman <blazej.kucman@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
---
mdadm.8.in | 71 ++++++++++++++++++++++++++++++++++++++----------------
1 file changed, 50 insertions(+), 21 deletions(-)
diff --git a/mdadm.8.in b/mdadm.8.in
index 70c79d1e..64f71ed1 100644
--- a/mdadm.8.in
+++ b/mdadm.8.in
@@ -2548,13 +2548,33 @@ Usage:
.I options... devices...
.PP
-This usage causes
+Monitor option can work in two modes:
+.IP \(bu 4
+system wide mode, follow all md devices based on
+.B /proc/mdstat,
+.IP \(bu 4
+follow only specified MD devices in command line.
+.PP
+
+.B \-\-scan -
+indicates system wide mode. Option causes the
+.I monitor
+to track all md devices that appear in
+.B /proc/mdstat.
+If it is not set, then at least one
+.B device
+must be specified.
+
+Monitor usage causes
.I mdadm
to periodically poll a number of md arrays and to report on any events
noticed.
-.I mdadm
-will never exit once it decides that there are arrays to be checked,
-so it should normally be run in the background.
+
+In both modes,
+.I monitor
+will work as long as there is an active array with redundancy and it is defined to follow (for
+.B \-\-scan
+every array is followed).
As well as reporting events,
.I mdadm
@@ -2565,15 +2585,6 @@ or
.B domain
and if the destination array has a failed drive but no spares.
-If any devices are listed on the command line,
-.I mdadm
-will only monitor those devices, otherwise, all arrays listed in the
-configuration file will be monitored. Further, if
-.B \-\-scan
-is given, then any other md devices that appear in
-.B /proc/mdstat
-will also be monitored.
-
The result of monitoring the arrays is the generation of events.
These events are passed to a separate program (if specified) and may
be mailed to a given E-mail address.
@@ -2586,16 +2597,34 @@ device if relevant (such as a component device that has failed).
If
.B \-\-scan
-is given, then a program or an E-mail address must be specified on the
-command line or in the config file. If neither are available, then
+is given, then a
+.B program
+or an
+.B e-mail
+address must be specified on the
+command line or in the config file. If neither are available, then
.I mdadm
will not monitor anything.
-Without
-.B \-\-scan,
-.I mdadm
-will continue monitoring as long as something was found to monitor. If
-no program or email is given, then each event is reported to
-.BR stdout .
+For devices given directly in command line, without
+.B program
+or
+.B email
+specified, each event is reported to
+.BR stdout.
+
+Note: For systems where
+.If mdadm monitor
+is configured via systemd,
+.B mdmonitor(mdmonitor.service)
+should be configured. The service is designed to be primary solution for array monitoring,
+it is configured to work in system wide mode.
+It is automatically started and stopped according to current state and types of MD arrays in system.
+The service may require additional configuration, like
+.B e-mail
+or
+.B delay.
+That should be done in
+.B mdadm.conf.
The different events are:
--
2.38.1

View File

@ -0,0 +1,38 @@
From 434b3b9bb96a76dc12f693b64cf23b581781e20b Mon Sep 17 00:00:00 2001
From: Blazej Kucman <blazej.kucman@intel.com>
Date: Tue, 20 Dec 2022 12:07:51 +0100
Subject: [PATCH 65/83] Grow: fix possible memory leak.
Signed-off-by: Blazej Kucman <blazej.kucman@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
---
Grow.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/Grow.c b/Grow.c
index e362403a..b73ec2ae 100644
--- a/Grow.c
+++ b/Grow.c
@@ -432,6 +432,7 @@ int Grow_addbitmap(char *devname, int fd, struct context *c, struct shape *s)
if (((disk.state & (1 << MD_DISK_WRITEMOSTLY)) == 0) &&
(strcmp(s->bitmap_file, "clustered") == 0)) {
pr_err("%s disks marked write-mostly are not supported with clustered bitmap\n",devname);
+ free(mdi);
return 1;
}
fd2 = dev_open(dv, O_RDWR);
@@ -453,8 +454,10 @@ int Grow_addbitmap(char *devname, int fd, struct context *c, struct shape *s)
pr_err("failed to load super-block.\n");
}
close(fd2);
- if (rv)
+ if (rv) {
+ free(mdi);
return 1;
+ }
}
if (offset_setable) {
st->ss->getinfo_super(st, mdi, NULL);
--
2.38.1

View File

@ -0,0 +1,148 @@
From 7fcbfd7c620e2dcd3b539d18e93cb503ee3a8a62 Mon Sep 17 00:00:00 2001
From: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Date: Wed, 21 Dec 2022 12:50:17 +0100
Subject: [PATCH 66/83] mdadm: create ident_init()
Add a wrapper for repeated initializations in mdadm.c and config.c.
Move includes up.
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
---
config.c | 45 +++++++++++++++++++++++++++++----------------
mdadm.c | 16 ++--------------
mdadm.h | 7 +++++--
3 files changed, 36 insertions(+), 32 deletions(-)
diff --git a/config.c b/config.c
index dc1620c1..eeedd0c6 100644
--- a/config.c
+++ b/config.c
@@ -119,6 +119,34 @@ int match_keyword(char *word)
return -1;
}
+/**
+ * ident_init() - Set defaults.
+ * @ident: ident pointer, not NULL.
+ */
+inline void ident_init(struct mddev_ident *ident)
+{
+ assert(ident);
+
+ ident->assembled = false;
+ ident->autof = 0;
+ ident->bitmap_fd = -1;
+ ident->bitmap_file = NULL;
+ ident->container = NULL;
+ ident->devices = NULL;
+ ident->devname = NULL;
+ ident->level = UnSet;
+ ident->member = NULL;
+ ident->name[0] = 0;
+ ident->next = NULL;
+ ident->raid_disks = UnSet;
+ ident->spare_group = NULL;
+ ident->spare_disks = 0;
+ ident->st = NULL;
+ ident->super_minor = UnSet;
+ ident->uuid[0] = 0;
+ ident->uuid_set = 0;
+}
+
struct conf_dev {
struct conf_dev *next;
char *name;
@@ -363,22 +391,7 @@ void arrayline(char *line)
struct mddev_ident mis;
struct mddev_ident *mi;
- mis.uuid_set = 0;
- mis.super_minor = UnSet;
- mis.level = UnSet;
- mis.raid_disks = UnSet;
- mis.spare_disks = 0;
- mis.devices = NULL;
- mis.devname = NULL;
- mis.spare_group = NULL;
- mis.autof = 0;
- mis.next = NULL;
- mis.st = NULL;
- mis.bitmap_fd = -1;
- mis.bitmap_file = NULL;
- mis.name[0] = 0;
- mis.container = NULL;
- mis.member = NULL;
+ ident_init(&mis);
for (w = dl_next(line); w != line; w = dl_next(w)) {
if (w[0] == '/' || strchr(w, '=') == NULL) {
diff --git a/mdadm.c b/mdadm.c
index 972adb52..74fdec31 100644
--- a/mdadm.c
+++ b/mdadm.c
@@ -107,25 +107,13 @@ int main(int argc, char *argv[])
srandom(time(0) ^ getpid());
- ident.uuid_set = 0;
- ident.level = UnSet;
- ident.raid_disks = UnSet;
- ident.super_minor = UnSet;
- ident.devices = 0;
- ident.spare_group = NULL;
- ident.autof = 0;
- ident.st = NULL;
- ident.bitmap_fd = -1;
- ident.bitmap_file = NULL;
- ident.name[0] = 0;
- ident.container = NULL;
- ident.member = NULL;
-
if (get_linux_version() < 2006015) {
pr_err("This version of mdadm does not support kernels older than 2.6.15\n");
exit(1);
}
+ ident_init(&ident);
+
while ((option_index = -1),
(opt = getopt_long(argc, argv, shortopt, long_options,
&option_index)) != -1) {
diff --git a/mdadm.h b/mdadm.h
index 3673494e..23ffe977 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -33,8 +33,10 @@ extern __off64_t lseek64 __P ((int __fd, __off64_t __offset, int __whence));
# endif
#endif
+#include <assert.h>
#include <sys/types.h>
#include <sys/stat.h>
+#include <stdarg.h>
#include <stdint.h>
#include <stdlib.h>
#include <time.h>
@@ -1552,6 +1554,8 @@ extern void enable_fds(int devices);
extern void manage_fork_fds(int close_all);
extern int continue_via_systemd(char *devnm, char *service_name);
+extern void ident_init(struct mddev_ident *ident);
+
extern int parse_auto(char *str, char *msg, int config);
extern struct mddev_ident *conf_get_ident(char *dev);
extern struct mddev_dev *conf_get_devs(void);
@@ -1779,8 +1783,7 @@ static inline sighandler_t signal_s(int sig, sighandler_t handler)
#define dprintf_cont(fmt, arg...) \
({ if (0) fprintf(stderr, fmt, ##arg); 0; })
#endif
-#include <assert.h>
-#include <stdarg.h>
+
static inline int xasprintf(char **strp, const char *fmt, ...) {
va_list ap;
int ret;
--
2.38.1

View File

@ -0,0 +1,287 @@
From 2568ce89ea5c26225e8984733adc2ea7559d853a Mon Sep 17 00:00:00 2001
From: Mateusz Kusiak <mateusz.kusiak@intel.com>
Date: Mon, 2 Jan 2023 09:35:15 +0100
Subject: [PATCH 67/83] mdadm: Add option validation for --update-subarray
Subset of options available for "--update" is not same as for "--update-subarray".
Define maps and enum for update options and use them instead of direct comparisons.
Add proper error message.
Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
---
ReadMe.c | 31 +++++++++++++++++
maps.c | 31 +++++++++++++++++
mdadm.c | 104 +++++++++++++++++--------------------------------------
mdadm.h | 32 ++++++++++++++++-
4 files changed, 124 insertions(+), 74 deletions(-)
diff --git a/ReadMe.c b/ReadMe.c
index 50a5e36d..bd8d50d2 100644
--- a/ReadMe.c
+++ b/ReadMe.c
@@ -655,3 +655,34 @@ char *mode_help[mode_count] = {
[GROW] = Help_grow,
[INCREMENTAL] = Help_incr,
};
+
+/**
+ * fprint_update_options() - Print valid update options depending on the mode.
+ * @outf: File (output stream)
+ * @update_mode: Used to distinguish update and update_subarray
+ */
+void fprint_update_options(FILE *outf, enum update_opt update_mode)
+{
+ int counter = UOPT_NAME, breakpoint = UOPT_HELP;
+ mapping_t *map = update_options;
+
+ if (!outf)
+ return;
+ if (update_mode == UOPT_SUBARRAY_ONLY) {
+ breakpoint = UOPT_SUBARRAY_ONLY;
+ fprintf(outf, "Valid --update options for update-subarray are:\n\t");
+ } else
+ fprintf(outf, "Valid --update options are:\n\t");
+ while (map->num) {
+ if (map->num >= breakpoint)
+ break;
+ fprintf(outf, "'%s', ", map->name);
+ if (counter % 5 == 0)
+ fprintf(outf, "\n\t");
+ counter++;
+ map++;
+ }
+ if ((counter - 1) % 5)
+ fprintf(outf, "\n");
+ fprintf(outf, "\r");
+}
diff --git a/maps.c b/maps.c
index 20fcf719..b586679a 100644
--- a/maps.c
+++ b/maps.c
@@ -165,6 +165,37 @@ mapping_t sysfs_array_states[] = {
{ "broken", ARRAY_BROKEN },
{ NULL, ARRAY_UNKNOWN_STATE }
};
+/**
+ * mapping_t update_options - stores supported update options.
+ */
+mapping_t update_options[] = {
+ { "name", UOPT_NAME },
+ { "ppl", UOPT_PPL },
+ { "no-ppl", UOPT_NO_PPL },
+ { "bitmap", UOPT_BITMAP },
+ { "no-bitmap", UOPT_NO_BITMAP },
+ { "sparc2.2", UOPT_SPARC22 },
+ { "super-minor", UOPT_SUPER_MINOR },
+ { "summaries", UOPT_SUMMARIES },
+ { "resync", UOPT_RESYNC },
+ { "uuid", UOPT_UUID },
+ { "homehost", UOPT_HOMEHOST },
+ { "home-cluster", UOPT_HOME_CLUSTER },
+ { "nodes", UOPT_NODES },
+ { "devicesize", UOPT_DEVICESIZE },
+ { "bbl", UOPT_BBL },
+ { "no-bbl", UOPT_NO_BBL },
+ { "force-no-bbl", UOPT_FORCE_NO_BBL },
+ { "metadata", UOPT_METADATA },
+ { "revert-reshape", UOPT_REVERT_RESHAPE },
+ { "layout-original", UOPT_LAYOUT_ORIGINAL },
+ { "layout-alternate", UOPT_LAYOUT_ALTERNATE },
+ { "layout-unspecified", UOPT_LAYOUT_UNSPECIFIED },
+ { "byteorder", UOPT_BYTEORDER },
+ { "help", UOPT_HELP },
+ { "?", UOPT_HELP },
+ { NULL, UOPT_UNDEFINED}
+};
/**
* map_num_s() - Safer alternative of map_num() function.
diff --git a/mdadm.c b/mdadm.c
index 74fdec31..f5f505fe 100644
--- a/mdadm.c
+++ b/mdadm.c
@@ -100,7 +100,7 @@ int main(int argc, char *argv[])
char *dump_directory = NULL;
int print_help = 0;
- FILE *outf;
+ FILE *outf = NULL;
int mdfd = -1;
int locked = 0;
@@ -723,7 +723,11 @@ int main(int argc, char *argv[])
continue;
case O(ASSEMBLE,'U'): /* update the superblock */
- case O(MISC,'U'):
+ case O(MISC,'U'): {
+ enum update_opt updateopt = map_name(update_options, c.update);
+ enum update_opt print_mode = UOPT_HELP;
+ const char *error_addon = "update option";
+
if (c.update) {
pr_err("Can only update one aspect of superblock, both %s and %s given.\n",
c.update, optarg);
@@ -733,83 +737,37 @@ int main(int argc, char *argv[])
pr_err("Only subarrays can be updated in misc mode\n");
exit(2);
}
+
c.update = optarg;
- if (strcmp(c.update, "sparc2.2") == 0)
- continue;
- if (strcmp(c.update, "super-minor") == 0)
- continue;
- if (strcmp(c.update, "summaries") == 0)
- continue;
- if (strcmp(c.update, "resync") == 0)
- continue;
- if (strcmp(c.update, "uuid") == 0)
- continue;
- if (strcmp(c.update, "name") == 0)
- continue;
- if (strcmp(c.update, "homehost") == 0)
- continue;
- if (strcmp(c.update, "home-cluster") == 0)
- continue;
- if (strcmp(c.update, "nodes") == 0)
- continue;
- if (strcmp(c.update, "devicesize") == 0)
- continue;
- if (strcmp(c.update, "bitmap") == 0)
- continue;
- if (strcmp(c.update, "no-bitmap") == 0)
- continue;
- if (strcmp(c.update, "bbl") == 0)
- continue;
- if (strcmp(c.update, "no-bbl") == 0)
- continue;
- if (strcmp(c.update, "force-no-bbl") == 0)
- continue;
- if (strcmp(c.update, "ppl") == 0)
- continue;
- if (strcmp(c.update, "no-ppl") == 0)
- continue;
- if (strcmp(c.update, "metadata") == 0)
- continue;
- if (strcmp(c.update, "revert-reshape") == 0)
- continue;
- if (strcmp(c.update, "layout-original") == 0 ||
- strcmp(c.update, "layout-alternate") == 0 ||
- strcmp(c.update, "layout-unspecified") == 0)
- continue;
- if (strcmp(c.update, "byteorder") == 0) {
+
+ if (devmode == UpdateSubarray) {
+ print_mode = UOPT_SUBARRAY_ONLY;
+ error_addon = "update-subarray option";
+
+ if (updateopt > UOPT_SUBARRAY_ONLY && updateopt < UOPT_HELP)
+ updateopt = UOPT_UNDEFINED;
+ }
+
+ switch (updateopt) {
+ case UOPT_UNDEFINED:
+ pr_err("'--update=%s' is invalid %s. ",
+ c.update, error_addon);
+ outf = stderr;
+ case UOPT_HELP:
+ if (!outf)
+ outf = stdout;
+ fprint_update_options(outf, print_mode);
+ exit(outf == stdout ? 0 : 2);
+ case UOPT_BYTEORDER:
if (ss) {
pr_err("must not set metadata type with --update=byteorder.\n");
exit(2);
}
- for(i = 0; !ss && superlist[i]; i++)
- ss = superlist[i]->match_metadata_desc(
- "0.swap");
- if (!ss) {
- pr_err("INTERNAL ERROR cannot find 0.swap\n");
- exit(2);
- }
-
- continue;
+ default:
+ break;
}
- if (strcmp(c.update,"?") == 0 ||
- strcmp(c.update, "help") == 0) {
- outf = stdout;
- fprintf(outf, "%s: ", Name);
- } else {
- outf = stderr;
- fprintf(outf,
- "%s: '--update=%s' is invalid. ",
- Name, c.update);
- }
- fprintf(outf, "Valid --update options are:\n"
- " 'sparc2.2', 'super-minor', 'uuid', 'name', 'nodes', 'resync',\n"
- " 'summaries', 'homehost', 'home-cluster', 'byteorder', 'devicesize',\n"
- " 'bitmap', 'no-bitmap', 'metadata', 'revert-reshape'\n"
- " 'bbl', 'no-bbl', 'force-no-bbl', 'ppl', 'no-ppl'\n"
- " 'layout-original', 'layout-alternate', 'layout-unspecified'\n"
- );
- exit(outf == stdout ? 0 : 2);
-
+ continue;
+ }
case O(MANAGE,'U'):
/* update=devicesize is allowed with --re-add */
if (devmode != 'A') {
diff --git a/mdadm.h b/mdadm.h
index 23ffe977..51f1db2d 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -497,6 +497,36 @@ enum special_options {
ConsistencyPolicy,
};
+enum update_opt {
+ UOPT_NAME = 1,
+ UOPT_PPL,
+ UOPT_NO_PPL,
+ UOPT_BITMAP,
+ UOPT_NO_BITMAP,
+ UOPT_SUBARRAY_ONLY,
+ UOPT_SPARC22,
+ UOPT_SUPER_MINOR,
+ UOPT_SUMMARIES,
+ UOPT_RESYNC,
+ UOPT_UUID,
+ UOPT_HOMEHOST,
+ UOPT_HOME_CLUSTER,
+ UOPT_NODES,
+ UOPT_DEVICESIZE,
+ UOPT_BBL,
+ UOPT_NO_BBL,
+ UOPT_FORCE_NO_BBL,
+ UOPT_METADATA,
+ UOPT_REVERT_RESHAPE,
+ UOPT_LAYOUT_ORIGINAL,
+ UOPT_LAYOUT_ALTERNATE,
+ UOPT_LAYOUT_UNSPECIFIED,
+ UOPT_BYTEORDER,
+ UOPT_HELP,
+ UOPT_UNDEFINED
+};
+extern void fprint_update_options(FILE *outf, enum update_opt update_mode);
+
enum prefix_standard {
JEDEC,
IEC
@@ -777,7 +807,7 @@ extern char *map_num(mapping_t *map, int num);
extern int map_name(mapping_t *map, char *name);
extern mapping_t r0layout[], r5layout[], r6layout[],
pers[], modes[], faultylayout[];
-extern mapping_t consistency_policies[], sysfs_array_states[];
+extern mapping_t consistency_policies[], sysfs_array_states[], update_options[];
extern char *map_dev_preferred(int major, int minor, int create,
char *prefer);
--
2.38.1

View File

@ -0,0 +1,54 @@
From db10eab68e652f141169b7240e057d110d626c3d Mon Sep 17 00:00:00 2001
From: Mateusz Kusiak <mateusz.kusiak@intel.com>
Date: Mon, 2 Jan 2023 09:35:16 +0100
Subject: [PATCH 68/83] Fix --update-subarray on active volume
Options: bitmap, ppl and name should not be updated when array is active.
Those features are mutually exclusive and share the same data area in IMSM (danger of overwriting by kernel).
Remove check for active subarrays from super-intel.
Since ddf is not supported, apply it globally for all options.
Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
---
Manage.c | 7 +++++++
super-intel.c | 5 -----
2 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/Manage.c b/Manage.c
index b1d0e630..5a9ea316 100644
--- a/Manage.c
+++ b/Manage.c
@@ -1745,6 +1745,13 @@ int Update_subarray(char *dev, char *subarray, char *update, struct mddev_ident
goto free_super;
}
+ if (is_subarray_active(subarray, st->devnm)) {
+ if (verbose >= 0)
+ pr_err("Subarray %s in %s is active, cannot update %s\n",
+ subarray, dev, update);
+ goto free_super;
+ }
+
if (mdmon_running(st->devnm))
st->update_tail = &st->updates;
diff --git a/super-intel.c b/super-intel.c
index b0565610..5f93f3d3 100644
--- a/super-intel.c
+++ b/super-intel.c
@@ -7914,11 +7914,6 @@ static int update_subarray_imsm(struct supertype *st, char *subarray,
char *ep;
int vol;
- if (is_subarray_active(subarray, st->devnm)) {
- pr_err("Unable to update name of active subarray\n");
- return 2;
- }
-
if (!check_name(super, name, 0))
return 2;
--
2.38.1

View File

@ -0,0 +1,77 @@
From 2257de106cbf17a7f1df33a10cfd2be0d5a064cb Mon Sep 17 00:00:00 2001
From: Mateusz Kusiak <mateusz.kusiak@intel.com>
Date: Mon, 2 Jan 2023 09:35:17 +0100
Subject: [PATCH 69/83] Add code specific update options to enum.
Some of update options aren't taken from user input, but are hard-coded
as strings.
Include those options in enum.
Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
---
maps.c | 21 +++++++++++++++++++++
mdadm.h | 15 +++++++++++++++
2 files changed, 36 insertions(+)
diff --git a/maps.c b/maps.c
index b586679a..c59036f1 100644
--- a/maps.c
+++ b/maps.c
@@ -194,6 +194,27 @@ mapping_t update_options[] = {
{ "byteorder", UOPT_BYTEORDER },
{ "help", UOPT_HELP },
{ "?", UOPT_HELP },
+ /*
+ * Those enries are temporary and will be removed in this patchset.
+ *
+ * Before update_super:update can be changed to enum,
+ * all update_super sub-functions must be adapted first.
+ * Update options will be passed as string (as it is for now),
+ * and then mapped, so all options must be handled temporarily.
+ *
+ * Those options code specific and should not be accessible for user.
+ */
+ { "force-one", UOPT_SPEC_FORCE_ONE },
+ { "force-array", UOPT_SPEC_FORCE_ARRAY },
+ { "assemble", UOPT_SPEC_ASSEMBLE },
+ { "linear-grow-new", UOPT_SPEC_LINEAR_GROW_NEW },
+ { "linear-grow-update", UOPT_SPEC_LINEAR_GROW_UPDATE },
+ { "_reshape_progress", UOPT_SPEC__RESHAPE_PROGRESS },
+ { "writemostly", UOPT_SPEC_WRITEMOSTLY },
+ { "readwrite", UOPT_SPEC_READWRITE },
+ { "failfast", UOPT_SPEC_FAILFAST },
+ { "nofailfast", UOPT_SPEC_NOFAILFAST },
+ { "revert-reshape-nobackup", UOPT_SPEC_REVERT_RESHAPE_NOBACKUP },
{ NULL, UOPT_UNDEFINED}
};
diff --git a/mdadm.h b/mdadm.h
index 51f1db2d..31db25f5 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -523,6 +523,21 @@ enum update_opt {
UOPT_LAYOUT_UNSPECIFIED,
UOPT_BYTEORDER,
UOPT_HELP,
+ UOPT_USER_ONLY,
+ /*
+ * Code specific options, cannot be set by the user
+ */
+ UOPT_SPEC_FORCE_ONE,
+ UOPT_SPEC_FORCE_ARRAY,
+ UOPT_SPEC_ASSEMBLE,
+ UOPT_SPEC_LINEAR_GROW_NEW,
+ UOPT_SPEC_LINEAR_GROW_UPDATE,
+ UOPT_SPEC__RESHAPE_PROGRESS,
+ UOPT_SPEC_WRITEMOSTLY,
+ UOPT_SPEC_READWRITE,
+ UOPT_SPEC_FAILFAST,
+ UOPT_SPEC_NOFAILFAST,
+ UOPT_SPEC_REVERT_RESHAPE_NOBACKUP,
UOPT_UNDEFINED
};
extern void fprint_update_options(FILE *outf, enum update_opt update_mode);
--
2.38.1

View File

@ -0,0 +1,106 @@
From 35aa44c549290e22f285896684c704acb53b7717 Mon Sep 17 00:00:00 2001
From: Mateusz Kusiak <mateusz.kusiak@intel.com>
Date: Mon, 2 Jan 2023 09:35:18 +0100
Subject: [PATCH 70/83] super-ddf: Remove update_super_ddf.
This is not supported by ddf.
It hides errors by returning success status for some updates.
Remove update_super_dff().
Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
---
super-ddf.c | 70 -----------------------------------------------------
1 file changed, 70 deletions(-)
diff --git a/super-ddf.c b/super-ddf.c
index 9d1e3b94..309812df 100644
--- a/super-ddf.c
+++ b/super-ddf.c
@@ -2139,75 +2139,6 @@ static void getinfo_super_ddf_bvd(struct supertype *st, struct mdinfo *info, cha
}
}
-static int update_super_ddf(struct supertype *st, struct mdinfo *info,
- char *update,
- char *devname, int verbose,
- int uuid_set, char *homehost)
-{
- /* For 'assemble' and 'force' we need to return non-zero if any
- * change was made. For others, the return value is ignored.
- * Update options are:
- * force-one : This device looks a bit old but needs to be included,
- * update age info appropriately.
- * assemble: clear any 'faulty' flag to allow this device to
- * be assembled.
- * force-array: Array is degraded but being forced, mark it clean
- * if that will be needed to assemble it.
- *
- * newdev: not used ????
- * grow: Array has gained a new device - this is currently for
- * linear only
- * resync: mark as dirty so a resync will happen.
- * uuid: Change the uuid of the array to match what is given
- * homehost: update the recorded homehost
- * name: update the name - preserving the homehost
- * _reshape_progress: record new reshape_progress position.
- *
- * Following are not relevant for this version:
- * sparc2.2 : update from old dodgey metadata
- * super-minor: change the preferred_minor number
- * summaries: update redundant counters.
- */
- int rv = 0;
-// struct ddf_super *ddf = st->sb;
-// struct vd_config *vd = find_vdcr(ddf, info->container_member);
-// struct virtual_entry *ve = find_ve(ddf);
-
- /* we don't need to handle "force-*" or "assemble" as
- * there is no need to 'trick' the kernel. When the metadata is
- * first updated to activate the array, all the implied modifications
- * will just happen.
- */
-
- if (strcmp(update, "grow") == 0) {
- /* FIXME */
- } else if (strcmp(update, "resync") == 0) {
-// info->resync_checkpoint = 0;
- } else if (strcmp(update, "homehost") == 0) {
- /* homehost is stored in controller->vendor_data,
- * or it is when we are the vendor
- */
-// if (info->vendor_is_local)
-// strcpy(ddf->controller.vendor_data, homehost);
- rv = -1;
- } else if (strcmp(update, "name") == 0) {
- /* name is stored in virtual_entry->name */
-// memset(ve->name, ' ', 16);
-// strncpy(ve->name, info->name, 16);
- rv = -1;
- } else if (strcmp(update, "_reshape_progress") == 0) {
- /* We don't support reshape yet */
- } else if (strcmp(update, "assemble") == 0 ) {
- /* Do nothing, just succeed */
- rv = 0;
- } else
- rv = -1;
-
-// update_all_csum(ddf);
-
- return rv;
-}
-
static void make_header_guid(char *guid)
{
be32 stamp;
@@ -5211,7 +5142,6 @@ struct superswitch super_ddf = {
.match_home = match_home_ddf,
.uuid_from_super= uuid_from_super_ddf,
.getinfo_super = getinfo_super_ddf,
- .update_super = update_super_ddf,
.avail_size = avail_size_ddf,
--
2.38.1

View File

@ -0,0 +1,212 @@
From 0a9e39383d3bf63e1f5cf10f64200083a1af8091 Mon Sep 17 00:00:00 2001
From: Mateusz Kusiak <mateusz.kusiak@intel.com>
Date: Mon, 2 Jan 2023 09:35:19 +0100
Subject: [PATCH 71/83] super0: refactor the code for enum
It prepares update_super0 for change context->update to enum.
Change if else statements to switch.
Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
---
super0.c | 102 ++++++++++++++++++++++++++++++++++---------------------
1 file changed, 63 insertions(+), 39 deletions(-)
diff --git a/super0.c b/super0.c
index 93876e2e..d9f5bff4 100644
--- a/super0.c
+++ b/super0.c
@@ -502,19 +502,39 @@ static int update_super0(struct supertype *st, struct mdinfo *info,
int rv = 0;
int uuid[4];
mdp_super_t *sb = st->sb;
+ enum update_opt update_enum = map_name(update_options, update);
- if (strcmp(update, "homehost") == 0 &&
- homehost) {
- /* note that 'homehost' is special as it is really
+ if (update_enum == UOPT_HOMEHOST && homehost) {
+ /*
+ * note that 'homehost' is special as it is really
* a "uuid" update.
*/
uuid_set = 0;
- update = "uuid";
+ update_enum = UOPT_UUID;
info->uuid[0] = sb->set_uuid0;
info->uuid[1] = sb->set_uuid1;
}
- if (strcmp(update, "sparc2.2")==0 ) {
+ switch (update_enum) {
+ case UOPT_UUID:
+ if (!uuid_set && homehost) {
+ char buf[20];
+ memcpy(info->uuid+2,
+ sha1_buffer(homehost, strlen(homehost), buf),
+ 8);
+ }
+ sb->set_uuid0 = info->uuid[0];
+ sb->set_uuid1 = info->uuid[1];
+ sb->set_uuid2 = info->uuid[2];
+ sb->set_uuid3 = info->uuid[3];
+ if (sb->state & (1<<MD_SB_BITMAP_PRESENT)) {
+ struct bitmap_super_s *bm;
+ bm = (struct bitmap_super_s *)(sb+1);
+ uuid_from_super0(st, uuid);
+ memcpy(bm->uuid, uuid, 16);
+ }
+ break;
+ case UOPT_SPARC22: {
/* 2.2 sparc put the events in the wrong place
* So we copy the tail of the superblock
* up 4 bytes before continuing
@@ -527,12 +547,15 @@ static int update_super0(struct supertype *st, struct mdinfo *info,
if (verbose >= 0)
pr_err("adjusting superblock of %s for 2.2/sparc compatibility.\n",
devname);
- } else if (strcmp(update, "super-minor") ==0) {
+ break;
+ }
+ case UOPT_SUPER_MINOR:
sb->md_minor = info->array.md_minor;
if (verbose > 0)
pr_err("updating superblock of %s with minor number %d\n",
devname, info->array.md_minor);
- } else if (strcmp(update, "summaries") == 0) {
+ break;
+ case UOPT_SUMMARIES: {
unsigned int i;
/* set nr_disks, active_disks, working_disks,
* failed_disks, spare_disks based on disks[]
@@ -559,7 +582,9 @@ static int update_super0(struct supertype *st, struct mdinfo *info,
sb->spare_disks++;
} else if (i >= sb->raid_disks && sb->disks[i].number == 0)
sb->disks[i].state = 0;
- } else if (strcmp(update, "force-one")==0) {
+ break;
+ }
+ case UOPT_SPEC_FORCE_ONE: {
/* Not enough devices for a working array, so
* bring this one up-to-date.
*/
@@ -569,7 +594,9 @@ static int update_super0(struct supertype *st, struct mdinfo *info,
if (sb->events_hi != ehi ||
sb->events_lo != elo)
rv = 1;
- } else if (strcmp(update, "force-array")==0) {
+ break;
+ }
+ case UOPT_SPEC_FORCE_ARRAY:
/* degraded array and 'force' requested, so
* maybe need to mark it 'clean'
*/
@@ -579,7 +606,8 @@ static int update_super0(struct supertype *st, struct mdinfo *info,
sb->state |= (1 << MD_SB_CLEAN);
rv = 1;
}
- } else if (strcmp(update, "assemble")==0) {
+ break;
+ case UOPT_SPEC_ASSEMBLE: {
int d = info->disk.number;
int wonly = sb->disks[d].state & (1<<MD_DISK_WRITEMOSTLY);
int failfast = sb->disks[d].state & (1<<MD_DISK_FAILFAST);
@@ -609,7 +637,9 @@ static int update_super0(struct supertype *st, struct mdinfo *info,
sb->reshape_position = info->reshape_progress;
rv = 1;
}
- } else if (strcmp(update, "linear-grow-new") == 0) {
+ break;
+ }
+ case UOPT_SPEC_LINEAR_GROW_NEW:
memset(&sb->disks[info->disk.number], 0, sizeof(sb->disks[0]));
sb->disks[info->disk.number].number = info->disk.number;
sb->disks[info->disk.number].major = info->disk.major;
@@ -617,7 +647,8 @@ static int update_super0(struct supertype *st, struct mdinfo *info,
sb->disks[info->disk.number].raid_disk = info->disk.raid_disk;
sb->disks[info->disk.number].state = info->disk.state;
sb->this_disk = sb->disks[info->disk.number];
- } else if (strcmp(update, "linear-grow-update") == 0) {
+ break;
+ case UOPT_SPEC_LINEAR_GROW_UPDATE:
sb->raid_disks = info->array.raid_disks;
sb->nr_disks = info->array.nr_disks;
sb->active_disks = info->array.active_disks;
@@ -628,29 +659,15 @@ static int update_super0(struct supertype *st, struct mdinfo *info,
sb->disks[info->disk.number].minor = info->disk.minor;
sb->disks[info->disk.number].raid_disk = info->disk.raid_disk;
sb->disks[info->disk.number].state = info->disk.state;
- } else if (strcmp(update, "resync") == 0) {
- /* make sure resync happens */
+ break;
+ case UOPT_RESYNC:
+ /*
+ * make sure resync happens
+ */
sb->state &= ~(1<<MD_SB_CLEAN);
sb->recovery_cp = 0;
- } else if (strcmp(update, "uuid") == 0) {
- if (!uuid_set && homehost) {
- char buf[20];
- char *hash = sha1_buffer(homehost,
- strlen(homehost),
- buf);
- memcpy(info->uuid+2, hash, 8);
- }
- sb->set_uuid0 = info->uuid[0];
- sb->set_uuid1 = info->uuid[1];
- sb->set_uuid2 = info->uuid[2];
- sb->set_uuid3 = info->uuid[3];
- if (sb->state & (1<<MD_SB_BITMAP_PRESENT)) {
- struct bitmap_super_s *bm;
- bm = (struct bitmap_super_s*)(sb+1);
- uuid_from_super0(st, uuid);
- memcpy(bm->uuid, uuid, 16);
- }
- } else if (strcmp(update, "metadata") == 0) {
+ break;
+ case UOPT_METADATA:
/* Create some v1.0 metadata to match ours but make the
* ctime bigger. Also update info->array.*_version.
* We need to arrange that store_super writes out
@@ -670,7 +687,8 @@ static int update_super0(struct supertype *st, struct mdinfo *info,
uuid_from_super0(st, info->uuid);
st->other = super1_make_v0(st, info, st->sb);
}
- } else if (strcmp(update, "revert-reshape") == 0) {
+ break;
+ case UOPT_REVERT_RESHAPE:
rv = -2;
if (sb->minor_version <= 90)
pr_err("No active reshape to revert on %s\n",
@@ -702,16 +720,22 @@ static int update_super0(struct supertype *st, struct mdinfo *info,
sb->new_chunk = sb->chunk_size;
sb->chunk_size = tmp;
}
- } else if (strcmp(update, "no-bitmap") == 0) {
+ break;
+ case UOPT_NO_BITMAP:
sb->state &= ~(1<<MD_SB_BITMAP_PRESENT);
- } else if (strcmp(update, "_reshape_progress")==0)
+ break;
+ case UOPT_SPEC__RESHAPE_PROGRESS:
sb->reshape_position = info->reshape_progress;
- else if (strcmp(update, "writemostly")==0)
+ break;
+ case UOPT_SPEC_WRITEMOSTLY:
sb->state |= (1<<MD_DISK_WRITEMOSTLY);
- else if (strcmp(update, "readwrite")==0)
+ break;
+ case UOPT_SPEC_READWRITE:
sb->state &= ~(1<<MD_DISK_WRITEMOSTLY);
- else
+ break;
+ default:
rv = -1;
+ }
sb->sb_csum = calc_sb0_csum(sb);
return rv;
--
2.38.1

View File

@ -0,0 +1,302 @@
From 7e8daba8b7937716dce8ea28298a4e2e72cb829e Mon Sep 17 00:00:00 2001
From: Mateusz Kusiak <mateusz.kusiak@intel.com>
Date: Mon, 2 Jan 2023 09:35:20 +0100
Subject: [PATCH 72/83] super1: refactor the code for enum
It prepares update_super1 for change context->update to enum.
Change if else statements into switch.
Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
---
super1.c | 152 +++++++++++++++++++++++++++++++++----------------------
1 file changed, 91 insertions(+), 61 deletions(-)
diff --git a/super1.c b/super1.c
index 0b505a7e..b0a97016 100644
--- a/super1.c
+++ b/super1.c
@@ -1218,30 +1218,55 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
int rv = 0;
struct mdp_superblock_1 *sb = st->sb;
bitmap_super_t *bms = (bitmap_super_t*)(((char*)sb) + MAX_SB_SIZE);
+ enum update_opt update_enum = map_name(update_options, update);
- if (strcmp(update, "homehost") == 0 &&
- homehost) {
- /* Note that 'homehost' is special as it is really
+ if (update_enum == UOPT_HOMEHOST && homehost) {
+ /*
+ * Note that 'homehost' is special as it is really
* a "name" update.
*/
char *c;
- update = "name";
+ update_enum = UOPT_NAME;
c = strchr(sb->set_name, ':');
if (c)
- strncpy(info->name, c+1, 31 - (c-sb->set_name));
+ snprintf(info->name, sizeof(info->name), "%s", c+1);
else
- strncpy(info->name, sb->set_name, 32);
- info->name[32] = 0;
+ snprintf(info->name, sizeof(info->name), "%s", sb->set_name);
}
- if (strcmp(update, "force-one")==0) {
+ switch (update_enum) {
+ case UOPT_NAME: {
+ int namelen;
+
+ if (!info->name[0])
+ snprintf(info->name, sizeof(info->name), "%d", info->array.md_minor);
+ memset(sb->set_name, 0, sizeof(sb->set_name));
+
+ namelen = strnlen(homehost, MD_NAME_MAX) + 1 + strnlen(info->name, MD_NAME_MAX);
+ if (homehost &&
+ strchr(info->name, ':') == NULL &&
+ namelen < MD_NAME_MAX) {
+ strcpy(sb->set_name, homehost);
+ strcat(sb->set_name, ":");
+ strcat(sb->set_name, info->name);
+ } else {
+ namelen = min((int)strnlen(info->name, MD_NAME_MAX),
+ (int)sizeof(sb->set_name) - 1);
+ memcpy(sb->set_name, info->name, namelen);
+ memset(&sb->set_name[namelen], '\0',
+ sizeof(sb->set_name) - namelen);
+ }
+ break;
+ }
+ case UOPT_SPEC_FORCE_ONE:
/* Not enough devices for a working array,
* so bring this one up-to-date
*/
if (sb->events != __cpu_to_le64(info->events))
rv = 1;
sb->events = __cpu_to_le64(info->events);
- } else if (strcmp(update, "force-array")==0) {
+ break;
+ case UOPT_SPEC_FORCE_ARRAY:
/* Degraded array and 'force' requests to
* maybe need to mark it 'clean'.
*/
@@ -1254,7 +1279,8 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
rv = 1;
sb->resync_offset = MaxSector;
}
- } else if (strcmp(update, "assemble")==0) {
+ break;
+ case UOPT_SPEC_ASSEMBLE: {
int d = info->disk.number;
int want;
if (info->disk.state & (1<<MD_DISK_ACTIVE))
@@ -1287,7 +1313,9 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
__cpu_to_le64(info->reshape_progress);
rv = 1;
}
- } else if (strcmp(update, "linear-grow-new") == 0) {
+ break;
+ }
+ case UOPT_SPEC_LINEAR_GROW_NEW: {
int i;
int fd;
int max = __le32_to_cpu(sb->max_dev);
@@ -1330,7 +1358,9 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
ds - __le64_to_cpu(sb->data_offset));
}
}
- } else if (strcmp(update, "linear-grow-update") == 0) {
+ break;
+ }
+ case UOPT_SPEC_LINEAR_GROW_UPDATE: {
int max = __le32_to_cpu(sb->max_dev);
int i = info->disk.number;
if (max > MAX_DEVS || i > MAX_DEVS)
@@ -1342,19 +1372,20 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
sb->raid_disks = __cpu_to_le32(info->array.raid_disks);
sb->dev_roles[info->disk.number] =
__cpu_to_le16(info->disk.raid_disk);
- } else if (strcmp(update, "resync") == 0) {
- /* make sure resync happens */
- sb->resync_offset = 0ULL;
- } else if (strcmp(update, "uuid") == 0) {
+ break;
+ }
+ case UOPT_UUID:
copy_uuid(sb->set_uuid, info->uuid, super1.swapuuid);
if (__le32_to_cpu(sb->feature_map) & MD_FEATURE_BITMAP_OFFSET)
memcpy(bms->uuid, sb->set_uuid, 16);
- } else if (strcmp(update, "no-bitmap") == 0) {
+ break;
+ case UOPT_NO_BITMAP:
sb->feature_map &= ~__cpu_to_le32(MD_FEATURE_BITMAP_OFFSET);
if (bms->version == BITMAP_MAJOR_CLUSTERED && !IsBitmapDirty(devname))
sb->resync_offset = MaxSector;
- } else if (strcmp(update, "bbl") == 0) {
+ break;
+ case UOPT_BBL: {
/* only possible if there is room after the bitmap, or if
* there is no bitmap
*/
@@ -1383,14 +1414,12 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
bb_offset = bitmap_offset + bm_sectors;
while (bb_offset < (long)sb_offset + 8 + 32*2 &&
bb_offset + 8+8 <= (long)data_offset)
- /* too close to bitmap, and room to grow */
bb_offset += 8;
if (bb_offset + 8 <= (long)data_offset) {
sb->bblog_size = __cpu_to_le16(8);
sb->bblog_offset = __cpu_to_le32(bb_offset);
}
} else {
- /* 1.0 - Put bbl just before super block */
if (bm_sectors && bitmap_offset < 0)
space = -bitmap_offset - bm_sectors;
else
@@ -1401,7 +1430,9 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
sb->bblog_offset = __cpu_to_le32((unsigned)-8);
}
}
- } else if (strcmp(update, "no-bbl") == 0) {
+ break;
+ }
+ case UOPT_NO_BBL:
if (sb->feature_map & __cpu_to_le32(MD_FEATURE_BAD_BLOCKS))
pr_err("Cannot remove active bbl from %s\n",devname);
else {
@@ -1409,12 +1440,14 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
sb->bblog_shift = 0;
sb->bblog_offset = 0;
}
- } else if (strcmp(update, "force-no-bbl") == 0) {
+ break;
+ case UOPT_FORCE_NO_BBL:
sb->feature_map &= ~ __cpu_to_le32(MD_FEATURE_BAD_BLOCKS);
sb->bblog_size = 0;
sb->bblog_shift = 0;
sb->bblog_offset = 0;
- } else if (strcmp(update, "ppl") == 0) {
+ break;
+ case UOPT_PPL: {
unsigned long long sb_offset = __le64_to_cpu(sb->super_offset);
unsigned long long data_offset = __le64_to_cpu(sb->data_offset);
unsigned long long data_size = __le64_to_cpu(sb->data_size);
@@ -1464,37 +1497,26 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
sb->ppl.offset = __cpu_to_le16(offset);
sb->ppl.size = __cpu_to_le16(space);
sb->feature_map |= __cpu_to_le32(MD_FEATURE_PPL);
- } else if (strcmp(update, "no-ppl") == 0) {
+ break;
+ }
+ case UOPT_NO_PPL:
sb->feature_map &= ~__cpu_to_le32(MD_FEATURE_PPL |
MD_FEATURE_MUTLIPLE_PPLS);
- } else if (strcmp(update, "name") == 0) {
- if (info->name[0] == 0)
- sprintf(info->name, "%d", info->array.md_minor);
- memset(sb->set_name, 0, sizeof(sb->set_name));
- if (homehost &&
- strchr(info->name, ':') == NULL &&
- strlen(homehost)+1+strlen(info->name) < 32) {
- strcpy(sb->set_name, homehost);
- strcat(sb->set_name, ":");
- strcat(sb->set_name, info->name);
- } else {
- int namelen;
-
- namelen = min((int)strlen(info->name),
- (int)sizeof(sb->set_name) - 1);
- memcpy(sb->set_name, info->name, namelen);
- memset(&sb->set_name[namelen], '\0',
- sizeof(sb->set_name) - namelen);
- }
- } else if (strcmp(update, "devicesize") == 0 &&
- __le64_to_cpu(sb->super_offset) <
- __le64_to_cpu(sb->data_offset)) {
- /* set data_size to device size less data_offset */
+ break;
+ case UOPT_DEVICESIZE:
+ if (__le64_to_cpu(sb->super_offset) >=
+ __le64_to_cpu(sb->data_offset))
+ break;
+ /*
+ * set data_size to device size less data_offset
+ */
struct misc_dev_info *misc = (struct misc_dev_info*)
(st->sb + MAX_SB_SIZE + BM_SUPER_SIZE);
sb->data_size = __cpu_to_le64(
misc->device_size - __le64_to_cpu(sb->data_offset));
- } else if (strncmp(update, "revert-reshape", 14) == 0) {
+ break;
+ case UOPT_SPEC_REVERT_RESHAPE_NOBACKUP:
+ case UOPT_REVERT_RESHAPE:
rv = -2;
if (!(sb->feature_map &
__cpu_to_le32(MD_FEATURE_RESHAPE_ACTIVE)))
@@ -1512,7 +1534,7 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
* If that couldn't happen, the "-nobackup" version
* will be used.
*/
- if (strcmp(update, "revert-reshape-nobackup") == 0 &&
+ if (update_enum == UOPT_SPEC_REVERT_RESHAPE_NOBACKUP &&
sb->reshape_position == 0 &&
(__le32_to_cpu(sb->delta_disks) > 0 ||
(__le32_to_cpu(sb->delta_disks) == 0 &&
@@ -1575,32 +1597,40 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
}
done:;
}
- } else if (strcmp(update, "_reshape_progress") == 0)
+ break;
+ case UOPT_SPEC__RESHAPE_PROGRESS:
sb->reshape_position = __cpu_to_le64(info->reshape_progress);
- else if (strcmp(update, "writemostly") == 0)
+ break;
+ case UOPT_SPEC_WRITEMOSTLY:
sb->devflags |= WriteMostly1;
- else if (strcmp(update, "readwrite") == 0)
+ break;
+ case UOPT_SPEC_READWRITE:
sb->devflags &= ~WriteMostly1;
- else if (strcmp(update, "failfast") == 0)
+ break;
+ case UOPT_SPEC_FAILFAST:
sb->devflags |= FailFast1;
- else if (strcmp(update, "nofailfast") == 0)
+ break;
+ case UOPT_SPEC_NOFAILFAST:
sb->devflags &= ~FailFast1;
- else if (strcmp(update, "layout-original") == 0 ||
- strcmp(update, "layout-alternate") == 0 ||
- strcmp(update, "layout-unspecified") == 0) {
+ break;
+ case UOPT_LAYOUT_ORIGINAL:
+ case UOPT_LAYOUT_ALTERNATE:
+ case UOPT_LAYOUT_UNSPECIFIED:
if (__le32_to_cpu(sb->level) != 0) {
pr_err("%s: %s only supported for RAID0\n",
- devname?:"", update);
+ devname ?: "", map_num(update_options, update_enum));
rv = -1;
- } else if (strcmp(update, "layout-unspecified") == 0) {
+ } else if (update_enum == UOPT_LAYOUT_UNSPECIFIED) {
sb->feature_map &= ~__cpu_to_le32(MD_FEATURE_RAID0_LAYOUT);
sb->layout = 0;
} else {
sb->feature_map |= __cpu_to_le32(MD_FEATURE_RAID0_LAYOUT);
- sb->layout = __cpu_to_le32(update[7] == 'o' ? 1 : 2);
+ sb->layout = __cpu_to_le32(update_enum == UOPT_LAYOUT_ORIGINAL ? 1 : 2);
}
- } else
+ break;
+ default:
rv = -1;
+ }
sb->sb_csum = calc_sb_1_csum(sb);
--
2.38.1

View File

@ -0,0 +1,106 @@
From 4345e135c4c7dd04bb15bad140dfc4747f677738 Mon Sep 17 00:00:00 2001
From: Mateusz Kusiak <mateusz.kusiak@intel.com>
Date: Mon, 2 Jan 2023 09:35:21 +0100
Subject: [PATCH 73/83] super-intel: refactor the code for enum
It prepares super-intel for change context->update to enum.
Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
---
super-intel.c | 37 +++++++++++++++++++++++++------------
1 file changed, 25 insertions(+), 12 deletions(-)
diff --git a/super-intel.c b/super-intel.c
index 5f93f3d3..85fb7f17 100644
--- a/super-intel.c
+++ b/super-intel.c
@@ -3930,7 +3930,8 @@ static int update_super_imsm(struct supertype *st, struct mdinfo *info,
mpb = super->anchor;
- if (strcmp(update, "uuid") == 0) {
+ switch (map_name(update_options, update)) {
+ case UOPT_UUID:
/* We take this to mean that the family_num should be updated.
* However that is much smaller than the uuid so we cannot really
* allow an explicit uuid to be given. And it is hard to reliably
@@ -3954,10 +3955,14 @@ static int update_super_imsm(struct supertype *st, struct mdinfo *info,
}
if (rv == 0)
mpb->orig_family_num = info->uuid[0];
- } else if (strcmp(update, "assemble") == 0)
+ break;
+ case UOPT_SPEC_ASSEMBLE:
rv = 0;
- else
+ break;
+ default:
rv = -1;
+ break;
+ }
/* successful update? recompute checksum */
if (rv == 0)
@@ -7889,17 +7894,25 @@ static int kill_subarray_imsm(struct supertype *st, char *subarray_id)
return 0;
}
-static int get_rwh_policy_from_update(char *update)
+/**
+ * get_rwh_policy_from_update() - Get the rwh policy for update option.
+ * @update: Update option.
+ */
+static int get_rwh_policy_from_update(enum update_opt update)
{
- if (strcmp(update, "ppl") == 0)
+ switch (update) {
+ case UOPT_PPL:
return RWH_MULTIPLE_DISTRIBUTED;
- else if (strcmp(update, "no-ppl") == 0)
+ case UOPT_NO_PPL:
return RWH_MULTIPLE_OFF;
- else if (strcmp(update, "bitmap") == 0)
+ case UOPT_BITMAP:
return RWH_BITMAP;
- else if (strcmp(update, "no-bitmap") == 0)
+ case UOPT_NO_BITMAP:
return RWH_OFF;
- return -1;
+ default:
+ break;
+ }
+ return UOPT_UNDEFINED;
}
static int update_subarray_imsm(struct supertype *st, char *subarray,
@@ -7909,7 +7922,7 @@ static int update_subarray_imsm(struct supertype *st, char *subarray,
struct intel_super *super = st->sb;
struct imsm_super *mpb = super->anchor;
- if (strcmp(update, "name") == 0) {
+ if (map_name(update_options, update) == UOPT_NAME) {
char *name = ident->name;
char *ep;
int vol;
@@ -7943,7 +7956,7 @@ static int update_subarray_imsm(struct supertype *st, char *subarray,
}
super->updates_pending++;
}
- } else if (get_rwh_policy_from_update(update) != -1) {
+ } else if (get_rwh_policy_from_update(map_name(update_options, update)) != UOPT_UNDEFINED) {
int new_policy;
char *ep;
int vol = strtoul(subarray, &ep, 10);
@@ -7951,7 +7964,7 @@ static int update_subarray_imsm(struct supertype *st, char *subarray,
if (*ep != '\0' || vol >= super->anchor->num_raid_devs)
return 2;
- new_policy = get_rwh_policy_from_update(update);
+ new_policy = get_rwh_policy_from_update(map_name(update_options, update));
if (st->update_tail) {
struct imsm_update_rwh_policy *u = xmalloc(sizeof(*u));
--
2.38.1

View File

@ -0,0 +1,424 @@
From 03312b5240438ffc3b63114bdc87e911222f01e5 Mon Sep 17 00:00:00 2001
From: Mateusz Kusiak <mateusz.kusiak@intel.com>
Date: Mon, 2 Jan 2023 09:35:22 +0100
Subject: [PATCH 74/83] Change update to enum in update_super and
update_subarray
Use already existing enum, change update_super and update_subarray
update to enum globally.
Refactor function references also.
Remove code specific options from update_options.
Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
---
Assemble.c | 14 +++++++++-----
Examine.c | 2 +-
Grow.c | 9 +++++----
Manage.c | 14 ++++++++------
maps.c | 21 ---------------------
mdadm.h | 12 +++++++++---
super-intel.c | 16 ++++++++--------
super0.c | 9 ++++-----
super1.c | 17 ++++++++---------
9 files changed, 52 insertions(+), 62 deletions(-)
diff --git a/Assemble.c b/Assemble.c
index 8b0af0c9..dba910cd 100644
--- a/Assemble.c
+++ b/Assemble.c
@@ -695,12 +695,16 @@ static int load_devices(struct devs *devices, char *devmap,
} else if (strcmp(c->update, "revert-reshape") == 0 &&
c->invalid_backup)
err = tst->ss->update_super(tst, content,
- "revert-reshape-nobackup",
+ UOPT_SPEC_REVERT_RESHAPE_NOBACKUP,
devname, c->verbose,
ident->uuid_set,
c->homehost);
else
- err = tst->ss->update_super(tst, content, c->update,
+ /*
+ * Mapping is temporary, will be removed in this patchset
+ */
+ err = tst->ss->update_super(tst, content,
+ map_name(update_options, c->update),
devname, c->verbose,
ident->uuid_set,
c->homehost);
@@ -960,7 +964,7 @@ static int force_array(struct mdinfo *content,
continue;
}
content->events = devices[most_recent].i.events;
- tst->ss->update_super(tst, content, "force-one",
+ tst->ss->update_super(tst, content, UOPT_SPEC_FORCE_ONE,
devices[chosen_drive].devname, c->verbose,
0, NULL);
@@ -1788,7 +1792,7 @@ try_again:
if (!(devices[j].i.array.state & 1))
clean = 0;
- if (st->ss->update_super(st, &devices[j].i, "assemble", NULL,
+ if (st->ss->update_super(st, &devices[j].i, UOPT_SPEC_ASSEMBLE, NULL,
c->verbose, 0, NULL)) {
if (c->force) {
if (c->verbose >= 0)
@@ -1811,7 +1815,7 @@ try_again:
if (c->force && !clean && !is_container(content->array.level) &&
!enough(content->array.level, content->array.raid_disks,
content->array.layout, clean, avail)) {
- change += st->ss->update_super(st, content, "force-array",
+ change += st->ss->update_super(st, content, UOPT_SPEC_FORCE_ARRAY,
devices[chosen_drive].devname, c->verbose,
0, NULL);
was_forced = 1;
diff --git a/Examine.c b/Examine.c
index 9574a3cc..c9605a60 100644
--- a/Examine.c
+++ b/Examine.c
@@ -117,7 +117,7 @@ int Examine(struct mddev_dev *devlist,
}
if (c->SparcAdjust)
- st->ss->update_super(st, NULL, "sparc2.2",
+ st->ss->update_super(st, NULL, UOPT_SPARC22,
devlist->devname, 0, 0, NULL);
/* Ok, its good enough to try, though the checksum could be wrong */
diff --git a/Grow.c b/Grow.c
index b73ec2ae..82d5d2ea 100644
--- a/Grow.c
+++ b/Grow.c
@@ -196,7 +196,7 @@ int Grow_Add_device(char *devname, int fd, char *newdev)
info.disk.minor = minor(rdev);
info.disk.raid_disk = d;
info.disk.state = (1 << MD_DISK_SYNC) | (1 << MD_DISK_ACTIVE);
- if (st->ss->update_super(st, &info, "linear-grow-new", newdev,
+ if (st->ss->update_super(st, &info, UOPT_SPEC_LINEAR_GROW_NEW, newdev,
0, 0, NULL) != 0) {
pr_err("Preparing new metadata failed on %s\n", newdev);
close(nfd);
@@ -254,7 +254,7 @@ int Grow_Add_device(char *devname, int fd, char *newdev)
info.array.active_disks = nd+1;
info.array.working_disks = nd+1;
- if (st->ss->update_super(st, &info, "linear-grow-update", dv,
+ if (st->ss->update_super(st, &info, UOPT_SPEC_LINEAR_GROW_UPDATE, dv,
0, 0, NULL) != 0) {
pr_err("Updating metadata failed on %s\n", dv);
close(fd2);
@@ -668,7 +668,7 @@ int Grow_consistency_policy(char *devname, int fd, struct context *c, struct sha
goto free_info;
}
- ret = st->ss->update_super(st, sra, "ppl",
+ ret = st->ss->update_super(st, sra, UOPT_PPL,
devname,
c->verbose, 0, NULL);
if (ret) {
@@ -4950,7 +4950,8 @@ int Grow_restart(struct supertype *st, struct mdinfo *info, int *fdlist,
continue;
st->ss->getinfo_super(st, &dinfo, NULL);
dinfo.reshape_progress = info->reshape_progress;
- st->ss->update_super(st, &dinfo, "_reshape_progress",
+ st->ss->update_super(st, &dinfo,
+ UOPT_SPEC__RESHAPE_PROGRESS,
NULL,0, 0, NULL);
st->ss->store_super(st, fdlist[j]);
st->ss->free_super(st);
diff --git a/Manage.c b/Manage.c
index 5a9ea316..87b8aa0c 100644
--- a/Manage.c
+++ b/Manage.c
@@ -605,6 +605,7 @@ int attempt_re_add(int fd, int tfd, struct mddev_dev *dv,
struct mdinfo mdi;
int duuid[4];
int ouuid[4];
+ enum update_opt update_enum = map_name(update_options, update);
dev_st->ss->getinfo_super(dev_st, &mdi, NULL);
dev_st->ss->uuid_from_super(dev_st, ouuid);
@@ -666,23 +667,23 @@ int attempt_re_add(int fd, int tfd, struct mddev_dev *dv,
if (dv->writemostly == FlagSet)
rv = dev_st->ss->update_super(
- dev_st, NULL, "writemostly",
+ dev_st, NULL, UOPT_SPEC_WRITEMOSTLY,
devname, verbose, 0, NULL);
if (dv->writemostly == FlagClear)
rv = dev_st->ss->update_super(
- dev_st, NULL, "readwrite",
+ dev_st, NULL, UOPT_SPEC_READWRITE,
devname, verbose, 0, NULL);
if (dv->failfast == FlagSet)
rv = dev_st->ss->update_super(
- dev_st, NULL, "failfast",
+ dev_st, NULL, UOPT_SPEC_FAILFAST,
devname, verbose, 0, NULL);
if (dv->failfast == FlagClear)
rv = dev_st->ss->update_super(
- dev_st, NULL, "nofailfast",
+ dev_st, NULL, UOPT_SPEC_NOFAILFAST,
devname, verbose, 0, NULL);
if (update)
rv = dev_st->ss->update_super(
- dev_st, NULL, update,
+ dev_st, NULL, update_enum,
devname, verbose, 0, NULL);
if (rv == 0)
rv = dev_st->ss->store_super(dev_st, tfd);
@@ -1731,6 +1732,7 @@ int Update_subarray(char *dev, char *subarray, char *update, struct mddev_ident
struct supertype supertype, *st = &supertype;
int fd, rv = 2;
struct mdinfo *info = NULL;
+ enum update_opt update_enum = map_name(update_options, update);
memset(st, 0, sizeof(*st));
@@ -1762,7 +1764,7 @@ int Update_subarray(char *dev, char *subarray, char *update, struct mddev_ident
goto free_super;
}
- rv = st->ss->update_subarray(st, subarray, update, ident);
+ rv = st->ss->update_subarray(st, subarray, update_enum, ident);
if (rv) {
if (verbose >= 0)
diff --git a/maps.c b/maps.c
index c59036f1..b586679a 100644
--- a/maps.c
+++ b/maps.c
@@ -194,27 +194,6 @@ mapping_t update_options[] = {
{ "byteorder", UOPT_BYTEORDER },
{ "help", UOPT_HELP },
{ "?", UOPT_HELP },
- /*
- * Those enries are temporary and will be removed in this patchset.
- *
- * Before update_super:update can be changed to enum,
- * all update_super sub-functions must be adapted first.
- * Update options will be passed as string (as it is for now),
- * and then mapped, so all options must be handled temporarily.
- *
- * Those options code specific and should not be accessible for user.
- */
- { "force-one", UOPT_SPEC_FORCE_ONE },
- { "force-array", UOPT_SPEC_FORCE_ARRAY },
- { "assemble", UOPT_SPEC_ASSEMBLE },
- { "linear-grow-new", UOPT_SPEC_LINEAR_GROW_NEW },
- { "linear-grow-update", UOPT_SPEC_LINEAR_GROW_UPDATE },
- { "_reshape_progress", UOPT_SPEC__RESHAPE_PROGRESS },
- { "writemostly", UOPT_SPEC_WRITEMOSTLY },
- { "readwrite", UOPT_SPEC_READWRITE },
- { "failfast", UOPT_SPEC_FAILFAST },
- { "nofailfast", UOPT_SPEC_NOFAILFAST },
- { "revert-reshape-nobackup", UOPT_SPEC_REVERT_RESHAPE_NOBACKUP },
{ NULL, UOPT_UNDEFINED}
};
diff --git a/mdadm.h b/mdadm.h
index 31db25f5..5dc94390 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -1011,7 +1011,7 @@ extern struct superswitch {
* it will resume going in the opposite direction.
*/
int (*update_super)(struct supertype *st, struct mdinfo *info,
- char *update,
+ enum update_opt update,
char *devname, int verbose,
int uuid_set, char *homehost);
@@ -1137,9 +1137,15 @@ extern struct superswitch {
/* Permit subarray's to be deleted from inactive containers */
int (*kill_subarray)(struct supertype *st,
char *subarray_id); /* optional */
- /* Permit subarray's to be modified */
+ /**
+ * update_subarray() - Permit subarray to be modified.
+ * @st: Supertype.
+ * @subarray: Subarray name.
+ * @update: Update option.
+ * @ident: Optional identifiers.
+ */
int (*update_subarray)(struct supertype *st, char *subarray,
- char *update, struct mddev_ident *ident); /* optional */
+ enum update_opt update, struct mddev_ident *ident);
/* Check if reshape is supported for this external format.
* st is obtained from super_by_fd() where st->subarray[0] is
* initialized to indicate if reshape is being performed at the
diff --git a/super-intel.c b/super-intel.c
index 85fb7f17..1f5f6eda 100644
--- a/super-intel.c
+++ b/super-intel.c
@@ -3893,8 +3893,8 @@ struct mdinfo *getinfo_super_disks_imsm(struct supertype *st)
}
static int update_super_imsm(struct supertype *st, struct mdinfo *info,
- char *update, char *devname, int verbose,
- int uuid_set, char *homehost)
+ enum update_opt update, char *devname,
+ int verbose, int uuid_set, char *homehost)
{
/* For 'assemble' and 'force' we need to return non-zero if any
* change was made. For others, the return value is ignored.
@@ -3930,7 +3930,7 @@ static int update_super_imsm(struct supertype *st, struct mdinfo *info,
mpb = super->anchor;
- switch (map_name(update_options, update)) {
+ switch (update) {
case UOPT_UUID:
/* We take this to mean that the family_num should be updated.
* However that is much smaller than the uuid so we cannot really
@@ -6538,7 +6538,7 @@ static int validate_ppl_imsm(struct supertype *st, struct mdinfo *info,
if (mdmon_running(st->container_devnm))
st->update_tail = &st->updates;
- if (st->ss->update_subarray(st, subarray, "ppl", NULL)) {
+ if (st->ss->update_subarray(st, subarray, UOPT_PPL, NULL)) {
pr_err("Failed to update subarray %s\n",
subarray);
} else {
@@ -7916,13 +7916,13 @@ static int get_rwh_policy_from_update(enum update_opt update)
}
static int update_subarray_imsm(struct supertype *st, char *subarray,
- char *update, struct mddev_ident *ident)
+ enum update_opt update, struct mddev_ident *ident)
{
/* update the subarray currently referenced by ->current_vol */
struct intel_super *super = st->sb;
struct imsm_super *mpb = super->anchor;
- if (map_name(update_options, update) == UOPT_NAME) {
+ if (update == UOPT_NAME) {
char *name = ident->name;
char *ep;
int vol;
@@ -7956,7 +7956,7 @@ static int update_subarray_imsm(struct supertype *st, char *subarray,
}
super->updates_pending++;
}
- } else if (get_rwh_policy_from_update(map_name(update_options, update)) != UOPT_UNDEFINED) {
+ } else if (get_rwh_policy_from_update(update) != UOPT_UNDEFINED) {
int new_policy;
char *ep;
int vol = strtoul(subarray, &ep, 10);
@@ -7964,7 +7964,7 @@ static int update_subarray_imsm(struct supertype *st, char *subarray,
if (*ep != '\0' || vol >= super->anchor->num_raid_devs)
return 2;
- new_policy = get_rwh_policy_from_update(map_name(update_options, update));
+ new_policy = get_rwh_policy_from_update(update);
if (st->update_tail) {
struct imsm_update_rwh_policy *u = xmalloc(sizeof(*u));
diff --git a/super0.c b/super0.c
index d9f5bff4..a7c5f813 100644
--- a/super0.c
+++ b/super0.c
@@ -491,7 +491,7 @@ static struct mdinfo *container_content0(struct supertype *st, char *subarray)
}
static int update_super0(struct supertype *st, struct mdinfo *info,
- char *update,
+ enum update_opt update,
char *devname, int verbose,
int uuid_set, char *homehost)
{
@@ -502,20 +502,19 @@ static int update_super0(struct supertype *st, struct mdinfo *info,
int rv = 0;
int uuid[4];
mdp_super_t *sb = st->sb;
- enum update_opt update_enum = map_name(update_options, update);
- if (update_enum == UOPT_HOMEHOST && homehost) {
+ if (update == UOPT_HOMEHOST && homehost) {
/*
* note that 'homehost' is special as it is really
* a "uuid" update.
*/
uuid_set = 0;
- update_enum = UOPT_UUID;
+ update = UOPT_UUID;
info->uuid[0] = sb->set_uuid0;
info->uuid[1] = sb->set_uuid1;
}
- switch (update_enum) {
+ switch (update) {
case UOPT_UUID:
if (!uuid_set && homehost) {
char buf[20];
diff --git a/super1.c b/super1.c
index b0a97016..f7020320 100644
--- a/super1.c
+++ b/super1.c
@@ -1208,7 +1208,7 @@ static struct mdinfo *container_content1(struct supertype *st, char *subarray)
}
static int update_super1(struct supertype *st, struct mdinfo *info,
- char *update, char *devname, int verbose,
+ enum update_opt update, char *devname, int verbose,
int uuid_set, char *homehost)
{
/* NOTE: for 'assemble' and 'force' we need to return non-zero
@@ -1218,15 +1218,14 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
int rv = 0;
struct mdp_superblock_1 *sb = st->sb;
bitmap_super_t *bms = (bitmap_super_t*)(((char*)sb) + MAX_SB_SIZE);
- enum update_opt update_enum = map_name(update_options, update);
- if (update_enum == UOPT_HOMEHOST && homehost) {
+ if (update == UOPT_HOMEHOST && homehost) {
/*
* Note that 'homehost' is special as it is really
* a "name" update.
*/
char *c;
- update_enum = UOPT_NAME;
+ update = UOPT_NAME;
c = strchr(sb->set_name, ':');
if (c)
snprintf(info->name, sizeof(info->name), "%s", c+1);
@@ -1234,7 +1233,7 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
snprintf(info->name, sizeof(info->name), "%s", sb->set_name);
}
- switch (update_enum) {
+ switch (update) {
case UOPT_NAME: {
int namelen;
@@ -1534,7 +1533,7 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
* If that couldn't happen, the "-nobackup" version
* will be used.
*/
- if (update_enum == UOPT_SPEC_REVERT_RESHAPE_NOBACKUP &&
+ if (update == UOPT_SPEC_REVERT_RESHAPE_NOBACKUP &&
sb->reshape_position == 0 &&
(__le32_to_cpu(sb->delta_disks) > 0 ||
(__le32_to_cpu(sb->delta_disks) == 0 &&
@@ -1618,14 +1617,14 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
case UOPT_LAYOUT_UNSPECIFIED:
if (__le32_to_cpu(sb->level) != 0) {
pr_err("%s: %s only supported for RAID0\n",
- devname ?: "", map_num(update_options, update_enum));
+ devname ?: "", map_num(update_options, update));
rv = -1;
- } else if (update_enum == UOPT_LAYOUT_UNSPECIFIED) {
+ } else if (update == UOPT_LAYOUT_UNSPECIFIED) {
sb->feature_map &= ~__cpu_to_le32(MD_FEATURE_RAID0_LAYOUT);
sb->layout = 0;
} else {
sb->feature_map |= __cpu_to_le32(MD_FEATURE_RAID0_LAYOUT);
- sb->layout = __cpu_to_le32(update_enum == UOPT_LAYOUT_ORIGINAL ? 1 : 2);
+ sb->layout = __cpu_to_le32(update == UOPT_LAYOUT_ORIGINAL ? 1 : 2);
}
break;
default:
--
2.38.1

View File

@ -0,0 +1,279 @@
From f2e8393bd7223c419aaa33c45feeb5c75440b986 Mon Sep 17 00:00:00 2001
From: Mateusz Kusiak <mateusz.kusiak@intel.com>
Date: Mon, 2 Jan 2023 09:35:23 +0100
Subject: [PATCH 75/83] Manage&Incremental: code refactor, string to enum
Prepare Manage and Incremental for later changing context->update to enum.
Change update from string to enum in multiple functions and pass enum
where already possible.
Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
---
Grow.c | 8 ++++----
Incremental.c | 8 ++++----
Manage.c | 35 +++++++++++++++++------------------
mdadm.c | 23 ++++++++++++++++++-----
mdadm.h | 4 ++--
5 files changed, 45 insertions(+), 33 deletions(-)
diff --git a/Grow.c b/Grow.c
index 82d5d2ea..8f5cf07d 100644
--- a/Grow.c
+++ b/Grow.c
@@ -605,12 +605,12 @@ int Grow_consistency_policy(char *devname, int fd, struct context *c, struct sha
}
if (subarray) {
- char *update;
+ enum update_opt update;
if (s->consistency_policy == CONSISTENCY_POLICY_PPL)
- update = "ppl";
+ update = UOPT_PPL;
else
- update = "no-ppl";
+ update = UOPT_NO_PPL;
sprintf(container_dev, "/dev/%s", st->container_devnm);
@@ -3243,7 +3243,7 @@ static int reshape_array(char *container, int fd, char *devname,
* level and frozen, we can safely add them.
*/
if (devlist) {
- if (Manage_subdevs(devname, fd, devlist, verbose, 0, NULL, 0))
+ if (Manage_subdevs(devname, fd, devlist, verbose, 0, UOPT_UNDEFINED, 0))
goto release;
}
diff --git a/Incremental.c b/Incremental.c
index 5a5f4c4c..ff3548c0 100644
--- a/Incremental.c
+++ b/Incremental.c
@@ -1025,7 +1025,7 @@ static int array_try_spare(char *devname, int *dfdp, struct dev_policy *pol,
close(dfd);
*dfdp = -1;
rv = Manage_subdevs(chosen->sys_name, mdfd, &devlist,
- -1, 0, NULL, 0);
+ -1, 0, UOPT_UNDEFINED, 0);
close(mdfd);
}
if (verbose > 0) {
@@ -1666,7 +1666,7 @@ static void remove_from_member_array(struct mdstat_ent *memb,
if (subfd >= 0) {
rv = Manage_subdevs(memb->devnm, subfd, devlist, verbose,
- 0, NULL, 0);
+ 0, UOPT_UNDEFINED, 0);
if (rv & 2) {
if (sysfs_init(&mmdi, -1, memb->devnm))
pr_err("unable to initialize sysfs for: %s\n",
@@ -1758,7 +1758,7 @@ int IncrementalRemove(char *devname, char *id_path, int verbose)
free_mdstat(mdstat);
} else {
rv |= Manage_subdevs(ent->devnm, mdfd, &devlist,
- verbose, 0, NULL, 0);
+ verbose, 0, UOPT_UNDEFINED, 0);
if (rv & 2) {
/* Failed due to EBUSY, try to stop the array.
* Give udisks a chance to unmount it first.
@@ -1770,7 +1770,7 @@ int IncrementalRemove(char *devname, char *id_path, int verbose)
devlist.disposition = 'r';
rv = Manage_subdevs(ent->devnm, mdfd, &devlist,
- verbose, 0, NULL, 0);
+ verbose, 0, UOPT_UNDEFINED, 0);
end:
close(mdfd);
free_mdstat(ent);
diff --git a/Manage.c b/Manage.c
index 87b8aa0c..594e3d2c 100644
--- a/Manage.c
+++ b/Manage.c
@@ -598,14 +598,12 @@ static void add_set(struct mddev_dev *dv, int fd, char set_char)
int attempt_re_add(int fd, int tfd, struct mddev_dev *dv,
struct supertype *dev_st, struct supertype *tst,
- unsigned long rdev,
- char *update, char *devname, int verbose,
- mdu_array_info_t *array)
+ unsigned long rdev, enum update_opt update,
+ char *devname, int verbose, mdu_array_info_t *array)
{
struct mdinfo mdi;
int duuid[4];
int ouuid[4];
- enum update_opt update_enum = map_name(update_options, update);
dev_st->ss->getinfo_super(dev_st, &mdi, NULL);
dev_st->ss->uuid_from_super(dev_st, ouuid);
@@ -683,7 +681,7 @@ int attempt_re_add(int fd, int tfd, struct mddev_dev *dv,
devname, verbose, 0, NULL);
if (update)
rv = dev_st->ss->update_super(
- dev_st, NULL, update_enum,
+ dev_st, NULL, update,
devname, verbose, 0, NULL);
if (rv == 0)
rv = dev_st->ss->store_super(dev_st, tfd);
@@ -715,8 +713,8 @@ skip_re_add:
int Manage_add(int fd, int tfd, struct mddev_dev *dv,
struct supertype *tst, mdu_array_info_t *array,
int force, int verbose, char *devname,
- char *update, unsigned long rdev, unsigned long long array_size,
- int raid_slot)
+ enum update_opt update, unsigned long rdev,
+ unsigned long long array_size, int raid_slot)
{
unsigned long long ldsize;
struct supertype *dev_st;
@@ -1332,7 +1330,7 @@ bool is_remove_safe(mdu_array_info_t *array, const int fd, char *devname, const
int Manage_subdevs(char *devname, int fd,
struct mddev_dev *devlist, int verbose, int test,
- char *update, int force)
+ enum update_opt update, int force)
{
/* Do something to each dev.
* devmode can be
@@ -1727,12 +1725,13 @@ int autodetect(void)
return rv;
}
-int Update_subarray(char *dev, char *subarray, char *update, struct mddev_ident *ident, int verbose)
+int Update_subarray(char *dev, char *subarray, enum update_opt update,
+ struct mddev_ident *ident, int verbose)
{
struct supertype supertype, *st = &supertype;
int fd, rv = 2;
struct mdinfo *info = NULL;
- enum update_opt update_enum = map_name(update_options, update);
+ char *update_verb = map_num(update_options, update);
memset(st, 0, sizeof(*st));
@@ -1750,7 +1749,7 @@ int Update_subarray(char *dev, char *subarray, char *update, struct mddev_ident
if (is_subarray_active(subarray, st->devnm)) {
if (verbose >= 0)
pr_err("Subarray %s in %s is active, cannot update %s\n",
- subarray, dev, update);
+ subarray, dev, update_verb);
goto free_super;
}
@@ -1759,23 +1758,23 @@ int Update_subarray(char *dev, char *subarray, char *update, struct mddev_ident
info = st->ss->container_content(st, subarray);
- if (strncmp(update, "ppl", 3) == 0 && !is_level456(info->array.level)) {
+ if (update == UOPT_PPL && !is_level456(info->array.level)) {
pr_err("RWH policy ppl is supported only for raid4, raid5 and raid6.\n");
goto free_super;
}
- rv = st->ss->update_subarray(st, subarray, update_enum, ident);
+ rv = st->ss->update_subarray(st, subarray, update, ident);
if (rv) {
if (verbose >= 0)
pr_err("Failed to update %s of subarray-%s in %s\n",
- update, subarray, dev);
+ update_verb, subarray, dev);
} else if (st->update_tail)
flush_metadata_updates(st);
else
st->ss->sync_metadata(st);
- if (rv == 0 && strcmp(update, "name") == 0 && verbose >= 0)
+ if (rv == 0 && update == UOPT_NAME && verbose >= 0)
pr_err("Updated subarray-%s name from %s, UUIDs may have changed\n",
subarray, dev);
@@ -1816,10 +1815,10 @@ int move_spare(char *from_devname, char *to_devname, dev_t devid)
sprintf(devname, "%d:%d", major(devid), minor(devid));
devlist.disposition = 'r';
- if (Manage_subdevs(from_devname, fd2, &devlist, -1, 0, NULL, 0) == 0) {
+ if (Manage_subdevs(from_devname, fd2, &devlist, -1, 0, UOPT_UNDEFINED, 0) == 0) {
devlist.disposition = 'a';
if (Manage_subdevs(to_devname, fd1, &devlist, -1, 0,
- NULL, 0) == 0) {
+ UOPT_UNDEFINED, 0) == 0) {
/* make sure manager is aware of changes */
ping_manager(to_devname);
ping_manager(from_devname);
@@ -1829,7 +1828,7 @@ int move_spare(char *from_devname, char *to_devname, dev_t devid)
}
else
Manage_subdevs(from_devname, fd2, &devlist,
- -1, 0, NULL, 0);
+ -1, 0, UOPT_UNDEFINED, 0);
}
close(fd1);
close(fd2);
diff --git a/mdadm.c b/mdadm.c
index f5f505fe..d06e2820 100644
--- a/mdadm.c
+++ b/mdadm.c
@@ -1402,10 +1402,22 @@ int main(int argc, char *argv[])
/* readonly, add/remove, readwrite, runstop */
if (c.readonly > 0)
rv = Manage_ro(devlist->devname, mdfd, c.readonly);
- if (!rv && devs_found>1)
- rv = Manage_subdevs(devlist->devname, mdfd,
- devlist->next, c.verbose, c.test,
- c.update, c.force);
+ if (!rv && devs_found > 1) {
+ /*
+ * This is temporary and will be removed in next patches
+ * Null c.update will cause segfault
+ */
+ if (c.update)
+ rv = Manage_subdevs(devlist->devname, mdfd,
+ devlist->next, c.verbose, c.test,
+ map_name(update_options, c.update),
+ c.force);
+ else
+ rv = Manage_subdevs(devlist->devname, mdfd,
+ devlist->next, c.verbose, c.test,
+ UOPT_UNDEFINED,
+ c.force);
+ }
if (!rv && c.readonly < 0)
rv = Manage_ro(devlist->devname, mdfd, c.readonly);
if (!rv && c.runstop > 0)
@@ -1931,7 +1943,8 @@ static int misc_list(struct mddev_dev *devlist,
continue;
}
rv |= Update_subarray(dv->devname, c->subarray,
- c->update, ident, c->verbose);
+ map_name(update_options, c->update),
+ ident, c->verbose);
continue;
case Dump:
rv |= Dump_metadata(dv->devname, dump_directory, c, ss);
diff --git a/mdadm.h b/mdadm.h
index 5dc94390..924f4b63 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -1478,7 +1478,7 @@ extern int Manage_stop(char *devname, int fd, int quiet,
int will_retry);
extern int Manage_subdevs(char *devname, int fd,
struct mddev_dev *devlist, int verbose, int test,
- char *update, int force);
+ enum update_opt update, int force);
extern int autodetect(void);
extern int Grow_Add_device(char *devname, int fd, char *newdev);
extern int Grow_addbitmap(char *devname, int fd,
@@ -1532,7 +1532,7 @@ extern int Monitor(struct mddev_dev *devlist,
extern int Kill(char *dev, struct supertype *st, int force, int verbose, int noexcl);
extern int Kill_subarray(char *dev, char *subarray, int verbose);
-extern int Update_subarray(char *dev, char *subarray, char *update, struct mddev_ident *ident, int quiet);
+extern int Update_subarray(char *dev, char *subarray, enum update_opt update, struct mddev_ident *ident, int quiet);
extern int Wait(char *dev);
extern int WaitClean(char *dev, int verbose);
extern int SetAction(char *dev, char *action);
--
2.38.1

View File

@ -0,0 +1,289 @@
From 3a87fa67112dc2c2c3664aeecd0b49cb4b6ceaa9 Mon Sep 17 00:00:00 2001
From: Mateusz Kusiak <mateusz.kusiak@intel.com>
Date: Mon, 2 Jan 2023 09:35:24 +0100
Subject: [PATCH 76/83] Change char* to enum in context->update & refactor code
Storing update option in string is bad for frequent comparisons and
error prone.
Replace char array with enum so already existing enum is passed around
instead of string.
Adapt code to changes.
Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
---
Assemble.c | 40 +++++++++++++++++-----------------------
mdadm.c | 52 +++++++++++++++++++---------------------------------
mdadm.h | 2 +-
3 files changed, 37 insertions(+), 57 deletions(-)
diff --git a/Assemble.c b/Assemble.c
index dba910cd..49804941 100644
--- a/Assemble.c
+++ b/Assemble.c
@@ -135,17 +135,17 @@ static int ident_matches(struct mddev_ident *ident,
struct mdinfo *content,
struct supertype *tst,
char *homehost, int require_homehost,
- char *update, char *devname)
+ enum update_opt update, char *devname)
{
- if (ident->uuid_set && (!update || strcmp(update, "uuid")!= 0) &&
+ if (ident->uuid_set && update != UOPT_UUID &&
same_uuid(content->uuid, ident->uuid, tst->ss->swapuuid)==0 &&
memcmp(content->uuid, uuid_zero, sizeof(int[4])) != 0) {
if (devname)
pr_err("%s has wrong uuid.\n", devname);
return 0;
}
- if (ident->name[0] && (!update || strcmp(update, "name")!= 0) &&
+ if (ident->name[0] && update != UOPT_NAME &&
name_matches(content->name, ident->name, homehost, require_homehost)==0) {
if (devname)
pr_err("%s has wrong name.\n", devname);
@@ -648,11 +648,10 @@ static int load_devices(struct devs *devices, char *devmap,
int err;
fstat(mdfd, &stb2);
- if (strcmp(c->update, "uuid") == 0 && !ident->uuid_set)
+ if (c->update == UOPT_UUID && !ident->uuid_set)
random_uuid((__u8 *)ident->uuid);
- if (strcmp(c->update, "ppl") == 0 &&
- ident->bitmap_fd >= 0) {
+ if (c->update == UOPT_PPL && ident->bitmap_fd >= 0) {
pr_err("PPL is not compatible with bitmap\n");
close(mdfd);
free(devices);
@@ -684,34 +683,30 @@ static int load_devices(struct devs *devices, char *devmap,
strcpy(content->name, ident->name);
content->array.md_minor = minor(stb2.st_rdev);
- if (strcmp(c->update, "byteorder") == 0)
+ if (c->update == UOPT_BYTEORDER)
err = 0;
- else if (strcmp(c->update, "home-cluster") == 0) {
+ else if (c->update == UOPT_HOME_CLUSTER) {
tst->cluster_name = c->homecluster;
err = tst->ss->write_bitmap(tst, dfd, NameUpdate);
- } else if (strcmp(c->update, "nodes") == 0) {
+ } else if (c->update == UOPT_NODES) {
tst->nodes = c->nodes;
err = tst->ss->write_bitmap(tst, dfd, NodeNumUpdate);
- } else if (strcmp(c->update, "revert-reshape") == 0 &&
- c->invalid_backup)
+ } else if (c->update == UOPT_REVERT_RESHAPE && c->invalid_backup)
err = tst->ss->update_super(tst, content,
UOPT_SPEC_REVERT_RESHAPE_NOBACKUP,
devname, c->verbose,
ident->uuid_set,
c->homehost);
else
- /*
- * Mapping is temporary, will be removed in this patchset
- */
err = tst->ss->update_super(tst, content,
- map_name(update_options, c->update),
+ c->update,
devname, c->verbose,
ident->uuid_set,
c->homehost);
if (err < 0) {
if (err == -1)
pr_err("--update=%s not understood for %s metadata\n",
- c->update, tst->ss->name);
+ map_num(update_options, c->update), tst->ss->name);
tst->ss->free_super(tst);
free(tst);
close(mdfd);
@@ -721,7 +716,7 @@ static int load_devices(struct devs *devices, char *devmap,
*stp = st;
return -1;
}
- if (strcmp(c->update, "uuid")==0 &&
+ if (c->update == UOPT_UUID &&
!ident->uuid_set) {
ident->uuid_set = 1;
memcpy(ident->uuid, content->uuid, 16);
@@ -730,7 +725,7 @@ static int load_devices(struct devs *devices, char *devmap,
pr_err("Could not re-write superblock on %s.\n",
devname);
- if (strcmp(c->update, "uuid")==0 &&
+ if (c->update == UOPT_UUID &&
ident->bitmap_fd >= 0 && !bitmap_done) {
if (bitmap_update_uuid(ident->bitmap_fd,
content->uuid,
@@ -1188,8 +1183,7 @@ static int start_array(int mdfd,
pr_err("%s: Need a backup file to complete reshape of this array.\n",
mddev);
pr_err("Please provided one with \"--backup-file=...\"\n");
- if (c->update &&
- strcmp(c->update, "revert-reshape") == 0)
+ if (c->update == UOPT_REVERT_RESHAPE)
pr_err("(Don't specify --update=revert-reshape again, that part succeeded.)\n");
return 1;
}
@@ -1487,7 +1481,7 @@ try_again:
*/
if (map_lock(&map))
pr_err("failed to get exclusive lock on mapfile - continue anyway...\n");
- if (c->update && strcmp(c->update,"uuid") == 0)
+ if (c->update == UOPT_UUID)
mp = NULL;
else
mp = map_by_uuid(&map, content->uuid);
@@ -1634,7 +1628,7 @@ try_again:
goto out;
}
- if (c->update && strcmp(c->update, "byteorder")==0)
+ if (c->update == UOPT_BYTEORDER)
st->minor_version = 90;
st->ss->getinfo_super(st, content, NULL);
@@ -1902,7 +1896,7 @@ try_again:
/* First, fill in the map, so that udev can find our name
* as soon as we become active.
*/
- if (c->update && strcmp(c->update, "metadata")==0) {
+ if (c->update == UOPT_METADATA) {
content->array.major_version = 1;
content->array.minor_version = 0;
strcpy(content->text_version, "1.0");
diff --git a/mdadm.c b/mdadm.c
index d06e2820..57e8e6fa 100644
--- a/mdadm.c
+++ b/mdadm.c
@@ -724,13 +724,12 @@ int main(int argc, char *argv[])
case O(ASSEMBLE,'U'): /* update the superblock */
case O(MISC,'U'): {
- enum update_opt updateopt = map_name(update_options, c.update);
enum update_opt print_mode = UOPT_HELP;
const char *error_addon = "update option";
if (c.update) {
pr_err("Can only update one aspect of superblock, both %s and %s given.\n",
- c.update, optarg);
+ map_num(update_options, c.update), optarg);
exit(2);
}
if (mode == MISC && !c.subarray) {
@@ -738,20 +737,20 @@ int main(int argc, char *argv[])
exit(2);
}
- c.update = optarg;
+ c.update = map_name(update_options, optarg);
if (devmode == UpdateSubarray) {
print_mode = UOPT_SUBARRAY_ONLY;
error_addon = "update-subarray option";
- if (updateopt > UOPT_SUBARRAY_ONLY && updateopt < UOPT_HELP)
- updateopt = UOPT_UNDEFINED;
+ if (c.update > UOPT_SUBARRAY_ONLY && c.update < UOPT_HELP)
+ c.update = UOPT_UNDEFINED;
}
- switch (updateopt) {
+ switch (c.update) {
case UOPT_UNDEFINED:
pr_err("'--update=%s' is invalid %s. ",
- c.update, error_addon);
+ optarg, error_addon);
outf = stderr;
case UOPT_HELP:
if (!outf)
@@ -776,14 +775,14 @@ int main(int argc, char *argv[])
}
if (c.update) {
pr_err("Can only update one aspect of superblock, both %s and %s given.\n",
- c.update, optarg);
+ map_num(update_options, c.update), optarg);
exit(2);
}
- c.update = optarg;
- if (strcmp(c.update, "devicesize") != 0 &&
- strcmp(c.update, "bbl") != 0 &&
- strcmp(c.update, "force-no-bbl") != 0 &&
- strcmp(c.update, "no-bbl") != 0) {
+ c.update = map_name(update_options, optarg);
+ if (c.update != UOPT_DEVICESIZE &&
+ c.update != UOPT_BBL &&
+ c.update != UOPT_NO_BBL &&
+ c.update != UOPT_FORCE_NO_BBL) {
pr_err("only 'devicesize', 'bbl', 'no-bbl', and 'force-no-bbl' can be updated with --re-add\n");
exit(2);
}
@@ -1357,7 +1356,7 @@ int main(int argc, char *argv[])
}
}
- if (c.update && strcmp(c.update, "nodes") == 0 && c.nodes == 0) {
+ if (c.update && c.update == UOPT_NODES && c.nodes == 0) {
pr_err("Please specify nodes number with --nodes\n");
exit(1);
}
@@ -1402,22 +1401,10 @@ int main(int argc, char *argv[])
/* readonly, add/remove, readwrite, runstop */
if (c.readonly > 0)
rv = Manage_ro(devlist->devname, mdfd, c.readonly);
- if (!rv && devs_found > 1) {
- /*
- * This is temporary and will be removed in next patches
- * Null c.update will cause segfault
- */
- if (c.update)
- rv = Manage_subdevs(devlist->devname, mdfd,
- devlist->next, c.verbose, c.test,
- map_name(update_options, c.update),
- c.force);
- else
- rv = Manage_subdevs(devlist->devname, mdfd,
- devlist->next, c.verbose, c.test,
- UOPT_UNDEFINED,
- c.force);
- }
+ if (!rv && devs_found > 1)
+ rv = Manage_subdevs(devlist->devname, mdfd,
+ devlist->next, c.verbose,
+ c.test, c.update, c.force);
if (!rv && c.readonly < 0)
rv = Manage_ro(devlist->devname, mdfd, c.readonly);
if (!rv && c.runstop > 0)
@@ -1937,14 +1924,13 @@ static int misc_list(struct mddev_dev *devlist,
rv |= Kill_subarray(dv->devname, c->subarray, c->verbose);
continue;
case UpdateSubarray:
- if (c->update == NULL) {
+ if (!c->update) {
pr_err("-U/--update must be specified with --update-subarray\n");
rv |= 1;
continue;
}
rv |= Update_subarray(dv->devname, c->subarray,
- map_name(update_options, c->update),
- ident, c->verbose);
+ c->update, ident, c->verbose);
continue;
case Dump:
rv |= Dump_metadata(dv->devname, dump_directory, c, ss);
diff --git a/mdadm.h b/mdadm.h
index 924f4b63..13f8b4cb 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -616,7 +616,7 @@ struct context {
int export;
int test;
char *subarray;
- char *update;
+ enum update_opt update;
int scan;
int SparcAdjust;
int autof;
--
2.38.1

View File

@ -0,0 +1,86 @@
From 9b429fc0a4ffd7028b3b336589d38e32fb9045dc Mon Sep 17 00:00:00 2001
From: Mateusz Kusiak <mateusz.kusiak@intel.com>
Date: Mon, 2 Jan 2023 09:46:21 +0100
Subject: [PATCH 77/83] mdmon: fix segfault
Mdmon crashes if stat2devnm returns null.
Use open_mddev to check if device is mddevice and get name using
fd2devnm.
Refactor container name handling.
Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
---
Makefile | 2 +-
mdmon.c | 26 ++++++++++++--------------
2 files changed, 13 insertions(+), 15 deletions(-)
diff --git a/Makefile b/Makefile
index ec1f99ed..5eac1a4e 100644
--- a/Makefile
+++ b/Makefile
@@ -160,7 +160,7 @@ SRCS = $(patsubst %.o,%.c,$(OBJS))
INCL = mdadm.h part.h bitmap.h
-MON_OBJS = mdmon.o monitor.o managemon.o uuid.o util.o maps.o mdstat.o sysfs.o \
+MON_OBJS = mdmon.o monitor.o managemon.o uuid.o util.o maps.o mdstat.o sysfs.o config.o mapfile.o mdopen.o\
policy.o lib.o \
Kill.o sg_io.o dlink.o ReadMe.o super-intel.o \
super-mbr.o super-gpt.o \
diff --git a/mdmon.c b/mdmon.c
index e9d035eb..ecf52dc8 100644
--- a/mdmon.c
+++ b/mdmon.c
@@ -363,14 +363,14 @@ int main(int argc, char *argv[])
}
if (all == 0 && container_name == NULL) {
- if (argv[optind])
- container_name = argv[optind];
+ if (argv[optind]) {
+ container_name = get_md_name(argv[optind]);
+ if (!container_name)
+ container_name = argv[optind];
+ }
}
- if (container_name == NULL)
- usage();
-
- if (argc - optind > 1)
+ if (container_name == NULL || argc - optind > 1)
usage();
if (strcmp(container_name, "/proc/mdstat") == 0)
@@ -402,21 +402,19 @@ int main(int argc, char *argv[])
free_mdstat(mdstat);
return status;
- } else if (strncmp(container_name, "md", 2) == 0) {
- int id = devnm2devid(container_name);
- if (id)
- devnm = container_name;
} else {
- struct stat st;
+ int mdfd = open_mddev(container_name, 1);
- if (stat(container_name, &st) == 0)
- devnm = xstrdup(stat2devnm(&st));
+ if (mdfd < 0)
+ return 1;
+ devnm = fd2devnm(mdfd);
+ close(mdfd);
}
if (!devnm) {
pr_err("%s is not a valid md device name\n",
container_name);
- exit(1);
+ return 1;
}
return mdmon(devnm, dofork && do_fork(), takeover);
}
--
2.38.1

View File

@ -0,0 +1,116 @@
From b938519e7719c992dae2d61c796c45fe49e6b71b Mon Sep 17 00:00:00 2001
From: Mateusz Kusiak <mateusz.kusiak@intel.com>
Date: Mon, 2 Jan 2023 09:46:22 +0100
Subject: [PATCH 78/83] util: remove obsolete code from get_md_name
get_md_name() is used only with mdstat entries.
Remove dead code and simplyfy function.
Remove redundadnt checks from mdmon.c
Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
---
mdmon.c | 8 +++-----
util.c | 51 +++++++++++++++++----------------------------------
2 files changed, 20 insertions(+), 39 deletions(-)
diff --git a/mdmon.c b/mdmon.c
index ecf52dc8..60ba3182 100644
--- a/mdmon.c
+++ b/mdmon.c
@@ -366,7 +366,7 @@ int main(int argc, char *argv[])
if (argv[optind]) {
container_name = get_md_name(argv[optind]);
if (!container_name)
- container_name = argv[optind];
+ return 1;
}
}
@@ -403,11 +403,9 @@ int main(int argc, char *argv[])
return status;
} else {
- int mdfd = open_mddev(container_name, 1);
-
- if (mdfd < 0)
- return 1;
+ int mdfd = open_mddev(container_name, 0);
devnm = fd2devnm(mdfd);
+
close(mdfd);
}
diff --git a/util.c b/util.c
index 26ffdcea..9cd89fa4 100644
--- a/util.c
+++ b/util.c
@@ -968,47 +968,30 @@ dev_t devnm2devid(char *devnm)
return 0;
}
+/**
+ * get_md_name() - Get main dev node of the md device.
+ * @devnm: Md device name or path.
+ *
+ * Function checks if the full name was passed and returns md name
+ * if it is the MD device.
+ *
+ * Return: Main dev node of the md device or NULL if not found.
+ */
char *get_md_name(char *devnm)
{
- /* find /dev/md%d or /dev/md/%d or make a device /dev/.tmp.md%d */
- /* if dev < 0, want /dev/md/d%d or find mdp in /proc/devices ... */
-
- static char devname[50];
+ static char devname[NAME_MAX];
struct stat stb;
- dev_t rdev = devnm2devid(devnm);
- char *dn;
- if (rdev == 0)
- return 0;
- if (strncmp(devnm, "md_", 3) == 0) {
- snprintf(devname, sizeof(devname), "/dev/md/%s",
- devnm + 3);
- if (stat(devname, &stb) == 0 &&
- (S_IFMT&stb.st_mode) == S_IFBLK && (stb.st_rdev == rdev))
- return devname;
- }
- snprintf(devname, sizeof(devname), "/dev/%s", devnm);
- if (stat(devname, &stb) == 0 && (S_IFMT&stb.st_mode) == S_IFBLK &&
- (stb.st_rdev == rdev))
- return devname;
+ if (strncmp(devnm, "/dev/", 5) == 0)
+ snprintf(devname, sizeof(devname), "%s", devnm);
+ else
+ snprintf(devname, sizeof(devname), "/dev/%s", devnm);
- snprintf(devname, sizeof(devname), "/dev/md/%s", devnm+2);
- if (stat(devname, &stb) == 0 && (S_IFMT&stb.st_mode) == S_IFBLK &&
- (stb.st_rdev == rdev))
+ if (!is_mddev(devname))
+ return NULL;
+ if (stat(devname, &stb) == 0 && (S_IFMT&stb.st_mode) == S_IFBLK)
return devname;
- dn = map_dev(major(rdev), minor(rdev), 0);
- if (dn)
- return dn;
- snprintf(devname, sizeof(devname), "/dev/.tmp.%s", devnm);
- if (mknod(devname, S_IFBLK | 0600, rdev) == -1)
- if (errno != EEXIST)
- return NULL;
-
- if (stat(devname, &stb) == 0 && (S_IFMT&stb.st_mode) == S_IFBLK &&
- (stb.st_rdev == rdev))
- return devname;
- unlink(devname);
return NULL;
}
--
2.38.1

View File

@ -0,0 +1,54 @@
From 24d329fc97a64ec185ef27e59730f3f058c09029 Mon Sep 17 00:00:00 2001
From: Xiao Ni <xni@redhat.com>
Date: Thu, 5 Jan 2023 00:29:20 +0800
Subject: [PATCH 79/83] mdadm/udev: Don't handle change event on raw devices
The raw devices are ready when add event happpens and the raid
can be assembled. So there is no need to handle change events.
And it can cause some inconvenient problems.
For example, the OS is installed on md0(/root) and md1(/home).
md0 and md1 are created on partitions. When it wants to re-install
OS, anaconda can't clear the storage configure. It deletes one
partition and does some jobs. The change event happens. Now
the raid device is assembled again. It can't delete the other
partitions.
So in this patch, we don't handle change event on raw devices
anymore.
Signed-off-by: Xiao Ni <xni@redhat.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
---
udev-md-raid-assembly.rules | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/udev-md-raid-assembly.rules b/udev-md-raid-assembly.rules
index 39b4344b..d4a7f0a5 100644
--- a/udev-md-raid-assembly.rules
+++ b/udev-md-raid-assembly.rules
@@ -11,6 +11,11 @@ SUBSYSTEM!="block", GOTO="md_inc_end"
ENV{SYSTEMD_READY}=="0", GOTO="md_inc_end"
# handle potential components of arrays (the ones supported by md)
+# For member devices which are md/dm devices, we don't need to
+# handle add event. Because md/dm devices need to do some init jobs.
+# Then the change event happens.
+# When adding md/dm devices, ID_FS_TYPE can only be linux_raid_member
+# after change event happens.
ENV{ID_FS_TYPE}=="linux_raid_member", GOTO="md_inc"
# "noiswmd" on kernel command line stops mdadm from handling
@@ -28,6 +33,9 @@ GOTO="md_inc_end"
LABEL="md_inc"
+# Bare disks are ready when add event happens, the raid can be assembled.
+ACTION=="change", KERNEL!="dm-*|md*", GOTO="md_inc_end"
+
# remember you can limit what gets auto/incrementally assembled by
# mdadm.conf(5)'s 'AUTO' and selectively whitelist using 'ARRAY'
ACTION!="remove", IMPORT{program}="BINDIR/mdadm --incremental --export $devnode --offroot $env{DEVLINKS}"
--
2.38.1

View File

@ -0,0 +1,33 @@
From b3e7b7eb1dfedd7cbd9a3800e884941f67d94c96 Mon Sep 17 00:00:00 2001
From: Kinga Tanska <kinga.tanska@intel.com>
Date: Tue, 27 Dec 2022 06:50:42 +0100
Subject: [PATCH 80/83] Manage: do not check array state when drive is removed
Array state doesn't need to be checked when drive is
removed, but until now clean state was required. Result
of the is_remove_safe() function will be independent
from array state.
Signed-off-by: Kinga Tanska <kinga.tanska@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
---
Manage.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/Manage.c b/Manage.c
index 594e3d2c..4d6e54b1 100644
--- a/Manage.c
+++ b/Manage.c
@@ -1321,8 +1321,7 @@ bool is_remove_safe(mdu_array_info_t *array, const int fd, char *devname, const
sysfs_free(mdi);
bool is_enough = enough(array->level, array->raid_disks,
- array->layout, (array->state & 1),
- avail);
+ array->layout, 1, avail);
free(avail);
return is_enough;
--
2.38.1

View File

@ -0,0 +1,59 @@
From 461fae7e7809670d286cc19aac5bfa861c29f93a Mon Sep 17 00:00:00 2001
From: Kinga Tanska <kinga.tanska@intel.com>
Date: Tue, 27 Dec 2022 06:50:43 +0100
Subject: [PATCH 81/83] incremental, manage: do not verify if remove is safe
Function is_remove_safe() was introduced to verify if removing
member device won't cause failed state of the array. This
verification should be used only with set-faulty command. Add
special mode indicating that Incremental removal was executed.
If this mode is used do not execute is_remove_safe() routine.
Signed-off-by: Kinga Tanska <kinga.tanska@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
---
Incremental.c | 2 +-
Manage.c | 7 ++++---
2 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/Incremental.c b/Incremental.c
index ff3548c0..09b94b9f 100644
--- a/Incremental.c
+++ b/Incremental.c
@@ -1744,7 +1744,7 @@ int IncrementalRemove(char *devname, char *id_path, int verbose)
memset(&devlist, 0, sizeof(devlist));
devlist.devname = devname;
- devlist.disposition = 'f';
+ devlist.disposition = 'I';
/* for a container, we must fail each member array */
if (ent->metadata_version &&
strncmp(ent->metadata_version, "external:", 9) == 0) {
diff --git a/Manage.c b/Manage.c
index 4d6e54b1..6184d3f7 100644
--- a/Manage.c
+++ b/Manage.c
@@ -1494,8 +1494,9 @@ int Manage_subdevs(char *devname, int fd,
/* Assume this is a kernel-internal name like 'sda1' */
int found = 0;
char dname[55];
- if (dv->disposition != 'r' && dv->disposition != 'f') {
- pr_err("%s only meaningful with -r or -f, not -%c\n",
+ if (dv->disposition != 'r' && dv->disposition != 'f' &&
+ dv->disposition != 'I') {
+ pr_err("%s only meaningful with -r, -f or -I, not -%c\n",
dv->devname, dv->disposition);
goto abort;
}
@@ -1647,7 +1648,7 @@ int Manage_subdevs(char *devname, int fd,
close(sysfd);
goto abort;
}
-
+ case 'I': /* incremental fail */
if ((sysfd >= 0 && write(sysfd, "faulty", 6) != 6) ||
(sysfd < 0 && ioctl(fd, SET_DISK_FAULTY,
rdev))) {
--
2.38.1

View File

@ -0,0 +1,52 @@
From 071f839ea549e2a384cd13bba445245cd87e48b1 Mon Sep 17 00:00:00 2001
From: Kinga Tanska <kinga.tanska@intel.com>
Date: Fri, 28 Oct 2022 04:51:17 +0200
Subject: [PATCH 82/83] super-intel: make freesize not required for chunk size
migration
Freesize is needed to be set for migrations where size of RAID could
be changed - expand. It tells how many free space is determined for
members. In chunk size migartion freesize is not needed to be set,
pointer shouldn't be checked if exists. This commit moves check to
condition which contains size calculations, instead of checking it
always at the first step.
Fix return value when superblock is not set.
Signed-off-by: Kinga Tanska <kinga.tanska@intel.com>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
---
super-intel.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/super-intel.c b/super-intel.c
index 1f5f6eda..89fac626 100644
--- a/super-intel.c
+++ b/super-intel.c
@@ -7719,11 +7719,11 @@ static int validate_geometry_imsm(struct supertype *st, int level, int layout,
struct intel_super *super = st->sb;
/*
- * Autolayout mode, st->sb and freesize must be set.
+ * Autolayout mode, st->sb must be set.
*/
- if (!super || !freesize) {
- pr_vrb("freesize and superblock must be set for autolayout, aborting\n");
- return 1;
+ if (!super) {
+ pr_vrb("superblock must be set for autolayout, aborting\n");
+ return 0;
}
if (!validate_geometry_imsm_orom(st->sb, level, layout,
@@ -7731,7 +7731,7 @@ static int validate_geometry_imsm(struct supertype *st, int level, int layout,
verbose))
return 0;
- if (super->orom) {
+ if (super->orom && freesize) {
imsm_status_t rv;
int count = count_volumes(super->hba, super->orom->dpa,
verbose);
--
2.38.1

View File

@ -0,0 +1,105 @@
From 36a707824eb1dafbb990f5daf1cbbe0e37dbbefb Mon Sep 17 00:00:00 2001
From: Kinga Tanska <kinga.tanska@intel.com>
Date: Thu, 5 Jan 2023 06:31:25 +0100
Subject: [PATCH 83/83] manage: move comment with function description
Move the function description from the function body to outside
to obey kernel coding style.
Signed-off-by: Kinga Tanska <kinga.tanska@intel.com>
Acked-by: Coly Li <colyli@suse.de>
Signed-off-by: Jes Sorensen <jes@trained-monkey.org>
---
Manage.c | 72 ++++++++++++++++++++++++++++++++++----------------------
1 file changed, 44 insertions(+), 28 deletions(-)
diff --git a/Manage.c b/Manage.c
index 6184d3f7..fde6aba3 100644
--- a/Manage.c
+++ b/Manage.c
@@ -1327,38 +1327,54 @@ bool is_remove_safe(mdu_array_info_t *array, const int fd, char *devname, const
return is_enough;
}
+/**
+ * Manage_subdevs() - Execute operation depending on devmode.
+ *
+ * @devname: name of the device.
+ * @fd: file descriptor.
+ * @devlist: list of sub-devices to manage.
+ * @verbose: verbose level.
+ * @test: test flag.
+ * @update: type of update.
+ * @force: force flag.
+ *
+ * This function executes operation defined by devmode
+ * for each dev from devlist.
+ * Devmode can be:
+ * 'a' - add the device
+ * 'S' - add the device as a spare - don't try re-add
+ * 'j' - add the device as a journal device
+ * 'A' - re-add the device
+ * 'r' - remove the device: HOT_REMOVE_DISK
+ * device can be 'faulty' or 'detached' in which case all
+ * matching devices are removed.
+ * 'f' - set the device faulty SET_DISK_FAULTY
+ * device can be 'detached' in which case any device that
+ * is inaccessible will be marked faulty.
+ * 'I' - remove device by using incremental fail
+ * which is executed when device is removed surprisingly.
+ * 'R' - mark this device as wanting replacement.
+ * 'W' - this device is added if necessary and activated as
+ * a replacement for a previous 'R' device.
+ * -----
+ * 'w' - 'W' will be changed to 'w' when it is paired with
+ * a 'R' device. If a 'W' is found while walking the list
+ * it must be unpaired, and is an error.
+ * 'M' - this is created by a 'missing' target. It is a slight
+ * variant on 'A'
+ * 'F' - Another variant of 'A', where the device was faulty
+ * so must be removed from the array first.
+ * 'c' - confirm the device as found (for clustered environments)
+ *
+ * For 'f' and 'r', the device can also be a kernel-internal
+ * name such as 'sdb'.
+ *
+ * Return: 0 on success, otherwise 1 or 2.
+ */
int Manage_subdevs(char *devname, int fd,
struct mddev_dev *devlist, int verbose, int test,
enum update_opt update, int force)
{
- /* Do something to each dev.
- * devmode can be
- * 'a' - add the device
- * 'S' - add the device as a spare - don't try re-add
- * 'j' - add the device as a journal device
- * 'A' - re-add the device
- * 'r' - remove the device: HOT_REMOVE_DISK
- * device can be 'faulty' or 'detached' in which case all
- * matching devices are removed.
- * 'f' - set the device faulty SET_DISK_FAULTY
- * device can be 'detached' in which case any device that
- * is inaccessible will be marked faulty.
- * 'R' - mark this device as wanting replacement.
- * 'W' - this device is added if necessary and activated as
- * a replacement for a previous 'R' device.
- * -----
- * 'w' - 'W' will be changed to 'w' when it is paired with
- * a 'R' device. If a 'W' is found while walking the list
- * it must be unpaired, and is an error.
- * 'M' - this is created by a 'missing' target. It is a slight
- * variant on 'A'
- * 'F' - Another variant of 'A', where the device was faulty
- * so must be removed from the array first.
- * 'c' - confirm the device as found (for clustered environments)
- *
- * For 'f' and 'r', the device can also be a kernel-internal
- * name such as 'sdb'.
- */
mdu_array_info_t array;
unsigned long long array_size;
struct mddev_dev *dv;
--
2.38.1

View File

@ -1,5 +1,5 @@
--- mdadm/udev-md-raid-assembly.rules.orig 2022-10-25 08:34:58.137936285 +0800
+++ mdadm/udev-md-raid-assembly.rules 2022-10-25 09:28:23.453154190 +0800
--- mdadm/udev-md-raid-assembly.rules.orig 2023-01-06 16:37:03.780756100 +0800
+++ mdadm/udev-md-raid-assembly.rules 2023-01-06 17:04:09.536159980 +0800
@@ -5,6 +5,9 @@
ENV{ANACONDA}=="?*", GOTO="md_inc_end"
# assemble md arrays
@ -10,17 +10,17 @@
SUBSYSTEM!="block", GOTO="md_inc_end"
# skip non-initialized devices
@@ -28,6 +31,13 @@
@@ -33,6 +36,13 @@
LABEL="md_inc"
+# Make sure we don't handle dm devices when some limits are set.
+# And linux_raid_member only be set when change/remove event happen.
+# So we don't need to consider add event here
+# So we don't need to consider add event here.
+KERNEL=="dm-*", ENV{DM_UDEV_RULES_VSN}!="?*", GOTO="md_inc_end"
+KERNEL=="dm-*", ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}=="1", GOTO="md_inc_end"
+KERNEL=="dm-*", ENV{DM_SUSPENDED}=="1", GOTO="md_inc_end"
+
# remember you can limit what gets auto/incrementally assembled by
# mdadm.conf(5)'s 'AUTO' and selectively whitelist using 'ARRAY'
ACTION!="remove", IMPORT{program}="BINDIR/mdadm --incremental --export $devnode --offroot $env{DEVLINKS}"
# Bare disks are ready when add event happens, the raid can be assembled.
ACTION=="change", KERNEL!="dm-*|md*", GOTO="md_inc_end"

View File

@ -1,7 +1,7 @@
Name: mdadm
Version: 4.2
# extraversion is used to define rhel internal version
%define extraversion 7
%define extraversion 8
Release: %{extraversion}%{?dist}
Summary: The mdadm program controls Linux md devices (software RAID arrays)
URL: http://www.kernel.org/pub/linux/utils/raid/mdadm/
@ -77,8 +77,28 @@ Patch056: 0058-mdadm-Add-Documentation-entries-to-systemd-services.patch
Patch057: 0059-ReadMe-fix-command-line-help.patch
Patch058: 0060-mdadm-replace-container-level-checking-with-inline.patch
Patch059: 0061-Mdmonitor-Omit-non-md-devices.patch
Patch060: 0062-Create-goto-abort_locked-instead-of-return-1-in-erro.patch
Patch061: 0063-Create-remove-safe_mode_delay-local-variable.patch
Patch060: 0062-Mdmonitor-Split-alert-into-separate-functions.patch
Patch061: 0063-Monitor-block-if-monitor-modes-are-combined.patch
Patch062: 0064-Update-mdadm-Monitor-manual.patch
Patch063: 0065-Grow-fix-possible-memory-leak.patch
Patch064: 0066-mdadm-create-ident_init.patch
Patch065: 0067-mdadm-Add-option-validation-for-update-subarray.patch
Patch066: 0068-Fix-update-subarray-on-active-volume.patch
Patch067: 0069-Add-code-specific-update-options-to-enum.patch
Patch068: 0070-super-ddf-Remove-update_super_ddf.patch
Patch069: 0071-super0-refactor-the-code-for-enum.patch
Patch070: 0072-super1-refactor-the-code-for-enum.patch
Patch071: 0073-super-intel-refactor-the-code-for-enum.patch
Patch072: 0074-Change-update-to-enum-in-update_super-and-update_sub.patch
Patch073: 0075-Manage-Incremental-code-refactor-string-to-enum.patch
Patch074: 0076-Change-char-to-enum-in-context-update-refactor-code.patch
Patch075: 0077-mdmon-fix-segfault.patch
Patch076: 0078-util-remove-obsolete-code-from-get_md_name.patch
Patch077: 0079-mdadm-udev-Don-t-handle-change-event-on-raw-devices.patch
Patch078: 0080-Manage-do-not-check-array-state-when-drive-is-remove.patch
Patch079: 0081-incremental-manage-do-not-verify-if-remove-is-safe.patch
Patch080: 0082-super-intel-make-freesize-not-required-for-chunk-siz.patch
Patch081: 0083-manage-move-comment-with-function-description.patch
# Fedora customization patches
@ -154,6 +174,10 @@ install -m644 %{SOURCE5} %{buildroot}/etc/libreport/events.d
/etc/libreport/events.d/*
%changelog
* Fri Jan 6 2023 Xiao Ni <xni@redhat.com> - 4.2-8
- Update to latest upstream
- Resolves rhbz#2127101, rhbz#2139789, rhbz#2149292, rhbz#2151209, rhbz#2148945
* Tue Nov 15 2022 Xiao Ni <xni@redhat.com> - 4.2-7
- Update to latest upstream and keep udev rule close to upstream
- Resolves rhbz#2107147, rhbz#2129087, rhbz#2126428