Update to latest upstream
Fix coverity issue 34533 and /dev/md symlink not created for second RAID container issue 50776 Resolves: RHEL-34533, RHEL50776 Signed-off-by: Xiao Ni <xni@redhat.com>
This commit is contained in:
parent
1d7bf968d3
commit
aba27b5983
267
0070-add-checking-of-return-status-on-fstat-calls.patch
Normal file
267
0070-add-checking-of-return-status-on-fstat-calls.patch
Normal file
@ -0,0 +1,267 @@
|
|||||||
|
From 95673c7d83c8ac7f2aeb91a34ead2971ba30e96e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Nigel Croxon <ncroxon@redhat.com>
|
||||||
|
Date: Mon, 20 May 2024 09:36:50 -0400
|
||||||
|
Subject: [PATCH 070/157] add checking of return status on fstat calls
|
||||||
|
|
||||||
|
There are a few places we don't check the return status when
|
||||||
|
calling fstat for success. Clean up the calls by adding a
|
||||||
|
check before continuing.
|
||||||
|
|
||||||
|
Signed-off-by: Nigel Croxon <ncroxon@redhat.com>
|
||||||
|
---
|
||||||
|
Assemble.c | 41 +++++++++++++++++++++++------------------
|
||||||
|
Dump.c | 11 +++++++++--
|
||||||
|
Grow.c | 12 ++++++++----
|
||||||
|
config.c | 3 ++-
|
||||||
|
mdstat.c | 3 ++-
|
||||||
|
super-ddf.c | 8 ++++++--
|
||||||
|
super-intel.c | 8 ++++++--
|
||||||
|
7 files changed, 56 insertions(+), 30 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Assemble.c b/Assemble.c
|
||||||
|
index 83dced19..58dc2c5e 100644
|
||||||
|
--- a/Assemble.c
|
||||||
|
+++ b/Assemble.c
|
||||||
|
@@ -652,7 +652,9 @@ static int load_devices(struct devs *devices, char *devmap,
|
||||||
|
/* prepare useful information in info structures */
|
||||||
|
struct stat stb2;
|
||||||
|
int err;
|
||||||
|
- fstat(mdfd, &stb2);
|
||||||
|
+
|
||||||
|
+ if (fstat(mdfd, &stb2) != 0)
|
||||||
|
+ goto error;
|
||||||
|
|
||||||
|
if (c->update == UOPT_UUID && !ident->uuid_set)
|
||||||
|
random_uuid((__u8 *)ident->uuid);
|
||||||
|
@@ -675,13 +677,10 @@ static int load_devices(struct devs *devices, char *devmap,
|
||||||
|
devname);
|
||||||
|
if (dfd >= 0)
|
||||||
|
close(dfd);
|
||||||
|
- close(mdfd);
|
||||||
|
- free(devices);
|
||||||
|
- free(devmap);
|
||||||
|
tst->ss->free_super(tst);
|
||||||
|
free(tst);
|
||||||
|
*stp = st;
|
||||||
|
- return -1;
|
||||||
|
+ goto error;
|
||||||
|
}
|
||||||
|
tst->ss->getinfo_super(tst, content, devmap + devcnt * content->array.raid_disks);
|
||||||
|
|
||||||
|
@@ -715,12 +714,9 @@ static int load_devices(struct devs *devices, char *devmap,
|
||||||
|
map_num(update_options, c->update), tst->ss->name);
|
||||||
|
tst->ss->free_super(tst);
|
||||||
|
free(tst);
|
||||||
|
- close(mdfd);
|
||||||
|
close(dfd);
|
||||||
|
- free(devices);
|
||||||
|
- free(devmap);
|
||||||
|
*stp = st;
|
||||||
|
- return -1;
|
||||||
|
+ goto error;
|
||||||
|
}
|
||||||
|
if (c->update == UOPT_UUID &&
|
||||||
|
!ident->uuid_set) {
|
||||||
|
@@ -751,18 +747,23 @@ static int load_devices(struct devs *devices, char *devmap,
|
||||||
|
devname);
|
||||||
|
if (dfd >= 0)
|
||||||
|
close(dfd);
|
||||||
|
- close(mdfd);
|
||||||
|
- free(devices);
|
||||||
|
- free(devmap);
|
||||||
|
tst->ss->free_super(tst);
|
||||||
|
free(tst);
|
||||||
|
*stp = st;
|
||||||
|
- return -1;
|
||||||
|
+ goto error;
|
||||||
|
}
|
||||||
|
tst->ss->getinfo_super(tst, content, devmap + devcnt * content->array.raid_disks);
|
||||||
|
}
|
||||||
|
|
||||||
|
- fstat(dfd, &stb);
|
||||||
|
+ if (fstat(dfd, &stb) != 0) {
|
||||||
|
+ close(dfd);
|
||||||
|
+ free(devices);
|
||||||
|
+ free(devmap);
|
||||||
|
+ tst->ss->free_super(tst);
|
||||||
|
+ free(tst);
|
||||||
|
+ *stp = st;
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
close(dfd);
|
||||||
|
|
||||||
|
if (c->verbose > 0)
|
||||||
|
@@ -842,12 +843,9 @@ static int load_devices(struct devs *devices, char *devmap,
|
||||||
|
inargv ? "the list" :
|
||||||
|
"the\n DEVICE list in mdadm.conf"
|
||||||
|
);
|
||||||
|
- close(mdfd);
|
||||||
|
- free(devices);
|
||||||
|
- free(devmap);
|
||||||
|
free(best);
|
||||||
|
*stp = st;
|
||||||
|
- return -1;
|
||||||
|
+ goto error;
|
||||||
|
}
|
||||||
|
if (best[i] == -1 || (devices[best[i]].i.events
|
||||||
|
< devices[devcnt].i.events))
|
||||||
|
@@ -863,6 +861,13 @@ static int load_devices(struct devs *devices, char *devmap,
|
||||||
|
*bestp = best;
|
||||||
|
*stp = st;
|
||||||
|
return devcnt;
|
||||||
|
+
|
||||||
|
+error:
|
||||||
|
+ close(mdfd);
|
||||||
|
+ free(devices);
|
||||||
|
+ free(devmap);
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
}
|
||||||
|
|
||||||
|
static int force_array(struct mdinfo *content,
|
||||||
|
diff --git a/Dump.c b/Dump.c
|
||||||
|
index 736bcb60..81b94940 100644
|
||||||
|
--- a/Dump.c
|
||||||
|
+++ b/Dump.c
|
||||||
|
@@ -37,6 +37,7 @@ int Dump_metadata(char *dev, char *dir, struct context *c,
|
||||||
|
unsigned long long size;
|
||||||
|
DIR *dirp;
|
||||||
|
struct dirent *de;
|
||||||
|
+ int ret = 0;
|
||||||
|
|
||||||
|
if (stat(dir, &stb) != 0 ||
|
||||||
|
(S_IFMT & stb.st_mode) != S_IFDIR) {
|
||||||
|
@@ -112,9 +113,15 @@ int Dump_metadata(char *dev, char *dir, struct context *c,
|
||||||
|
}
|
||||||
|
if (c->verbose >= 0)
|
||||||
|
printf("%s saved as %s.\n", dev, fname);
|
||||||
|
- fstat(fd, &dstb);
|
||||||
|
- close(fd);
|
||||||
|
+
|
||||||
|
close(fl);
|
||||||
|
+ ret = fstat(fd, &dstb);
|
||||||
|
+ close(fd);
|
||||||
|
+ if (ret) {
|
||||||
|
+ unlink(fname);
|
||||||
|
+ free(fname);
|
||||||
|
+ return 1;
|
||||||
|
+ }
|
||||||
|
if ((dstb.st_mode & S_IFMT) != S_IFBLK) {
|
||||||
|
/* Not a block device, so cannot create links */
|
||||||
|
free(fname);
|
||||||
|
diff --git a/Grow.c b/Grow.c
|
||||||
|
index 1923c27c..963792d0 100644
|
||||||
|
--- a/Grow.c
|
||||||
|
+++ b/Grow.c
|
||||||
|
@@ -1223,13 +1223,14 @@ int reshape_open_backup_file(char *backup_file,
|
||||||
|
* way this will not notice, but it is better than
|
||||||
|
* nothing.
|
||||||
|
*/
|
||||||
|
- fstat(*fdlist, &stb);
|
||||||
|
+ if (fstat(*fdlist, &stb) != 0)
|
||||||
|
+ goto error;
|
||||||
|
dev = stb.st_dev;
|
||||||
|
- fstat(fd, &stb);
|
||||||
|
+ if (fstat(fd, &stb) != 0)
|
||||||
|
+ goto error;
|
||||||
|
if (stb.st_rdev == dev) {
|
||||||
|
pr_err("backup file must NOT be on the array being reshaped.\n");
|
||||||
|
- close(*fdlist);
|
||||||
|
- return 0;
|
||||||
|
+ goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(buf, 0, 512);
|
||||||
|
@@ -1255,6 +1256,9 @@ int reshape_open_backup_file(char *backup_file,
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
+error:
|
||||||
|
+ close(*fdlist);
|
||||||
|
+ return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned long compute_backup_blocks(int nchunk, int ochunk,
|
||||||
|
diff --git a/config.c b/config.c
|
||||||
|
index b46d71cb..612e700d 100644
|
||||||
|
--- a/config.c
|
||||||
|
+++ b/config.c
|
||||||
|
@@ -949,7 +949,8 @@ void conf_file_or_dir(FILE *f)
|
||||||
|
struct dirent *dp;
|
||||||
|
struct fname *list = NULL;
|
||||||
|
|
||||||
|
- fstat(fileno(f), &st);
|
||||||
|
+ if (fstat(fileno(f), &st) != 0)
|
||||||
|
+ return;
|
||||||
|
if (S_ISREG(st.st_mode))
|
||||||
|
conf_file(f);
|
||||||
|
else if (!S_ISDIR(st.st_mode))
|
||||||
|
diff --git a/mdstat.c b/mdstat.c
|
||||||
|
index 2fd792c5..e233f094 100644
|
||||||
|
--- a/mdstat.c
|
||||||
|
+++ b/mdstat.c
|
||||||
|
@@ -348,7 +348,8 @@ void mdstat_wait_fd(int fd, const sigset_t *sigmask)
|
||||||
|
|
||||||
|
if (fd >= 0) {
|
||||||
|
struct stat stb;
|
||||||
|
- fstat(fd, &stb);
|
||||||
|
+ if (fstat(fd, &stb) != 0)
|
||||||
|
+ return;
|
||||||
|
if ((stb.st_mode & S_IFMT) == S_IFREG)
|
||||||
|
/* Must be a /proc or /sys fd, so expect
|
||||||
|
* POLLPRI
|
||||||
|
diff --git a/super-ddf.c b/super-ddf.c
|
||||||
|
index 21426c75..311001c1 100644
|
||||||
|
--- a/super-ddf.c
|
||||||
|
+++ b/super-ddf.c
|
||||||
|
@@ -1053,7 +1053,10 @@ static int load_ddf_local(int fd, struct ddf_super *super,
|
||||||
|
0);
|
||||||
|
dl->devname = devname ? xstrdup(devname) : NULL;
|
||||||
|
|
||||||
|
- fstat(fd, &stb);
|
||||||
|
+ if (fstat(fd, &stb) != 0) {
|
||||||
|
+ free(dl);
|
||||||
|
+ return 1;
|
||||||
|
+ }
|
||||||
|
dl->major = major(stb.st_rdev);
|
||||||
|
dl->minor = minor(stb.st_rdev);
|
||||||
|
dl->next = super->dlist;
|
||||||
|
@@ -2786,7 +2789,8 @@ static int add_to_super_ddf(struct supertype *st,
|
||||||
|
/* This is device numbered dk->number. We need to create
|
||||||
|
* a phys_disk entry and a more detailed disk_data entry.
|
||||||
|
*/
|
||||||
|
- fstat(fd, &stb);
|
||||||
|
+ if (fstat(fd, &stb) != 0)
|
||||||
|
+ return 1;
|
||||||
|
n = find_unused_pde(ddf);
|
||||||
|
if (n == DDF_NOTFOUND) {
|
||||||
|
pr_err("No free slot in array, cannot add disk\n");
|
||||||
|
diff --git a/super-intel.c b/super-intel.c
|
||||||
|
index 2b8b6fda..4d257371 100644
|
||||||
|
--- a/super-intel.c
|
||||||
|
+++ b/super-intel.c
|
||||||
|
@@ -4239,7 +4239,10 @@ load_imsm_disk(int fd, struct intel_super *super, char *devname, int keep_fd)
|
||||||
|
|
||||||
|
dl = xcalloc(1, sizeof(*dl));
|
||||||
|
|
||||||
|
- fstat(fd, &stb);
|
||||||
|
+ if (fstat(fd, &stb) != 0) {
|
||||||
|
+ free(dl);
|
||||||
|
+ return 1;
|
||||||
|
+ }
|
||||||
|
dl->major = major(stb.st_rdev);
|
||||||
|
dl->minor = minor(stb.st_rdev);
|
||||||
|
dl->next = super->disks;
|
||||||
|
@@ -5981,7 +5984,8 @@ static int add_to_super_imsm(struct supertype *st, mdu_disk_info_t *dk,
|
||||||
|
if (super->current_vol >= 0)
|
||||||
|
return add_to_super_imsm_volume(st, dk, fd, devname);
|
||||||
|
|
||||||
|
- fstat(fd, &stb);
|
||||||
|
+ if (fstat(fd, &stb) != 0)
|
||||||
|
+ return 1;
|
||||||
|
dd = xcalloc(sizeof(*dd), 1);
|
||||||
|
dd->major = major(stb.st_rdev);
|
||||||
|
dd->minor = minor(stb.st_rdev);
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
28
0071-super-intel-fix-typo-in-error-msg.patch
Normal file
28
0071-super-intel-fix-typo-in-error-msg.patch
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
From c7790592bb7d050a990a9accb50de8f584879169 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Blazej Kucman <blazej.kucman@intel.com>
|
||||||
|
Date: Wed, 22 May 2024 11:13:17 +0200
|
||||||
|
Subject: [PATCH 071/157] super-intel: fix typo in error msg
|
||||||
|
|
||||||
|
Fix typo in encryption policy error msg.
|
||||||
|
|
||||||
|
Signed-off-by: Blazej Kucman <blazej.kucman@intel.com>
|
||||||
|
---
|
||||||
|
super-intel.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/super-intel.c b/super-intel.c
|
||||||
|
index 4d257371..95856322 100644
|
||||||
|
--- a/super-intel.c
|
||||||
|
+++ b/super-intel.c
|
||||||
|
@@ -11328,7 +11328,7 @@ check_policy:
|
||||||
|
return MDADM_STATUS_SUCCESS;
|
||||||
|
|
||||||
|
fd2devname(disk_fd, devname);
|
||||||
|
- pr_vrb("Encryption status \"%s\" detected for disk %s, but \"%s\" status was detected eariler.\n",
|
||||||
|
+ pr_vrb("Encryption status \"%s\" detected for disk %s, but \"%s\" status was detected earlier.\n",
|
||||||
|
encryption_state, devname, expected_policy->value);
|
||||||
|
pr_vrb("Disks with different encryption status cannot be used.\n");
|
||||||
|
return MDADM_STATUS_ERROR;
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
45
0072-mdadm-super-intel-remove-dead-code.patch
Normal file
45
0072-mdadm-super-intel-remove-dead-code.patch
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
From 49145d4f574b21a6c0612ce691f255732cb91832 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Nigel Croxon <ncroxon@redhat.com>
|
||||||
|
Date: Wed, 22 May 2024 16:05:25 -0400
|
||||||
|
Subject: [PATCH 072/157] mdadm: super-intel remove dead code
|
||||||
|
|
||||||
|
Execution cannot reach this statement: "while (devlist) { dv = de...".
|
||||||
|
Local variable "err" is assigned only once, to a constant value,
|
||||||
|
making it effectively constant throughout its scope.
|
||||||
|
Remove dead code.
|
||||||
|
|
||||||
|
Signed-off-by: Nigel Croxon <ncroxon@redhat.com>
|
||||||
|
---
|
||||||
|
super-intel.c | 9 ---------
|
||||||
|
1 file changed, 9 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/super-intel.c b/super-intel.c
|
||||||
|
index 95856322..d1b737c7 100644
|
||||||
|
--- a/super-intel.c
|
||||||
|
+++ b/super-intel.c
|
||||||
|
@@ -7046,7 +7046,6 @@ get_devices(const char *hba_path)
|
||||||
|
struct md_list *dv;
|
||||||
|
struct dirent *ent;
|
||||||
|
DIR *dir;
|
||||||
|
- int err = 0;
|
||||||
|
|
||||||
|
#if DEBUG_LOOP
|
||||||
|
devlist = get_loop_devices();
|
||||||
|
@@ -7088,14 +7087,6 @@ get_devices(const char *hba_path)
|
||||||
|
dv->next = devlist;
|
||||||
|
devlist = dv;
|
||||||
|
}
|
||||||
|
- if (err) {
|
||||||
|
- while(devlist) {
|
||||||
|
- dv = devlist;
|
||||||
|
- devlist = devlist->next;
|
||||||
|
- free(dv->devname);
|
||||||
|
- free(dv);
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
closedir(dir);
|
||||||
|
return devlist;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
55
0073-mdadm-super-intel-fix-bad-shift.patch
Normal file
55
0073-mdadm-super-intel-fix-bad-shift.patch
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
From 5c30864146412fcdfdcfddcdd94c5c449d9ddbed Mon Sep 17 00:00:00 2001
|
||||||
|
From: Nigel Croxon <ncroxon@redhat.com>
|
||||||
|
Date: Wed, 22 May 2024 16:53:22 -0400
|
||||||
|
Subject: [PATCH 073/157] mdadm: super-intel fix bad shift
|
||||||
|
|
||||||
|
In the expression "1 << i", left shifting by more than 31 bits has undefined behavior.
|
||||||
|
The shift amount, "i", is as much as 63. The operand has type "int" (32 bits) and will
|
||||||
|
be shifted as an "int". The fix is to change to a 64 bit int.
|
||||||
|
|
||||||
|
Signed-off-by: Nigel Croxon <ncroxon@redhat.com>
|
||||||
|
---
|
||||||
|
super-intel.c | 11 ++++++-----
|
||||||
|
1 file changed, 6 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/super-intel.c b/super-intel.c
|
||||||
|
index d1b737c7..0287a618 100644
|
||||||
|
--- a/super-intel.c
|
||||||
|
+++ b/super-intel.c
|
||||||
|
@@ -2343,7 +2343,8 @@ void print_encryption_information(int disk_fd, enum sys_dev_type hba_type)
|
||||||
|
get_encryption_status_string(information.status));
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int ahci_enumerate_ports(struct sys_dev *hba, int port_count, int host_base, int verbose)
|
||||||
|
+static int ahci_enumerate_ports(struct sys_dev *hba, unsigned long port_count, int host_base,
|
||||||
|
+ int verbose)
|
||||||
|
{
|
||||||
|
/* dump an unsorted list of devices attached to AHCI Intel storage
|
||||||
|
* controller, as well as non-connected ports
|
||||||
|
@@ -2357,7 +2358,7 @@ static int ahci_enumerate_ports(struct sys_dev *hba, int port_count, int host_ba
|
||||||
|
|
||||||
|
if (port_count > (int)sizeof(port_mask) * 8) {
|
||||||
|
if (verbose > 0)
|
||||||
|
- pr_err("port_count %d out of range\n", port_count);
|
||||||
|
+ pr_err("port_count %ld out of range\n", port_count);
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -2499,11 +2500,11 @@ static int ahci_enumerate_ports(struct sys_dev *hba, int port_count, int host_ba
|
||||||
|
if (dir)
|
||||||
|
closedir(dir);
|
||||||
|
if (err == 0) {
|
||||||
|
- int i;
|
||||||
|
+ unsigned long i;
|
||||||
|
|
||||||
|
for (i = 0; i < port_count; i++)
|
||||||
|
- if (port_mask & (1 << i))
|
||||||
|
- printf(" Port%d : - no device attached -\n", i);
|
||||||
|
+ if (port_mask & (1L << i))
|
||||||
|
+ printf(" Port%ld : - no device attached -\n", i);
|
||||||
|
}
|
||||||
|
|
||||||
|
return err;
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
438
0074-mdadm-deprecate-bitmap-custom-file.patch
Normal file
438
0074-mdadm-deprecate-bitmap-custom-file.patch
Normal file
@ -0,0 +1,438 @@
|
|||||||
|
From 50b100768a115526f5029113af957658ef76b383 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
Date: Fri, 29 Mar 2024 15:21:54 +0100
|
||||||
|
Subject: [PATCH 074/157] mdadm: deprecate bitmap custom file
|
||||||
|
|
||||||
|
This option has been deprecated in kernel by Christoph in commit
|
||||||
|
0ae1c9d38426 ("md: deprecate bitmap file support"). Do the same in
|
||||||
|
mdadm.
|
||||||
|
|
||||||
|
With this change, user must acknowledge it, it is not
|
||||||
|
skippable. The implementation of custom bitmap file looks like it's
|
||||||
|
abandoned. It cannot be done by Incremental so it is not respected by
|
||||||
|
any udev based system and it seems to not be recorded by metadata.
|
||||||
|
User must assemble such volume manually.
|
||||||
|
|
||||||
|
Tests for bitmap custom file are removed because now they will not
|
||||||
|
pass because interaction with user is mandatory.
|
||||||
|
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
mdadm.8.in | 34 +++++++++----------
|
||||||
|
mdadm.c | 70 +++++++++++++++++++++++++++-------------
|
||||||
|
tests/05r1-bitmapfile | 49 ----------------------------
|
||||||
|
tests/05r1-grow-external | 33 -------------------
|
||||||
|
tests/05r1-n3-bitmapfile | 53 ------------------------------
|
||||||
|
tests/05r5-bitmapfile | 49 ----------------------------
|
||||||
|
tests/05r6-bitmapfile | 49 ----------------------------
|
||||||
|
7 files changed, 62 insertions(+), 275 deletions(-)
|
||||||
|
delete mode 100644 tests/05r1-bitmapfile
|
||||||
|
delete mode 100644 tests/05r1-grow-external
|
||||||
|
delete mode 100644 tests/05r1-n3-bitmapfile
|
||||||
|
delete mode 100644 tests/05r5-bitmapfile
|
||||||
|
delete mode 100644 tests/05r6-bitmapfile
|
||||||
|
|
||||||
|
diff --git a/mdadm.8.in b/mdadm.8.in
|
||||||
|
index 9ba66825..aa0c5403 100644
|
||||||
|
--- a/mdadm.8.in
|
||||||
|
+++ b/mdadm.8.in
|
||||||
|
@@ -727,29 +727,25 @@ same as
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.BR \-b ", " \-\-bitmap=
|
||||||
|
-Specify a file to store a write-intent bitmap in. The file should not
|
||||||
|
-exist unless
|
||||||
|
-.B \-\-force
|
||||||
|
-is also given. The same file should be provided
|
||||||
|
-when assembling the array. If the word
|
||||||
|
-.B "internal"
|
||||||
|
-is given, then the bitmap is stored with the metadata on the array,
|
||||||
|
-and so is replicated on all devices. If the word
|
||||||
|
-.B "none"
|
||||||
|
-is given with
|
||||||
|
-.B \-\-grow
|
||||||
|
-mode, then any bitmap that is present is removed. If the word
|
||||||
|
-.B "clustered"
|
||||||
|
-is given, the array is created for a clustered environment. One bitmap
|
||||||
|
-is created for each node as defined by the
|
||||||
|
+Specify how to store a write-intent bitmap. Following values are supported:
|
||||||
|
+
|
||||||
|
+.B internal
|
||||||
|
+- the bitmap is stored with the metadata on the array and so is replicated on all devices.
|
||||||
|
+
|
||||||
|
+.B clustered
|
||||||
|
+- the array is created for a clustered environment. One bitmap is created for each node as defined
|
||||||
|
+by the
|
||||||
|
.B \-\-nodes
|
||||||
|
parameter and are stored internally.
|
||||||
|
|
||||||
|
-To help catch typing errors, the filename must contain at least one
|
||||||
|
-slash ('/') if it is a real file (not 'internal' or 'none').
|
||||||
|
+.B none
|
||||||
|
+- create array with no bitmap or remove any present bitmap (grow mode).
|
||||||
|
|
||||||
|
-Note: external bitmaps are only known to work on ext2 and ext3.
|
||||||
|
-Storing bitmap files on other filesystems may result in serious problems.
|
||||||
|
+Setting bitmap for file is deprecated and should not be used. The file should not exist unless
|
||||||
|
+.B \-\-force
|
||||||
|
+is also given. The same file should be provided when assembling the array. The file name must
|
||||||
|
+contain at least one slash ('/'). Bitmap files are only known to work on ext2 and ext3. Storing
|
||||||
|
+bitmap files on other filesystems may result in serious problems.
|
||||||
|
|
||||||
|
When creating an array on devices which are 100G or larger,
|
||||||
|
.I mdadm
|
||||||
|
diff --git a/mdadm.c b/mdadm.c
|
||||||
|
index d18619db..0b99fad4 100644
|
||||||
|
--- a/mdadm.c
|
||||||
|
+++ b/mdadm.c
|
||||||
|
@@ -29,6 +29,51 @@
|
||||||
|
#include "md_p.h"
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
+/**
|
||||||
|
+ * set_bitmap_value() - set bitmap value.
|
||||||
|
+ * @s: Shape.
|
||||||
|
+ * @c: Context.
|
||||||
|
+ * @val: value to set.
|
||||||
|
+ *
|
||||||
|
+ * Validate and set bitmap. Context is needed for setting nodes for clustered bitmap.
|
||||||
|
+ */
|
||||||
|
+static mdadm_status_t set_bitmap_value(struct shape *s, struct context *c, char *val)
|
||||||
|
+{
|
||||||
|
+ if (s->bitmap_file) {
|
||||||
|
+ pr_err("--bitmap cannot be set twice. Second value: \"%s\".\n", val);
|
||||||
|
+ return MDADM_STATUS_ERROR;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (strcmp(val, "internal") == 0 || strcmp(optarg, STR_COMMON_NONE) == 0) {
|
||||||
|
+ s->bitmap_file = val;
|
||||||
|
+ return MDADM_STATUS_SUCCESS;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (strcmp(val, "clustered") == 0) {
|
||||||
|
+ s->bitmap_file = val;
|
||||||
|
+ /* Set the default number of cluster nodes
|
||||||
|
+ * to 4 if not already set by user
|
||||||
|
+ */
|
||||||
|
+ if (c->nodes < 1)
|
||||||
|
+ c->nodes = 4;
|
||||||
|
+ return MDADM_STATUS_SUCCESS;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (strchr(val, '/')) {
|
||||||
|
+ pr_info("Custom write-intent bitmap file option is deprecated.\n");
|
||||||
|
+ if (ask("Do you want to continue? (y/n)")) {
|
||||||
|
+ s->bitmap_file = val;
|
||||||
|
+ return MDADM_STATUS_SUCCESS;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return MDADM_STATUS_ERROR;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ pr_err("--bitmap value must contain a '/' or be 'internal', 'clustered' or 'none'\n");
|
||||||
|
+ pr_err("Current value is \"%s\"", val);
|
||||||
|
+ return MDADM_STATUS_ERROR;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int scan_assemble(struct supertype *ss,
|
||||||
|
struct context *c,
|
||||||
|
struct mddev_ident *ident);
|
||||||
|
@@ -1094,30 +1139,9 @@ int main(int argc, char *argv[])
|
||||||
|
case O(CREATE,Bitmap): /* here we create the bitmap */
|
||||||
|
case O(GROW,'b'):
|
||||||
|
case O(GROW,Bitmap):
|
||||||
|
- if (s.bitmap_file) {
|
||||||
|
- pr_err("bitmap cannot be set twice. Second value: %s.\n", optarg);
|
||||||
|
+ if (set_bitmap_value(&s, &c, optarg))
|
||||||
|
exit(2);
|
||||||
|
- }
|
||||||
|
- if (strcmp(optarg, "internal") == 0 ||
|
||||||
|
- strcmp(optarg, STR_COMMON_NONE) == 0 ||
|
||||||
|
- strchr(optarg, '/') != NULL) {
|
||||||
|
- s.bitmap_file = optarg;
|
||||||
|
- continue;
|
||||||
|
- }
|
||||||
|
- if (strcmp(optarg, "clustered") == 0) {
|
||||||
|
- s.bitmap_file = optarg;
|
||||||
|
- /* Set the default number of cluster nodes
|
||||||
|
- * to 4 if not already set by user
|
||||||
|
- */
|
||||||
|
- if (c.nodes < 1)
|
||||||
|
- c.nodes = 4;
|
||||||
|
- continue;
|
||||||
|
- }
|
||||||
|
- /* probable typo */
|
||||||
|
- pr_err("bitmap file must contain a '/', or be 'internal', or be 'clustered', or 'none'\n"
|
||||||
|
- " not '%s'\n", optarg);
|
||||||
|
- exit(2);
|
||||||
|
-
|
||||||
|
+ continue;
|
||||||
|
case O(GROW,BitmapChunk):
|
||||||
|
case O(BUILD,BitmapChunk):
|
||||||
|
case O(CREATE,BitmapChunk): /* bitmap chunksize */
|
||||||
|
diff --git a/tests/05r1-bitmapfile b/tests/05r1-bitmapfile
|
||||||
|
deleted file mode 100644
|
||||||
|
index f384f0ea..00000000
|
||||||
|
--- a/tests/05r1-bitmapfile
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,49 +0,0 @@
|
||||||
|
-
|
||||||
|
-#
|
||||||
|
-# create a raid1 with a bitmap file
|
||||||
|
-#
|
||||||
|
-bmf=$targetdir/bitmap
|
||||||
|
-rm -f $bmf
|
||||||
|
-mdadm --create --run $md0 --level=1 -n2 --delay=1 --bitmap $bmf $dev1 $dev2
|
||||||
|
-check wait
|
||||||
|
-testdev $md0 1 $mdsize1a 64
|
||||||
|
-mdadm -S $md0
|
||||||
|
-
|
||||||
|
-mdadm --assemble $md0 --bitmap=$bmf $dev1 $dev2
|
||||||
|
-testdev $md0 1 $mdsize1a 64
|
||||||
|
-dirty1=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
-sleep 4
|
||||||
|
-dirty2=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
-
|
||||||
|
-if [ $dirty1 -lt 400 -o $dirty2 -ne 0 ]
|
||||||
|
-then echo >&2 "ERROR bad 'dirty' counts: $dirty1 and $dirty2"
|
||||||
|
- exit 1
|
||||||
|
-fi
|
||||||
|
-mdadm $md0 -f $dev1
|
||||||
|
-testdev $md0 1 $mdsize1a 64
|
||||||
|
-sleep 4
|
||||||
|
-dirty3=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
-if [ $dirty3 -lt 400 ]
|
||||||
|
-then
|
||||||
|
- echo >&2 "ERROR dirty count $dirty3 is too small"
|
||||||
|
- exit 2
|
||||||
|
-fi
|
||||||
|
-
|
||||||
|
-mdadm -S $md0
|
||||||
|
-
|
||||||
|
-mdadm --assemble -R $md0 --bitmap=$bmf $dev2
|
||||||
|
-dirty4=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
-mdadm --zero $dev1 # force --add, not --re-add
|
||||||
|
-mdadm $md0 --add $dev1
|
||||||
|
-#it is too fast# check recovery
|
||||||
|
-
|
||||||
|
-check wait
|
||||||
|
-sleep 4
|
||||||
|
-dirty5=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
-
|
||||||
|
-if [ $dirty4 -lt 400 -o $dirty5 -ne 0 ]
|
||||||
|
-then echo echo >&2 "ERROR bad 'dirty' counts at end: $dirty4 $dirty5"
|
||||||
|
- exit 1
|
||||||
|
-fi
|
||||||
|
-
|
||||||
|
-mdadm -S $md0
|
||||||
|
diff --git a/tests/05r1-grow-external b/tests/05r1-grow-external
|
||||||
|
deleted file mode 100644
|
||||||
|
index 69da3e90..00000000
|
||||||
|
--- a/tests/05r1-grow-external
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,33 +0,0 @@
|
||||||
|
-
|
||||||
|
-#
|
||||||
|
-# create a raid1 array, add an external bitmap
|
||||||
|
-#
|
||||||
|
-mdadm --create --run $md0 -l 1 -n 2 $dev1 $dev2
|
||||||
|
-check wait
|
||||||
|
-testdev $md0 1 $mdsize1a 64
|
||||||
|
-
|
||||||
|
-bmf=$targetdir/bm
|
||||||
|
-rm -f $bmf
|
||||||
|
-#mdadm -E $dev1
|
||||||
|
-mdadm --grow $md0 --bitmap=$bmf --delay=1 || { mdadm -X $bmf ; exit 1; }
|
||||||
|
-dirty1=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
-sleep 4
|
||||||
|
-dirty2=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
-
|
||||||
|
-testdev $md0 1 $mdsize1a 64
|
||||||
|
-dirty3=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
-sleep 4
|
||||||
|
-dirty4=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
-
|
||||||
|
-#echo $dirty1 $dirty2 $dirty3 $dirty4
|
||||||
|
-if [ $dirty2 -ne 0 -o $dirty4 -ne 0 -o $dirty3 -lt 400 ]
|
||||||
|
-then
|
||||||
|
- echo bad dirty counts
|
||||||
|
- exit 1
|
||||||
|
-fi
|
||||||
|
-
|
||||||
|
-# now to remove the bitmap
|
||||||
|
-check bitmap
|
||||||
|
-mdadm --grow $md0 --bitmap=none
|
||||||
|
-check nobitmap
|
||||||
|
-mdadm -S $md0
|
||||||
|
diff --git a/tests/05r1-n3-bitmapfile b/tests/05r1-n3-bitmapfile
|
||||||
|
deleted file mode 100644
|
||||||
|
index f1c3f1ee..00000000
|
||||||
|
--- a/tests/05r1-n3-bitmapfile
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,53 +0,0 @@
|
||||||
|
-
|
||||||
|
-#
|
||||||
|
-# create a raid1 with 3 devices and a bitmap file
|
||||||
|
-# make sure resync does right thing.
|
||||||
|
-#
|
||||||
|
-#
|
||||||
|
-bmf=$targetdir/bitmap
|
||||||
|
-rm -f $bmf
|
||||||
|
-mdadm --create -e0.90 --run $md0 --level=1 -n3 --delay=1 --bitmap $bmf $dev1 $dev2 $dev3
|
||||||
|
-check wait
|
||||||
|
-testdev $md0 1 $mdsize0 64
|
||||||
|
-mdadm -S $md0
|
||||||
|
-
|
||||||
|
-mdadm --assemble $md0 --bitmap=$bmf $dev1 $dev2 $dev3
|
||||||
|
-testdev $md0 1 $mdsize0 64
|
||||||
|
-dirty1=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
-sleep 4
|
||||||
|
-dirty2=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
-
|
||||||
|
-if [ $dirty1 -lt 400 -o $dirty2 -ne 0 ]
|
||||||
|
-then echo >&2 "ERROR bad 'dirty' counts: $dirty1 and $dirty2"
|
||||||
|
- exit 1
|
||||||
|
-fi
|
||||||
|
-mdadm $md0 -f $dev2
|
||||||
|
-testdev $md0 1 $mdsize0 64
|
||||||
|
-sleep 4
|
||||||
|
-dirty3=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
-if [ $dirty3 -lt 400 ]
|
||||||
|
-then
|
||||||
|
- echo >&2 "ERROR dirty count $dirty3 is too small"
|
||||||
|
- exit 2
|
||||||
|
-fi
|
||||||
|
-
|
||||||
|
-mdadm -S $md0
|
||||||
|
-
|
||||||
|
-mdadm --assemble -R $md0 --bitmap=$bmf $dev1 $dev3
|
||||||
|
-check nosync
|
||||||
|
-mdadm --zero-superblock $dev2
|
||||||
|
-mdadm $md0 --add $dev2
|
||||||
|
-check recovery
|
||||||
|
-
|
||||||
|
-dirty4=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
-check wait
|
||||||
|
-sleep 4
|
||||||
|
-dirty5=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
-
|
||||||
|
-if [ $dirty4 -lt 400 -o $dirty5 -ne 0 ]
|
||||||
|
-then echo echo >&2 "ERROR bad 'dirty' counts at end: $dirty4 $dirty5"
|
||||||
|
- exit 1
|
||||||
|
-fi
|
||||||
|
-
|
||||||
|
-mdadm -S $md0
|
||||||
|
-exit 0
|
||||||
|
diff --git a/tests/05r5-bitmapfile b/tests/05r5-bitmapfile
|
||||||
|
deleted file mode 100644
|
||||||
|
index 6d173d88..00000000
|
||||||
|
--- a/tests/05r5-bitmapfile
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,49 +0,0 @@
|
||||||
|
-
|
||||||
|
-#
|
||||||
|
-# create a raid1 with a bitmap file
|
||||||
|
-#
|
||||||
|
-bmf=$targetdir/bitmap
|
||||||
|
-rm -f $bmf
|
||||||
|
-mdadm --create --run $md0 --level=5 -n3 --delay=1 --bitmap $bmf $dev1 $dev2 $dev3
|
||||||
|
-check wait
|
||||||
|
-testdev $md0 2 $mdsize1 512
|
||||||
|
-mdadm -S $md0
|
||||||
|
-
|
||||||
|
-mdadm --assemble $md0 --bitmap=$bmf $dev1 $dev2 $dev3
|
||||||
|
-testdev $md0 2 $mdsize1 512
|
||||||
|
-dirty1=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
-sleep 4
|
||||||
|
-dirty2=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
-
|
||||||
|
-if [ $dirty1 -lt 400 -o $dirty2 -ne 0 ]
|
||||||
|
-then echo >&2 "ERROR bad 'dirty' counts: $dirty1 and $dirty2"
|
||||||
|
- exit 1
|
||||||
|
-fi
|
||||||
|
-mdadm $md0 -f $dev1
|
||||||
|
-testdev $md0 2 $mdsize1 512
|
||||||
|
-sleep 4
|
||||||
|
-dirty3=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
-if [ $dirty3 -lt 400 ]
|
||||||
|
-then
|
||||||
|
- echo >&2 "ERROR dirty count $dirty3 is too small"
|
||||||
|
- exit 2
|
||||||
|
-fi
|
||||||
|
-
|
||||||
|
-mdadm -S $md0
|
||||||
|
-
|
||||||
|
-mdadm --assemble -R $md0 --bitmap=$bmf $dev2 $dev3
|
||||||
|
-mdadm --zero $dev1 # force add, not re-add
|
||||||
|
-mdadm $md0 --add $dev1
|
||||||
|
-check recovery
|
||||||
|
-
|
||||||
|
-dirty4=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
-check wait
|
||||||
|
-sleep 4
|
||||||
|
-dirty5=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
-
|
||||||
|
-if [ $dirty4 -lt 400 -o $dirty5 -ne 0 ]
|
||||||
|
-then echo echo >&2 "ERROR bad 'dirty' counts at end: $dirty4 $dirty5"
|
||||||
|
- exit 1
|
||||||
|
-fi
|
||||||
|
-
|
||||||
|
-mdadm -S $md0
|
||||||
|
diff --git a/tests/05r6-bitmapfile b/tests/05r6-bitmapfile
|
||||||
|
deleted file mode 100644
|
||||||
|
index d11896db..00000000
|
||||||
|
--- a/tests/05r6-bitmapfile
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,49 +0,0 @@
|
||||||
|
-
|
||||||
|
-#
|
||||||
|
-# create a raid1 with a bitmap file
|
||||||
|
-#
|
||||||
|
-bmf=$targetdir/bitmap
|
||||||
|
-rm -f $bmf
|
||||||
|
-mdadm --create --run $md0 --level=6 -n4 --delay=1 --bitmap $bmf $dev1 $dev2 $dev3 $dev4
|
||||||
|
-check wait
|
||||||
|
-testdev $md0 2 $mdsize1 512
|
||||||
|
-mdadm -S $md0
|
||||||
|
-
|
||||||
|
-mdadm --assemble $md0 --bitmap=$bmf $dev1 $dev2 $dev3 $dev4
|
||||||
|
-testdev $md0 2 $mdsize1 512
|
||||||
|
-dirty1=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
-sleep 4
|
||||||
|
-dirty2=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
-
|
||||||
|
-if [ $dirty1 -lt 400 -o $dirty2 -ne 0 ]
|
||||||
|
-then echo >&2 "ERROR bad 'dirty' counts: $dirty1 and $dirty2"
|
||||||
|
- exit 1
|
||||||
|
-fi
|
||||||
|
-mdadm $md0 -f $dev3
|
||||||
|
-testdev $md0 2 $mdsize1 512
|
||||||
|
-sleep 4
|
||||||
|
-dirty3=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
-if [ $dirty3 -lt 400 ]
|
||||||
|
-then
|
||||||
|
- echo >&2 "ERROR dirty count $dirty3 is too small"
|
||||||
|
- exit 2
|
||||||
|
-fi
|
||||||
|
-
|
||||||
|
-mdadm -S $md0
|
||||||
|
-
|
||||||
|
-mdadm --assemble -R $md0 --bitmap=$bmf $dev1 $dev2 $dev4
|
||||||
|
-mdadm --zero $dev3 # force --add, not --re-add
|
||||||
|
-mdadm $md0 --add $dev3
|
||||||
|
-check recovery
|
||||||
|
-
|
||||||
|
-dirty4=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
-check wait
|
||||||
|
-sleep 4
|
||||||
|
-dirty5=`mdadm -X $bmf | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
-
|
||||||
|
-if [ $dirty4 -lt 400 -o $dirty5 -ne 0 ]
|
||||||
|
-then echo echo >&2 "ERROR bad 'dirty' counts at end: $dirty4 $dirty5"
|
||||||
|
- exit 1
|
||||||
|
-fi
|
||||||
|
-
|
||||||
|
-mdadm -S $md0
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
31
0075-Makefile-fix-make-s-detection.patch
Normal file
31
0075-Makefile-fix-make-s-detection.patch
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
From 906922ee321d64e2ce8458147e67d4892696fb58 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Valery Ushakov <valery.ushakov@bell-sw.com>
|
||||||
|
Date: Wed, 22 May 2024 17:07:38 +0300
|
||||||
|
Subject: [PATCH 075/157] Makefile: fix make -s detection
|
||||||
|
|
||||||
|
Only check the first word of MAKEFLAGS for 's', that's where all the
|
||||||
|
single letter options are collected.
|
||||||
|
|
||||||
|
MAKEFLAGS contains _all_ make flags, so if any command line argument
|
||||||
|
contains a letter 's', the silent test will be false positive. Think
|
||||||
|
e.g. make 'DESTDIR=.../aports/main/mdadm/pkg/mdadm' install
|
||||||
|
---
|
||||||
|
Makefile | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/Makefile b/Makefile
|
||||||
|
index adac7905..446710bd 100644
|
||||||
|
--- a/Makefile
|
||||||
|
+++ b/Makefile
|
||||||
|
@@ -157,7 +157,7 @@ ifndef UDEVDIR
|
||||||
|
UDEVDIR = /lib/udev
|
||||||
|
endif
|
||||||
|
|
||||||
|
-ifeq (,$(findstring s,$(MAKEFLAGS)))
|
||||||
|
+ifeq (,$(findstring s,$(firstword -$(MAKEFLAGS))))
|
||||||
|
ECHO=echo
|
||||||
|
else
|
||||||
|
ECHO=:
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
81
0076-Change-some-error-messages-to-info-level.patch
Normal file
81
0076-Change-some-error-messages-to-info-level.patch
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
From 13a0e92a3ed70c52246a0f0572dee61203994327 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Wed, 22 May 2024 16:50:38 +0800
|
||||||
|
Subject: [PATCH 076/157] Change some error messages to info level
|
||||||
|
|
||||||
|
These logs are not error logs. Change them to info level.
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
Assemble.c | 16 ++++++----------
|
||||||
|
Manage.c | 2 +-
|
||||||
|
util.c | 4 ++--
|
||||||
|
3 files changed, 9 insertions(+), 13 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Assemble.c b/Assemble.c
|
||||||
|
index 58dc2c5e..0e6da593 100644
|
||||||
|
--- a/Assemble.c
|
||||||
|
+++ b/Assemble.c
|
||||||
|
@@ -1214,23 +1214,19 @@ static int start_array(int mdfd,
|
||||||
|
if (rv == 0) {
|
||||||
|
sysfs_rules_apply(mddev, content);
|
||||||
|
if (c->verbose >= 0) {
|
||||||
|
- pr_err("%s has been started with %d drive%s",
|
||||||
|
+ pr_info("%s has been started with %d drive%s",
|
||||||
|
mddev, okcnt, okcnt==1?"":"s");
|
||||||
|
if (okcnt < (unsigned)content->array.raid_disks)
|
||||||
|
- fprintf(stderr, " (out of %d)",
|
||||||
|
- content->array.raid_disks);
|
||||||
|
+ printf(" (out of %d)", content->array.raid_disks);
|
||||||
|
if (rebuilding_cnt)
|
||||||
|
- fprintf(stderr, "%s %d rebuilding",
|
||||||
|
- sparecnt?",":" and",
|
||||||
|
+ printf("%s %d rebuilding", sparecnt?",":" and",
|
||||||
|
rebuilding_cnt);
|
||||||
|
if (sparecnt)
|
||||||
|
- fprintf(stderr, " and %d spare%s",
|
||||||
|
- sparecnt,
|
||||||
|
+ printf(" and %d spare%s", sparecnt,
|
||||||
|
sparecnt == 1 ? "" : "s");
|
||||||
|
if (content->journal_clean)
|
||||||
|
- fprintf(stderr, " and %d journal",
|
||||||
|
- journalcnt);
|
||||||
|
- fprintf(stderr, ".\n");
|
||||||
|
+ printf(" and %d journal", journalcnt);
|
||||||
|
+ printf(".\n");
|
||||||
|
}
|
||||||
|
if (content->reshape_active &&
|
||||||
|
is_level456(content->array.level)) {
|
||||||
|
diff --git a/Manage.c b/Manage.c
|
||||||
|
index 96e5ee54..5db72b77 100644
|
||||||
|
--- a/Manage.c
|
||||||
|
+++ b/Manage.c
|
||||||
|
@@ -463,7 +463,7 @@ done:
|
||||||
|
}
|
||||||
|
|
||||||
|
if (verbose >= 0)
|
||||||
|
- pr_err("stopped %s\n", devname);
|
||||||
|
+ pr_info("stopped %s\n", devname);
|
||||||
|
map_lock(&map);
|
||||||
|
map_remove(&map, devnm);
|
||||||
|
map_unlock(&map);
|
||||||
|
diff --git a/util.c b/util.c
|
||||||
|
index bf79742f..48c97545 100644
|
||||||
|
--- a/util.c
|
||||||
|
+++ b/util.c
|
||||||
|
@@ -633,9 +633,9 @@ int check_ext2(int fd, char *name)
|
||||||
|
bsize = sb[24]|(sb[25]|(sb[26]|sb[27]<<8)<<8)<<8;
|
||||||
|
size = sb[4]|(sb[5]|(sb[6]|sb[7]<<8)<<8)<<8;
|
||||||
|
size <<= bsize;
|
||||||
|
- pr_err("%s appears to contain an ext2fs file system\n",
|
||||||
|
+ pr_info("%s appears to contain an ext2fs file system\n",
|
||||||
|
name);
|
||||||
|
- cont_err("size=%lluK mtime=%s", size, ctime(&mtime));
|
||||||
|
+ pr_info("size=%lluK mtime=%s", size, ctime(&mtime));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
40
0077-mdadm-Start-update_opt-from-0.patch
Normal file
40
0077-mdadm-Start-update_opt-from-0.patch
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
From 296398299391b10650bdd79d986b115588e60590 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Wed, 22 May 2024 16:50:39 +0800
|
||||||
|
Subject: [PATCH 077/157] mdadm: Start update_opt from 0
|
||||||
|
|
||||||
|
Before f2e8393bd722 ('Manage&Incremental: code refactor, string to enum'), it uses
|
||||||
|
NULL to represent it doesn't need to update. So init UOPT_UNDEFINED to 0. This
|
||||||
|
problem is found by test case 05r6tor0.
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
mdadm.h | 4 ++--
|
||||||
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/mdadm.h b/mdadm.h
|
||||||
|
index b71d7b32..40818941 100644
|
||||||
|
--- a/mdadm.h
|
||||||
|
+++ b/mdadm.h
|
||||||
|
@@ -535,7 +535,8 @@ enum special_options {
|
||||||
|
};
|
||||||
|
|
||||||
|
enum update_opt {
|
||||||
|
- UOPT_NAME = 1,
|
||||||
|
+ UOPT_UNDEFINED = 0,
|
||||||
|
+ UOPT_NAME,
|
||||||
|
UOPT_PPL,
|
||||||
|
UOPT_NO_PPL,
|
||||||
|
UOPT_BITMAP,
|
||||||
|
@@ -575,7 +576,6 @@ enum update_opt {
|
||||||
|
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.41.0
|
||||||
|
|
49
0078-Don-t-control-reshape-speed-in-daemon.patch
Normal file
49
0078-Don-t-control-reshape-speed-in-daemon.patch
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
From f79f7189aa25b9da51736f2c578a51c2c4fe7706 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Wed, 22 May 2024 16:50:40 +0800
|
||||||
|
Subject: [PATCH 078/157] Don't control reshape speed in daemon
|
||||||
|
|
||||||
|
It tries to set the max sync speed in reshape. This should be done by
|
||||||
|
administrators by control interfaces /proc/sys/dev/raid/speed_limit_max/min.
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
Grow.c | 7 -------
|
||||||
|
1 file changed, 7 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Grow.c b/Grow.c
|
||||||
|
index 963792d0..b135930d 100644
|
||||||
|
--- a/Grow.c
|
||||||
|
+++ b/Grow.c
|
||||||
|
@@ -4488,7 +4488,6 @@ int child_monitor(int afd, struct mdinfo *sra, struct reshape *reshape,
|
||||||
|
*/
|
||||||
|
char *buf;
|
||||||
|
int degraded = -1;
|
||||||
|
- unsigned long long speed;
|
||||||
|
unsigned long long suspend_point, array_size;
|
||||||
|
unsigned long long backup_point, wait_point;
|
||||||
|
unsigned long long reshape_completed;
|
||||||
|
@@ -4544,10 +4543,6 @@ int child_monitor(int afd, struct mdinfo *sra, struct reshape *reshape,
|
||||||
|
if (posix_memalign((void**)&buf, 4096, disks * chunk))
|
||||||
|
/* Don't start the 'reshape' */
|
||||||
|
return 0;
|
||||||
|
- if (reshape->before.data_disks == reshape->after.data_disks) {
|
||||||
|
- sysfs_get_ll(sra, NULL, "sync_speed_min", &speed);
|
||||||
|
- sysfs_set_num(sra, NULL, "sync_speed_min", 200000);
|
||||||
|
- }
|
||||||
|
|
||||||
|
if (increasing) {
|
||||||
|
array_size = sra->component_size * reshape->after.data_disks;
|
||||||
|
@@ -4680,8 +4675,6 @@ int child_monitor(int afd, struct mdinfo *sra, struct reshape *reshape,
|
||||||
|
sysfs_set_num(sra, NULL, "suspend_lo", 0);
|
||||||
|
sysfs_set_num(sra, NULL, "sync_min", 0);
|
||||||
|
|
||||||
|
- if (reshape->before.data_disks == reshape->after.data_disks)
|
||||||
|
- sysfs_set_num(sra, NULL, "sync_speed_min", speed);
|
||||||
|
free(buf);
|
||||||
|
return done;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
119
0079-mdadm-tests-test-enhance.patch
Normal file
119
0079-mdadm-tests-test-enhance.patch
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
From 6e8af9475cf0ac22f7ac167040dbf92fbfdd97ab Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Wed, 22 May 2024 16:50:41 +0800
|
||||||
|
Subject: [PATCH 079/157] mdadm/tests: test enhance
|
||||||
|
|
||||||
|
There are two changes.
|
||||||
|
First, if md module is not loaded, it gives error when reading
|
||||||
|
speed_limit_max. So read the value after loading md module which
|
||||||
|
is done in do_setup
|
||||||
|
|
||||||
|
Second, sometimes the test reports error sync action doesn't
|
||||||
|
happen. But dmesg shows sync action is done. So limit the sync
|
||||||
|
speed before test. It doesn't affect the test run time. Because
|
||||||
|
check wait sets the max speed before waiting sync action. And
|
||||||
|
recording speed_limit_max/min in do_setup.
|
||||||
|
|
||||||
|
Fixes: 4c12714d1ca0 ('test: run tests on system level mdadm')
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
test | 10 +++++-----
|
||||||
|
tests/func.sh | 26 +++++++++++++++++++++++---
|
||||||
|
2 files changed, 28 insertions(+), 8 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/test b/test
|
||||||
|
index 338c2db4..ff403293 100755
|
||||||
|
--- a/test
|
||||||
|
+++ b/test
|
||||||
|
@@ -6,7 +6,10 @@ targetdir="/var/tmp"
|
||||||
|
logdir="$targetdir"
|
||||||
|
config=/tmp/mdadm.conf
|
||||||
|
testdir=$PWD/tests
|
||||||
|
-system_speed_limit=`cat /proc/sys/dev/raid/speed_limit_max`
|
||||||
|
+system_speed_limit_max=0
|
||||||
|
+system_speed_limit_min=0
|
||||||
|
+test_speed_limit_min=100
|
||||||
|
+test_speed_limit_max=500
|
||||||
|
devlist=
|
||||||
|
|
||||||
|
savelogs=0
|
||||||
|
@@ -39,10 +42,6 @@ ctrl_c() {
|
||||||
|
ctrl_c_error=1
|
||||||
|
}
|
||||||
|
|
||||||
|
-restore_system_speed_limit() {
|
||||||
|
- echo $system_speed_limit > /proc/sys/dev/raid/speed_limit_max
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
mdadm() {
|
||||||
|
rm -f $targetdir/stderr
|
||||||
|
case $* in
|
||||||
|
@@ -103,6 +102,7 @@ do_test() {
|
||||||
|
do_clean
|
||||||
|
# source script in a subshell, so it has access to our
|
||||||
|
# namespace, but cannot change it.
|
||||||
|
+ control_system_speed_limit
|
||||||
|
echo -ne "$_script... "
|
||||||
|
if ( set -ex ; . $_script ) &> $targetdir/log
|
||||||
|
then
|
||||||
|
diff --git a/tests/func.sh b/tests/func.sh
|
||||||
|
index b474442b..221cff15 100644
|
||||||
|
--- a/tests/func.sh
|
||||||
|
+++ b/tests/func.sh
|
||||||
|
@@ -136,6 +136,23 @@ check_env() {
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
+record_system_speed_limit() {
|
||||||
|
+ system_speed_limit_max=`cat /proc/sys/dev/raid/speed_limit_max`
|
||||||
|
+ system_speed_limit_min=`cat /proc/sys/dev/raid/speed_limit_min`
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+# To avoid sync action finishes before checking it, it needs to limit
|
||||||
|
+# the sync speed
|
||||||
|
+control_system_speed_limit() {
|
||||||
|
+ echo $test_speed_limit_min > /proc/sys/dev/raid/speed_limit_min
|
||||||
|
+ echo $test_speed_limit_max > /proc/sys/dev/raid/speed_limit_max
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+restore_system_speed_limit() {
|
||||||
|
+ echo $system_speed_limit_min > /proc/sys/dev/raid/speed_limit_max
|
||||||
|
+ echo $system_speed_limit_max > /proc/sys/dev/raid/speed_limit_max
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
do_setup() {
|
||||||
|
trap cleanup 0 1 3 15
|
||||||
|
trap ctrl_c 2
|
||||||
|
@@ -214,6 +231,7 @@ do_setup() {
|
||||||
|
ulimit -c unlimited
|
||||||
|
[ -f /proc/mdstat ] || modprobe md_mod
|
||||||
|
echo 0 > /sys/module/md_mod/parameters/start_ro
|
||||||
|
+ record_system_speed_limit
|
||||||
|
}
|
||||||
|
|
||||||
|
# check various things
|
||||||
|
@@ -265,15 +283,17 @@ check() {
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
wait )
|
||||||
|
- p=`cat /proc/sys/dev/raid/speed_limit_max`
|
||||||
|
- echo 2000000 > /proc/sys/dev/raid/speed_limit_max
|
||||||
|
+ min=`cat /proc/sys/dev/raid/speed_limit_min`
|
||||||
|
+ max=`cat /proc/sys/dev/raid/speed_limit_max`
|
||||||
|
+ echo 200000 > /proc/sys/dev/raid/speed_limit_max
|
||||||
|
sleep 0.1
|
||||||
|
while grep -Eq '(resync|recovery|reshape|check|repair) *=' /proc/mdstat ||
|
||||||
|
grep -v idle > /dev/null /sys/block/md*/md/sync_action
|
||||||
|
do
|
||||||
|
sleep 0.5
|
||||||
|
done
|
||||||
|
- echo $p > /proc/sys/dev/raid/speed_limit_max
|
||||||
|
+ echo $min > /proc/sys/dev/raid/speed_limit_min
|
||||||
|
+ echo $max > /proc/sys/dev/raid/speed_limit_max
|
||||||
|
;;
|
||||||
|
state )
|
||||||
|
grep -sq "blocks.*\[$2\]\$" /proc/mdstat ||
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
@ -0,0 +1,31 @@
|
|||||||
|
From 73ba062ef93d0a57360a2d5200bc7a8f8781e7b6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Wed, 22 May 2024 16:50:42 +0800
|
||||||
|
Subject: [PATCH 080/157] mdadm/tests: test don't fail when systemd reports
|
||||||
|
error
|
||||||
|
|
||||||
|
Sometimes systemd reports error in dmesg and test fails. Add
|
||||||
|
a condition to avoid this failure.
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
test | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/test b/test
|
||||||
|
index ff403293..3da53f87 100755
|
||||||
|
--- a/test
|
||||||
|
+++ b/test
|
||||||
|
@@ -109,7 +109,7 @@ do_test() {
|
||||||
|
if [ -f "${_script}.inject_error" ]; then
|
||||||
|
echo "dmesg checking is skipped because test inject error"
|
||||||
|
else
|
||||||
|
- dmesg | grep -iq "error\|call trace\|segfault" &&
|
||||||
|
+ dmesg | grep -iq "error\|call trace\|segfault" | grep -v "systemd" &&
|
||||||
|
die "dmesg prints errors when testing $_basename!"
|
||||||
|
fi
|
||||||
|
echo "succeeded"
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
109
0081-mdadm-tests-names_template-enhance.patch
Normal file
109
0081-mdadm-tests-names_template-enhance.patch
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
From 41706a91568472d10153bf4ada3c3f0d93ef327a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Wed, 22 May 2024 16:50:43 +0800
|
||||||
|
Subject: [PATCH 081/157] mdadm/tests: names_template enhance
|
||||||
|
|
||||||
|
For super1, if the length of hostname is >= 32, it doesn't add hostname
|
||||||
|
in metadata name. Fix this problem by checking the length of hostname.
|
||||||
|
Because other cases may use need to check this, so do the check in
|
||||||
|
do_setup.
|
||||||
|
|
||||||
|
And this patch adds a check if link /dev/md/name exists.
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
test | 5 +++++
|
||||||
|
tests/func.sh | 13 +++++++++++++
|
||||||
|
tests/templates/names_template | 14 ++++++++++++--
|
||||||
|
3 files changed, 30 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/test b/test
|
||||||
|
index 3da53f87..814ce199 100755
|
||||||
|
--- a/test
|
||||||
|
+++ b/test
|
||||||
|
@@ -11,6 +11,11 @@ system_speed_limit_min=0
|
||||||
|
test_speed_limit_min=100
|
||||||
|
test_speed_limit_max=500
|
||||||
|
devlist=
|
||||||
|
+# If super1 metadata name doesn't have the same hostname with machine,
|
||||||
|
+# it's treated as foreign.
|
||||||
|
+# For example, /dev/md0 is created, stops it, then assemble it, the
|
||||||
|
+# device node will be /dev/md127 (127 is choosed by mdadm autumatically)
|
||||||
|
+is_foreign="no"
|
||||||
|
|
||||||
|
savelogs=0
|
||||||
|
exitonerror=1
|
||||||
|
diff --git a/tests/func.sh b/tests/func.sh
|
||||||
|
index 221cff15..cfe83e55 100644
|
||||||
|
--- a/tests/func.sh
|
||||||
|
+++ b/tests/func.sh
|
||||||
|
@@ -153,6 +153,18 @@ restore_system_speed_limit() {
|
||||||
|
echo $system_speed_limit_max > /proc/sys/dev/raid/speed_limit_max
|
||||||
|
}
|
||||||
|
|
||||||
|
+is_raid_foreign() {
|
||||||
|
+
|
||||||
|
+ # If the length of hostname is >= 32, super1 doesn't use
|
||||||
|
+ # hostname in metadata
|
||||||
|
+ hostname=$(hostname)
|
||||||
|
+ if [ `expr length $(hostname)` -lt 32 ]; then
|
||||||
|
+ is_foreign="no"
|
||||||
|
+ else
|
||||||
|
+ is_foreign="yes"
|
||||||
|
+ fi
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
do_setup() {
|
||||||
|
trap cleanup 0 1 3 15
|
||||||
|
trap ctrl_c 2
|
||||||
|
@@ -232,6 +244,7 @@ do_setup() {
|
||||||
|
[ -f /proc/mdstat ] || modprobe md_mod
|
||||||
|
echo 0 > /sys/module/md_mod/parameters/start_ro
|
||||||
|
record_system_speed_limit
|
||||||
|
+ is_raid_foreign
|
||||||
|
}
|
||||||
|
|
||||||
|
# check various things
|
||||||
|
diff --git a/tests/templates/names_template b/tests/templates/names_template
|
||||||
|
index 1b6cd14b..88ad5b8c 100644
|
||||||
|
--- a/tests/templates/names_template
|
||||||
|
+++ b/tests/templates/names_template
|
||||||
|
@@ -30,6 +30,7 @@ function names_verify() {
|
||||||
|
local DEVNODE_NAME="$1"
|
||||||
|
local WANTED_LINK="$2"
|
||||||
|
local WANTED_NAME="$3"
|
||||||
|
+ local EXPECTED=""
|
||||||
|
|
||||||
|
local RES="$(mdadm -D --export $DEVNODE_NAME | grep MD_DEVNAME)"
|
||||||
|
if [[ "$?" != "0" ]]; then
|
||||||
|
@@ -38,7 +39,12 @@ function names_verify() {
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$WANTED_LINK" != "empty" ]]; then
|
||||||
|
- local EXPECTED="MD_DEVNAME=$WANTED_LINK"
|
||||||
|
+ EXPECTED="MD_DEVNAME=$WANTED_LINK"
|
||||||
|
+
|
||||||
|
+ if [ ! -b /dev/md/$WANTED_LINK ]; then
|
||||||
|
+ echo "/dev/md/$WANTED_LINK doesn't exit"
|
||||||
|
+ exit 1
|
||||||
|
+ fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$RES" != "$EXPECTED" ]]; then
|
||||||
|
@@ -52,7 +58,11 @@ function names_verify() {
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
- local EXPECTED="MD_NAME=$(hostname):$WANTED_NAME"
|
||||||
|
+ if [ $is_foreign == "no" ]; then
|
||||||
|
+ EXPECTED="MD_NAME=$(hostname):$WANTED_NAME"
|
||||||
|
+ else
|
||||||
|
+ EXPECTED="MD_NAME=$WANTED_NAME"
|
||||||
|
+ fi
|
||||||
|
if [[ "$RES" != "$EXPECTED" ]]; then
|
||||||
|
echo "$RES doesn't match $EXPECTED."
|
||||||
|
exit 1
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
67
0082-mdadm-tests-03assem-incr-enhance.patch
Normal file
67
0082-mdadm-tests-03assem-incr-enhance.patch
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
From 23f45965a0abe3506885c8e8005ee79473a66422 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Wed, 22 May 2024 16:50:44 +0800
|
||||||
|
Subject: [PATCH 082/157] mdadm/tests: 03assem-incr enhance
|
||||||
|
|
||||||
|
It fails when hostname lenght > 32. Because the super1 metadata name
|
||||||
|
doesn't include hostname when hostname length > 32. Then mdadm thinks
|
||||||
|
the array is a foreign array if no device link is specified when
|
||||||
|
assembling the array. It chooses a minor number from 127.
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
test | 3 +++
|
||||||
|
tests/03assem-incr | 20 +++++++++++++-------
|
||||||
|
2 files changed, 16 insertions(+), 7 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/test b/test
|
||||||
|
index 814ce199..1fce6be2 100755
|
||||||
|
--- a/test
|
||||||
|
+++ b/test
|
||||||
|
@@ -33,6 +33,9 @@ LVM_VOLGROUP=mdtest
|
||||||
|
md0=/dev/md0
|
||||||
|
md1=/dev/md1
|
||||||
|
md2=/dev/md2
|
||||||
|
+# if user doesn't specify minor number, mdadm chooses minor number
|
||||||
|
+# automatically from 127.
|
||||||
|
+md127=/dev/md127
|
||||||
|
mdp0=/dev/md_d0
|
||||||
|
mdp1=/dev/md_d1
|
||||||
|
|
||||||
|
diff --git a/tests/03assem-incr b/tests/03assem-incr
|
||||||
|
index 38880a7f..21215a34 100644
|
||||||
|
--- a/tests/03assem-incr
|
||||||
|
+++ b/tests/03assem-incr
|
||||||
|
@@ -9,15 +9,21 @@ set -x -e
|
||||||
|
levels=(raid0 raid1 raid5)
|
||||||
|
|
||||||
|
if [ "$LINEAR" == "yes" ]; then
|
||||||
|
- levels+=( linear )
|
||||||
|
+ levels+=( linear )
|
||||||
|
fi
|
||||||
|
|
||||||
|
for l in ${levels[@]}
|
||||||
|
do
|
||||||
|
- mdadm -CR $md0 -l $l -n5 $dev0 $dev1 $dev2 $dev3 $dev4 --assume-clean
|
||||||
|
- mdadm -S md0
|
||||||
|
- mdadm -I $dev1
|
||||||
|
- mdadm -I $dev3
|
||||||
|
- mdadm -A /dev/md0 $dev0 $dev1 $dev2 $dev3 $dev4
|
||||||
|
- mdadm -S /dev/md0
|
||||||
|
+ mdadm -CR $md0 -l $l -n5 $dev0 $dev1 $dev2 $dev3 $dev4 --assume-clean
|
||||||
|
+ mdadm -S $md0
|
||||||
|
+ mdadm -I $dev1
|
||||||
|
+ mdadm -I $dev3
|
||||||
|
+ mdadm -A $md0 $dev0 $dev1 $dev2 $dev3 $dev4
|
||||||
|
+ # If one array is foreign (metadata name doesn't have the machine's
|
||||||
|
+ # hostname), mdadm chooses a minor number automatically from 127
|
||||||
|
+ if [ $is_foreign == "no" ]; then
|
||||||
|
+ mdadm -S $md0
|
||||||
|
+ else
|
||||||
|
+ mdadm -S $md127
|
||||||
|
+ fi
|
||||||
|
done
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
38
0083-mdadm-tests-03r0assem-enhance.patch
Normal file
38
0083-mdadm-tests-03r0assem-enhance.patch
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
From f136d9a8b7d8fdfd7539b96707bc9a03528754aa Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Wed, 22 May 2024 16:50:45 +0800
|
||||||
|
Subject: [PATCH 083/157] mdadm/tests 03r0assem enhance
|
||||||
|
|
||||||
|
dcc22ae74a864 ('super1: remove support for name= in config') already
|
||||||
|
removes name= support. So remove related test codes in 03r0assem.
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
tests/03r0assem | 10 ----------
|
||||||
|
1 file changed, 10 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/tests/03r0assem b/tests/03r0assem
|
||||||
|
index f7c29e8c..4bf8b9e8 100644
|
||||||
|
--- a/tests/03r0assem
|
||||||
|
+++ b/tests/03r0assem
|
||||||
|
@@ -33,16 +33,6 @@ mdadm -As -c $conf $md2
|
||||||
|
$tst
|
||||||
|
mdadm -S $md2
|
||||||
|
|
||||||
|
-{
|
||||||
|
- echo DEVICE $devlist
|
||||||
|
- echo array $md2 name=2
|
||||||
|
-} > $conf
|
||||||
|
-
|
||||||
|
-mdadm -As -c $conf $md2
|
||||||
|
-$tst
|
||||||
|
-mdadm -S $md2
|
||||||
|
-
|
||||||
|
-
|
||||||
|
{
|
||||||
|
echo DEVICE $devlist
|
||||||
|
echo array $md2 devices=$dev0,$dev1,$dev2
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
35
0084-mdadm-tests-remove-03r5assem-failed.patch
Normal file
35
0084-mdadm-tests-remove-03r5assem-failed.patch
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
From 5c1133ba8d026d65362953f25178fbf974b78ce9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Wed, 22 May 2024 16:50:46 +0800
|
||||||
|
Subject: [PATCH 084/157] mdadm/tests: remove 03r5assem-failed
|
||||||
|
|
||||||
|
03r5assem can run successfully with kernel 6.9.0-rc4
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
tests/03r5assem-failed | 12 ------------
|
||||||
|
1 file changed, 12 deletions(-)
|
||||||
|
delete mode 100644 tests/03r5assem-failed
|
||||||
|
|
||||||
|
diff --git a/tests/03r5assem-failed b/tests/03r5assem-failed
|
||||||
|
deleted file mode 100644
|
||||||
|
index d38241df..00000000
|
||||||
|
--- a/tests/03r5assem-failed
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,12 +0,0 @@
|
||||||
|
-
|
||||||
|
-# Create an array, fail one device while array is active, stop array,
|
||||||
|
-# then re-assemble listing the failed device first.
|
||||||
|
-
|
||||||
|
-mdadm -CR $md1 -l5 -n4 $dev0 $dev1 $dev2 $dev3
|
||||||
|
-check wait
|
||||||
|
-
|
||||||
|
-echo 2000 > /sys/block/md1/md/safe_mode_delay
|
||||||
|
-mkfs $md1
|
||||||
|
-mdadm $md1 -f $dev0
|
||||||
|
-mdadm -S $md1
|
||||||
|
-mdadm -A $md1 $dev0 $dev1 $dev2 $dev3 || exit 1
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
52
0085-mdadm-tests-03r5assemV1.patch
Normal file
52
0085-mdadm-tests-03r5assemV1.patch
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
From 6077e9248acda8c70df58fabc8de23195c19a0cf Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Wed, 22 May 2024 16:50:47 +0800
|
||||||
|
Subject: [PATCH 085/157] mdadm/tests: 03r5assemV1
|
||||||
|
|
||||||
|
dcc22ae74a864 ('super1: remove support for name= in config') already
|
||||||
|
removes name= support. So remove related test codes in 03r5assemV1.
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
tests/03r5assemV1 | 17 -----------------
|
||||||
|
1 file changed, 17 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/tests/03r5assemV1 b/tests/03r5assemV1
|
||||||
|
index bca0c583..6026011e 100644
|
||||||
|
--- a/tests/03r5assemV1
|
||||||
|
+++ b/tests/03r5assemV1
|
||||||
|
@@ -31,14 +31,6 @@ conf=$targetdir/mdadm.conf
|
||||||
|
mdadm -As -c $conf $md1
|
||||||
|
eval $tst
|
||||||
|
|
||||||
|
-{
|
||||||
|
- echo DEVICE $devlist
|
||||||
|
- echo array $md1 name=one
|
||||||
|
-} > $conf
|
||||||
|
-
|
||||||
|
-mdadm -As -c $conf
|
||||||
|
-eval $tst
|
||||||
|
-
|
||||||
|
{
|
||||||
|
echo DEVICE $devlist
|
||||||
|
echo array $md1 devices=$dev0,$dev1,$dev2,$dev3,$dev4
|
||||||
|
@@ -88,15 +80,6 @@ mdadm -As -c $conf $md1
|
||||||
|
check state U_U
|
||||||
|
eval $tst
|
||||||
|
|
||||||
|
-{
|
||||||
|
- echo DEVICE $devlist
|
||||||
|
- echo array $md1 name=one
|
||||||
|
-} > $conf
|
||||||
|
-
|
||||||
|
-mdadm -As -c $conf
|
||||||
|
-check state U_U
|
||||||
|
-eval $tst
|
||||||
|
-
|
||||||
|
{
|
||||||
|
echo DEVICE $devlist
|
||||||
|
echo array $md1 devices=$dev0,$dev1,$dev2
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
30
0086-mdadm-tests-remove-04r5swap.broken.patch
Normal file
30
0086-mdadm-tests-remove-04r5swap.broken.patch
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
From b9b8eaef49e075ce68846abb7cf0ca47c1ba9f2f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Wed, 22 May 2024 16:50:48 +0800
|
||||||
|
Subject: [PATCH 086/157] mdadm/tests: remove 04r5swap.broken
|
||||||
|
|
||||||
|
04r5swap can run successfully with kernel 6.9.0-rc4
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
tests/04r5swap.broken | 7 -------
|
||||||
|
1 file changed, 7 deletions(-)
|
||||||
|
delete mode 100644 tests/04r5swap.broken
|
||||||
|
|
||||||
|
diff --git a/tests/04r5swap.broken b/tests/04r5swap.broken
|
||||||
|
deleted file mode 100644
|
||||||
|
index e38987db..00000000
|
||||||
|
--- a/tests/04r5swap.broken
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,7 +0,0 @@
|
||||||
|
-always fails
|
||||||
|
-
|
||||||
|
-Fails with errors:
|
||||||
|
-
|
||||||
|
- mdadm: /dev/loop0 has no superblock - assembly aborted
|
||||||
|
-
|
||||||
|
- ERROR: no recovery happening
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
116
0087-tests-04update-metadata-skip-linear.patch
Normal file
116
0087-tests-04update-metadata-skip-linear.patch
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
From 9808f110c5aea5454e9f56b2b660612a57adb347 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Wed, 22 May 2024 16:50:49 +0800
|
||||||
|
Subject: [PATCH 087/157] tests/04update-metadata skip linear
|
||||||
|
|
||||||
|
Add one check that if kernel doesn't support linear/multipath, it can
|
||||||
|
skip linear/multipath testing.
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
test | 3 +++
|
||||||
|
tests/04update-metadata | 35 ++++++++++++++++++++---------------
|
||||||
|
tests/func.sh | 2 ++
|
||||||
|
3 files changed, 25 insertions(+), 15 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/test b/test
|
||||||
|
index 1fce6be2..f09994e7 100755
|
||||||
|
--- a/test
|
||||||
|
+++ b/test
|
||||||
|
@@ -17,6 +17,9 @@ devlist=
|
||||||
|
# device node will be /dev/md127 (127 is choosed by mdadm autumatically)
|
||||||
|
is_foreign="no"
|
||||||
|
|
||||||
|
+skipping_linear="no"
|
||||||
|
+skipping_multipath="no"
|
||||||
|
+
|
||||||
|
savelogs=0
|
||||||
|
exitonerror=1
|
||||||
|
ctrl_c_error=0
|
||||||
|
diff --git a/tests/04update-metadata b/tests/04update-metadata
|
||||||
|
index 2b72a303..c748770c 100644
|
||||||
|
--- a/tests/04update-metadata
|
||||||
|
+++ b/tests/04update-metadata
|
||||||
|
@@ -8,24 +8,29 @@ set -xe
|
||||||
|
|
||||||
|
dlist="$dev0 $dev1 $dev2 $dev3"
|
||||||
|
|
||||||
|
-for ls in linear/4 raid1/1 raid5/3 raid6/2
|
||||||
|
+if [ $skipping_linear == "yes" ]; then
|
||||||
|
+ level_list="raid1/1 raid5/3 raid6/2"
|
||||||
|
+else
|
||||||
|
+ level_list="linear/4 raid1/1 raid5/3 raid6/2"
|
||||||
|
+fi
|
||||||
|
+for ls in $level_list
|
||||||
|
do
|
||||||
|
- s=${ls#*/} l=${ls%/*}
|
||||||
|
- if [[ $l == 'raid1' ]]; then
|
||||||
|
- mdadm -CR --assume-clean -e 0.90 $md0 --level $l -n 4 $dlist
|
||||||
|
- else
|
||||||
|
- mdadm -CR --assume-clean -e 0.90 $md0 --level $l -n 4 -c 64 $dlist
|
||||||
|
- fi
|
||||||
|
- testdev $md0 $s 19904 64
|
||||||
|
- mdadm -S $md0
|
||||||
|
- mdadm -A $md0 --update=metadata $dlist
|
||||||
|
- testdev $md0 $s 19904 64 check
|
||||||
|
- mdadm -S $md0
|
||||||
|
+ s=${ls#*/} l=${ls%/*}
|
||||||
|
+ if [[ $l == 'raid1' ]]; then
|
||||||
|
+ mdadm -CR --assume-clean -e 0.90 $md0 --level $l -n 4 $dlist
|
||||||
|
+ else
|
||||||
|
+ mdadm -CR --assume-clean -e 0.90 $md0 --level $l -n 4 -c 64 $dlist
|
||||||
|
+ fi
|
||||||
|
+ testdev $md0 $s 19904 64
|
||||||
|
+ mdadm -S $md0
|
||||||
|
+ mdadm -A $md0 --update=metadata $dlist
|
||||||
|
+ testdev $md0 $s 19904 64 check
|
||||||
|
+ mdadm -S $md0
|
||||||
|
done
|
||||||
|
|
||||||
|
if mdadm -A $md0 --update=metadata $dlist
|
||||||
|
then echo >&2 should fail with v1.0 metadata
|
||||||
|
- exit 1
|
||||||
|
+ exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
mdadm -CR -e 0.90 $md0 --level=6 -n4 -c32 $dlist
|
||||||
|
@@ -33,7 +38,7 @@ mdadm -S $md0
|
||||||
|
|
||||||
|
if mdadm -A $md0 --update=metadata $dlist
|
||||||
|
then echo >&2 should fail during resync
|
||||||
|
- exit 1
|
||||||
|
+ exit 1
|
||||||
|
fi
|
||||||
|
mdadm -A $md0 $dlist
|
||||||
|
mdadm --wait $md0 || true
|
||||||
|
@@ -48,5 +53,5 @@ mdadm -S $md0
|
||||||
|
|
||||||
|
if mdadm -A $md0 --update=metadata $dlist
|
||||||
|
then echo >&2 should fail when bitmap present
|
||||||
|
- exit 1
|
||||||
|
+ exit 1
|
||||||
|
fi
|
||||||
|
diff --git a/tests/func.sh b/tests/func.sh
|
||||||
|
index cfe83e55..db55542d 100644
|
||||||
|
--- a/tests/func.sh
|
||||||
|
+++ b/tests/func.sh
|
||||||
|
@@ -125,6 +125,7 @@ check_env() {
|
||||||
|
MULTIPATH="yes"
|
||||||
|
if [ "$MULTIPATH" != "yes" ]; then
|
||||||
|
echo "test: skipping tests for multipath, which is removed in upstream 6.8+ kernels"
|
||||||
|
+ skipping_multipath="yes"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check whether to run linear tests
|
||||||
|
@@ -133,6 +134,7 @@ check_env() {
|
||||||
|
LINEAR="yes"
|
||||||
|
if [ "$LINEAR" != "yes" ]; then
|
||||||
|
echo "test: skipping tests for linear, which is removed in upstream 6.8+ kernels"
|
||||||
|
+ skipping_linear="yes"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
68
0088-mdadm-tests-05r5-internalbitmap.patch
Normal file
68
0088-mdadm-tests-05r5-internalbitmap.patch
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
From 7664a3851476cfcda931d35f495d03f51707bac9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Wed, 22 May 2024 16:50:50 +0800
|
||||||
|
Subject: [PATCH 088/157] mdadm/tests: 05r5-internalbitmap
|
||||||
|
|
||||||
|
It's not right to compare bitmap bits with a number after io comes.
|
||||||
|
Because maybe those bits are already flused. Remove the related
|
||||||
|
tests.
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
tests/05r5-internalbitmap | 21 +++++++++------------
|
||||||
|
1 file changed, 9 insertions(+), 12 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/tests/05r5-internalbitmap b/tests/05r5-internalbitmap
|
||||||
|
index 13dc5921..1a64482f 100644
|
||||||
|
--- a/tests/05r5-internalbitmap
|
||||||
|
+++ b/tests/05r5-internalbitmap
|
||||||
|
@@ -9,21 +9,20 @@ mdadm -S $md0
|
||||||
|
|
||||||
|
mdadm --assemble $md0 $dev1 $dev2 $dev3
|
||||||
|
testdev $md0 2 $mdsize1 512
|
||||||
|
-dirty1=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
sleep 4
|
||||||
|
-dirty2=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
+dirty1=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
|
||||||
|
-if [ $dirty1 -lt 400 -o $dirty2 -ne 0 ]
|
||||||
|
-then echo >&2 "ERROR bad 'dirty' counts: $dirty1 and $dirty2"
|
||||||
|
+if [ $dirty1 -ne 0 ]
|
||||||
|
+then echo >&2 "ERROR bad 'dirty' counts: $dirty1"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
mdadm $md0 -f $dev1
|
||||||
|
testdev $md0 2 $mdsize1 512
|
||||||
|
sleep 4
|
||||||
|
-dirty3=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
-if [ $dirty3 -lt 400 ]
|
||||||
|
+dirty2=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
+if [ $dirty2 -lt 400 ]
|
||||||
|
then
|
||||||
|
- echo >&2 "ERROR dirty count $dirty3 is too small"
|
||||||
|
+ echo >&2 "ERROR dirty count $dirty2 is too small"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
@@ -33,14 +32,12 @@ mdadm --assemble -R $md0 $dev2 $dev3
|
||||||
|
mdadm --zero $dev1 # force --add, not --re-add
|
||||||
|
mdadm $md0 --add $dev1
|
||||||
|
check recovery
|
||||||
|
-
|
||||||
|
-dirty4=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
check wait
|
||||||
|
sleep 4
|
||||||
|
-dirty5=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
+dirty3=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
|
||||||
|
-if [ $dirty4 -lt 400 -o $dirty5 -ne 0 ]
|
||||||
|
-then echo echo >&2 "ERROR bad 'dirty' counts at end: $dirty4 $dirty5"
|
||||||
|
+if [ $dirty3 -ne 0 ]
|
||||||
|
+then echo echo >&2 "ERROR bad 'dirty' counts at end: $dirty3"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
38
0089-mdadm-tests-06name-enhance.patch
Normal file
38
0089-mdadm-tests-06name-enhance.patch
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
From 6e7d850a57d40e18d525d0739a4f4226f6057d91 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Wed, 22 May 2024 16:50:52 +0800
|
||||||
|
Subject: [PATCH 089/157] mdadm/tests: 06name enhance
|
||||||
|
|
||||||
|
It needs to check hostname in metadata name if one array is
|
||||||
|
local. Add the check in this case.
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
tests/06name | 10 ++++++++--
|
||||||
|
1 file changed, 8 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/tests/06name b/tests/06name
|
||||||
|
index 86eaab69..c3213f6c 100644
|
||||||
|
--- a/tests/06name
|
||||||
|
+++ b/tests/06name
|
||||||
|
@@ -3,8 +3,14 @@ set -x
|
||||||
|
# create an array with a name
|
||||||
|
|
||||||
|
mdadm -CR $md0 -l0 -n2 --metadata=1 --name="Fred" $dev0 $dev1
|
||||||
|
-mdadm -E $dev0 | grep 'Name : Fred' > /dev/null || exit 1
|
||||||
|
-mdadm -D $md0 | grep 'Name : Fred' > /dev/null || exit 1
|
||||||
|
+
|
||||||
|
+if [ $is_foreign == "no" ]; then
|
||||||
|
+ mdadm -E $dev0 | grep "Name : $(hostname):Fred" > /dev/null || exit 1
|
||||||
|
+ mdadm -D $md0 | grep "Name : $(hostname):Fred" > /dev/null || exit 1
|
||||||
|
+else
|
||||||
|
+ mdadm -E $dev0 | grep "Name : Fred" > /dev/null || exit 1
|
||||||
|
+ mdadm -D $md0 | grep "Name : Fred" > /dev/null || exit 1
|
||||||
|
+fi
|
||||||
|
mdadm -S $md0
|
||||||
|
|
||||||
|
mdadm -A $md0 --name="Fred" $devlist
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
108
0090-mdadm-tests-07autoassemble.patch
Normal file
108
0090-mdadm-tests-07autoassemble.patch
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
From 63e99a49cc02cbe4d1777b477719078897fc8308 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Wed, 22 May 2024 16:50:53 +0800
|
||||||
|
Subject: [PATCH 090/157] mdadm/tests: 07autoassemble
|
||||||
|
|
||||||
|
This test is used to test stacked array auto assemble.
|
||||||
|
|
||||||
|
There are two different cases depends on if array is foreign or not.
|
||||||
|
If the array is foreign, the stacked array (md0 is on md1 and md2)
|
||||||
|
can't be assembled with name md0. Because udev rule will run when md1
|
||||||
|
and md2 are assembled and mdadm -I doesn't specify homehost. So it
|
||||||
|
will treat stacked array (md0) as foreign array and choose md127 as
|
||||||
|
the device node name (/dev/md127)
|
||||||
|
|
||||||
|
Add the case that stacked array is local.
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
test | 2 ++
|
||||||
|
tests/07autoassemble | 37 +++++++++++++++++++++++++++++++++++--
|
||||||
|
tests/07autoassemble.broken | 8 --------
|
||||||
|
3 files changed, 37 insertions(+), 10 deletions(-)
|
||||||
|
delete mode 100644 tests/07autoassemble.broken
|
||||||
|
|
||||||
|
diff --git a/test b/test
|
||||||
|
index f09994e7..4a88de58 100755
|
||||||
|
--- a/test
|
||||||
|
+++ b/test
|
||||||
|
@@ -39,6 +39,8 @@ md2=/dev/md2
|
||||||
|
# if user doesn't specify minor number, mdadm chooses minor number
|
||||||
|
# automatically from 127.
|
||||||
|
md127=/dev/md127
|
||||||
|
+md126=/dev/md126
|
||||||
|
+md125=/dev/md125
|
||||||
|
mdp0=/dev/md_d0
|
||||||
|
mdp1=/dev/md_d1
|
||||||
|
|
||||||
|
diff --git a/tests/07autoassemble b/tests/07autoassemble
|
||||||
|
index e689be7c..9dc78149 100644
|
||||||
|
--- a/tests/07autoassemble
|
||||||
|
+++ b/tests/07autoassemble
|
||||||
|
@@ -10,7 +10,14 @@ mdadm -Ss
|
||||||
|
mdadm -As -c /dev/null --homehost=testing -vvv
|
||||||
|
testdev $md1 1 $mdsize1a 64
|
||||||
|
testdev $md2 1 $mdsize1a 64
|
||||||
|
-testdev $md0 2 $mdsize11a 512
|
||||||
|
+# md1 and md2 will be incremental assemble by udev rule. And
|
||||||
|
+# the testing machines' hostname is not testing. The md0 will
|
||||||
|
+# be considered as a foreign array. It can use 0 as metadata
|
||||||
|
+# name. md127 will be used
|
||||||
|
+testdev $md127 2 $mdsize11a 512
|
||||||
|
+mdadm --stop $md127
|
||||||
|
+mdadm --zero-superblock $md1
|
||||||
|
+mdadm --zero-superblock $md2
|
||||||
|
mdadm -Ss
|
||||||
|
|
||||||
|
mdadm --zero-superblock $dev0 $dev1 $dev2 $dev3
|
||||||
|
@@ -20,5 +27,31 @@ mdadm -CR $md0 -l0 -n2 $md1 $dev2 --homehost=testing
|
||||||
|
mdadm -Ss
|
||||||
|
mdadm -As -c /dev/null --homehost=testing -vvv
|
||||||
|
testdev $md1 1 $mdsize1a 64
|
||||||
|
-testdev $md0 1 $[mdsize1a+mdsize11a] 512
|
||||||
|
+testdev $md127 1 $[mdsize1a+mdsize11a] 512
|
||||||
|
+mdadm --stop $md127
|
||||||
|
+mdadm --zero-superblock $md1
|
||||||
|
+mdadm -Ss
|
||||||
|
+
|
||||||
|
+# Don't specify homehost when creating raid and use the test
|
||||||
|
+# machine's homehost. For super1.2, if homehost name's length
|
||||||
|
+# is > 32, it doesn't use homehost name in metadata name and
|
||||||
|
+# the array will be treated as foreign array
|
||||||
|
+mdadm --zero-superblock $dev0 $dev1 $dev2 $dev3
|
||||||
|
+mdadm -CR $md1 -l1 -n2 $dev0 $dev1
|
||||||
|
+mdadm -CR $md2 -l1 -n2 $dev2 $dev3
|
||||||
|
+mdadm -CR $md0 -l0 -n2 $md1 $md2
|
||||||
|
+mdadm -Ss
|
||||||
|
+mdadm -As -c /dev/null
|
||||||
|
+if [ $is_foreign == "yes" ]; then
|
||||||
|
+ # md127 is md1
|
||||||
|
+ testdev $md127 1 $mdsize1a 64
|
||||||
|
+ # md126 is md0, udev rule incremental assemble it
|
||||||
|
+ testdev $md126 2 $mdsize11a 512
|
||||||
|
+ # md125 is md2
|
||||||
|
+ testdev $md125 1 $mdsize1a 64
|
||||||
|
+else
|
||||||
|
+ testdev $md1 1 $mdsize1a 64
|
||||||
|
+ testdev $md2 1 $mdsize1a 64
|
||||||
|
+ testdev $md0 2 $mdsize11a 512
|
||||||
|
+fi
|
||||||
|
mdadm -Ss
|
||||||
|
diff --git a/tests/07autoassemble.broken b/tests/07autoassemble.broken
|
||||||
|
deleted file mode 100644
|
||||||
|
index 8be09407..00000000
|
||||||
|
--- a/tests/07autoassemble.broken
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,8 +0,0 @@
|
||||||
|
-always fails
|
||||||
|
-
|
||||||
|
-Prints lots of messages, but the array doesn't assemble. Error
|
||||||
|
-possibly related to:
|
||||||
|
-
|
||||||
|
- mdadm: /dev/md/1 is busy - skipping
|
||||||
|
- mdadm: no recogniseable superblock on /dev/md/testing:0
|
||||||
|
- mdadm: /dev/md/2 is busy - skipping
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
28
0091-mdadm-tests-07autodetect.broken-can-be-removed.patch
Normal file
28
0091-mdadm-tests-07autodetect.broken-can-be-removed.patch
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
From 1d0c61f4baa49bc218687017ccb2e3a664351390 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Wed, 22 May 2024 16:50:54 +0800
|
||||||
|
Subject: [PATCH 091/157] mdadm/tests: 07autodetect.broken can be removed
|
||||||
|
|
||||||
|
07autodetect can run successfully without error in kernel 6.9.0-rc5.
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
tests/07autodetect.broken | 5 -----
|
||||||
|
1 file changed, 5 deletions(-)
|
||||||
|
delete mode 100644 tests/07autodetect.broken
|
||||||
|
|
||||||
|
diff --git a/tests/07autodetect.broken b/tests/07autodetect.broken
|
||||||
|
deleted file mode 100644
|
||||||
|
index 294954a1..00000000
|
||||||
|
--- a/tests/07autodetect.broken
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,5 +0,0 @@
|
||||||
|
-always fails
|
||||||
|
-
|
||||||
|
-Fails with error:
|
||||||
|
-
|
||||||
|
- ERROR: no resync happening
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
73
0092-mdadm-tests-07changelevelintr.patch
Normal file
73
0092-mdadm-tests-07changelevelintr.patch
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
From cd3b2350bef136b20c81190371fb0b60d62a0365 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Wed, 22 May 2024 16:50:55 +0800
|
||||||
|
Subject: [PATCH 092/157] mdadm/tests: 07changelevelintr
|
||||||
|
|
||||||
|
It needs to specify a 2 powered array size when updating array size.
|
||||||
|
If not, it can't change chunksize.
|
||||||
|
|
||||||
|
And sometimes it reports error reshape doesn't happen. In fact the
|
||||||
|
reshape has finished. It doesn't need to wait before checking
|
||||||
|
reshape action. Because check function waits itself.
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
tests/07changelevelintr | 9 +++++----
|
||||||
|
tests/07changelevelintr.broken | 9 ---------
|
||||||
|
2 files changed, 5 insertions(+), 13 deletions(-)
|
||||||
|
delete mode 100644 tests/07changelevelintr.broken
|
||||||
|
|
||||||
|
diff --git a/tests/07changelevelintr b/tests/07changelevelintr
|
||||||
|
index 18c63092..d921f2b2 100644
|
||||||
|
--- a/tests/07changelevelintr
|
||||||
|
+++ b/tests/07changelevelintr
|
||||||
|
@@ -27,11 +27,9 @@ checkgeo() {
|
||||||
|
}
|
||||||
|
|
||||||
|
restart() {
|
||||||
|
- sleep 0.5
|
||||||
|
check reshape
|
||||||
|
mdadm -S $md0
|
||||||
|
mdadm -A $md0 $devs --backup-file=$bu
|
||||||
|
- sleep 0.5
|
||||||
|
check reshape
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -49,13 +47,16 @@ mdadm -G $md0 --layout rs --backup-file=$bu
|
||||||
|
restart
|
||||||
|
checkgeo md0 raid5 5 $[128*1024] 3
|
||||||
|
|
||||||
|
-mdadm -G $md0 --array-size 58368
|
||||||
|
+# It needs to shrink array size first. Choose a value that
|
||||||
|
+# is power of 2 for array size. If not, it can't change
|
||||||
|
+# chunk size.
|
||||||
|
+mdadm -G $md0 --array-size 51200
|
||||||
|
mdadm -G $md0 --raid-disks 4 -c 64 --backup-file=$bu
|
||||||
|
restart
|
||||||
|
checkgeo md0 raid5 4 $[64*1024] 3
|
||||||
|
|
||||||
|
devs="$dev0 $dev1 $dev2 $dev3"
|
||||||
|
-mdadm -G $md0 --array-size 19456
|
||||||
|
+mdadm -G $md0 --array-size 18432
|
||||||
|
mdadm -G $md0 -n 2 -c 256 --backup-file=$bu
|
||||||
|
restart
|
||||||
|
checkgeo md0 raid5 2 $[256*1024] 3
|
||||||
|
diff --git a/tests/07changelevelintr.broken b/tests/07changelevelintr.broken
|
||||||
|
deleted file mode 100644
|
||||||
|
index 284b4906..00000000
|
||||||
|
--- a/tests/07changelevelintr.broken
|
||||||
|
+++ /dev/null
|
||||||
|
@@ -1,9 +0,0 @@
|
||||||
|
-always fails
|
||||||
|
-
|
||||||
|
-Fails with errors:
|
||||||
|
-
|
||||||
|
- mdadm: this change will reduce the size of the array.
|
||||||
|
- use --grow --array-size first to truncate array.
|
||||||
|
- e.g. mdadm --grow /dev/md0 --array-size 56832
|
||||||
|
-
|
||||||
|
- ERROR: no reshape happening
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
68
0093-mdadm-tests-disable-selinux.patch
Normal file
68
0093-mdadm-tests-disable-selinux.patch
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
From b914aa25ee1fe3e0bd97f58bdf2bfdd185992a79 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Wed, 22 May 2024 16:50:56 +0800
|
||||||
|
Subject: [PATCH 093/157] mdadm/tests: disable selinux
|
||||||
|
|
||||||
|
Sometimes systemd service fails because selinux. Disable selinux
|
||||||
|
during testing now. We can enable it in future when having a better
|
||||||
|
method.
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
test | 3 +++
|
||||||
|
tests/func.sh | 10 ++++++++++
|
||||||
|
2 files changed, 13 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/test b/test
|
||||||
|
index 4a88de58..47f53ad7 100755
|
||||||
|
--- a/test
|
||||||
|
+++ b/test
|
||||||
|
@@ -16,6 +16,8 @@ devlist=
|
||||||
|
# For example, /dev/md0 is created, stops it, then assemble it, the
|
||||||
|
# device node will be /dev/md127 (127 is choosed by mdadm autumatically)
|
||||||
|
is_foreign="no"
|
||||||
|
+#disable selinux
|
||||||
|
+sys_selinux="Permissive"
|
||||||
|
|
||||||
|
skipping_linear="no"
|
||||||
|
skipping_multipath="no"
|
||||||
|
@@ -351,6 +353,7 @@ main() {
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
+ restore_selinux
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/tests/func.sh b/tests/func.sh
|
||||||
|
index db55542d..b2e4d122 100644
|
||||||
|
--- a/tests/func.sh
|
||||||
|
+++ b/tests/func.sh
|
||||||
|
@@ -167,6 +167,15 @@ is_raid_foreign() {
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
+record_selinux() {
|
||||||
|
+ sys_selinux=`getenforce`
|
||||||
|
+ setenforce Permissive
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+restore_selinux() {
|
||||||
|
+ setenforce $sys_selinux
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
do_setup() {
|
||||||
|
trap cleanup 0 1 3 15
|
||||||
|
trap ctrl_c 2
|
||||||
|
@@ -247,6 +256,7 @@ do_setup() {
|
||||||
|
echo 0 > /sys/module/md_mod/parameters/start_ro
|
||||||
|
record_system_speed_limit
|
||||||
|
is_raid_foreign
|
||||||
|
+ record_selinux
|
||||||
|
}
|
||||||
|
|
||||||
|
# check various things
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
44
0094-mdadm-platform-intel-buffer-overflow-detected.patch
Normal file
44
0094-mdadm-platform-intel-buffer-overflow-detected.patch
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
From 827e1870f320545796d907f50af594e901399417 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Tue, 28 May 2024 16:44:39 +0800
|
||||||
|
Subject: [PATCH 094/157] mdadm/platform-intel: buffer overflow detected
|
||||||
|
|
||||||
|
mdadm -CR /dev/md0 -l1 -n2 /dev/nvme0n1 /dev/nvme2n1
|
||||||
|
*** buffer overflow detected ***: terminated
|
||||||
|
Aborted (core dumped)
|
||||||
|
|
||||||
|
It doesn't happen 100% and it depends on the building environment.
|
||||||
|
It can be fixed by replacing sprintf with snprintf.
|
||||||
|
|
||||||
|
Fixes: d835518b6b53 ('imsm: nvme multipath support')
|
||||||
|
Reported-by: Guang Wu <guazhang@redhat.com>
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
platform-intel.c | 4 ++--
|
||||||
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/platform-intel.c b/platform-intel.c
|
||||||
|
index 15a9fa5a..d6a53533 100644
|
||||||
|
--- a/platform-intel.c
|
||||||
|
+++ b/platform-intel.c
|
||||||
|
@@ -907,14 +907,14 @@ char *get_nvme_multipath_dev_hw_path(const char *dev_path)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
for (ent = readdir(dir); ent; ent = readdir(dir)) {
|
||||||
|
- char buf[strlen(dev_path) + strlen(ent->d_name) + 1];
|
||||||
|
+ char buf[PATH_MAX];
|
||||||
|
|
||||||
|
/* Check if dir is a controller, ignore namespaces*/
|
||||||
|
if (!(strncmp(ent->d_name, "nvme", 4) == 0) ||
|
||||||
|
(strrchr(ent->d_name, 'n') != &ent->d_name[0]))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
- sprintf(buf, "%s/%s", dev_path, ent->d_name);
|
||||||
|
+ snprintf(buf, PATH_MAX, "%s/%s", dev_path, ent->d_name);
|
||||||
|
rp = realpath(buf, NULL);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
279
0095-mdadm-tests-bitmap-cases-enhance.patch
Normal file
279
0095-mdadm-tests-bitmap-cases-enhance.patch
Normal file
@ -0,0 +1,279 @@
|
|||||||
|
From c006602b313e2f6062b51aad37d93dccd29649de Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Tue, 28 May 2024 21:51:47 +0800
|
||||||
|
Subject: [PATCH 095/157] mdadm/tests: bitmap cases enhance
|
||||||
|
|
||||||
|
It fails because bitmap dirty number is smaller than 400 sometimes. It's not
|
||||||
|
good to compare bitmap dirty bits with a number. It depends on the test
|
||||||
|
machine, it can flush soon before checking the number. So remove related codes.
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
tests/05r1-grow-internal | 11 ++++-------
|
||||||
|
tests/05r1-grow-internal-1 | 12 ++++--------
|
||||||
|
tests/05r1-internalbitmap | 22 ++++++++++------------
|
||||||
|
tests/05r1-internalbitmap-v1a | 22 ++++++++++------------
|
||||||
|
tests/05r1-internalbitmap-v1b | 23 ++++++++++-------------
|
||||||
|
tests/05r1-internalbitmap-v1c | 22 ++++++++++------------
|
||||||
|
6 files changed, 48 insertions(+), 64 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/tests/05r1-grow-internal b/tests/05r1-grow-internal
|
||||||
|
index 24b3aece..f7fff989 100644
|
||||||
|
--- a/tests/05r1-grow-internal
|
||||||
|
+++ b/tests/05r1-grow-internal
|
||||||
|
@@ -8,18 +8,15 @@ testdev $md0 1 $mdsize1a 64
|
||||||
|
|
||||||
|
#mdadm -E $dev1
|
||||||
|
mdadm --grow $md0 --bitmap=internal --bitmap-chunk=4 --delay=1 || { mdadm -X $dev2 ; exit 1; }
|
||||||
|
-dirty1=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
sleep 4
|
||||||
|
-dirty2=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
+dirty1=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
|
||||||
|
testdev $md0 1 $mdsize1a 64
|
||||||
|
-dirty3=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
sleep 4
|
||||||
|
-dirty4=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
+dirty2=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
|
||||||
|
-#echo $dirty1 $dirty2 $dirty3 $dirty4
|
||||||
|
-if [ $dirty2 -ne 0 -o $dirty4 -ne 0 -o $dirty3 -lt 400 ]
|
||||||
|
-then
|
||||||
|
+if [ $dirty1 -ne 0 -o $dirty2 -ne 0 ]
|
||||||
|
+then echo >&2 "ERROR bad 'dirty' counts: dirty1 $dirty1, dirty2 $dirty2"
|
||||||
|
echo bad dirty counts
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
diff --git a/tests/05r1-grow-internal-1 b/tests/05r1-grow-internal-1
|
||||||
|
index 2f0d8237..f0f8349f 100644
|
||||||
|
--- a/tests/05r1-grow-internal-1
|
||||||
|
+++ b/tests/05r1-grow-internal-1
|
||||||
|
@@ -8,19 +8,15 @@ testdev $md0 1 $mdsize1b 64
|
||||||
|
|
||||||
|
#mdadm -E $dev1
|
||||||
|
mdadm --grow $md0 --bitmap=internal --bitmap-chunk=4 --delay=1
|
||||||
|
-dirty1=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
sleep 4
|
||||||
|
-dirty2=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
+dirty1=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
|
||||||
|
testdev $md0 1 $mdsize1b 64
|
||||||
|
-dirty3=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
sleep 4
|
||||||
|
-dirty4=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
+dirty2=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
|
||||||
|
-#echo $dirty1 $dirty2 $dirty3 $dirty4
|
||||||
|
-if [ $dirty2 -ne 0 -o $dirty4 -ne 0 -o $dirty3 -lt 400 ]
|
||||||
|
-then
|
||||||
|
- echo bad dirty counts
|
||||||
|
+if [ $dirty1 -ne 0 -o $dirty2 -ne 0 ]
|
||||||
|
+then echo >&2 "ERROR bad 'dirty' counts: dirty1 $dirty1, dirty2 $dirty2"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
diff --git a/tests/05r1-internalbitmap b/tests/05r1-internalbitmap
|
||||||
|
index dd7232a7..f1a2843e 100644
|
||||||
|
--- a/tests/05r1-internalbitmap
|
||||||
|
+++ b/tests/05r1-internalbitmap
|
||||||
|
@@ -9,21 +9,20 @@ mdadm -S $md0
|
||||||
|
|
||||||
|
mdadm --assemble $md0 $dev1 $dev2
|
||||||
|
testdev $md0 1 $mdsize0 64
|
||||||
|
-dirty1=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
sleep 4
|
||||||
|
-dirty2=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
+dirty1=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
|
||||||
|
-if [ $dirty1 -lt 400 -o $dirty2 -ne 0 ]
|
||||||
|
-then echo >&2 "ERROR bad 'dirty' counts: $dirty1 and $dirty2"
|
||||||
|
+if [ $dirty1 -ne 0 ]
|
||||||
|
+then echo >&2 "ERROR bad 'dirty' counts: $dirty1"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
mdadm $md0 -f $dev1
|
||||||
|
testdev $md0 1 $mdsize0 64
|
||||||
|
sleep 4
|
||||||
|
-dirty3=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
-if [ $dirty3 -lt 400 ]
|
||||||
|
-then
|
||||||
|
- echo >&2 "ERROR dirty count $dirty3 is too small"
|
||||||
|
+total=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) bits.*/\1/p'`
|
||||||
|
+dirty2=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
+if [ $dirty2 -ne $total ]
|
||||||
|
+then echo >&2 "ERROR bad 'dirty' counts: total $total, dirty2 $dirty2"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
@@ -34,13 +33,12 @@ mdadm --zero-superblock $dev1
|
||||||
|
mdadm $md0 --add $dev1
|
||||||
|
check recovery
|
||||||
|
|
||||||
|
-dirty4=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
check wait
|
||||||
|
sleep 4
|
||||||
|
-dirty5=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
+dirty3=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
|
||||||
|
-if [ $dirty4 -lt 400 -o $dirty5 -ne 0 ]
|
||||||
|
-then echo echo >&2 "ERROR bad 'dirty' counts at end: $dirty4 $dirty5"
|
||||||
|
+if [ $dirty3 -ne 0 ]
|
||||||
|
+then echo >&2 "ERROR bad 'dirty' counts: $dirty3"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
diff --git a/tests/05r1-internalbitmap-v1a b/tests/05r1-internalbitmap-v1a
|
||||||
|
index 3ddc082f..cf3f3972 100644
|
||||||
|
--- a/tests/05r1-internalbitmap-v1a
|
||||||
|
+++ b/tests/05r1-internalbitmap-v1a
|
||||||
|
@@ -10,21 +10,20 @@ mdadm -S $md0
|
||||||
|
|
||||||
|
mdadm --assemble $md0 $dev1 $dev2
|
||||||
|
testdev $md0 1 $mdsize1b 64
|
||||||
|
-dirty1=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
sleep 4
|
||||||
|
-dirty2=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
+dirty1=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
|
||||||
|
-if [ $dirty1 -lt 400 -o $dirty2 -ne 0 ]
|
||||||
|
-then echo >&2 "ERROR bad 'dirty' counts: $dirty1 and $dirty2"
|
||||||
|
+if [ $dirty1 -ne 0 ]
|
||||||
|
+then echo >&2 "ERROR bad 'dirty' counts: $dirty1"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
mdadm $md0 -f $dev1
|
||||||
|
testdev $md0 1 $mdsize1b 64
|
||||||
|
sleep 4
|
||||||
|
-dirty3=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
-if [ $dirty3 -lt 400 ]
|
||||||
|
-then
|
||||||
|
- echo >&2 "ERROR dirty count $dirty3 is too small"
|
||||||
|
+total=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) bits.*/\1/p'`
|
||||||
|
+dirty2=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
+if [ $dirty2 -ne $total ]
|
||||||
|
+then echo >&2 "ERROR bad 'dirty' counts: total $total, dirty2 $dirty2"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
@@ -35,13 +34,12 @@ mdadm --assemble -R $md0 $dev2
|
||||||
|
mdadm $md0 --add $dev1
|
||||||
|
check recovery
|
||||||
|
|
||||||
|
-dirty4=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
check wait
|
||||||
|
sleep 4
|
||||||
|
-dirty5=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
+dirty3=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
|
||||||
|
-if [ $dirty4 -lt 400 -o $dirty5 -ne 0 ]
|
||||||
|
-then echo echo >&2 "ERROR bad 'dirty' counts at end: $dirty4 $dirty5"
|
||||||
|
+if [ $dirty3 -ne 0 ]
|
||||||
|
+then echo >&2 "ERROR bad 'dirty' counts: $dirty3"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
diff --git a/tests/05r1-internalbitmap-v1b b/tests/05r1-internalbitmap-v1b
|
||||||
|
index 40f7abea..4952887e 100644
|
||||||
|
--- a/tests/05r1-internalbitmap-v1b
|
||||||
|
+++ b/tests/05r1-internalbitmap-v1b
|
||||||
|
@@ -11,21 +11,20 @@ mdadm -S $md0
|
||||||
|
mdadm --assemble $md0 $dev1 $dev2
|
||||||
|
check bitmap
|
||||||
|
testdev $md0 1 $mdsize11 64
|
||||||
|
-dirty1=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
sleep 4
|
||||||
|
-dirty2=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
+dirty1=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
|
||||||
|
-if [ $dirty1 -lt 400 -o $dirty2 -ne 0 ]
|
||||||
|
-then echo >&2 "ERROR bad 'dirty' counts: $dirty1 and $dirty2"
|
||||||
|
+if [ $dirty1 -ne 0 ]
|
||||||
|
+then echo >&2 "ERROR bad 'dirty' counts: $dirty1"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
mdadm $md0 -f $dev1
|
||||||
|
testdev $md0 1 $mdsize11 64
|
||||||
|
sleep 4
|
||||||
|
-dirty3=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
-if [ $dirty3 -lt 400 ]
|
||||||
|
-then
|
||||||
|
- echo >&2 "ERROR dirty count $dirty3 is too small"
|
||||||
|
+total=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) bits.*/\1/p'`
|
||||||
|
+dirty2=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
+if [ $dirty2 -ne $total ]
|
||||||
|
+then echo >&2 "ERROR bad 'dirty' counts: total $total, dirty2 $dirty2"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
@@ -35,14 +34,12 @@ mdadm --zero-superblock $dev1
|
||||||
|
mdadm --assemble -R $md0 $dev2
|
||||||
|
mdadm $md0 --add $dev1
|
||||||
|
check recovery
|
||||||
|
-
|
||||||
|
-dirty4=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
check wait
|
||||||
|
sleep 4
|
||||||
|
-dirty5=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
+dirty3=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
|
||||||
|
-if [ $dirty4 -lt 400 -o $dirty5 -ne 0 ]
|
||||||
|
-then echo echo >&2 "ERROR bad 'dirty' counts at end: $dirty4 $dirty5"
|
||||||
|
+if [ $dirty3 -ne 0 ]
|
||||||
|
+then echo >&2 "ERROR bad 'dirty' counts: $dirty3"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
diff --git a/tests/05r1-internalbitmap-v1c b/tests/05r1-internalbitmap-v1c
|
||||||
|
index 2eaea59b..e1e4472f 100644
|
||||||
|
--- a/tests/05r1-internalbitmap-v1c
|
||||||
|
+++ b/tests/05r1-internalbitmap-v1c
|
||||||
|
@@ -10,21 +10,20 @@ mdadm -S $md0
|
||||||
|
|
||||||
|
mdadm --assemble $md0 $dev1 $dev2
|
||||||
|
testdev $md0 1 $mdsize12 64
|
||||||
|
-dirty1=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
sleep 4
|
||||||
|
-dirty2=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
+dirty1=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
|
||||||
|
-if [ $dirty1 -lt 400 -o $dirty2 -ne 0 ]
|
||||||
|
-then echo >&2 "ERROR bad 'dirty' counts: $dirty1 and $dirty2"
|
||||||
|
+if [ $dirty1 -ne 0 ]
|
||||||
|
+then echo >&2 "ERROR bad 'dirty' counts: $dirty1"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
mdadm $md0 -f $dev1
|
||||||
|
testdev $md0 1 $mdsize12 64
|
||||||
|
sleep 4
|
||||||
|
-dirty3=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
-if [ $dirty3 -lt 400 ]
|
||||||
|
-then
|
||||||
|
- echo >&2 "ERROR dirty count $dirty3 is too small"
|
||||||
|
+total=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) bits.*/\1/p'`
|
||||||
|
+dirty2=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
+if [ $dirty2 -ne $total ]
|
||||||
|
+then echo >&2 "ERROR bad 'dirty' counts: total $total, dirty2 $dirty2"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
@@ -35,13 +34,12 @@ mdadm --assemble -R $md0 $dev2
|
||||||
|
mdadm $md0 --add $dev1
|
||||||
|
check recovery
|
||||||
|
|
||||||
|
-dirty4=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
check wait
|
||||||
|
sleep 4
|
||||||
|
-dirty5=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
+dirty3=`mdadm -X $dev2 | sed -n -e 's/.*Bitmap.* \([0-9]*\) dirty.*/\1/p'`
|
||||||
|
|
||||||
|
-if [ $dirty4 -lt 400 -o $dirty5 -ne 0 ]
|
||||||
|
-then echo echo >&2 "ERROR bad 'dirty' counts at end: $dirty4 $dirty5"
|
||||||
|
+if [ $dirty3 -ne 0 ]
|
||||||
|
+then echo >&2 "ERROR bad 'dirty' counts: $dirty3"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
39
0096-mdadm-tests-04update-uuid.patch
Normal file
39
0096-mdadm-tests-04update-uuid.patch
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
From 19cde79fda386329f69ead15ca6ae26527fab707 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Tue, 28 May 2024 21:51:48 +0800
|
||||||
|
Subject: [PATCH 096/157] mdadm/tests: 04update-uuid
|
||||||
|
|
||||||
|
Patch 50b100768a11('mdadm: deprecate bitmap custom file') needs to confirm when
|
||||||
|
creating raid device with bitmap file.
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
tests/04update-uuid | 4 ++--
|
||||||
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/tests/04update-uuid b/tests/04update-uuid
|
||||||
|
index a4409e78..25314ab5 100644
|
||||||
|
--- a/tests/04update-uuid
|
||||||
|
+++ b/tests/04update-uuid
|
||||||
|
@@ -25,7 +25,7 @@ mdadm -S /dev/md0
|
||||||
|
|
||||||
|
# now if we have a bitmap, that needs updating too.
|
||||||
|
rm -f $targetdir/bitmap
|
||||||
|
-mdadm -CR --assume-clean -b $targetdir/bitmap $md0 -l5 -n3 $dev0 $dev1 $dev2
|
||||||
|
+yes | mdadm -CR --assume-clean -b $targetdir/bitmap $md0 -l5 -n3 $dev0 $dev1 $dev2
|
||||||
|
mdadm -S /dev/md0
|
||||||
|
mdadm -A /dev/md0 -b $targetdir/bitmap --update=uuid --uuid=0123456789abcdef:fedcba9876543210 $dev0 $dev1 $dev2
|
||||||
|
no_errors
|
||||||
|
@@ -41,7 +41,7 @@ mdadm -S /dev/md0
|
||||||
|
|
||||||
|
# and bitmap for version1
|
||||||
|
rm -f $targetdir/bitmap
|
||||||
|
-mdadm -CR --assume-clean -e1.1 -b $targetdir/bitmap $md0 -l5 -n3 $dev0 $dev1 $dev2
|
||||||
|
+yes | mdadm -CR --assume-clean -e1.1 -b $targetdir/bitmap $md0 -l5 -n3 $dev0 $dev1 $dev2
|
||||||
|
mdadm -S /dev/md0
|
||||||
|
mdadm -A /dev/md0 -b $targetdir/bitmap --update=uuid --uuid=0123456789abcdef:fedcba9876543210 $dev0 $dev1 $dev2
|
||||||
|
no_errors
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
30
0097-mdadm-tests-05r1-re-add-nosuper.patch
Normal file
30
0097-mdadm-tests-05r1-re-add-nosuper.patch
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
From c36477fac2e485fd294e5cb48d411b548c654f30 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Tue, 28 May 2024 21:51:49 +0800
|
||||||
|
Subject: [PATCH 097/157] mdadm/tests: 05r1-re-add-nosuper
|
||||||
|
|
||||||
|
Patch 50b100768a11('mdadm: deprecate bitmap custom file') needs to confirm when
|
||||||
|
creating raid device with bitmap file.
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
tests/05r1-re-add-nosuper | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/tests/05r1-re-add-nosuper b/tests/05r1-re-add-nosuper
|
||||||
|
index 058d602d..7d41fd7b 100644
|
||||||
|
--- a/tests/05r1-re-add-nosuper
|
||||||
|
+++ b/tests/05r1-re-add-nosuper
|
||||||
|
@@ -6,7 +6,7 @@
|
||||||
|
#
|
||||||
|
bmf=$targetdir/bitmap2
|
||||||
|
rm -f $bmf
|
||||||
|
-mdadm -B $md0 -l1 -n2 -b$bmf -d1 $dev1 $dev2
|
||||||
|
+yes | mdadm -B $md0 -l1 -n2 -b$bmf -d1 $dev1 $dev2
|
||||||
|
check resync
|
||||||
|
check wait
|
||||||
|
testdev $md0 1 $size 1
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
44
0098-mdadm-tests-remove-strace-test.patch
Normal file
44
0098-mdadm-tests-remove-strace-test.patch
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
From c5a4fe7874f94b3f172027043f9a94b037f4d4dd Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Tue, 28 May 2024 21:51:50 +0800
|
||||||
|
Subject: [PATCH 098/157] mdadm/tests: remove strace test
|
||||||
|
|
||||||
|
Some tests will fail if the test env doesn't have strace
|
||||||
|
commands. So remove the dependency.
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
tests/07revert-grow | 2 +-
|
||||||
|
tests/07revert-inplace | 2 +-
|
||||||
|
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/tests/07revert-grow b/tests/07revert-grow
|
||||||
|
index c8c4e855..333483dc 100644
|
||||||
|
--- a/tests/07revert-grow
|
||||||
|
+++ b/tests/07revert-grow
|
||||||
|
@@ -43,7 +43,7 @@ testdev $md0 2 $mdsize1 512
|
||||||
|
mdadm -G $md0 -n 5
|
||||||
|
sleep 3
|
||||||
|
mdadm -S $md0
|
||||||
|
-strace -o /tmp/str ./mdadm -A $md0 --update=revert-reshape $devlist4
|
||||||
|
+mdadm -A $md0 --update=revert-reshape $devlist4
|
||||||
|
check wait
|
||||||
|
check raid10
|
||||||
|
testdev $md0 2 $mdsize1 512
|
||||||
|
diff --git a/tests/07revert-inplace b/tests/07revert-inplace
|
||||||
|
index a73eb977..776324ac 100644
|
||||||
|
--- a/tests/07revert-inplace
|
||||||
|
+++ b/tests/07revert-inplace
|
||||||
|
@@ -37,7 +37,7 @@ testdev $md0 3 $mdsize1 64
|
||||||
|
mdadm -G $md0 -c 32
|
||||||
|
sleep 2
|
||||||
|
mdadm -S $md0
|
||||||
|
-strace -o /tmp/str ./mdadm -A $md0 --update=revert-reshape $devlist5
|
||||||
|
+mdadm -A $md0 --update=revert-reshape $devlist5
|
||||||
|
check wait
|
||||||
|
check raid10
|
||||||
|
testdev $md0 3 $mdsize1 64
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
@ -0,0 +1,37 @@
|
|||||||
|
From 9dbd11e091f84eb0bf9d717283774816c4c4453d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
Date: Tue, 21 May 2024 16:26:33 +0200
|
||||||
|
Subject: [PATCH 099/157] mdadm.h: provide basename if GLIBC is not avialable
|
||||||
|
|
||||||
|
If GNU basename is not avilable, define it. It is safer to use that
|
||||||
|
rather than include libgen.h with XPG basename() definition.
|
||||||
|
|
||||||
|
Fixes:#12
|
||||||
|
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
mdadm.h | 8 ++++++++
|
||||||
|
1 file changed, 8 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/mdadm.h b/mdadm.h
|
||||||
|
index 40818941..e9f764a2 100644
|
||||||
|
--- a/mdadm.h
|
||||||
|
+++ b/mdadm.h
|
||||||
|
@@ -223,6 +223,14 @@ struct dlm_lksb {
|
||||||
|
struct __una_u16 { __u16 x; } __attribute__ ((packed));
|
||||||
|
struct __una_u32 { __u32 x; } __attribute__ ((packed));
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * Ensure GNU basename behavior on GLIBC less systems.
|
||||||
|
+ */
|
||||||
|
+#ifndef __GLIBC__
|
||||||
|
+#define basename(path) \
|
||||||
|
+ (strrchr((path), '/') ? strrchr((path),'/') + 1 : (path))
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
static inline __u16 __get_unaligned16(const void *p)
|
||||||
|
{
|
||||||
|
const struct __una_u16 *ptr = (const struct __una_u16 *)p;
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
@ -0,0 +1,79 @@
|
|||||||
|
From 46f19270265fe54cda1c728cb156b755273b4ab6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
Date: Thu, 23 May 2024 12:06:36 +0200
|
||||||
|
Subject: [PATCH 100/157] imsm: fix first volume autolayout with
|
||||||
|
IMSM_NO_PLATFORM
|
||||||
|
|
||||||
|
Autolayout_imsm() is not executed if IMSM_NO_PLATFORM=1 is set.
|
||||||
|
This causes that first volume cannot be created. Disk for new volume are
|
||||||
|
never configured.
|
||||||
|
|
||||||
|
Fix it by making autolayout_imsm() independent from super->orom because
|
||||||
|
NULL there means that IMSM_NO_PLATFORM=1 is set. There are not platform
|
||||||
|
restrictions to create volume, we just analyze drives. It is safe.
|
||||||
|
|
||||||
|
Fixes: 6d4d9ab295de ("imsm: use same slot across container")
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
super-intel.c | 18 +++++++++---------
|
||||||
|
1 file changed, 9 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/super-intel.c b/super-intel.c
|
||||||
|
index 0287a618..29652196 100644
|
||||||
|
--- a/super-intel.c
|
||||||
|
+++ b/super-intel.c
|
||||||
|
@@ -7706,9 +7706,11 @@ static int validate_geometry_imsm(struct supertype *st, int level, int layout,
|
||||||
|
char *dev, unsigned long long *freesize,
|
||||||
|
int consistency_policy, int verbose)
|
||||||
|
{
|
||||||
|
- int fd, cfd;
|
||||||
|
+ struct intel_super *super = st->sb;
|
||||||
|
struct mdinfo *sra;
|
||||||
|
int is_member = 0;
|
||||||
|
+ imsm_status_t rv;
|
||||||
|
+ int fd, cfd;
|
||||||
|
|
||||||
|
/* load capability
|
||||||
|
* if given unused devices create a container
|
||||||
|
@@ -7733,11 +7735,10 @@ static int validate_geometry_imsm(struct supertype *st, int level, int layout,
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!dev) {
|
||||||
|
- struct intel_super *super = st->sb;
|
||||||
|
-
|
||||||
|
/*
|
||||||
|
* Autolayout mode, st->sb must be set.
|
||||||
|
*/
|
||||||
|
+
|
||||||
|
if (!super) {
|
||||||
|
pr_vrb("superblock must be set for autolayout, aborting\n");
|
||||||
|
return 0;
|
||||||
|
@@ -7749,20 +7750,19 @@ static int validate_geometry_imsm(struct supertype *st, int level, int layout,
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (super->orom && freesize) {
|
||||||
|
- imsm_status_t rv;
|
||||||
|
- int count = count_volumes(super->hba, super->orom->dpa,
|
||||||
|
- verbose);
|
||||||
|
+ int count = count_volumes(super->hba, super->orom->dpa, verbose);
|
||||||
|
+
|
||||||
|
if (super->orom->vphba <= count) {
|
||||||
|
pr_vrb("platform does not support more than %d raid volumes.\n",
|
||||||
|
super->orom->vphba);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- rv = autolayout_imsm(super, raiddisks, size, *chunk,
|
||||||
|
- freesize);
|
||||||
|
+ rv = autolayout_imsm(super, raiddisks, size, *chunk, freesize);
|
||||||
|
if (rv != IMSM_STATUS_OK)
|
||||||
|
return 0;
|
||||||
|
- }
|
||||||
|
+
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (st->sb) {
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
50
0101-imsm-make-freesize-required-to-volume-autolayout.patch
Normal file
50
0101-imsm-make-freesize-required-to-volume-autolayout.patch
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
From 4f3efc34644d06f55fc650e4aa6b5a6ec22cea5f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kinga Stefaniuk <kinga.stefaniuk@intel.com>
|
||||||
|
Date: Tue, 11 Jun 2024 07:58:49 +0200
|
||||||
|
Subject: [PATCH 101/157] imsm: make freesize required to volume autolayout
|
||||||
|
|
||||||
|
Autolayout_imsm() shall be executed when IMSM_NO_PLATFORM=1 is set.
|
||||||
|
It was fixed by listed commit, checking super->orom was removed, but
|
||||||
|
also checking freesize. Freesize is not set for operations on RAID
|
||||||
|
volume with no size update, that's why it is not required to have
|
||||||
|
this value and always run autolayout_imsm().
|
||||||
|
Fix it by making autolayout_imsm() dependent on freesize.
|
||||||
|
|
||||||
|
Fixes: 46f192 ("imsm: fix first volume autolayout with IMSM_NO_PLATFORM")
|
||||||
|
|
||||||
|
Signed-off-by: Kinga Stefaniuk <kinga.stefaniuk@intel.com>
|
||||||
|
---
|
||||||
|
super-intel.c | 10 ++++++----
|
||||||
|
1 file changed, 6 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/super-intel.c b/super-intel.c
|
||||||
|
index 29652196..ef3f5da1 100644
|
||||||
|
--- a/super-intel.c
|
||||||
|
+++ b/super-intel.c
|
||||||
|
@@ -7749,7 +7749,7 @@ static int validate_geometry_imsm(struct supertype *st, int level, int layout,
|
||||||
|
verbose))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
- if (super->orom && freesize) {
|
||||||
|
+ if (super->orom) {
|
||||||
|
int count = count_volumes(super->hba, super->orom->dpa, verbose);
|
||||||
|
|
||||||
|
if (super->orom->vphba <= count) {
|
||||||
|
@@ -7759,9 +7759,11 @@ static int validate_geometry_imsm(struct supertype *st, int level, int layout,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- rv = autolayout_imsm(super, raiddisks, size, *chunk, freesize);
|
||||||
|
- if (rv != IMSM_STATUS_OK)
|
||||||
|
- return 0;
|
||||||
|
+ if (freesize) {
|
||||||
|
+ rv = autolayout_imsm(super, raiddisks, size, *chunk, freesize);
|
||||||
|
+ if (rv != IMSM_STATUS_OK)
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
@ -0,0 +1,86 @@
|
|||||||
|
From 1a5c0e60308651a20d25ff52511230a20d830330 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Logan Gunthorpe <logang@deltatee.com>
|
||||||
|
Date: Tue, 4 Jun 2024 10:38:36 -0600
|
||||||
|
Subject: [PATCH 102/157] mdadm: Fix hang race condition in
|
||||||
|
wait_for_zero_forks()
|
||||||
|
|
||||||
|
Running a create operation with --write-zeros can randomly hang
|
||||||
|
forever waiting for child processes. This happens roughly on in
|
||||||
|
ten runs with when running with small (20MB) loop devices.
|
||||||
|
|
||||||
|
The bug is caused by the fact that signals can be coallesced into
|
||||||
|
one if they are not read by signalfd quick enough. So if two children
|
||||||
|
finish at exactly the same time, only one SIGCHLD will be received
|
||||||
|
by the parent.
|
||||||
|
|
||||||
|
To fix this, wait on all processes with WNOHANG every time a SIGCHLD
|
||||||
|
is received and exit when all processes have been waited on.
|
||||||
|
|
||||||
|
Reported-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
Create.c | 28 +++++++++++++++-------------
|
||||||
|
1 file changed, 15 insertions(+), 13 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Create.c b/Create.c
|
||||||
|
index d033eb68..4f992a22 100644
|
||||||
|
--- a/Create.c
|
||||||
|
+++ b/Create.c
|
||||||
|
@@ -178,6 +178,7 @@ static int wait_for_zero_forks(int *zero_pids, int count)
|
||||||
|
bool interrupted = false;
|
||||||
|
sigset_t sigset;
|
||||||
|
ssize_t s;
|
||||||
|
+ pid_t pid;
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
|
if (zero_pids[i])
|
||||||
|
@@ -196,7 +197,7 @@ static int wait_for_zero_forks(int *zero_pids, int count)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
- while (1) {
|
||||||
|
+ while (wait_count) {
|
||||||
|
s = read(sfd, &fdsi, sizeof(fdsi));
|
||||||
|
if (s != sizeof(fdsi)) {
|
||||||
|
pr_err("Invalid signalfd read: %s\n", strerror(errno));
|
||||||
|
@@ -209,23 +210,24 @@ static int wait_for_zero_forks(int *zero_pids, int count)
|
||||||
|
pr_info("Interrupting zeroing processes, please wait...\n");
|
||||||
|
interrupted = true;
|
||||||
|
} else if (fdsi.ssi_signo == SIGCHLD) {
|
||||||
|
- if (!--wait_count)
|
||||||
|
- break;
|
||||||
|
+ for (i = 0; i < count; i++) {
|
||||||
|
+ if (!zero_pids[i])
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ pid = waitpid(zero_pids[i], &wstatus, WNOHANG);
|
||||||
|
+ if (pid <= 0)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ zero_pids[i] = 0;
|
||||||
|
+ if (!WIFEXITED(wstatus) || WEXITSTATUS(wstatus))
|
||||||
|
+ ret = 1;
|
||||||
|
+ wait_count--;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
close(sfd);
|
||||||
|
|
||||||
|
- for (i = 0; i < count; i++) {
|
||||||
|
- if (!zero_pids[i])
|
||||||
|
- continue;
|
||||||
|
-
|
||||||
|
- waitpid(zero_pids[i], &wstatus, 0);
|
||||||
|
- zero_pids[i] = 0;
|
||||||
|
- if (!WIFEXITED(wstatus) || WEXITSTATUS(wstatus))
|
||||||
|
- ret = 1;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
if (interrupted) {
|
||||||
|
pr_err("zeroing interrupted!\n");
|
||||||
|
return 1;
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
@ -0,0 +1,37 @@
|
|||||||
|
From 539ad6e6f9a067646a018d77582af0babf8e125e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Logan Gunthorpe <logang@deltatee.com>
|
||||||
|
Date: Tue, 4 Jun 2024 10:38:37 -0600
|
||||||
|
Subject: [PATCH 103/157] mdadm: Block SIGCHLD processes before starting
|
||||||
|
children
|
||||||
|
|
||||||
|
There is a small race condition noticed during code review, but
|
||||||
|
never actully hit in practice, with the write_zero feature.
|
||||||
|
|
||||||
|
If a write zeros fork finishes quickly before wait_for_zero_forks()
|
||||||
|
gets called, then the SIGCHLD will be delivered before the signalfd
|
||||||
|
is setup.
|
||||||
|
|
||||||
|
While this is only theoretical, fix this by blocking the SIGCHLD
|
||||||
|
signal before forking any children.
|
||||||
|
|
||||||
|
Signed-off-by: Logan Gunthorpe <logang@deltatee.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
Create.c | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
diff --git a/Create.c b/Create.c
|
||||||
|
index 4f992a22..bd4875e4 100644
|
||||||
|
--- a/Create.c
|
||||||
|
+++ b/Create.c
|
||||||
|
@@ -401,6 +401,7 @@ static int add_disks(int mdfd, struct mdinfo *info, struct shape *s,
|
||||||
|
*/
|
||||||
|
sigemptyset(&sigset);
|
||||||
|
sigaddset(&sigset, SIGINT);
|
||||||
|
+ sigaddset(&sigset, SIGCHLD);
|
||||||
|
sigprocmask(SIG_BLOCK, &sigset, &orig_sigset);
|
||||||
|
memset(zero_pids, 0, sizeof(zero_pids));
|
||||||
|
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
137
0104-test-pass-flags-to-services.patch
Normal file
137
0104-test-pass-flags-to-services.patch
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
From 29aa21d94bc7ff10f3f7ef0b7f490f3903f5c6fd Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mateusz Kusiak <mateusz.kusiak@intel.com>
|
||||||
|
Date: Fri, 15 Mar 2024 16:03:09 -0400
|
||||||
|
Subject: [PATCH 104/157] test: pass flags to services
|
||||||
|
|
||||||
|
Commit 4c12714d1ca0 ("test: run tests on system level mdadm") removed
|
||||||
|
MDADM_NO_SYSTEMCTL flag from test suite. This causes imsm tests to fail
|
||||||
|
as mdadm no longer triggers mdmon and flags exists only within session.
|
||||||
|
|
||||||
|
Use systemd set/unset-environment to pass necessary flags.
|
||||||
|
|
||||||
|
Introduce colors to grab users attention to warnings and key messages.
|
||||||
|
|
||||||
|
Make test suite setup systemd environment.
|
||||||
|
Add setup/clean_systemd_env() functions.
|
||||||
|
Warn user about altering systemd environment.
|
||||||
|
|
||||||
|
Add colors to success/fail messages and warnings.
|
||||||
|
|
||||||
|
Signed-off-by: Mateusz Kusiak <mateusz.kusiak@intel.com>
|
||||||
|
---
|
||||||
|
test | 8 +++-----
|
||||||
|
tests/func.sh | 46 +++++++++++++++++++++++++++++++++++++++++++++-
|
||||||
|
2 files changed, 48 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/test b/test
|
||||||
|
index 47f53ad7..3a05bc9b 100755
|
||||||
|
--- a/test
|
||||||
|
+++ b/test
|
||||||
|
@@ -127,7 +127,7 @@ do_test() {
|
||||||
|
dmesg | grep -iq "error\|call trace\|segfault" | grep -v "systemd" &&
|
||||||
|
die "dmesg prints errors when testing $_basename!"
|
||||||
|
fi
|
||||||
|
- echo "succeeded"
|
||||||
|
+ succeed "succeeded\n"
|
||||||
|
_fail=0
|
||||||
|
else
|
||||||
|
save_log fail
|
||||||
|
@@ -315,10 +315,8 @@ parse_args() {
|
||||||
|
}
|
||||||
|
|
||||||
|
print_warning() {
|
||||||
|
- cat <<-EOF
|
||||||
|
- Warning! Tests are performed on system level mdadm!
|
||||||
|
- If you want to test local build, you need to install it first!
|
||||||
|
- EOF
|
||||||
|
+ warn "Warning! Tests are performed on system level mdadm!\n"
|
||||||
|
+ echo "If you want to test local build, you need to install it first!"
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
diff --git a/tests/func.sh b/tests/func.sh
|
||||||
|
index b2e4d122..8c142c76 100644
|
||||||
|
--- a/tests/func.sh
|
||||||
|
+++ b/tests/func.sh
|
||||||
|
@@ -23,6 +23,28 @@ mdsize12=19988
|
||||||
|
# ddf needs bigger devices as 32Meg is reserved!
|
||||||
|
ddfsize=65536
|
||||||
|
|
||||||
|
+# Systemd flags
|
||||||
|
+devname_as_serial_flag="IMSM_DEVNAME_AS_SERIAL=1"
|
||||||
|
+no_platform_flag="IMSM_NO_PLATFORM=1"
|
||||||
|
+
|
||||||
|
+# Common colors
|
||||||
|
+COLOR_FAIL='\033[0;31m' #RED
|
||||||
|
+COLOR_WARN='\033[1;33m' #YELLOW
|
||||||
|
+COLOR_SUCCESS='\033[0;32m' #GREEN
|
||||||
|
+COLOR_NONE='\033[0m'
|
||||||
|
+
|
||||||
|
+fail() {
|
||||||
|
+ printf "${COLOR_FAIL}$1${COLOR_NONE}"
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+warn() {
|
||||||
|
+ printf "${COLOR_WARN}$1${COLOR_NONE}"
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+succeed() {
|
||||||
|
+ printf "${COLOR_SUCCESS}$1${COLOR_NONE}"
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
# $1 is optional parameter, it shows why to save log
|
||||||
|
save_log() {
|
||||||
|
status=$1
|
||||||
|
@@ -36,7 +58,8 @@ save_log() {
|
||||||
|
cat /proc/mdstat >> $logdir/$logfile
|
||||||
|
array=($(mdadm -Ds | cut -d' ' -f2))
|
||||||
|
[ "$1" == "fail" ] &&
|
||||||
|
- echo "FAILED - see $logdir/$_basename.log and $logdir/$logfile for details"
|
||||||
|
+ fail "FAILED"
|
||||||
|
+ echo " - see $logdir/$_basename.log and $logdir/$logfile for details\n"
|
||||||
|
if [ $DEVTYPE == 'lvm' ]
|
||||||
|
then
|
||||||
|
# not supported lvm type yet
|
||||||
|
@@ -86,6 +109,7 @@ cleanup() {
|
||||||
|
$mdadm --zero ${disks[@]} &> /dev/null
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
+ clean_systemd_env
|
||||||
|
}
|
||||||
|
|
||||||
|
do_clean()
|
||||||
|
@@ -176,11 +200,31 @@ restore_selinux() {
|
||||||
|
setenforce $sys_selinux
|
||||||
|
}
|
||||||
|
|
||||||
|
+setup_systemd_env() {
|
||||||
|
+ warn "Warning! Test suite will set up systemd environment!\n"
|
||||||
|
+ echo "Use \"systemctl show-environment\" to show systemd environment variables"
|
||||||
|
+ for env_var in $devname_as_serial_flag $no_platform_flag
|
||||||
|
+ do
|
||||||
|
+ systemctl set-environment $env_var
|
||||||
|
+ echo "Added $env_var" to systemd environment, use \
|
||||||
|
+ \"systemctl unset-environment $env_var\" to remove it.
|
||||||
|
+ done
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+clean_systemd_env() {
|
||||||
|
+ for env_var in $devname_as_serial_flag $no_platform_flag
|
||||||
|
+ do
|
||||||
|
+ systemctl unset-environment $env_var
|
||||||
|
+ echo "Removed $env_var from systemd environment."
|
||||||
|
+ done
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
do_setup() {
|
||||||
|
trap cleanup 0 1 3 15
|
||||||
|
trap ctrl_c 2
|
||||||
|
|
||||||
|
check_env
|
||||||
|
+ setup_systemd_env
|
||||||
|
[ -d $logdir ] || mkdir -p $logdir
|
||||||
|
|
||||||
|
devlist=
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
@ -0,0 +1,68 @@
|
|||||||
|
From 66a54b266f6c579e5f37b6253820903a55c3346c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Shminderjit Singh <shminderjit.singh@oracle.com>
|
||||||
|
Date: Tue, 4 Jun 2024 07:46:03 +0000
|
||||||
|
Subject: [PATCH 105/157] mdadm: Fix socket connection failure when mdmon runs
|
||||||
|
in foreground mode.
|
||||||
|
|
||||||
|
While creating an IMSM RAID, mdadm will wait for the mdmon main process
|
||||||
|
to finish if mdmon runs in forking mode. This is because with
|
||||||
|
"Type=forking" in the mdmon service unit file, "systemctl start service"
|
||||||
|
will block until the main process of mdmon exits. At that moment, mdmon
|
||||||
|
has already created the socket, so the subsequent socket connect from
|
||||||
|
mdadm will succeed.
|
||||||
|
|
||||||
|
However, when mdmon runs in foreground mode (without "Type=forking" in
|
||||||
|
the service unit file), "systemctl start service" will return once the
|
||||||
|
mdmon process starts. This causes mdadm and mdmon to run in parallel,
|
||||||
|
which may lead to a socket connection failure since mdmon has not yet
|
||||||
|
initialized the socket when mdadm tries to connect. If the next
|
||||||
|
instruction/command is to access this device and try to write to it, a
|
||||||
|
permission error will occur since mdmon has not yet set the array to RW
|
||||||
|
mode.
|
||||||
|
|
||||||
|
Signed-off-by: Shminderjit Singh <shminderjit.singh@oracle.com>
|
||||||
|
---
|
||||||
|
msg.c | 20 +++++++++++++++++++-
|
||||||
|
1 file changed, 19 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/msg.c b/msg.c
|
||||||
|
index ba0e25be..d17f679d 100644
|
||||||
|
--- a/msg.c
|
||||||
|
+++ b/msg.c
|
||||||
|
@@ -151,6 +151,7 @@ int connect_monitor(char *devname)
|
||||||
|
struct sockaddr_un addr;
|
||||||
|
int pos;
|
||||||
|
char *c;
|
||||||
|
+ int rv, retry_count = 0;
|
||||||
|
|
||||||
|
pos = sprintf(path, "%s/", MDMON_DIR);
|
||||||
|
if (is_subarray(devname)) {
|
||||||
|
@@ -170,7 +171,24 @@ int connect_monitor(char *devname)
|
||||||
|
|
||||||
|
addr.sun_family = PF_LOCAL;
|
||||||
|
strcpy(addr.sun_path, path);
|
||||||
|
- if (connect(sfd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
|
||||||
|
+
|
||||||
|
+ /* In foreground mode, when mdadm is trying to connect to control
|
||||||
|
+ * socket it is possible that the mdmon has not created it yet.
|
||||||
|
+ * Give some time to mdmon to create socket.
|
||||||
|
+ */
|
||||||
|
+ for (retry_count = 0; retry_count < 10; retry_count++) {
|
||||||
|
+ rv = connect(sfd, (struct sockaddr*)&addr, sizeof(addr));
|
||||||
|
+
|
||||||
|
+ if (rv < 0) {
|
||||||
|
+ sleep_for(0, MSEC_TO_NSEC(200), true);
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (rv < 0) {
|
||||||
|
+ pr_err("Failed to connect to control socket. (%s!!)\n",
|
||||||
|
+ strerror(errno));
|
||||||
|
close(sfd);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
50
0106-Makefile-Do-not-call-gcc-directly.patch
Normal file
50
0106-Makefile-Do-not-call-gcc-directly.patch
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
From 027b2d37a8cd56973d117107acc25a64cfe0a92f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Gwendal Grignou <gwendal@chromium.org>
|
||||||
|
Date: Wed, 15 May 2024 14:30:59 -0700
|
||||||
|
Subject: [PATCH 106/157] Makefile: Do not call gcc directly
|
||||||
|
|
||||||
|
When mdadm is compiled with clang, direct gcc will fail.
|
||||||
|
Make sure to use $(CC) variable instead.
|
||||||
|
|
||||||
|
Note that Clang does not support --help=warnings,
|
||||||
|
--print-diagnostic-options should be used instead.
|
||||||
|
So with Clang, the compilation will go through, but the
|
||||||
|
extra warning flags will never be added.
|
||||||
|
|
||||||
|
Signed-off-by: Gwendal Grignou <gwendal@chromium.org>
|
||||||
|
---
|
||||||
|
Makefile | 6 +++---
|
||||||
|
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Makefile b/Makefile
|
||||||
|
index 446710bd..3fe0a053 100644
|
||||||
|
--- a/Makefile
|
||||||
|
+++ b/Makefile
|
||||||
|
@@ -56,21 +56,21 @@ CWFLAGS += -Wp -O3
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(origin FALLTHROUGH), undefined)
|
||||||
|
- FALLTHROUGH := $(shell gcc -Q --help=warnings 2>&1 | grep "implicit-fallthrough" | wc -l)
|
||||||
|
+ FALLTHROUGH := $(shell $(CC) -Q --help=warnings 2>&1 | grep "implicit-fallthrough" | wc -l)
|
||||||
|
ifneq "$(FALLTHROUGH)" "0"
|
||||||
|
CWFLAGS += -Wimplicit-fallthrough=0
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(origin FORMATOVERFLOW), undefined)
|
||||||
|
- FORMATOVERFLOW := $(shell gcc -Q --help=warnings 2>&1 | grep "format-overflow" | wc -l)
|
||||||
|
+ FORMATOVERFLOW := $(shell $(CC) -Q --help=warnings 2>&1 | grep "format-overflow" | wc -l)
|
||||||
|
ifneq "$(FORMATOVERFLOW)" "0"
|
||||||
|
CWFLAGS += -Wformat-overflow
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(origin STRINGOPOVERFLOW), undefined)
|
||||||
|
- STRINGOPOVERFLOW := $(shell gcc -Q --help=warnings 2>&1 | grep "stringop-overflow" | wc -l)
|
||||||
|
+ STRINGOPOVERFLOW := $(shell $(CC) -Q --help=warnings 2>&1 | grep "stringop-overflow" | wc -l)
|
||||||
|
ifneq "$(STRINGOPOVERFLOW)" "0"
|
||||||
|
CWFLAGS += -Wstringop-overflow
|
||||||
|
endif
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
103
0107-mdadm-tests-judge-foreign-array-in-test-cases.patch
Normal file
103
0107-mdadm-tests-judge-foreign-array-in-test-cases.patch
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
From 23aef35113553cb97ef2e7b01c760d5449592e14 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Fri, 14 Jun 2024 10:45:01 +0800
|
||||||
|
Subject: [PATCH 107/157] mdadm/tests: judge foreign array in test cases
|
||||||
|
|
||||||
|
It needs to use array name when judging if one array is foreign or not.
|
||||||
|
So calling is_raid_foreign in test cases which need it.
|
||||||
|
|
||||||
|
Fixes: 41706a915684 ('mdadm/tests: names_template enhance')
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
tests/03assem-incr | 2 ++
|
||||||
|
tests/06name | 2 ++
|
||||||
|
tests/07autoassemble | 3 +++
|
||||||
|
tests/func.sh | 9 +++++----
|
||||||
|
tests/templates/names_template | 2 ++
|
||||||
|
5 files changed, 14 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/tests/03assem-incr b/tests/03assem-incr
|
||||||
|
index 21215a34..56afbf2c 100644
|
||||||
|
--- a/tests/03assem-incr
|
||||||
|
+++ b/tests/03assem-incr
|
||||||
|
@@ -12,6 +12,8 @@ if [ "$LINEAR" == "yes" ]; then
|
||||||
|
levels+=( linear )
|
||||||
|
fi
|
||||||
|
|
||||||
|
+is_raid_foreign $md0
|
||||||
|
+
|
||||||
|
for l in ${levels[@]}
|
||||||
|
do
|
||||||
|
mdadm -CR $md0 -l $l -n5 $dev0 $dev1 $dev2 $dev3 $dev4 --assume-clean
|
||||||
|
diff --git a/tests/06name b/tests/06name
|
||||||
|
index c3213f6c..9ec3437b 100644
|
||||||
|
--- a/tests/06name
|
||||||
|
+++ b/tests/06name
|
||||||
|
@@ -2,6 +2,8 @@ set -x
|
||||||
|
|
||||||
|
# create an array with a name
|
||||||
|
|
||||||
|
+is_raid_foreign $md0
|
||||||
|
+
|
||||||
|
mdadm -CR $md0 -l0 -n2 --metadata=1 --name="Fred" $dev0 $dev1
|
||||||
|
|
||||||
|
if [ $is_foreign == "no" ]; then
|
||||||
|
diff --git a/tests/07autoassemble b/tests/07autoassemble
|
||||||
|
index 9dc78149..b6630e17 100644
|
||||||
|
--- a/tests/07autoassemble
|
||||||
|
+++ b/tests/07autoassemble
|
||||||
|
@@ -2,6 +2,9 @@
|
||||||
|
# create two raid1s, build a raid0 on top, then
|
||||||
|
# tear it down and get auto-assemble to rebuild it.
|
||||||
|
|
||||||
|
+#the length of md0/md1/md2 is same. So use md0 here.
|
||||||
|
+is_raid_foreign $md0
|
||||||
|
+
|
||||||
|
mdadm -CR $md1 -l1 -n2 $dev0 $dev1 --homehost=testing
|
||||||
|
mdadm -CR $md2 -l1 -n2 $dev2 $dev3 --homehost=testing
|
||||||
|
mdadm -CR $md0 -l0 -n2 $md1 $md2 --homehost=testing
|
||||||
|
diff --git a/tests/func.sh b/tests/func.sh
|
||||||
|
index 8c142c76..e7ccc4fc 100644
|
||||||
|
--- a/tests/func.sh
|
||||||
|
+++ b/tests/func.sh
|
||||||
|
@@ -181,10 +181,12 @@ restore_system_speed_limit() {
|
||||||
|
|
||||||
|
is_raid_foreign() {
|
||||||
|
|
||||||
|
- # If the length of hostname is >= 32, super1 doesn't use
|
||||||
|
- # hostname in metadata
|
||||||
|
+ name=$1
|
||||||
|
+ # super1 uses this formula strlen(homehost)+1+strlen(name) < 32
|
||||||
|
+ # to decide if an array is foreign or local. It adds homehost if
|
||||||
|
+ # one array is local
|
||||||
|
hostname=$(hostname)
|
||||||
|
- if [ `expr length $(hostname)` -lt 32 ]; then
|
||||||
|
+ if [ `expr length "$(hostname)$name"` -lt 31 ]; then
|
||||||
|
is_foreign="no"
|
||||||
|
else
|
||||||
|
is_foreign="yes"
|
||||||
|
@@ -299,7 +301,6 @@ do_setup() {
|
||||||
|
[ -f /proc/mdstat ] || modprobe md_mod
|
||||||
|
echo 0 > /sys/module/md_mod/parameters/start_ro
|
||||||
|
record_system_speed_limit
|
||||||
|
- is_raid_foreign
|
||||||
|
record_selinux
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/tests/templates/names_template b/tests/templates/names_template
|
||||||
|
index 88ad5b8c..c94245ea 100644
|
||||||
|
--- a/tests/templates/names_template
|
||||||
|
+++ b/tests/templates/names_template
|
||||||
|
@@ -4,6 +4,8 @@ function names_create() {
|
||||||
|
local NAME=$2
|
||||||
|
local NEG_TEST=$3
|
||||||
|
|
||||||
|
+ is_raid_foreign $DEVNAME
|
||||||
|
+
|
||||||
|
if [[ -z "$NAME" ]]; then
|
||||||
|
mdadm -CR "$DEVNAME" -l0 -n 1 $dev0 --force
|
||||||
|
else
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
@ -0,0 +1,58 @@
|
|||||||
|
From f98340f1b830d950978abba752b2b9b004528faf Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
Date: Thu, 20 Jun 2024 15:22:50 +0200
|
||||||
|
Subject: [PATCH 108/157] Revert "mdadm: Fix socket connection failure when
|
||||||
|
mdmon runs in foreground mode."
|
||||||
|
|
||||||
|
This reverts commit 66a54b266f6c579e5f37b6253820903a55c3346c.
|
||||||
|
|
||||||
|
connect_monitor() is called from ping_monitor() but this function is often
|
||||||
|
used as advice, without verification that mdmon is really working. This
|
||||||
|
produces hangs in many scenarios.
|
||||||
|
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
msg.c | 20 +-------------------
|
||||||
|
1 file changed, 1 insertion(+), 19 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/msg.c b/msg.c
|
||||||
|
index d17f679d..f0772b3f 100644
|
||||||
|
--- a/msg.c
|
||||||
|
+++ b/msg.c
|
||||||
|
@@ -151,7 +151,6 @@ int connect_monitor(char *devname)
|
||||||
|
struct sockaddr_un addr;
|
||||||
|
int pos;
|
||||||
|
char *c;
|
||||||
|
- int rv, retry_count = 0;
|
||||||
|
|
||||||
|
pos = sprintf(path, "%s/", MDMON_DIR);
|
||||||
|
if (is_subarray(devname)) {
|
||||||
|
@@ -171,24 +170,7 @@ int connect_monitor(char *devname)
|
||||||
|
|
||||||
|
addr.sun_family = PF_LOCAL;
|
||||||
|
strcpy(addr.sun_path, path);
|
||||||
|
-
|
||||||
|
- /* In foreground mode, when mdadm is trying to connect to control
|
||||||
|
- * socket it is possible that the mdmon has not created it yet.
|
||||||
|
- * Give some time to mdmon to create socket.
|
||||||
|
- */
|
||||||
|
- for (retry_count = 0; retry_count < 10; retry_count++) {
|
||||||
|
- rv = connect(sfd, (struct sockaddr*)&addr, sizeof(addr));
|
||||||
|
-
|
||||||
|
- if (rv < 0) {
|
||||||
|
- sleep_for(0, MSEC_TO_NSEC(200), true);
|
||||||
|
- continue;
|
||||||
|
- }
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (rv < 0) {
|
||||||
|
- pr_err("Failed to connect to control socket. (%s!!)\n",
|
||||||
|
- strerror(errno));
|
||||||
|
+ if (connect(sfd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
|
||||||
|
close(sfd);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
149
0109-mdadm-Assemble.c-fix-coverity-issues.patch
Normal file
149
0109-mdadm-Assemble.c-fix-coverity-issues.patch
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
From 3e6358e9aa0618f6a7de3a58e545caaada03739f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Nigel Croxon <ncroxon@redhat.com>
|
||||||
|
Date: Tue, 25 Jun 2024 07:57:28 -0400
|
||||||
|
Subject: [PATCH 109/157] mdadm: Assemble.c fix coverity issues
|
||||||
|
|
||||||
|
Fixing the following coding errors the coverity tools found:
|
||||||
|
|
||||||
|
* Event dereference: Dereferencing "pre_exist", which is known to be "NULL".
|
||||||
|
* Event parameter_hidden: Declaration hides parameter "c".
|
||||||
|
* Event leaked_storage: Variable "pre_exist" going out of scope leaks the
|
||||||
|
storage it points to.
|
||||||
|
* Event leaked_storage: Variable "avail" going out of scope leaks the
|
||||||
|
storage it points to.
|
||||||
|
|
||||||
|
Signed-off-by: Nigel Croxon <ncroxon@redhat.com>
|
||||||
|
---
|
||||||
|
Assemble.c | 30 ++++++++++++++++++++++++------
|
||||||
|
1 file changed, 24 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Assemble.c b/Assemble.c
|
||||||
|
index 0e6da593..77f2b50e 100644
|
||||||
|
--- a/Assemble.c
|
||||||
|
+++ b/Assemble.c
|
||||||
|
@@ -567,6 +567,9 @@ static int select_devices(struct mddev_dev *devlist,
|
||||||
|
tmpdev->used = 1;
|
||||||
|
content = *contentp;
|
||||||
|
|
||||||
|
+ if (!st)
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
if (!st->sb) {
|
||||||
|
/* we need sb from one of the spares */
|
||||||
|
int dfd = dev_open(tmpdev->devname, O_RDONLY);
|
||||||
|
@@ -815,12 +818,12 @@ static int load_devices(struct devs *devices, char *devmap,
|
||||||
|
if (i >= bestcnt) {
|
||||||
|
int newbestcnt = i+10;
|
||||||
|
int *newbest = xmalloc(sizeof(int)*newbestcnt);
|
||||||
|
- int c;
|
||||||
|
- for (c=0; c < newbestcnt; c++)
|
||||||
|
- if (c < bestcnt)
|
||||||
|
- newbest[c] = best[c];
|
||||||
|
+ int cc;
|
||||||
|
+ for (cc = 0; cc < newbestcnt; cc++)
|
||||||
|
+ if (cc < bestcnt)
|
||||||
|
+ newbest[cc] = best[cc];
|
||||||
|
else
|
||||||
|
- newbest[c] = -1;
|
||||||
|
+ newbest[cc] = -1;
|
||||||
|
if (best)free(best);
|
||||||
|
best = newbest;
|
||||||
|
bestcnt = newbestcnt;
|
||||||
|
@@ -1493,8 +1496,11 @@ try_again:
|
||||||
|
mp = map_by_uuid(&map, content->uuid);
|
||||||
|
if (mp) {
|
||||||
|
struct mdinfo *dv;
|
||||||
|
- /* array already exists. */
|
||||||
|
pre_exist = sysfs_read(-1, mp->devnm, GET_LEVEL|GET_DEVS);
|
||||||
|
+ if (!pre_exist)
|
||||||
|
+ goto out;
|
||||||
|
+
|
||||||
|
+ /* array already exists. */
|
||||||
|
if (pre_exist->array.level != UnSet) {
|
||||||
|
pr_err("Found some drive for an array that is already active: %s\n",
|
||||||
|
mp->path);
|
||||||
|
@@ -1606,6 +1612,7 @@ try_again:
|
||||||
|
err = assemble_container_content(st, mdfd, content, c,
|
||||||
|
chosen_name, NULL);
|
||||||
|
close(mdfd);
|
||||||
|
+ sysfs_free(pre_exist);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1745,23 +1752,27 @@ try_again:
|
||||||
|
: (O_RDONLY|O_EXCL)))< 0) {
|
||||||
|
pr_err("Cannot open %s: %s\n",
|
||||||
|
devices[j].devname, strerror(errno));
|
||||||
|
+ free(avail);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
if (st->ss->load_super(st,fd, NULL)) {
|
||||||
|
close(fd);
|
||||||
|
pr_err("RAID superblock has disappeared from %s\n",
|
||||||
|
devices[j].devname);
|
||||||
|
+ free(avail);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
close(fd);
|
||||||
|
}
|
||||||
|
if (st->sb == NULL) {
|
||||||
|
pr_err("No suitable drives found for %s\n", mddev);
|
||||||
|
+ free(avail);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
st->ss->getinfo_super(st, content, NULL);
|
||||||
|
if (sysfs_init(content, mdfd, NULL)) {
|
||||||
|
pr_err("Unable to initialize sysfs\n");
|
||||||
|
+ free(avail);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1824,12 +1835,14 @@ try_again:
|
||||||
|
if (fd < 0) {
|
||||||
|
pr_err("Could not open %s for write - cannot Assemble array.\n",
|
||||||
|
devices[chosen_drive].devname);
|
||||||
|
+ free(avail);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
if (st->ss->store_super(st, fd)) {
|
||||||
|
close(fd);
|
||||||
|
pr_err("Could not re-write superblock on %s\n",
|
||||||
|
devices[chosen_drive].devname);
|
||||||
|
+ free(avail);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
if (c->verbose >= 0)
|
||||||
|
@@ -1888,6 +1901,7 @@ try_again:
|
||||||
|
pr_err("Failed to restore critical section for reshape, sorry.\n");
|
||||||
|
if (c->backup_file == NULL)
|
||||||
|
cont_err("Possibly you needed to specify the --backup-file\n");
|
||||||
|
+ free(avail);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -1916,6 +1930,7 @@ try_again:
|
||||||
|
if (rv == 1 && !pre_exist)
|
||||||
|
ioctl(mdfd, STOP_ARRAY, NULL);
|
||||||
|
free(devices);
|
||||||
|
+ free(avail);
|
||||||
|
out:
|
||||||
|
map_unlock(&map);
|
||||||
|
if (rv == 0) {
|
||||||
|
@@ -1951,11 +1966,14 @@ out:
|
||||||
|
close(mdfd);
|
||||||
|
|
||||||
|
free(best);
|
||||||
|
+ sysfs_free(pre_exist);
|
||||||
|
+
|
||||||
|
/* '2' means 'OK, but not started yet' */
|
||||||
|
if (rv == -1) {
|
||||||
|
free(devices);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
+ close(mdfd);
|
||||||
|
return rv == 2 ? 0 : rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
118
0111-mdadm-Fix-socket-connection-failure-when-mdmon-runs-.patch
Normal file
118
0111-mdadm-Fix-socket-connection-failure-when-mdmon-runs-.patch
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
From 3cbe13403ec0c78374343dcd889609aefe791f9b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Shminderjit Singh <shminderjit.singh@oracle.com>
|
||||||
|
Date: Mon, 24 Jun 2024 08:58:51 +0000
|
||||||
|
Subject: [PATCH 111/157] mdadm: Fix socket connection failure when mdmon runs
|
||||||
|
in foreground mode.
|
||||||
|
|
||||||
|
While creating an IMSM RAID, mdadm will wait for the mdmon main process
|
||||||
|
to finish if mdmon runs in forking mode. This is because with
|
||||||
|
"Type=forking" in the mdmon service unit file, "systemctl start service"
|
||||||
|
will block until the main process of mdmon exits. At that moment, mdmon
|
||||||
|
has already created the socket, so the subsequent socket connect from
|
||||||
|
mdadm will succeed.
|
||||||
|
|
||||||
|
However, when mdmon runs in foreground mode (without "Type=forking" in
|
||||||
|
the service unit file), "systemctl start service" will return once the
|
||||||
|
mdmon process starts. This causes mdadm and mdmon to run in parallel,
|
||||||
|
which may lead to a socket connection failure since mdmon has not yet
|
||||||
|
initialized the socket when mdadm tries to connect. If the next
|
||||||
|
instruction/command is to access this device and try to write to it, a
|
||||||
|
permission error will occur since mdmon has not yet set the array to RW
|
||||||
|
mode.
|
||||||
|
|
||||||
|
Signed-off-by: Shminderjit Singh <shminderjit.singh@oracle.com>
|
||||||
|
---
|
||||||
|
Create.c | 6 ++++--
|
||||||
|
mdadm.h | 1 +
|
||||||
|
util.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
3 files changed, 50 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Create.c b/Create.c
|
||||||
|
index bd4875e4..479c2715 100644
|
||||||
|
--- a/Create.c
|
||||||
|
+++ b/Create.c
|
||||||
|
@@ -1344,9 +1344,11 @@ int Create(struct supertype *st, struct mddev_ident *ident, int subdevs,
|
||||||
|
if (c->verbose >= 0)
|
||||||
|
pr_info("array %s started.\n", chosen_name);
|
||||||
|
if (st->ss->external && st->container_devnm[0]) {
|
||||||
|
- if (need_mdmon)
|
||||||
|
+ if (need_mdmon) {
|
||||||
|
start_mdmon(st->container_devnm);
|
||||||
|
-
|
||||||
|
+ if (wait_for_mdmon_control_socket(st->container_devnm) != MDADM_STATUS_SUCCESS)
|
||||||
|
+ goto abort;
|
||||||
|
+ }
|
||||||
|
ping_monitor(st->container_devnm);
|
||||||
|
close(container_fd);
|
||||||
|
}
|
||||||
|
diff --git a/mdadm.h b/mdadm.h
|
||||||
|
index e9f764a2..27009154 100644
|
||||||
|
--- a/mdadm.h
|
||||||
|
+++ b/mdadm.h
|
||||||
|
@@ -1776,6 +1776,7 @@ extern int is_subarray_active(char *subarray, char *devname);
|
||||||
|
extern int open_subarray(char *dev, char *subarray, struct supertype *st, int quiet);
|
||||||
|
extern struct superswitch *version_to_superswitch(char *vers);
|
||||||
|
|
||||||
|
+extern mdadm_status_t wait_for_mdmon_control_socket(const char *container_devnm);
|
||||||
|
extern int mdmon_running(const char *devnm);
|
||||||
|
extern int mdmon_pid(const char *devnm);
|
||||||
|
extern mdadm_status_t wait_for_mdmon(const char *devnm);
|
||||||
|
diff --git a/util.c b/util.c
|
||||||
|
index 48c97545..908f8430 100644
|
||||||
|
--- a/util.c
|
||||||
|
+++ b/util.c
|
||||||
|
@@ -1932,6 +1932,51 @@ int mdmon_running(const char *devnm)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * wait_for_mdmon_control_socket() - Waits for mdmon control socket
|
||||||
|
+ * to be created within specified time.
|
||||||
|
+ * @container_devnm: Device for which mdmon control socket should start.
|
||||||
|
+ *
|
||||||
|
+ * In foreground mode, when mdadm is trying to connect to control
|
||||||
|
+ * socket it is possible that the mdmon has not created it yet.
|
||||||
|
+ * Give some time to mdmon to create socket. Timeout set to 2 sec.
|
||||||
|
+ *
|
||||||
|
+ * Return: MDADM_STATUS_SUCCESS if connect succeed, otherwise return
|
||||||
|
+ * error code.
|
||||||
|
+ */
|
||||||
|
+mdadm_status_t wait_for_mdmon_control_socket(const char *container_devnm)
|
||||||
|
+{
|
||||||
|
+ enum mdadm_status status = MDADM_STATUS_SUCCESS;
|
||||||
|
+ int sfd, rv, retry_count = 0;
|
||||||
|
+ struct sockaddr_un addr;
|
||||||
|
+ char path[PATH_MAX];
|
||||||
|
+
|
||||||
|
+ snprintf(path, PATH_MAX, "%s/%s.sock", MDMON_DIR, container_devnm);
|
||||||
|
+ sfd = socket(PF_LOCAL, SOCK_STREAM, 0);
|
||||||
|
+ if (!is_fd_valid(sfd))
|
||||||
|
+ return MDADM_STATUS_ERROR;
|
||||||
|
+
|
||||||
|
+ addr.sun_family = PF_LOCAL;
|
||||||
|
+ strncpy(addr.sun_path, path, sizeof(addr.sun_path) - 1);
|
||||||
|
+ addr.sun_path[sizeof(addr.sun_path) - 1] = '\0';
|
||||||
|
+
|
||||||
|
+ for (retry_count = 0; retry_count < 10; retry_count++) {
|
||||||
|
+ rv = connect(sfd, (struct sockaddr*)&addr, sizeof(addr));
|
||||||
|
+ if (rv < 0) {
|
||||||
|
+ sleep_for(0, MSEC_TO_NSEC(200), true);
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (rv < 0) {
|
||||||
|
+ pr_err("Failed to connect to control socket.\n");
|
||||||
|
+ status = MDADM_STATUS_ERROR;
|
||||||
|
+ }
|
||||||
|
+ close(sfd);
|
||||||
|
+ return status;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* wait_for_mdmon() - Waits for mdmon within specified time.
|
||||||
|
* @devnm: Device for which mdmon should start.
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
28
0113-config.c-Fix-memory-leak-in-load_containers.patch
Normal file
28
0113-config.c-Fix-memory-leak-in-load_containers.patch
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
From 44457789fd67168c37932060f9a991f0c611e5a2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Anna Sztukowska <anna.sztukowska@intel.com>
|
||||||
|
Date: Fri, 28 Jun 2024 12:32:16 +0200
|
||||||
|
Subject: [PATCH 113/157] config.c: Fix memory leak in load_containers()
|
||||||
|
|
||||||
|
Fix memory leak in load_containers() in config.c reported by SAST
|
||||||
|
analysis.
|
||||||
|
|
||||||
|
Signed-off-by: Anna Sztukowska <anna.sztukowska@intel.com>
|
||||||
|
---
|
||||||
|
config.c | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
diff --git a/config.c b/config.c
|
||||||
|
index 612e700d..cd2379bd 100644
|
||||||
|
--- a/config.c
|
||||||
|
+++ b/config.c
|
||||||
|
@@ -379,6 +379,7 @@ struct mddev_dev *load_containers(void)
|
||||||
|
map = NULL;
|
||||||
|
}
|
||||||
|
free_mdstat(mdstat);
|
||||||
|
+ map_free(map);
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
40
0114-mdadm-Build.c-fix-coverity-issues.patch
Normal file
40
0114-mdadm-Build.c-fix-coverity-issues.patch
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
From 0244bac0a828e69aef36404437cac4ff148eaea0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Nigel Croxon <ncroxon@redhat.com>
|
||||||
|
Date: Tue, 2 Jul 2024 09:49:13 -0400
|
||||||
|
Subject: [PATCH 114/157] mdadm: Build.c fix coverity issues
|
||||||
|
|
||||||
|
Event leaked_handle: Handle variable "bitmap_fd" going out of
|
||||||
|
scope leaks the handle.
|
||||||
|
|
||||||
|
Signed-off-by: Nigel Croxon <ncroxon@redhat.com>
|
||||||
|
---
|
||||||
|
Build.c | 12 ++++++------
|
||||||
|
1 file changed, 6 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Build.c b/Build.c
|
||||||
|
index 1be90e41..052b1bc2 100644
|
||||||
|
--- a/Build.c
|
||||||
|
+++ b/Build.c
|
||||||
|
@@ -168,13 +168,13 @@ int Build(struct mddev_ident *ident, struct mddev_dev *devlist, struct shape *s,
|
||||||
|
goto abort;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- if (bitmap_fd >= 0) {
|
||||||
|
- if (ioctl(mdfd, SET_BITMAP_FILE, bitmap_fd) < 0) {
|
||||||
|
- pr_err("Cannot set bitmap file for %s: %s\n", chosen_name,
|
||||||
|
- strerror(errno));
|
||||||
|
- goto abort;
|
||||||
|
- }
|
||||||
|
+ if (ioctl(mdfd, SET_BITMAP_FILE, bitmap_fd) < 0) {
|
||||||
|
+ pr_err("Cannot set bitmap file for %s: %s\n", chosen_name,
|
||||||
|
+ strerror(errno));
|
||||||
|
+ close(bitmap_fd);
|
||||||
|
+ goto abort;
|
||||||
|
}
|
||||||
|
+ close(bitmap_fd);
|
||||||
|
}
|
||||||
|
if (ioctl(mdfd, RUN_ARRAY, ¶m)) {
|
||||||
|
pr_err("RUN_ARRAY failed: %s\n", strerror(errno));
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
45
0115-mdadm-Create.c-fix-coverity-issues.patch
Normal file
45
0115-mdadm-Create.c-fix-coverity-issues.patch
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
From 7c524aa83c4463c15a13f6f47a27a18ab4de9eef Mon Sep 17 00:00:00 2001
|
||||||
|
From: Nigel Croxon <ncroxon@redhat.com>
|
||||||
|
Date: Fri, 5 Jul 2024 08:45:32 -0400
|
||||||
|
Subject: [PATCH 115/157] mdadm: Create.c fix coverity issues
|
||||||
|
|
||||||
|
* Event negative_returns: "fd" is passed to a parameter that cannot be negative. Which
|
||||||
|
is set to -1 to start.
|
||||||
|
|
||||||
|
* Event open_fn: Returning handle opened by "open_dev_excl".
|
||||||
|
* Event var_assign: Assigning: "container_fd" = handle returned from
|
||||||
|
"open_dev_excl(st->container_devnm)"
|
||||||
|
* Event leaked_handle: Handle variable "container_fd" going out of scope leaks the handle
|
||||||
|
|
||||||
|
Signed-off-by: Nigel Croxon <ncroxon@redhat.com>
|
||||||
|
---
|
||||||
|
Create.c | 6 +++---
|
||||||
|
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Create.c b/Create.c
|
||||||
|
index 479c2715..7fde1c16 100644
|
||||||
|
--- a/Create.c
|
||||||
|
+++ b/Create.c
|
||||||
|
@@ -297,7 +297,7 @@ static int add_disk_to_super(int mdfd, struct shape *s, struct context *c,
|
||||||
|
if (st->ss->add_to_super(st, &info->disk, fd, dv->devname,
|
||||||
|
dv->data_offset)) {
|
||||||
|
ioctl(mdfd, STOP_ARRAY, NULL);
|
||||||
|
- close(fd);
|
||||||
|
+ close_fd(&fd);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
st->ss->getinfo_super(st, info, NULL);
|
||||||
|
@@ -1370,8 +1370,8 @@ int Create(struct supertype *st, struct mddev_ident *ident, int subdevs,
|
||||||
|
map_remove(&map, fd2devnm(mdfd));
|
||||||
|
map_unlock(&map);
|
||||||
|
|
||||||
|
- if (mdfd >= 0)
|
||||||
|
- close(mdfd);
|
||||||
|
+ close_fd(&mdfd);
|
||||||
|
+ close_fd(&container_fd);
|
||||||
|
|
||||||
|
dev_policy_free(custom_pols);
|
||||||
|
return 1;
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
473
0116-mdadm-super-ddf.c-fix-coverity-issues.patch
Normal file
473
0116-mdadm-super-ddf.c-fix-coverity-issues.patch
Normal file
@ -0,0 +1,473 @@
|
|||||||
|
From 96b8035a09b6449ea99f2eb91f9ba4f6912e5bd6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Nigel Croxon <ncroxon@redhat.com>
|
||||||
|
Date: Tue, 2 Jul 2024 10:11:26 -0400
|
||||||
|
Subject: [PATCH 116/157] mdadm: super-ddf.c fix coverity issues
|
||||||
|
|
||||||
|
Fixing the following coding errors the coverity tools found:
|
||||||
|
|
||||||
|
* Calling "lseek64" without checking return value. This library function may
|
||||||
|
fail and return an error code.
|
||||||
|
* Overrunning array "anchor->pad2" of 3 bytes by passing it to a function
|
||||||
|
which accesses it at byte offset 398 using argument "399UL".
|
||||||
|
* Event leaked_storage: Variable "sra" going out of scope leaks the storage
|
||||||
|
it points to.
|
||||||
|
* Event leaked_storage: Variable "super" going out of scope leaks the storage
|
||||||
|
it points to.
|
||||||
|
* Event leaked_handle: Handle variable "dfd" going out of scope leaks the
|
||||||
|
handle.
|
||||||
|
* Event leaked_storage: Variable "dl1" going out of scope leaks the storage
|
||||||
|
it points to
|
||||||
|
* Event leaked_handle: Handle variable "cfd" going out of scope leaks the
|
||||||
|
handle.
|
||||||
|
* Variable "avail" going out of scope leaks the storage it points to.
|
||||||
|
* Passing unterminated string "super->anchor.revision" to "fprintf", which
|
||||||
|
expects a null-terminated string.
|
||||||
|
* You might overrun the 32-character fixed-size string "st->container_devnm"
|
||||||
|
by copying the return value of "fd2devnm" without checking the length.
|
||||||
|
* Event fixed_size_dest: You might overrun the 33-character fixed-size string
|
||||||
|
"dev->name" by copying "(*d).devname" without checking the length.
|
||||||
|
* Event uninit_use_in_call: Using uninitialized value "info.array.raid_disks"
|
||||||
|
when calling "getinfo_super_ddf"
|
||||||
|
|
||||||
|
V2: clean up validate_geometry_ddf() routine with Mariusz Tkaczyk recommendations.
|
||||||
|
V3: clean up spaces with Blazej Kucman recommendations.
|
||||||
|
V4: clean up recommended by Mariusz Tkaczyk.
|
||||||
|
V5: clean up recommended by Mariusz Tkaczyk.
|
||||||
|
|
||||||
|
Signed-off-by: Nigel Croxon <ncroxon@redhat.com>
|
||||||
|
---
|
||||||
|
super-ddf.c | 172 +++++++++++++++++++++++++++++++++++-----------------
|
||||||
|
1 file changed, 115 insertions(+), 57 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/super-ddf.c b/super-ddf.c
|
||||||
|
index 311001c1..d870102d 100644
|
||||||
|
--- a/super-ddf.c
|
||||||
|
+++ b/super-ddf.c
|
||||||
|
@@ -809,7 +809,7 @@ static int load_ddf_header(int fd, unsigned long long lba,
|
||||||
|
if (lba >= size-1)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
- if (lseek64(fd, lba<<9, 0) < 0)
|
||||||
|
+ if (lseek64(fd, lba << 9, 0) == -1L)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (read(fd, hdr, 512) != 512)
|
||||||
|
@@ -828,8 +828,7 @@ static int load_ddf_header(int fd, unsigned long long lba,
|
||||||
|
!be64_eq(anchor->primary_lba, hdr->primary_lba) ||
|
||||||
|
!be64_eq(anchor->secondary_lba, hdr->secondary_lba) ||
|
||||||
|
hdr->type != type ||
|
||||||
|
- memcmp(anchor->pad2, hdr->pad2, 512 -
|
||||||
|
- offsetof(struct ddf_header, pad2)) != 0) {
|
||||||
|
+ memcmp(anchor->pad2, hdr->pad2, sizeof(anchor->pad2)) != 0) {
|
||||||
|
pr_err("header mismatch\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@@ -863,7 +862,7 @@ static void *load_section(int fd, struct ddf_super *super, void *buf,
|
||||||
|
else
|
||||||
|
offset += be64_to_cpu(super->active->secondary_lba);
|
||||||
|
|
||||||
|
- if ((unsigned long long)lseek64(fd, offset<<9, 0) != (offset<<9)) {
|
||||||
|
+ if ((unsigned long long)lseek64(fd, offset << 9, 0) != (offset << 9)) {
|
||||||
|
if (dofree)
|
||||||
|
free(buf);
|
||||||
|
return NULL;
|
||||||
|
@@ -882,7 +881,7 @@ static int load_ddf_headers(int fd, struct ddf_super *super, char *devname)
|
||||||
|
|
||||||
|
get_dev_size(fd, NULL, &dsize);
|
||||||
|
|
||||||
|
- if (lseek64(fd, dsize-512, 0) < 0) {
|
||||||
|
+ if (lseek64(fd, dsize - 512, 0) == -1L) {
|
||||||
|
if (devname)
|
||||||
|
pr_err("Cannot seek to anchor block on %s: %s\n",
|
||||||
|
devname, strerror(errno));
|
||||||
|
@@ -909,8 +908,7 @@ static int load_ddf_headers(int fd, struct ddf_super *super, char *devname)
|
||||||
|
if (memcmp(super->anchor.revision, DDF_REVISION_0, 8) != 0 &&
|
||||||
|
memcmp(super->anchor.revision, DDF_REVISION_2, 8) != 0) {
|
||||||
|
if (devname)
|
||||||
|
- pr_err("can only support super revision %.8s and earlier, not %.8s on %s\n",
|
||||||
|
- DDF_REVISION_2, super->anchor.revision,devname);
|
||||||
|
+ pr_err("The DDF revision on %s\n is not supported", devname);
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
super->active = NULL;
|
||||||
|
@@ -1610,6 +1608,7 @@ static unsigned int get_vd_num_of_subarray(struct supertype *st)
|
||||||
|
return DDF_NOTFOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ sysfs_free(sra);
|
||||||
|
return vcnum;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1617,11 +1616,11 @@ static void brief_examine_super_ddf(struct supertype *st, int verbose)
|
||||||
|
{
|
||||||
|
/* We just write a generic DDF ARRAY entry
|
||||||
|
*/
|
||||||
|
- struct mdinfo info;
|
||||||
|
+ struct mdinfo info = {0};
|
||||||
|
char nbuf[64];
|
||||||
|
+
|
||||||
|
getinfo_super_ddf(st, &info, NULL);
|
||||||
|
fname_from_uuid(&info, nbuf);
|
||||||
|
-
|
||||||
|
printf("ARRAY metadata=ddf UUID=%s\n", nbuf + 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1631,9 +1630,10 @@ static void brief_examine_subarrays_ddf(struct supertype *st, int verbose)
|
||||||
|
* by uuid and member by unit number and uuid.
|
||||||
|
*/
|
||||||
|
struct ddf_super *ddf = st->sb;
|
||||||
|
- struct mdinfo info;
|
||||||
|
+ struct mdinfo info = {0};
|
||||||
|
unsigned int i;
|
||||||
|
char nbuf[64];
|
||||||
|
+
|
||||||
|
getinfo_super_ddf(st, &info, NULL);
|
||||||
|
fname_from_uuid(&info, nbuf);
|
||||||
|
|
||||||
|
@@ -1658,8 +1658,9 @@ static void brief_examine_subarrays_ddf(struct supertype *st, int verbose)
|
||||||
|
|
||||||
|
static void export_examine_super_ddf(struct supertype *st)
|
||||||
|
{
|
||||||
|
- struct mdinfo info;
|
||||||
|
+ struct mdinfo info = {0};
|
||||||
|
char nbuf[64];
|
||||||
|
+
|
||||||
|
getinfo_super_ddf(st, &info, NULL);
|
||||||
|
fname_from_uuid(&info, nbuf);
|
||||||
|
printf("MD_METADATA=ddf\n");
|
||||||
|
@@ -1692,10 +1693,12 @@ static int copy_metadata_ddf(struct supertype *st, int from, int to)
|
||||||
|
if (!get_dev_size(from, NULL, &dsize))
|
||||||
|
goto err;
|
||||||
|
|
||||||
|
- if (lseek64(from, dsize-512, 0) < 0)
|
||||||
|
+ if (lseek64(from, dsize - 512, 0) == -1L)
|
||||||
|
goto err;
|
||||||
|
+
|
||||||
|
if (read(from, buf, 512) != 512)
|
||||||
|
goto err;
|
||||||
|
+
|
||||||
|
ddf = buf;
|
||||||
|
if (!be32_eq(ddf->magic, DDF_HEADER_MAGIC) ||
|
||||||
|
!be32_eq(calc_crc(ddf, 512), ddf->crc) ||
|
||||||
|
@@ -1711,9 +1714,9 @@ static int copy_metadata_ddf(struct supertype *st, int from, int to)
|
||||||
|
|
||||||
|
bytes = dsize - offset;
|
||||||
|
|
||||||
|
- if (lseek64(from, offset, 0) < 0 ||
|
||||||
|
- lseek64(to, offset, 0) < 0)
|
||||||
|
+ if (lseek64(from, offset, 0) == -1L || lseek64(to, offset, 0) == -1L)
|
||||||
|
goto err;
|
||||||
|
+
|
||||||
|
while (written < bytes) {
|
||||||
|
int n = bytes - written;
|
||||||
|
if (n > 4096)
|
||||||
|
@@ -1795,6 +1798,7 @@ static void brief_detail_super_ddf(struct supertype *st, char *subarray)
|
||||||
|
char nbuf[64];
|
||||||
|
struct ddf_super *ddf = st->sb;
|
||||||
|
unsigned int vcnum = get_vd_num_of_subarray(st);
|
||||||
|
+
|
||||||
|
if (vcnum == DDF_CONTAINER)
|
||||||
|
uuid_from_super_ddf(st, info.uuid);
|
||||||
|
else if (vcnum == DDF_NOTFOUND)
|
||||||
|
@@ -2971,7 +2975,9 @@ static int __write_ddf_structure(struct dl *d, struct ddf_super *ddf, __u8 type)
|
||||||
|
header->openflag = 1;
|
||||||
|
header->crc = calc_crc(header, 512);
|
||||||
|
|
||||||
|
- lseek64(fd, sector<<9, 0);
|
||||||
|
+ if (lseek64(fd, sector << 9, 0) == -1L)
|
||||||
|
+ goto out;
|
||||||
|
+
|
||||||
|
if (write(fd, header, 512) < 0)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
@@ -2982,6 +2988,7 @@ static int __write_ddf_structure(struct dl *d, struct ddf_super *ddf, __u8 type)
|
||||||
|
ddf->phys->crc = calc_crc(ddf->phys, ddf->pdsize);
|
||||||
|
if (write(fd, ddf->phys, ddf->pdsize) < 0)
|
||||||
|
goto out;
|
||||||
|
+
|
||||||
|
ddf->virt->crc = calc_crc(ddf->virt, ddf->vdsize);
|
||||||
|
if (write(fd, ddf->virt, ddf->vdsize) < 0)
|
||||||
|
goto out;
|
||||||
|
@@ -3035,7 +3042,9 @@ out:
|
||||||
|
header->openflag = 0;
|
||||||
|
header->crc = calc_crc(header, 512);
|
||||||
|
|
||||||
|
- lseek64(fd, sector<<9, 0);
|
||||||
|
+ if (lseek64(fd, sector << 9, 0) == -1L)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
if (write(fd, header, 512) < 0)
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
@@ -3088,7 +3097,9 @@ static int _write_super_to_disk(struct ddf_super *ddf, struct dl *d)
|
||||||
|
if (!__write_ddf_structure(d, ddf, DDF_HEADER_SECONDARY))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
- lseek64(fd, (size-1)*512, SEEK_SET);
|
||||||
|
+ if (lseek64(fd, (size - 1) * 512, SEEK_SET) == -1L)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
if (write(fd, &ddf->anchor, 512) < 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
@@ -3299,9 +3310,10 @@ static int validate_geometry_ddf(struct supertype *st,
|
||||||
|
char *dev, unsigned long long *freesize,
|
||||||
|
int consistency_policy, int verbose)
|
||||||
|
{
|
||||||
|
- int fd;
|
||||||
|
- struct mdinfo *sra;
|
||||||
|
+ struct mdinfo *sra = NULL;
|
||||||
|
+ int ret = 1;
|
||||||
|
int cfd;
|
||||||
|
+ int fd;
|
||||||
|
|
||||||
|
/* ddf potentially supports lots of things, but it depends on
|
||||||
|
* what devices are offered (and maybe kernel version?)
|
||||||
|
@@ -3369,7 +3381,7 @@ static int validate_geometry_ddf(struct supertype *st,
|
||||||
|
* Later we should check for a BVD and make an SVD.
|
||||||
|
*/
|
||||||
|
fd = open(dev, O_RDONLY|O_EXCL, 0);
|
||||||
|
- if (fd >= 0) {
|
||||||
|
+ if (is_fd_valid(fd)) {
|
||||||
|
close(fd);
|
||||||
|
/* Just a bare device, no good to us */
|
||||||
|
if (verbose)
|
||||||
|
@@ -3377,44 +3389,58 @@ static int validate_geometry_ddf(struct supertype *st,
|
||||||
|
dev);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
if (errno != EBUSY || (fd = open(dev, O_RDONLY, 0)) < 0) {
|
||||||
|
if (verbose)
|
||||||
|
pr_err("ddf: Cannot open %s: %s\n",
|
||||||
|
dev, strerror(errno));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
/* Well, it is in use by someone, maybe a 'ddf' container. */
|
||||||
|
cfd = open_container(fd);
|
||||||
|
- if (cfd < 0) {
|
||||||
|
- close(fd);
|
||||||
|
+ close(fd);
|
||||||
|
+
|
||||||
|
+ if (!is_fd_valid(cfd)) {
|
||||||
|
if (verbose)
|
||||||
|
- pr_err("ddf: Cannot use %s: %s\n",
|
||||||
|
- dev, strerror(EBUSY));
|
||||||
|
+ pr_err("ddf: Cannot use %s\n", dev);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
sra = sysfs_read(cfd, NULL, GET_VERSION);
|
||||||
|
- close(fd);
|
||||||
|
- if (sra && sra->array.major_version == -1 &&
|
||||||
|
- strcmp(sra->text_version, "ddf") == 0) {
|
||||||
|
+ if (!sra) {
|
||||||
|
+ pr_err("Cannot read sysfs for /dev/%s\n", fd2kname(cfd));
|
||||||
|
+ goto error;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (sra->array.major_version == -1 && strcmp(sra->text_version, "ddf") == 0) {
|
||||||
|
/* This is a member of a ddf container. Load the container
|
||||||
|
* and try to create a bvd
|
||||||
|
*/
|
||||||
|
- struct ddf_super *ddf;
|
||||||
|
+ struct ddf_super *ddf = NULL;
|
||||||
|
+
|
||||||
|
if (load_super_ddf_all(st, cfd, (void **)&ddf, NULL) == 0) {
|
||||||
|
st->sb = ddf;
|
||||||
|
- strcpy(st->container_devnm, fd2devnm(cfd));
|
||||||
|
+ snprintf(st->container_devnm, sizeof(st->container_devnm),
|
||||||
|
+ "%s", fd2kname(cfd));
|
||||||
|
close(cfd);
|
||||||
|
- return validate_geometry_ddf_bvd(st, level, layout,
|
||||||
|
- raiddisks, chunk, size,
|
||||||
|
- data_offset,
|
||||||
|
- dev, freesize,
|
||||||
|
- verbose);
|
||||||
|
+ free(sra);
|
||||||
|
+
|
||||||
|
+ return validate_geometry_ddf_bvd(st, level, layout, raiddisks,
|
||||||
|
+ chunk, size, data_offset, dev,
|
||||||
|
+ freesize, verbose);
|
||||||
|
}
|
||||||
|
- close(cfd);
|
||||||
|
- } else /* device may belong to a different container */
|
||||||
|
- return 0;
|
||||||
|
+ free(ddf);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- return 1;
|
||||||
|
+ /* device may belong to a different container */
|
||||||
|
+ ret = 0;
|
||||||
|
+
|
||||||
|
+error:
|
||||||
|
+ free(sra);
|
||||||
|
+ close(cfd);
|
||||||
|
+
|
||||||
|
+ return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int validate_geometry_ddf_bvd(struct supertype *st,
|
||||||
|
@@ -3483,35 +3509,42 @@ static int validate_geometry_ddf_bvd(struct supertype *st,
|
||||||
|
static int load_super_ddf_all(struct supertype *st, int fd,
|
||||||
|
void **sbp, char *devname)
|
||||||
|
{
|
||||||
|
- struct mdinfo *sra;
|
||||||
|
- struct ddf_super *super;
|
||||||
|
struct mdinfo *sd, *best = NULL;
|
||||||
|
+ struct ddf_super *super = NULL;
|
||||||
|
+ struct mdinfo *sra;
|
||||||
|
int bestseq = 0;
|
||||||
|
- int seq;
|
||||||
|
+ int ret = 1;
|
||||||
|
char nm[20];
|
||||||
|
+ int seq;
|
||||||
|
int dfd;
|
||||||
|
|
||||||
|
sra = sysfs_read(fd, NULL, GET_LEVEL|GET_VERSION|GET_DEVS|GET_STATE);
|
||||||
|
if (!sra)
|
||||||
|
return 1;
|
||||||
|
- if (sra->array.major_version != -1 ||
|
||||||
|
- sra->array.minor_version != -2 ||
|
||||||
|
+ if (sra->array.major_version != -1 || sra->array.minor_version != -2 ||
|
||||||
|
strcmp(sra->text_version, "ddf") != 0)
|
||||||
|
- return 1;
|
||||||
|
+ goto out;
|
||||||
|
|
||||||
|
if (posix_memalign((void**)&super, 512, sizeof(*super)) != 0)
|
||||||
|
- return 1;
|
||||||
|
+ goto out;
|
||||||
|
+
|
||||||
|
memset(super, 0, sizeof(*super));
|
||||||
|
|
||||||
|
/* first, try each device, and choose the best ddf */
|
||||||
|
for (sd = sra->devs ; sd ; sd = sd->next) {
|
||||||
|
int rv;
|
||||||
|
+
|
||||||
|
sprintf(nm, "%d:%d", sd->disk.major, sd->disk.minor);
|
||||||
|
+
|
||||||
|
dfd = dev_open(nm, O_RDONLY);
|
||||||
|
- if (dfd < 0)
|
||||||
|
- return 2;
|
||||||
|
+ if (!is_fd_valid(dfd)) {
|
||||||
|
+ ret = 2;
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
rv = load_ddf_headers(dfd, super, NULL);
|
||||||
|
close(dfd);
|
||||||
|
+
|
||||||
|
if (rv == 0) {
|
||||||
|
seq = be32_to_cpu(super->active->seq);
|
||||||
|
if (super->active->openflag)
|
||||||
|
@@ -3523,28 +3556,39 @@ static int load_super_ddf_all(struct supertype *st, int fd,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!best)
|
||||||
|
- return 1;
|
||||||
|
+ goto out;
|
||||||
|
+
|
||||||
|
/* OK, load this ddf */
|
||||||
|
sprintf(nm, "%d:%d", best->disk.major, best->disk.minor);
|
||||||
|
+
|
||||||
|
dfd = dev_open(nm, O_RDONLY);
|
||||||
|
if (dfd < 0)
|
||||||
|
- return 1;
|
||||||
|
+ goto out;
|
||||||
|
+
|
||||||
|
load_ddf_headers(dfd, super, NULL);
|
||||||
|
load_ddf_global(dfd, super, NULL);
|
||||||
|
close(dfd);
|
||||||
|
+
|
||||||
|
/* Now we need the device-local bits */
|
||||||
|
for (sd = sra->devs ; sd ; sd = sd->next) {
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
sprintf(nm, "%d:%d", sd->disk.major, sd->disk.minor);
|
||||||
|
+
|
||||||
|
dfd = dev_open(nm, O_RDWR);
|
||||||
|
- if (dfd < 0)
|
||||||
|
- return 2;
|
||||||
|
+ if (dfd < 0) {
|
||||||
|
+ ret = 2;
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
rv = load_ddf_headers(dfd, super, NULL);
|
||||||
|
if (rv == 0)
|
||||||
|
rv = load_ddf_local(dfd, super, NULL, 1);
|
||||||
|
- if (rv)
|
||||||
|
- return 1;
|
||||||
|
+
|
||||||
|
+ if (rv) {
|
||||||
|
+ close(dfd);
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
*sbp = super;
|
||||||
|
@@ -3553,8 +3597,16 @@ static int load_super_ddf_all(struct supertype *st, int fd,
|
||||||
|
st->minor_version = 0;
|
||||||
|
st->max_devs = 512;
|
||||||
|
}
|
||||||
|
- strcpy(st->container_devnm, fd2devnm(fd));
|
||||||
|
- return 0;
|
||||||
|
+
|
||||||
|
+ snprintf(st->container_devnm, sizeof(st->container_devnm), "%s", fd2devnm(fd));
|
||||||
|
+ ret = 0;
|
||||||
|
+
|
||||||
|
+out:
|
||||||
|
+ if (sra)
|
||||||
|
+ free(sra);
|
||||||
|
+ if (super && ret != 0)
|
||||||
|
+ free(super);
|
||||||
|
+ return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int load_container_ddf(struct supertype *st, int fd,
|
||||||
|
@@ -3791,7 +3843,7 @@ static struct mdinfo *container_content_ddf(struct supertype *st, char *subarray
|
||||||
|
be64_to_cpu(LBA_OFFSET(ddf, bvd)[iphys]);
|
||||||
|
dev->component_size = be64_to_cpu(bvd->blocks);
|
||||||
|
if (d->devname)
|
||||||
|
- strcpy(dev->name, d->devname);
|
||||||
|
+ snprintf(dev->name, sizeof(dev->name), "%s", d->devname);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return rest;
|
||||||
|
@@ -3840,11 +3892,15 @@ static int store_super_ddf(struct supertype *st, int fd)
|
||||||
|
return 1;
|
||||||
|
memset(buf, 0, 512);
|
||||||
|
|
||||||
|
- lseek64(fd, dsize-512, 0);
|
||||||
|
+ if (lseek64(fd, dsize - 512, 0) == -1L) {
|
||||||
|
+ free(buf);
|
||||||
|
+ return 1;
|
||||||
|
+ }
|
||||||
|
rc = write(fd, buf, 512);
|
||||||
|
free(buf);
|
||||||
|
if (rc < 0)
|
||||||
|
return 1;
|
||||||
|
+
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -3959,6 +4015,7 @@ static int compare_super_ddf(struct supertype *st, struct supertype *tst,
|
||||||
|
if (posix_memalign((void **)&dl1->spare, 512,
|
||||||
|
first->conf_rec_len*512) != 0) {
|
||||||
|
pr_err("could not allocate spare info buf\n");
|
||||||
|
+ free(dl1);
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
memcpy(dl1->spare, dl2->spare, first->conf_rec_len*512);
|
||||||
|
@@ -4180,6 +4237,7 @@ static int get_bvd_state(const struct ddf_super *ddf,
|
||||||
|
state = DDF_state_part_optimal;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
+ free(avail);
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
102
0117-mdadm-clustermd_tests-add-some-APIs-in-func.sh-to-su.patch
Normal file
102
0117-mdadm-clustermd_tests-add-some-APIs-in-func.sh-to-su.patch
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
From cdce3219a52938fc35f93b5f17561f2ca7175e37 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Heming Zhao <heming.zhao@suse.com>
|
||||||
|
Date: Tue, 9 Jul 2024 20:04:51 +0800
|
||||||
|
Subject: [PATCH 117/157] mdadm/clustermd_tests: add some APIs in func.sh to
|
||||||
|
support running the tests without errors
|
||||||
|
|
||||||
|
clustermd_tests/func.sh lacks some APIs to run, this patch makes
|
||||||
|
clustermd_tests runnable from the test suite.
|
||||||
|
|
||||||
|
Signed-off-by: Heming Zhao <heming.zhao@suse.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
clustermd_tests/func.sh | 60 +++++++++++++++++++++++++++++++++++++++++
|
||||||
|
1 file changed, 60 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/clustermd_tests/func.sh b/clustermd_tests/func.sh
|
||||||
|
index 801d6043..e659c0ba 100644
|
||||||
|
--- a/clustermd_tests/func.sh
|
||||||
|
+++ b/clustermd_tests/func.sh
|
||||||
|
@@ -1,5 +1,22 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
+COLOR_FAIL='\033[0;31m' #RED
|
||||||
|
+COLOR_WARN='\033[1;33m' #YELLOW
|
||||||
|
+COLOR_SUCCESS='\033[0;32m' #GREEN
|
||||||
|
+COLOR_NONE='\033[0m'
|
||||||
|
+
|
||||||
|
+fail() {
|
||||||
|
+ printf "${COLOR_FAIL}$1${COLOR_NONE}"
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+warn() {
|
||||||
|
+ printf "${COLOR_WARN}$1${COLOR_NONE}"
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+succeed() {
|
||||||
|
+ printf "${COLOR_SUCCESS}$1${COLOR_NONE}"
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
check_ssh()
|
||||||
|
{
|
||||||
|
NODE1="$(grep '^NODE1' $CLUSTER_CONF | cut -d'=' -f2)"
|
||||||
|
@@ -151,6 +168,33 @@ stop_md()
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
+record_system_speed_limit() {
|
||||||
|
+ system_speed_limit_max=`cat /proc/sys/dev/raid/speed_limit_max`
|
||||||
|
+ system_speed_limit_min=`cat /proc/sys/dev/raid/speed_limit_min`
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+# To avoid sync action finishes before checking it, it needs to limit
|
||||||
|
+# the sync speed
|
||||||
|
+control_system_speed_limit() {
|
||||||
|
+ echo $test_speed_limit_min > /proc/sys/dev/raid/speed_limit_min
|
||||||
|
+ echo $test_speed_limit_max > /proc/sys/dev/raid/speed_limit_max
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+restore_system_speed_limit() {
|
||||||
|
+ echo $system_speed_limit_min > /proc/sys/dev/raid/speed_limit_max
|
||||||
|
+ echo $system_speed_limit_max > /proc/sys/dev/raid/speed_limit_max
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+record_selinux() {
|
||||||
|
+ # empty
|
||||||
|
+ return 0
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+restore_selinux() {
|
||||||
|
+ # empty
|
||||||
|
+ return 0
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
# $1/optional, it shows why to save log
|
||||||
|
save_log()
|
||||||
|
{
|
||||||
|
@@ -240,6 +284,22 @@ check()
|
||||||
|
die "$ip: check '$2' failed."
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
+ recovery-remote )
|
||||||
|
+ cnt=5
|
||||||
|
+ for ip in ${NODES[@]}
|
||||||
|
+ do
|
||||||
|
+ while ! ssh $ip "grep -sqE 'recovery|REMOTE' /proc/mdstat"
|
||||||
|
+ do
|
||||||
|
+ if [ "$cnt" -gt '0' ]
|
||||||
|
+ then
|
||||||
|
+ sleep 0.2
|
||||||
|
+ cnt=$[cnt-1]
|
||||||
|
+ else
|
||||||
|
+ die "$ip: no '$2' happening!"
|
||||||
|
+ fi
|
||||||
|
+ done
|
||||||
|
+ done
|
||||||
|
+ ;;
|
||||||
|
PENDING | recovery | resync | reshape )
|
||||||
|
cnt=5
|
||||||
|
for ip in ${NODES[@]}
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
@ -0,0 +1,81 @@
|
|||||||
|
From bde21cc929d4864bd4b9f459f46ce63dd8c793ca Mon Sep 17 00:00:00 2001
|
||||||
|
From: Heming Zhao <heming.zhao@suse.com>
|
||||||
|
Date: Tue, 9 Jul 2024 20:04:52 +0800
|
||||||
|
Subject: [PATCH 118/157] mdadm/clustermd_tests: adjust test cases to support
|
||||||
|
md module changes
|
||||||
|
|
||||||
|
Since kernel commit db5e653d7c9f ("md: delay choosing sync action to
|
||||||
|
md_start_sync()") delays the start of the sync action, clustermd
|
||||||
|
array sync/resync jobs can happen on any leg of the array. This
|
||||||
|
commit adjusts the test cases to follow the new kernel layer behavior.
|
||||||
|
|
||||||
|
Signed-off-by: Heming Zhao <heming.zhao@suse.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
clustermd_tests/02r10_Manage_re-add | 3 ++-
|
||||||
|
clustermd_tests/02r1_Manage_re-add | 1 +
|
||||||
|
clustermd_tests/03r10_switch-recovery | 4 ++--
|
||||||
|
clustermd_tests/03r1_switch-recovery | 4 ++--
|
||||||
|
4 files changed, 7 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/clustermd_tests/02r10_Manage_re-add b/clustermd_tests/02r10_Manage_re-add
|
||||||
|
index 2288a008..d8764667 100644
|
||||||
|
--- a/clustermd_tests/02r10_Manage_re-add
|
||||||
|
+++ b/clustermd_tests/02r10_Manage_re-add
|
||||||
|
@@ -9,7 +9,8 @@ check all state UU
|
||||||
|
check all dmesg
|
||||||
|
mdadm --manage $md0 --fail $dev0 --remove $dev0
|
||||||
|
mdadm --manage $md0 --re-add $dev0
|
||||||
|
-check $NODE1 recovery
|
||||||
|
+#non-clustered array also doesn't do sync job
|
||||||
|
+#check $NODE1 recovery
|
||||||
|
check all wait
|
||||||
|
check all state UU
|
||||||
|
check all dmesg
|
||||||
|
diff --git a/clustermd_tests/02r1_Manage_re-add b/clustermd_tests/02r1_Manage_re-add
|
||||||
|
index d0d13e53..811df87b 100644
|
||||||
|
--- a/clustermd_tests/02r1_Manage_re-add
|
||||||
|
+++ b/clustermd_tests/02r1_Manage_re-add
|
||||||
|
@@ -9,6 +9,7 @@ check all state UU
|
||||||
|
check all dmesg
|
||||||
|
mdadm --manage $md0 --fail $dev0 --remove $dev0
|
||||||
|
mdadm --manage $md0 --re-add $dev0
|
||||||
|
+check all wait
|
||||||
|
check all state UU
|
||||||
|
check all dmesg
|
||||||
|
stop_md all $md0
|
||||||
|
diff --git a/clustermd_tests/03r10_switch-recovery b/clustermd_tests/03r10_switch-recovery
|
||||||
|
index 867388d0..7d0b8812 100644
|
||||||
|
--- a/clustermd_tests/03r10_switch-recovery
|
||||||
|
+++ b/clustermd_tests/03r10_switch-recovery
|
||||||
|
@@ -10,9 +10,9 @@ check all state UU
|
||||||
|
check all dmesg
|
||||||
|
mdadm --manage $md0 --fail $dev0
|
||||||
|
sleep 0.2
|
||||||
|
-check $NODE1 recovery
|
||||||
|
+check $NODE1 recovery-remote
|
||||||
|
stop_md $NODE1 $md0
|
||||||
|
-check $NODE2 recovery
|
||||||
|
+check $NODE2 recovery-remote
|
||||||
|
check $NODE2 wait
|
||||||
|
check $NODE2 state UU
|
||||||
|
check all dmesg
|
||||||
|
diff --git a/clustermd_tests/03r1_switch-recovery b/clustermd_tests/03r1_switch-recovery
|
||||||
|
index a1a7cbe7..d8483c45 100644
|
||||||
|
--- a/clustermd_tests/03r1_switch-recovery
|
||||||
|
+++ b/clustermd_tests/03r1_switch-recovery
|
||||||
|
@@ -10,9 +10,9 @@ check all state UU
|
||||||
|
check all dmesg
|
||||||
|
mdadm --manage $md0 --fail $dev0
|
||||||
|
sleep 0.3
|
||||||
|
-check $NODE1 recovery
|
||||||
|
+check $NODE1 recovery-remote
|
||||||
|
stop_md $NODE1 $md0
|
||||||
|
-check $NODE2 recovery
|
||||||
|
+check $NODE2 recovery-remote
|
||||||
|
check $NODE2 wait
|
||||||
|
check $NODE2 state UU
|
||||||
|
check all dmesg
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
40
0119-mapfile.c-Fix-STRING_OVERFLOW-issue.patch
Normal file
40
0119-mapfile.c-Fix-STRING_OVERFLOW-issue.patch
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
From 48c365376ce7763fd9a9e7735b1e9ec5d0ff1631 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Anna Sztukowska <anna.sztukowska@intel.com>
|
||||||
|
Date: Wed, 3 Jul 2024 14:11:58 +0200
|
||||||
|
Subject: [PATCH 119/157] mapfile.c: Fix STRING_OVERFLOW issue
|
||||||
|
|
||||||
|
Fix STRING_OVERFLOW issue found by SAST analysis in map_add() and
|
||||||
|
map_update() in mapfile.c.
|
||||||
|
|
||||||
|
Signed-off-by: Anna Sztukowska <anna.sztukowska@intel.com>
|
||||||
|
---
|
||||||
|
mapfile.c | 6 +++---
|
||||||
|
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/mapfile.c b/mapfile.c
|
||||||
|
index f1f3ee2c..ea9837ac 100644
|
||||||
|
--- a/mapfile.c
|
||||||
|
+++ b/mapfile.c
|
||||||
|
@@ -165,8 +165,8 @@ void map_add(struct map_ent **melp,
|
||||||
|
{
|
||||||
|
struct map_ent *me = xmalloc(sizeof(*me));
|
||||||
|
|
||||||
|
- strcpy(me->devnm, devnm);
|
||||||
|
- strcpy(me->metadata, metadata);
|
||||||
|
+ snprintf(me->devnm, sizeof(me->devnm), "%s", devnm);
|
||||||
|
+ snprintf(me->metadata, sizeof(me->metadata), "%s", metadata);
|
||||||
|
memcpy(me->uuid, uuid, 16);
|
||||||
|
me->path = path ? xstrdup(path) : NULL;
|
||||||
|
me->next = *melp;
|
||||||
|
@@ -227,7 +227,7 @@ int map_update(struct map_ent **mpp, char *devnm, char *metadata,
|
||||||
|
|
||||||
|
for (mp = map ; mp ; mp=mp->next)
|
||||||
|
if (strcmp(mp->devnm, devnm) == 0) {
|
||||||
|
- strcpy(mp->metadata, metadata);
|
||||||
|
+ snprintf(mp->metadata, sizeof(mp->metadata), "%s", metadata);
|
||||||
|
memcpy(mp->uuid, uuid, 16);
|
||||||
|
free(mp->path);
|
||||||
|
mp->path = path ? xstrdup(path) : NULL;
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
484
0120-mdadm-Manage.c-fix-coverity-issues.patch
Normal file
484
0120-mdadm-Manage.c-fix-coverity-issues.patch
Normal file
@ -0,0 +1,484 @@
|
|||||||
|
From 1b4b73fd535a6487075e98f620454ff2e13b5240 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Nigel Croxon <ncroxon@redhat.com>
|
||||||
|
Date: Wed, 10 Jul 2024 08:55:08 -0400
|
||||||
|
Subject: [PATCH 120/157] mdadm: Manage.c fix coverity issues
|
||||||
|
|
||||||
|
Fixing the following coding errors the coverity tools found:
|
||||||
|
|
||||||
|
* Event parameter_hidden: declaration hides parameter "dv".
|
||||||
|
* Event leaked_storage: Variable "mdi" going out of scope leaks the storage
|
||||||
|
it points to.
|
||||||
|
* Event overwrite_var: Overwriting "mdi" in "mdi = mdi->devs" leaks the
|
||||||
|
storage that "mdi" points to.
|
||||||
|
* Event leaked_handle: Handle variable "lfd" going out of scope leaks
|
||||||
|
the handle.
|
||||||
|
* Event leaked_handle: Returning without closing handle "fd" leaks it.
|
||||||
|
* Event fixed_size_dest: You might overrun the 32-character fixed-sizei
|
||||||
|
string "devnm" by copying the return value of "fd2devnm" without
|
||||||
|
checking the length.
|
||||||
|
* Event fixed_size_dest: You might overrun the 32-character fixed-size
|
||||||
|
string "nm" by copying "nmp" without checking the length.
|
||||||
|
* Event fixed_size_dest: You might overrun the 32-character fixed-size
|
||||||
|
string "devnm" by copying the return value of "fd2devnm" without
|
||||||
|
checking the length.
|
||||||
|
* Event assigned_value: Assigning value "-1" to "tfd" here, but that
|
||||||
|
stored value is overwritten before it can be used.
|
||||||
|
|
||||||
|
Signed-off-by: Nigel Croxon <ncroxon@redhat.com>
|
||||||
|
---
|
||||||
|
Manage.c | 149 ++++++++++++++++++++++++++-----------------------------
|
||||||
|
1 file changed, 71 insertions(+), 78 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Manage.c b/Manage.c
|
||||||
|
index 5db72b77..aa5e80b2 100644
|
||||||
|
--- a/Manage.c
|
||||||
|
+++ b/Manage.c
|
||||||
|
@@ -56,7 +56,7 @@ int Manage_ro(char *devname, int fd, int readonly)
|
||||||
|
vers[9] = '-';
|
||||||
|
sysfs_set_str(mdi, NULL, "metadata_version", vers);
|
||||||
|
|
||||||
|
- close(fd);
|
||||||
|
+ close_fd(&fd);
|
||||||
|
rv = sysfs_set_str(mdi, NULL, "array_state", "readonly");
|
||||||
|
|
||||||
|
if (rv < 0) {
|
||||||
|
@@ -165,7 +165,7 @@ int Manage_run(char *devname, int fd, struct context *c)
|
||||||
|
pr_err("Cannot find %s in sysfs!!\n", devname);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
- strcpy(nm, nmp);
|
||||||
|
+ snprintf(nm, sizeof(nm), "%s", nmp);
|
||||||
|
return IncrementalScan(c, nm);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -187,7 +187,7 @@ int Manage_stop(char *devname, int fd, int verbose, int will_retry)
|
||||||
|
if (will_retry && verbose == 0)
|
||||||
|
verbose = -1;
|
||||||
|
|
||||||
|
- strcpy(devnm, fd2devnm(fd));
|
||||||
|
+ snprintf(devnm, sizeof(devnm), "%s", fd2devnm(fd));
|
||||||
|
/* Get EXCL access first. If this fails, then attempting
|
||||||
|
* to stop is probably a bad idea.
|
||||||
|
*/
|
||||||
|
@@ -195,7 +195,7 @@ int Manage_stop(char *devname, int fd, int verbose, int will_retry)
|
||||||
|
if (mdi && is_subarray(mdi->text_version))
|
||||||
|
sysfs_get_container_devnm(mdi, container);
|
||||||
|
|
||||||
|
- close(fd);
|
||||||
|
+ close_fd(&fd);
|
||||||
|
count = 5;
|
||||||
|
while (((fd = ((devname[0] == '/')
|
||||||
|
?open(devname, O_RDONLY|O_EXCL)
|
||||||
|
@@ -206,14 +206,12 @@ int Manage_stop(char *devname, int fd, int verbose, int will_retry)
|
||||||
|
* is a container, so we might be racing with mdmon, so
|
||||||
|
* retry for a bit.
|
||||||
|
*/
|
||||||
|
- if (fd >= 0)
|
||||||
|
- close(fd);
|
||||||
|
+ close_fd(&fd);
|
||||||
|
flush_mdmon(container);
|
||||||
|
count--;
|
||||||
|
}
|
||||||
|
if (fd < 0 || strcmp(fd2devnm(fd), devnm) != 0) {
|
||||||
|
- if (fd >= 0)
|
||||||
|
- close(fd);
|
||||||
|
+ close_fd(&fd);
|
||||||
|
if (verbose >= 0)
|
||||||
|
pr_err("Cannot get exclusive access to %s:Perhaps a running process, mounted filesystem or active volume group?\n",
|
||||||
|
devname);
|
||||||
|
@@ -228,7 +226,7 @@ int Manage_stop(char *devname, int fd, int verbose, int will_retry)
|
||||||
|
is_subarray(mdi->text_version)) {
|
||||||
|
int err;
|
||||||
|
/* This is mdmon managed. */
|
||||||
|
- close(fd);
|
||||||
|
+ close_fd(&fd);
|
||||||
|
|
||||||
|
/* As we had an O_EXCL open, any use of the device
|
||||||
|
* which blocks STOP_ARRAY is probably a transient use,
|
||||||
|
@@ -430,8 +428,7 @@ int Manage_stop(char *devname, int fd, int verbose, int will_retry)
|
||||||
|
break;
|
||||||
|
sysfs_wait(scfd, &delay);
|
||||||
|
}
|
||||||
|
- if (scfd >= 0)
|
||||||
|
- close(scfd);
|
||||||
|
+ close_fd(&scfd);
|
||||||
|
|
||||||
|
}
|
||||||
|
done:
|
||||||
|
@@ -469,6 +466,7 @@ done:
|
||||||
|
map_unlock(&map);
|
||||||
|
out:
|
||||||
|
sysfs_free(mdi);
|
||||||
|
+ close_fd(&fd);
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
@@ -664,7 +662,7 @@ int attempt_re_add(int fd, int tfd, struct mddev_dev *dv,
|
||||||
|
devname, verbose, 0, NULL);
|
||||||
|
if (rv == 0)
|
||||||
|
rv = dev_st->ss->store_super(dev_st, tfd);
|
||||||
|
- close(tfd);
|
||||||
|
+ close_fd(&tfd);
|
||||||
|
if (rv != 0) {
|
||||||
|
pr_err("failed to update superblock during re-add\n");
|
||||||
|
return -1;
|
||||||
|
@@ -766,15 +764,15 @@ mdadm_status_t manage_add_external(struct supertype *st, int fd, char *disk_name
|
||||||
|
rv = MDADM_STATUS_SUCCESS;
|
||||||
|
|
||||||
|
out:
|
||||||
|
- close(container_fd);
|
||||||
|
+ close_fd(&container_fd);
|
||||||
|
dev_policy_free(pols);
|
||||||
|
|
||||||
|
if (sra)
|
||||||
|
sysfs_free(sra);
|
||||||
|
|
||||||
|
- if (rv != MDADM_STATUS_SUCCESS && is_fd_valid(disk_fd))
|
||||||
|
+ if (rv != MDADM_STATUS_SUCCESS)
|
||||||
|
/* Metadata handler records this descriptor, so release it only on failure. */
|
||||||
|
- close(disk_fd);
|
||||||
|
+ close_fd(&disk_fd);
|
||||||
|
|
||||||
|
if (st->sb)
|
||||||
|
st->ss->free_super(st);
|
||||||
|
@@ -845,10 +843,10 @@ int Manage_add(int fd, int tfd, struct mddev_dev *dv,
|
||||||
|
continue;
|
||||||
|
if (tst->ss->load_super(tst, dfd,
|
||||||
|
NULL)) {
|
||||||
|
- close(dfd);
|
||||||
|
+ close_fd(&dfd);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
- close(dfd);
|
||||||
|
+ close_fd(&dfd);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* FIXME this is a bad test to be using */
|
||||||
|
@@ -1100,7 +1098,8 @@ int Manage_remove(struct supertype *tst, int fd, struct mddev_dev *dv,
|
||||||
|
*/
|
||||||
|
int ret;
|
||||||
|
char devnm[32];
|
||||||
|
- strcpy(devnm, fd2devnm(fd));
|
||||||
|
+
|
||||||
|
+ snprintf(devnm, sizeof(devnm), "%s", fd2devnm(fd));
|
||||||
|
lfd = open_dev_excl(devnm);
|
||||||
|
if (lfd < 0) {
|
||||||
|
pr_err("Cannot get exclusive access to container - odd\n");
|
||||||
|
@@ -1134,13 +1133,13 @@ int Manage_remove(struct supertype *tst, int fd, struct mddev_dev *dv,
|
||||||
|
if (ret == 0) {
|
||||||
|
pr_err("%s is not a member, cannot remove.\n",
|
||||||
|
dv->devname);
|
||||||
|
- close(lfd);
|
||||||
|
+ close_fd(&lfd);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (ret >= 2) {
|
||||||
|
pr_err("%s is still in use, cannot remove.\n",
|
||||||
|
dv->devname);
|
||||||
|
- close(lfd);
|
||||||
|
+ close_fd(&lfd);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -1157,26 +1156,27 @@ int Manage_remove(struct supertype *tst, int fd, struct mddev_dev *dv,
|
||||||
|
/* Old kernels rejected this if no personality
|
||||||
|
* is registered */
|
||||||
|
struct mdinfo *sra = sysfs_read(fd, NULL, GET_DEVS);
|
||||||
|
- struct mdinfo *dv = NULL;
|
||||||
|
- if (sra)
|
||||||
|
- dv = sra->devs;
|
||||||
|
- for ( ; dv ; dv=dv->next)
|
||||||
|
- if (dv->disk.major == (int)major(rdev) &&
|
||||||
|
- dv->disk.minor == (int)minor(rdev))
|
||||||
|
- break;
|
||||||
|
- if (dv)
|
||||||
|
- err = sysfs_set_str(sra, dv,
|
||||||
|
- "state", "remove");
|
||||||
|
- else
|
||||||
|
+ struct mdinfo *dev = NULL;
|
||||||
|
+
|
||||||
|
+ if (!sra) {
|
||||||
|
err = -1;
|
||||||
|
- sysfs_free(sra);
|
||||||
|
+ } else {
|
||||||
|
+ for (dev = sra->devs; dev ; dev = dev->next)
|
||||||
|
+ if (dev->disk.major == (int)major(rdev) &&
|
||||||
|
+ dev->disk.minor == (int)minor(rdev))
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ if (dev)
|
||||||
|
+ err = sysfs_set_str(sra, dev,
|
||||||
|
+ "state", "remove");
|
||||||
|
+ sysfs_free(sra);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (err) {
|
||||||
|
pr_err("hot remove failed for %s: %s\n", dv->devname,
|
||||||
|
strerror(errno));
|
||||||
|
- if (lfd >= 0)
|
||||||
|
- close(lfd);
|
||||||
|
+ close_fd(&lfd);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (tst->ss->external) {
|
||||||
|
@@ -1190,13 +1190,13 @@ int Manage_remove(struct supertype *tst, int fd, struct mddev_dev *dv,
|
||||||
|
|
||||||
|
if (!devnm) {
|
||||||
|
pr_err("unable to get container name\n");
|
||||||
|
+ close_fd(&lfd);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ping_manager(devnm);
|
||||||
|
}
|
||||||
|
- if (lfd >= 0)
|
||||||
|
- close(lfd);
|
||||||
|
+ close_fd(&lfd);
|
||||||
|
if (verbose >= 0)
|
||||||
|
pr_err("hot removed %s from %s\n",
|
||||||
|
dv->devname, devname);
|
||||||
|
@@ -1218,7 +1218,7 @@ int Manage_replace(struct supertype *tst, int fd, struct mddev_dev *dv,
|
||||||
|
if (!mdi || !mdi->devs) {
|
||||||
|
pr_err("Cannot find status of %s to enable replacement - strange\n",
|
||||||
|
devname);
|
||||||
|
- return -1;
|
||||||
|
+ goto abort;
|
||||||
|
}
|
||||||
|
for (di = mdi->devs; di; di = di->next)
|
||||||
|
if (di->disk.major == (int)major(rdev) &&
|
||||||
|
@@ -1229,16 +1229,14 @@ int Manage_replace(struct supertype *tst, int fd, struct mddev_dev *dv,
|
||||||
|
if (di->disk.raid_disk < 0) {
|
||||||
|
pr_err("%s is not active and so cannot be replaced.\n",
|
||||||
|
dv->devname);
|
||||||
|
- sysfs_free(mdi);
|
||||||
|
- return -1;
|
||||||
|
+ goto abort;
|
||||||
|
}
|
||||||
|
rv = sysfs_set_str(mdi, di,
|
||||||
|
"state", "want_replacement");
|
||||||
|
if (rv) {
|
||||||
|
- sysfs_free(mdi);
|
||||||
|
pr_err("Failed to request replacement for %s\n",
|
||||||
|
dv->devname);
|
||||||
|
- return -1;
|
||||||
|
+ goto abort;
|
||||||
|
}
|
||||||
|
if (verbose >= 0)
|
||||||
|
pr_err("Marked %s (device %d in %s) for replacement\n",
|
||||||
|
@@ -1252,11 +1250,13 @@ int Manage_replace(struct supertype *tst, int fd, struct mddev_dev *dv,
|
||||||
|
dv->disposition = 'w';
|
||||||
|
dv->used = di->disk.raid_disk;
|
||||||
|
}
|
||||||
|
+ sysfs_free(mdi);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
- sysfs_free(mdi);
|
||||||
|
pr_err("%s not found in %s so cannot --replace it\n",
|
||||||
|
dv->devname, devname);
|
||||||
|
+abort:
|
||||||
|
+ sysfs_free(mdi);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1269,7 +1269,7 @@ int Manage_with(struct supertype *tst, int fd, struct mddev_dev *dv,
|
||||||
|
if (!mdi || !mdi->devs) {
|
||||||
|
pr_err("Cannot find status of %s to enable replacement - strange\n",
|
||||||
|
devname);
|
||||||
|
- return -1;
|
||||||
|
+ goto abort;
|
||||||
|
}
|
||||||
|
for (di = mdi->devs; di; di = di->next)
|
||||||
|
if (di->disk.major == (int)major(rdev) &&
|
||||||
|
@@ -1280,31 +1280,30 @@ int Manage_with(struct supertype *tst, int fd, struct mddev_dev *dv,
|
||||||
|
if (di->disk.state & (1<<MD_DISK_FAULTY)) {
|
||||||
|
pr_err("%s is faulty and cannot be a replacement\n",
|
||||||
|
dv->devname);
|
||||||
|
- sysfs_free(mdi);
|
||||||
|
- return -1;
|
||||||
|
+ goto abort;
|
||||||
|
}
|
||||||
|
if (di->disk.raid_disk >= 0) {
|
||||||
|
pr_err("%s is active and cannot be a replacement\n",
|
||||||
|
dv->devname);
|
||||||
|
- sysfs_free(mdi);
|
||||||
|
- return -1;
|
||||||
|
+ goto abort;
|
||||||
|
}
|
||||||
|
rv = sysfs_set_num(mdi, di,
|
||||||
|
"slot", dv->used);
|
||||||
|
if (rv) {
|
||||||
|
- sysfs_free(mdi);
|
||||||
|
pr_err("Failed to set %s as preferred replacement.\n",
|
||||||
|
dv->devname);
|
||||||
|
- return -1;
|
||||||
|
+ goto abort;
|
||||||
|
}
|
||||||
|
if (verbose >= 0)
|
||||||
|
pr_err("Marked %s in %s as replacement for device %d\n",
|
||||||
|
dv->devname, devname, dv->used);
|
||||||
|
+ sysfs_free(mdi);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
- sysfs_free(mdi);
|
||||||
|
pr_err("%s not found in %s so cannot make it preferred replacement\n",
|
||||||
|
dv->devname, devname);
|
||||||
|
+abort:
|
||||||
|
+ sysfs_free(mdi);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1324,6 +1323,7 @@ bool is_remove_safe(mdu_array_info_t *array, const int fd, char *devname, const
|
||||||
|
{
|
||||||
|
dev_t devid = devnm2devid(devname + 5);
|
||||||
|
struct mdinfo *mdi = sysfs_read(fd, NULL, GET_DEVS | GET_DISKS | GET_STATE);
|
||||||
|
+ struct mdinfo *disk;
|
||||||
|
|
||||||
|
if (!mdi) {
|
||||||
|
if (verbose)
|
||||||
|
@@ -1333,14 +1333,14 @@ bool is_remove_safe(mdu_array_info_t *array, const int fd, char *devname, const
|
||||||
|
|
||||||
|
char *avail = xcalloc(array->raid_disks, sizeof(char));
|
||||||
|
|
||||||
|
- for (mdi = mdi->devs; mdi; mdi = mdi->next) {
|
||||||
|
- if (mdi->disk.raid_disk < 0)
|
||||||
|
+ for (disk = mdi->devs; disk; disk = mdi->next) {
|
||||||
|
+ if (disk->disk.raid_disk < 0)
|
||||||
|
continue;
|
||||||
|
- if (!(mdi->disk.state & (1 << MD_DISK_SYNC)))
|
||||||
|
+ if (!(disk->disk.state & (1 << MD_DISK_SYNC)))
|
||||||
|
continue;
|
||||||
|
- if (makedev(mdi->disk.major, mdi->disk.minor) == devid)
|
||||||
|
+ if (makedev(disk->disk.major, disk->disk.minor) == devid)
|
||||||
|
continue;
|
||||||
|
- avail[mdi->disk.raid_disk] = 1;
|
||||||
|
+ avail[disk->disk.raid_disk] = 1;
|
||||||
|
}
|
||||||
|
sysfs_free(mdi);
|
||||||
|
|
||||||
|
@@ -1550,7 +1550,7 @@ int Manage_subdevs(char *devname, int fd,
|
||||||
|
rdev = makedev(mj,mn);
|
||||||
|
found = 1;
|
||||||
|
}
|
||||||
|
- close(sysfd);
|
||||||
|
+ close_fd(&sysfd);
|
||||||
|
sysfd = -1;
|
||||||
|
}
|
||||||
|
if (!found) {
|
||||||
|
@@ -1572,7 +1572,7 @@ int Manage_subdevs(char *devname, int fd,
|
||||||
|
tfd = dev_open(dv->devname, O_RDONLY);
|
||||||
|
if (tfd >= 0) {
|
||||||
|
fstat_is_blkdev(tfd, dv->devname, &rdev);
|
||||||
|
- close(tfd);
|
||||||
|
+ close_fd(&tfd);
|
||||||
|
} else {
|
||||||
|
int open_err = errno;
|
||||||
|
if (!stat_is_blkdev(dv->devname, &rdev)) {
|
||||||
|
@@ -1635,7 +1635,7 @@ int Manage_subdevs(char *devname, int fd,
|
||||||
|
* need non-exclusive access to add it, so
|
||||||
|
* do that now.
|
||||||
|
*/
|
||||||
|
- close(tfd);
|
||||||
|
+ close_fd(&tfd);
|
||||||
|
tfd = dev_open(dv->devname, O_RDONLY);
|
||||||
|
}
|
||||||
|
if (tfd < 0) {
|
||||||
|
@@ -1654,8 +1654,7 @@ int Manage_subdevs(char *devname, int fd,
|
||||||
|
rv = Manage_add(fd, tfd, dv, tst, &array,
|
||||||
|
force, verbose, devname, update,
|
||||||
|
rdev, array_size, raid_slot);
|
||||||
|
- close(tfd);
|
||||||
|
- tfd = -1;
|
||||||
|
+ close_fd(&tfd);
|
||||||
|
if (rv < 0)
|
||||||
|
goto abort;
|
||||||
|
if (rv > 0)
|
||||||
|
@@ -1672,7 +1671,7 @@ int Manage_subdevs(char *devname, int fd,
|
||||||
|
rdev, verbose, force,
|
||||||
|
devname);
|
||||||
|
if (sysfd >= 0)
|
||||||
|
- close(sysfd);
|
||||||
|
+ close_fd(&sysfd);
|
||||||
|
sysfd = -1;
|
||||||
|
if (rv < 0)
|
||||||
|
goto abort;
|
||||||
|
@@ -1684,8 +1683,7 @@ int Manage_subdevs(char *devname, int fd,
|
||||||
|
if (!is_remove_safe(&array, fd, dv->devname, verbose)) {
|
||||||
|
pr_err("Cannot remove %s from %s, array will be failed.\n",
|
||||||
|
dv->devname, devname);
|
||||||
|
- if (sysfd >= 0)
|
||||||
|
- close(sysfd);
|
||||||
|
+ close_fd(&sysfd);
|
||||||
|
goto abort;
|
||||||
|
}
|
||||||
|
case 'I': /* incremental fail */
|
||||||
|
@@ -1696,13 +1694,10 @@ int Manage_subdevs(char *devname, int fd,
|
||||||
|
busy = 1;
|
||||||
|
pr_err("set device faulty failed for %s: %s\n",
|
||||||
|
dv->devname, strerror(errno));
|
||||||
|
- if (sysfd >= 0)
|
||||||
|
- close(sysfd);
|
||||||
|
+ close_fd(&sysfd);
|
||||||
|
goto abort;
|
||||||
|
}
|
||||||
|
- if (sysfd >= 0)
|
||||||
|
- close(sysfd);
|
||||||
|
- sysfd = -1;
|
||||||
|
+ close_fd(&sysfd);
|
||||||
|
count++;
|
||||||
|
if (verbose >= 0)
|
||||||
|
pr_err("set %s faulty in %s\n",
|
||||||
|
@@ -1762,7 +1757,7 @@ int autodetect(void)
|
||||||
|
if (fd >= 0) {
|
||||||
|
if (ioctl(fd, RAID_AUTORUN, 0) == 0)
|
||||||
|
rv = 0;
|
||||||
|
- close(fd);
|
||||||
|
+ close_fd(&fd);
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
@@ -1825,7 +1820,7 @@ free_super:
|
||||||
|
if (info)
|
||||||
|
free(info);
|
||||||
|
st->ss->free_super(st);
|
||||||
|
- close(fd);
|
||||||
|
+ close_fd(&fd);
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
@@ -1843,10 +1838,8 @@ int move_spare(char *from_devname, char *to_devname, dev_t devid)
|
||||||
|
int fd2 = open(from_devname, O_RDONLY);
|
||||||
|
|
||||||
|
if (fd1 < 0 || fd2 < 0) {
|
||||||
|
- if (fd1 >= 0)
|
||||||
|
- close(fd1);
|
||||||
|
- if (fd2 >= 0)
|
||||||
|
- close(fd2);
|
||||||
|
+ close_fd(&fd1);
|
||||||
|
+ close_fd(&fd2);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1865,15 +1858,15 @@ int move_spare(char *from_devname, char *to_devname, dev_t devid)
|
||||||
|
/* make sure manager is aware of changes */
|
||||||
|
ping_manager(to_devname);
|
||||||
|
ping_manager(from_devname);
|
||||||
|
- close(fd1);
|
||||||
|
- close(fd2);
|
||||||
|
+ close_fd(&fd1);
|
||||||
|
+ close_fd(&fd2);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Manage_subdevs(from_devname, fd2, &devlist,
|
||||||
|
-1, 0, UOPT_UNDEFINED, 0);
|
||||||
|
}
|
||||||
|
- close(fd1);
|
||||||
|
- close(fd2);
|
||||||
|
+ close_fd(&fd1);
|
||||||
|
+ close_fd(&fd2);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
29
0121-Manage-fix-is_remove_safe.patch
Normal file
29
0121-Manage-fix-is_remove_safe.patch
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
From ec72668a9768ad01b409b68f31f3ca7ffeeaab4e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
Date: Tue, 16 Jul 2024 15:37:34 +0200
|
||||||
|
Subject: [PATCH 121/157] Manage: fix is_remove_safe()
|
||||||
|
|
||||||
|
Fix for to make --set-faulty working.
|
||||||
|
|
||||||
|
Fixes: 1b4b73fd535a ("mdadm: Manage.c fix coverity issues")
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
Manage.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/Manage.c b/Manage.c
|
||||||
|
index aa5e80b2..f0304e1e 100644
|
||||||
|
--- a/Manage.c
|
||||||
|
+++ b/Manage.c
|
||||||
|
@@ -1333,7 +1333,7 @@ bool is_remove_safe(mdu_array_info_t *array, const int fd, char *devname, const
|
||||||
|
|
||||||
|
char *avail = xcalloc(array->raid_disks, sizeof(char));
|
||||||
|
|
||||||
|
- for (disk = mdi->devs; disk; disk = mdi->next) {
|
||||||
|
+ for (disk = mdi->devs; disk; disk = disk->next) {
|
||||||
|
if (disk->disk.raid_disk < 0)
|
||||||
|
continue;
|
||||||
|
if (!(disk->disk.state & (1 << MD_DISK_SYNC)))
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
28
0122-imsm-add-indent-for-encryption-details.patch
Normal file
28
0122-imsm-add-indent-for-encryption-details.patch
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
From f8274feea5c63300e893109840943513df924da2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
Date: Mon, 15 Jul 2024 12:21:19 +0200
|
||||||
|
Subject: [PATCH 122/157] imsm: add indent for encryption details
|
||||||
|
|
||||||
|
Improve readability of the output.
|
||||||
|
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
super-intel.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/super-intel.c b/super-intel.c
|
||||||
|
index ef3f5da1..713bfccf 100644
|
||||||
|
--- a/super-intel.c
|
||||||
|
+++ b/super-intel.c
|
||||||
|
@@ -2318,7 +2318,7 @@ void print_encryption_information(int disk_fd, enum sys_dev_type hba_type)
|
||||||
|
{
|
||||||
|
struct encryption_information information = {0};
|
||||||
|
mdadm_status_t status = MDADM_STATUS_SUCCESS;
|
||||||
|
- const char *indent = " ";
|
||||||
|
+ const char *indent = " ";
|
||||||
|
|
||||||
|
switch (hba_type) {
|
||||||
|
case SYS_DEV_VMD:
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
67
0123-mdadm-Monitor.c-fix-coverity-issues.patch
Normal file
67
0123-mdadm-Monitor.c-fix-coverity-issues.patch
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
From 5cb6df3f190feccc8b3e82da2b01a0e01e612a25 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Nigel Croxon <ncroxon@redhat.com>
|
||||||
|
Date: Mon, 15 Jul 2024 10:13:46 -0400
|
||||||
|
Subject: [PATCH 123/157] mdadm: Monitor.c fix coverity issues
|
||||||
|
|
||||||
|
Fixing the following coding errors the coverity tools found:
|
||||||
|
|
||||||
|
* Event check_return: Calling "fcntl(fd, 2, 1)" without checking
|
||||||
|
return value. This library function may fail and return an error code.
|
||||||
|
|
||||||
|
* Dereferencing "sl", which is known to be "NULL".
|
||||||
|
|
||||||
|
* Event fixed_size_dest: You might overrun the 32-character fixed-size
|
||||||
|
string "devnm" by copying "tmp" without checking the length.
|
||||||
|
|
||||||
|
Signed-off-by: Nigel Croxon <ncroxon@redhat.com>
|
||||||
|
---
|
||||||
|
Monitor.c | 12 ++++++++----
|
||||||
|
1 file changed, 8 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Monitor.c b/Monitor.c
|
||||||
|
index 9b016bc3..26c53e13 100644
|
||||||
|
--- a/Monitor.c
|
||||||
|
+++ b/Monitor.c
|
||||||
|
@@ -782,7 +782,9 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
|
||||||
|
if (!is_container && !md_array_active(fd))
|
||||||
|
goto disappeared;
|
||||||
|
|
||||||
|
- fcntl(fd, F_SETFD, FD_CLOEXEC);
|
||||||
|
+ if (fcntl(fd, F_SETFD, FD_CLOEXEC) < 0)
|
||||||
|
+ goto out;
|
||||||
|
+
|
||||||
|
if (md_get_array_info(fd, &array) < 0)
|
||||||
|
goto disappeared;
|
||||||
|
|
||||||
|
@@ -997,7 +999,8 @@ static int add_new_arrays(struct mdstat_ent *mdstat, struct state **statelist)
|
||||||
|
snprintf(st->parent_devnm, MD_NAME_MAX,
|
||||||
|
"%s", mse->metadata_version + 10);
|
||||||
|
sl = strchr(st->parent_devnm, '/');
|
||||||
|
- *sl = 0;
|
||||||
|
+ if (sl)
|
||||||
|
+ *sl = 0;
|
||||||
|
} else
|
||||||
|
st->parent_devnm[0] = 0;
|
||||||
|
*statelist = st;
|
||||||
|
@@ -1261,7 +1264,7 @@ int Wait(char *dev)
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
- strcpy(devnm, tmp);
|
||||||
|
+ snprintf(devnm, sizeof(devnm), "%s", tmp);
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
struct mdstat_ent *ms = mdstat_read(1, 0);
|
||||||
|
@@ -1332,7 +1335,8 @@ int WaitClean(char *dev, int verbose)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
- strcpy(devnm, fd2devnm(fd));
|
||||||
|
+ snprintf(devnm, sizeof(devnm), "%s", fd2devnm(fd));
|
||||||
|
+
|
||||||
|
mdi = sysfs_read(fd, devnm, GET_VERSION|GET_LEVEL|GET_SAFEMODE);
|
||||||
|
if (!mdi) {
|
||||||
|
if (verbose)
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
42
0124-mdadm-Query.c-fix-coverity-issues.patch
Normal file
42
0124-mdadm-Query.c-fix-coverity-issues.patch
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
From bcc3ab1728da61e5519e1f01597c8da0c5bc769b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Nigel Croxon <ncroxon@redhat.com>
|
||||||
|
Date: Tue, 16 Jul 2024 07:19:34 -0400
|
||||||
|
Subject: [PATCH 124/157] mdadm: Query.c fix coverity issues
|
||||||
|
|
||||||
|
Fixing the following coding errors the coverity tools found:
|
||||||
|
|
||||||
|
* Event leaked_storage: Variable "sra" going out of scope leaks the
|
||||||
|
storage it points to.
|
||||||
|
|
||||||
|
* Event uninit_use_in_call: Using uninitialized value "larray_size" when
|
||||||
|
calling "human_size_brief".
|
||||||
|
|
||||||
|
Signed-off-by: Nigel Croxon <ncroxon@redhat.com>
|
||||||
|
---
|
||||||
|
Query.c | 4 +++-
|
||||||
|
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/Query.c b/Query.c
|
||||||
|
index adcd231e..aedb4ce7 100644
|
||||||
|
--- a/Query.c
|
||||||
|
+++ b/Query.c
|
||||||
|
@@ -39,7 +39,7 @@ int Query(char *dev)
|
||||||
|
struct mdinfo info;
|
||||||
|
struct mdinfo *sra;
|
||||||
|
struct supertype *st = NULL;
|
||||||
|
- unsigned long long larray_size;
|
||||||
|
+ unsigned long long larray_size = 0;
|
||||||
|
struct stat stb;
|
||||||
|
char *mddev;
|
||||||
|
mdu_disk_info_t disc;
|
||||||
|
@@ -136,5 +136,7 @@ int Query(char *dev)
|
||||||
|
if (st->ss == &super0)
|
||||||
|
put_md_name(mddev);
|
||||||
|
}
|
||||||
|
+ free(sra);
|
||||||
|
+
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
43
0125-mdadm-lib.c-fix-coverity-issues.patch
Normal file
43
0125-mdadm-lib.c-fix-coverity-issues.patch
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
From da7aecdf25371e1476da4ec56e9ec5ddf13af5da Mon Sep 17 00:00:00 2001
|
||||||
|
From: Nigel Croxon <ncroxon@redhat.com>
|
||||||
|
Date: Tue, 16 Jul 2024 07:20:10 -0400
|
||||||
|
Subject: [PATCH 125/157] mdadm: lib.c fix coverity issues
|
||||||
|
|
||||||
|
Fixing the following coding errors the coverity tools found:
|
||||||
|
|
||||||
|
* Event fixed_size_dest: You might overrun the 32-character fixed-size
|
||||||
|
string "devnm" by copying "cp + 1" without checking the length.
|
||||||
|
|
||||||
|
* Event fixed_size_dest: You might overrun the 32-character fixed-size
|
||||||
|
string "devnm" by copying "cp" without checking the length.
|
||||||
|
|
||||||
|
Signed-off-by: Nigel Croxon <ncroxon@redhat.com>
|
||||||
|
---
|
||||||
|
lib.c | 4 ++--
|
||||||
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib.c b/lib.c
|
||||||
|
index 2b09293c..13d4e4f1 100644
|
||||||
|
--- a/lib.c
|
||||||
|
+++ b/lib.c
|
||||||
|
@@ -109,7 +109,7 @@ char *devid2kname(dev_t devid)
|
||||||
|
link[n] = 0;
|
||||||
|
cp = strrchr(link, '/');
|
||||||
|
if (cp) {
|
||||||
|
- strcpy(devnm, cp + 1);
|
||||||
|
+ snprintf(devnm, sizeof(devnm), "%s", cp + 1);
|
||||||
|
return devnm;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -159,7 +159,7 @@ char *devid2devnm(dev_t devid)
|
||||||
|
ep = strchr(cp, '/');
|
||||||
|
if (ep)
|
||||||
|
*ep = 0;
|
||||||
|
- strcpy(devnm, cp);
|
||||||
|
+ snprintf(devnm, sizeof(devnm), "%s", cp);
|
||||||
|
return devnm;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
158
0126-mdadm-do-not-allow-leading-dot-in-MD-device-name.patch
Normal file
158
0126-mdadm-do-not-allow-leading-dot-in-MD-device-name.patch
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
From 998544c198c156db027a6e4f1b201910b138041e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
Date: Mon, 15 Jul 2024 12:29:24 +0200
|
||||||
|
Subject: [PATCH 126/157] mdadm: do not allow leading dot in MD device name
|
||||||
|
|
||||||
|
Do not allow to use '.' on first place for named MD device.
|
||||||
|
Having leading dot might be confusing, MD device cannot be hidden.
|
||||||
|
It also removes possibility to create md device with name '.'.
|
||||||
|
|
||||||
|
Additionally, code optimalizations are done.
|
||||||
|
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
config.c | 75 +++++++++++++++++++++++++++++++-------------------------
|
||||||
|
1 file changed, 41 insertions(+), 34 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/config.c b/config.c
|
||||||
|
index cd2379bd..6ea905f3 100644
|
||||||
|
--- a/config.c
|
||||||
|
+++ b/config.c
|
||||||
|
@@ -188,8 +188,36 @@ inline void ident_init(struct mddev_ident *ident)
|
||||||
|
ident->uuid_set = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+/** ident_check_name() - helper function to verify name.
|
||||||
|
+ * @name: name to check.
|
||||||
|
+ * @prop_name: the name of the property it is validated against, used for logging.
|
||||||
|
+ * @cmdline: context dependent actions.
|
||||||
|
+ *
|
||||||
|
+ * @name must follow name's criteria, be POSIX compatible and does not have leading dot.
|
||||||
|
+ */
|
||||||
|
+static mdadm_status_t ident_check_name(const char *name, const char *prop_name, const bool cmdline)
|
||||||
|
+{
|
||||||
|
+ if (!is_string_lq(name, MD_NAME_MAX + 1)) {
|
||||||
|
+ ident_log(prop_name, name, "Too long or empty", cmdline);
|
||||||
|
+ return MDADM_STATUS_ERROR;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (*name == '.') {
|
||||||
|
+ /* MD device should not be considered as hidden. */
|
||||||
|
+ ident_log(prop_name, name, "Leading dot forbidden", cmdline);
|
||||||
|
+ return MDADM_STATUS_ERROR;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!is_name_posix_compatible(name)) {
|
||||||
|
+ ident_log(prop_name, name, "Not POSIX compatible", cmdline);
|
||||||
|
+ return MDADM_STATUS_ERROR;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return MDADM_STATUS_SUCCESS;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
- * _ident_set_devname()- verify devname and set it in &mddev_ident.
|
||||||
|
+ * _ident_set_devname() - verify devname and set it in &mddev_ident.
|
||||||
|
* @ident: pointer to &mddev_ident.
|
||||||
|
* @devname: devname to be set.
|
||||||
|
* @cmdline: context dependent actions. If set, ignore keyword is not allowed.
|
||||||
|
@@ -202,8 +230,7 @@ inline void ident_init(struct mddev_ident *ident)
|
||||||
|
* /dev/md/{name}
|
||||||
|
* {name}
|
||||||
|
*
|
||||||
|
- * {name} must follow name's criteria and be POSIX compatible.
|
||||||
|
- * If criteria passed, duplicate memory and set devname in @ident.
|
||||||
|
+ * If verification passed, duplicate memory and set devname in @ident.
|
||||||
|
*
|
||||||
|
* Return: %MDADM_STATUS_SUCCESS or %MDADM_STATUS_ERROR.
|
||||||
|
*/
|
||||||
|
@@ -216,6 +243,7 @@ mdadm_status_t _ident_set_devname(struct mddev_ident *ident, const char *devname
|
||||||
|
static const char named_dev_pref[] = DEV_NUM_PREF "_";
|
||||||
|
static const int named_dev_pref_size = sizeof(named_dev_pref) - 1;
|
||||||
|
const char *prop_name = "devname";
|
||||||
|
+ mdadm_status_t ret;
|
||||||
|
const char *name;
|
||||||
|
|
||||||
|
if (ident->devname) {
|
||||||
|
@@ -242,53 +270,40 @@ mdadm_status_t _ident_set_devname(struct mddev_ident *ident, const char *devname
|
||||||
|
else
|
||||||
|
name = devname;
|
||||||
|
|
||||||
|
- if (is_name_posix_compatible(name) == false) {
|
||||||
|
- ident_log(prop_name, name, "Not POSIX compatible", cmdline);
|
||||||
|
- return MDADM_STATUS_ERROR;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (is_string_lq(name, MD_NAME_MAX + 1) == false) {
|
||||||
|
- ident_log(prop_name, devname, "Invalid length", cmdline);
|
||||||
|
- return MDADM_STATUS_ERROR;
|
||||||
|
- }
|
||||||
|
+ ret = ident_check_name(name, prop_name, cmdline);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
pass:
|
||||||
|
ident->devname = xstrdup(devname);
|
||||||
|
return MDADM_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
- * _ident_set_name()- set name in &mddev_ident.
|
||||||
|
+ * _ident_set_name() - set name in &mddev_ident.
|
||||||
|
* @ident: pointer to &mddev_ident.
|
||||||
|
* @name: name to be set.
|
||||||
|
- * @cmdline: context dependent actions.
|
||||||
|
*
|
||||||
|
* If criteria passed, set name in @ident.
|
||||||
|
* Note: name is not used by config file, it for cmdline only.
|
||||||
|
*
|
||||||
|
* Return: %MDADM_STATUS_SUCCESS or %MDADM_STATUS_ERROR.
|
||||||
|
*/
|
||||||
|
-static mdadm_status_t _ident_set_name(struct mddev_ident *ident, const char *name,
|
||||||
|
- const bool cmdline)
|
||||||
|
+mdadm_status_t ident_set_name(struct mddev_ident *ident, const char *name)
|
||||||
|
{
|
||||||
|
assert(name);
|
||||||
|
assert(ident);
|
||||||
|
|
||||||
|
const char *prop_name = "name";
|
||||||
|
+ mdadm_status_t ret;
|
||||||
|
|
||||||
|
if (ident->name[0]) {
|
||||||
|
- ident_log(prop_name, name, "Already defined", cmdline);
|
||||||
|
+ ident_log(prop_name, name, "Already defined", true);
|
||||||
|
return MDADM_STATUS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (is_string_lq(name, MD_NAME_MAX + 1) == false) {
|
||||||
|
- ident_log(prop_name, name, "Too long or empty", cmdline);
|
||||||
|
- return MDADM_STATUS_ERROR;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (is_name_posix_compatible(name) == false) {
|
||||||
|
- ident_log(prop_name, name, "Not POSIX compatible", cmdline);
|
||||||
|
- return MDADM_STATUS_ERROR;
|
||||||
|
- }
|
||||||
|
+ ret = ident_check_name(name, prop_name, true);
|
||||||
|
+ if (ret)
|
||||||
|
+ return ret;
|
||||||
|
|
||||||
|
snprintf(ident->name, MD_NAME_MAX + 1, "%s", name);
|
||||||
|
return MDADM_STATUS_SUCCESS;
|
||||||
|
@@ -302,14 +317,6 @@ mdadm_status_t ident_set_devname(struct mddev_ident *ident, const char *name)
|
||||||
|
return _ident_set_devname(ident, name, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
-/**
|
||||||
|
- * ident_set_name()- exported, for cmdline.
|
||||||
|
- */
|
||||||
|
-mdadm_status_t ident_set_name(struct mddev_ident *ident, const char *name)
|
||||||
|
-{
|
||||||
|
- return _ident_set_name(ident, name, true);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
struct conf_dev {
|
||||||
|
struct conf_dev *next;
|
||||||
|
char *name;
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
36
0128-Detail-fix-detail-export-for-uuid_zero.patch
Normal file
36
0128-Detail-fix-detail-export-for-uuid_zero.patch
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
From 5be749ce416852e7acbb2415be380be358859612 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kinga Stefaniuk <kinga.stefaniuk@intel.com>
|
||||||
|
Date: Tue, 23 Jul 2024 15:38:41 +0200
|
||||||
|
Subject: [PATCH 128/157] Detail: fix --detail --export for uuid_zero
|
||||||
|
|
||||||
|
Mentioned commit (see Fixes) causes that devices with UUID
|
||||||
|
equal to uuid_zero was not recognized properly. For few devices
|
||||||
|
the first one was taken always, and the same information was
|
||||||
|
printed. It caused regression, when few containers were created,
|
||||||
|
symlinks were generated only for the first one.
|
||||||
|
|
||||||
|
Add checking if uuid is uuid_zero and, if yes, use devname to
|
||||||
|
differentiate devices.
|
||||||
|
|
||||||
|
Fixes: 60c19530dd7c ("Detail: remove duplicated code")
|
||||||
|
Signed-off-by: Kinga Stefaniuk <kinga.stefaniuk@intel.com>
|
||||||
|
---
|
||||||
|
Detail.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/Detail.c b/Detail.c
|
||||||
|
index 55a086d3..f8b9e847 100644
|
||||||
|
--- a/Detail.c
|
||||||
|
+++ b/Detail.c
|
||||||
|
@@ -274,7 +274,7 @@ int Detail(char *dev, struct context *c)
|
||||||
|
array.minor_version);
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (info)
|
||||||
|
+ if (info && memcmp(info->uuid, uuid_zero, sizeof(int[4])) != 0)
|
||||||
|
mp = map_by_uuid(&map, info->uuid);
|
||||||
|
if (!mp)
|
||||||
|
mp = map_by_devnm(&map, fd2devnm(fd));
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
84
0129-drive_encryption-Fix-ata-passthrough12-verify.patch
Normal file
84
0129-drive_encryption-Fix-ata-passthrough12-verify.patch
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
From 2bb4efb504d0991eaba755242d3e70facb5d994b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Blazej Kucman <blazej.kucman@intel.com>
|
||||||
|
Date: Tue, 23 Jul 2024 12:45:10 +0200
|
||||||
|
Subject: [PATCH 129/157] drive_encryption: Fix ata passthrough12 verify
|
||||||
|
|
||||||
|
Based on documentation SCSI Primary Commands - 4 (SPC-4) only first 7 bits
|
||||||
|
of first byte in sense data are used to store response code. The current
|
||||||
|
verification uses all 8 bits for comparison of response code.
|
||||||
|
|
||||||
|
Incorrect verification may make impossible to use SATA disks with IMSM,
|
||||||
|
because IMSM requires verification of the encryption state before use.
|
||||||
|
|
||||||
|
There was issue in kernel libata [1]. This issue hides bug in mdadm because
|
||||||
|
last bit was not set.
|
||||||
|
|
||||||
|
Example output with affected mdadm:
|
||||||
|
|
||||||
|
Port3 : /dev/sde (BTPR212503EK120LGN)
|
||||||
|
mdadm: Failed ata passthrough12 ioctl. Device: /dev/sde.
|
||||||
|
mdadm: Failed to get drive encryption information
|
||||||
|
|
||||||
|
The fix is use the first 7 bits of Byte 0, to compare with the expected
|
||||||
|
values.
|
||||||
|
|
||||||
|
[1] https://git.kernel.org/pub/scm/linux/kernel/git/libata/linux.git/commit/?id=38dab832c3f4
|
||||||
|
|
||||||
|
Fixes: df38df3052c3 ("Add reading SATA encryption information")
|
||||||
|
Signed-off-by: Blazej Kucman <blazej.kucman@intel.com>
|
||||||
|
---
|
||||||
|
drive_encryption.c | 10 +++++++---
|
||||||
|
1 file changed, 7 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drive_encryption.c b/drive_encryption.c
|
||||||
|
index a4ad799f..63bdab1a 100644
|
||||||
|
--- a/drive_encryption.c
|
||||||
|
+++ b/drive_encryption.c
|
||||||
|
@@ -65,6 +65,7 @@
|
||||||
|
#define SENSE_DATA_CURRENT_FIXED (0x70)
|
||||||
|
#define SENSE_DATA_CURRENT_DESC (0x72)
|
||||||
|
#define SENSE_CURRENT_RES_DESC_POS (8)
|
||||||
|
+#define SENSE_RESPONSE_CODE_MASK (0x7f)
|
||||||
|
#define SG_DRIVER_SENSE (0x08)
|
||||||
|
|
||||||
|
typedef enum drive_feature_support_status {
|
||||||
|
@@ -473,6 +474,7 @@ ata_pass_through12_ioctl(int disk_fd, __u8 ata_command, __u8 sec_protocol, __u1
|
||||||
|
{
|
||||||
|
__u8 cdb[ATA_INQUIRY_LENGTH] = {0};
|
||||||
|
__u8 sense[SG_SENSE_SIZE] = {0};
|
||||||
|
+ __u8 sense_response_code;
|
||||||
|
__u8 *sense_desc = NULL;
|
||||||
|
sg_io_hdr_t sg = {0};
|
||||||
|
|
||||||
|
@@ -517,15 +519,17 @@ ata_pass_through12_ioctl(int disk_fd, __u8 ata_command, __u8 sec_protocol, __u1
|
||||||
|
return MDADM_STATUS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ sense_response_code = sense[0] & SENSE_RESPONSE_CODE_MASK;
|
||||||
|
/* verify expected sense response code */
|
||||||
|
- if (!(sense[0] == SENSE_DATA_CURRENT_DESC || sense[0] == SENSE_DATA_CURRENT_FIXED)) {
|
||||||
|
+ if (!(sense_response_code == SENSE_DATA_CURRENT_DESC ||
|
||||||
|
+ sense_response_code == SENSE_DATA_CURRENT_FIXED)) {
|
||||||
|
pr_vrb("Failed ata passthrough12 ioctl. Device: /dev/%s.\n", fd2kname(disk_fd));
|
||||||
|
return MDADM_STATUS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
sense_desc = sense + SENSE_CURRENT_RES_DESC_POS;
|
||||||
|
/* verify sense data current response with descriptor format */
|
||||||
|
- if (sense[0] == SENSE_DATA_CURRENT_DESC &&
|
||||||
|
+ if (sense_response_code == SENSE_DATA_CURRENT_DESC &&
|
||||||
|
!(sense_desc[0] == ATA_STATUS_RETURN_DESCRIPTOR &&
|
||||||
|
sense_desc[1] == ATA_INQUIRY_LENGTH)) {
|
||||||
|
pr_vrb("Failed ata passthrough12 ioctl. Device: /dev/%s. Sense data ASC: %d, ASCQ: %d.\n",
|
||||||
|
@@ -534,7 +538,7 @@ ata_pass_through12_ioctl(int disk_fd, __u8 ata_command, __u8 sec_protocol, __u1
|
||||||
|
}
|
||||||
|
|
||||||
|
/* verify sense data current response with fixed format */
|
||||||
|
- if (sense[0] == SENSE_DATA_CURRENT_FIXED &&
|
||||||
|
+ if (sense_response_code == SENSE_DATA_CURRENT_FIXED &&
|
||||||
|
!(sense[12] == ATA_PT_INFORMATION_AVAILABLE_ASC &&
|
||||||
|
sense[13] == ATA_PT_INFORMATION_AVAILABLE_ASCQ)) {
|
||||||
|
pr_vrb("Failed ata passthrough12 ioctl. Device: /dev/%s. Sense data ASC: %d, ASCQ: %d.\n",
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
@ -0,0 +1,46 @@
|
|||||||
|
From 0af8c9ebf50b68ad5f80efad7e94688235544a3d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kinga Stefaniuk <kinga.stefaniuk@intel.com>
|
||||||
|
Date: Thu, 4 Jul 2024 14:53:35 +0200
|
||||||
|
Subject: [PATCH 130/157] super0: use define for char array in examine_super0
|
||||||
|
|
||||||
|
Using nb with 11 length may cause format-truncation errors,
|
||||||
|
because it was possible to use snprintf with 12 length input
|
||||||
|
and write it to 11 length output. Added new define and use it
|
||||||
|
to avoid this error.
|
||||||
|
|
||||||
|
Signed-off-by: Kinga Stefaniuk <kinga.stefaniuk@intel.com>
|
||||||
|
---
|
||||||
|
mdadm.h | 3 +++
|
||||||
|
super0.c | 2 +-
|
||||||
|
2 files changed, 4 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/mdadm.h b/mdadm.h
|
||||||
|
index 27009154..22d5e8f4 100644
|
||||||
|
--- a/mdadm.h
|
||||||
|
+++ b/mdadm.h
|
||||||
|
@@ -2021,6 +2021,9 @@ enum r0layout {
|
||||||
|
#define PATH_MAX 4096
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+/* The max string length necessary for decimal conversion, cannot be longer than count of bits */
|
||||||
|
+#define INT_2_DEC_STR_MAX (sizeof(int) * 8)
|
||||||
|
+
|
||||||
|
#define RESYNC_NONE -1
|
||||||
|
#define RESYNC_DELAYED -2
|
||||||
|
#define RESYNC_PENDING -3
|
||||||
|
diff --git a/super0.c b/super0.c
|
||||||
|
index 9b8a1bd6..9b4e187e 100644
|
||||||
|
--- a/super0.c
|
||||||
|
+++ b/super0.c
|
||||||
|
@@ -229,7 +229,7 @@ static void examine_super0(struct supertype *st, char *homehost)
|
||||||
|
d++) {
|
||||||
|
mdp_disk_t *dp;
|
||||||
|
char *dv;
|
||||||
|
- char nb[11];
|
||||||
|
+ char nb[INT_2_DEC_STR_MAX];
|
||||||
|
int wonly, failfast;
|
||||||
|
if (d>=0) dp = &sb->disks[d];
|
||||||
|
else dp = &sb->this_disk;
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
61
0131-Makefile-add-more-compiler-flags.patch
Normal file
61
0131-Makefile-add-more-compiler-flags.patch
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
From 93c5215677a71e9772f68a449533cb3c97d2b869 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kinga Stefaniuk <kinga.stefaniuk@intel.com>
|
||||||
|
Date: Thu, 4 Jul 2024 15:01:06 +0200
|
||||||
|
Subject: [PATCH 131/157] Makefile: add more compiler flags
|
||||||
|
|
||||||
|
It is essential to avoid vulnerabilities in code as much
|
||||||
|
as possible using safe compilation flags. It is easier if
|
||||||
|
they are added to the Makefile and applied during compilation.
|
||||||
|
Add new gcc flags and make them configurable, because they
|
||||||
|
may not be supported for some compilers.
|
||||||
|
Set FORTIFY_SOURCE with the highest supported value for platform.
|
||||||
|
|
||||||
|
Signed-off-by: Kinga Stefaniuk <kinga.stefaniuk@intel.com>
|
||||||
|
---
|
||||||
|
Makefile | 23 ++++++++++++++++++++++-
|
||||||
|
1 file changed, 22 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/Makefile b/Makefile
|
||||||
|
index 3fe0a053..a914b178 100644
|
||||||
|
--- a/Makefile
|
||||||
|
+++ b/Makefile
|
||||||
|
@@ -30,7 +30,7 @@
|
||||||
|
|
||||||
|
# define "CXFLAGS" to give extra flags to CC.
|
||||||
|
# e.g. make CXFLAGS=-O to optimise
|
||||||
|
-CXFLAGS ?=-O2 -D_FORTIFY_SOURCE=2
|
||||||
|
+CXFLAGS ?=-O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE
|
||||||
|
TCC = tcc
|
||||||
|
UCLIBC_GCC = $(shell for nm in i386-uclibc-linux-gcc i386-uclibc-gcc; do which $$nm > /dev/null && { echo $$nm ; exit; } ; done; echo false No uclibc found )
|
||||||
|
#DIET_GCC = diet gcc
|
||||||
|
@@ -76,6 +76,27 @@ ifeq ($(origin STRINGOPOVERFLOW), undefined)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
+ifeq ($(origin NOSTRICTOVERFLOW), undefined)
|
||||||
|
+ NOSTRICTOVERFLOW := $(shell $(CC) -Q --help=warning 2>&1 | grep "strict-overflow" | wc -l)
|
||||||
|
+ ifneq "$(NOSTRICTOVERFLOW)" "0"
|
||||||
|
+ CWFLAGS += -fno-strict-overflow
|
||||||
|
+ endif
|
||||||
|
+endif
|
||||||
|
+
|
||||||
|
+ifeq ($(origin NODELETENULLPOINTER), undefined)
|
||||||
|
+ NODELETENULLPOINTER := $(shell $(CC) -Q --help=optimizers 2>&1 | grep "delete-null-pointer-checks" | wc -l)
|
||||||
|
+ ifneq "$(NODELETENULLPOINTER)" "0"
|
||||||
|
+ CWFLAGS += -fno-delete-null-pointer-checks
|
||||||
|
+ endif
|
||||||
|
+endif
|
||||||
|
+
|
||||||
|
+ifeq ($(origin WRAPV), undefined)
|
||||||
|
+ WRAPV := $(shell $(CC) -Q --help=optimizers 2>&1 | grep "wrapv" | wc -l)
|
||||||
|
+ ifneq "$(WRAPV)" "0"
|
||||||
|
+ CWFLAGS += -fwrapv
|
||||||
|
+ endif
|
||||||
|
+endif
|
||||||
|
+
|
||||||
|
ifdef DEBIAN
|
||||||
|
CPPFLAGS += -DDEBIAN
|
||||||
|
endif
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
575
0133-mdstat-Rework-mdstat-external-arrays-handling.patch
Normal file
575
0133-mdstat-Rework-mdstat-external-arrays-handling.patch
Normal file
@ -0,0 +1,575 @@
|
|||||||
|
From 4b3644ab4ce6df8c7f64c189c12b66627ff3e027 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
Date: Fri, 5 Jul 2024 10:49:27 +0200
|
||||||
|
Subject: [PATCH 133/157] mdstat: Rework mdstat external arrays handling
|
||||||
|
|
||||||
|
To avoid repeating mdstat_read() in IncrementalRemove(), new function
|
||||||
|
mdstat_find_by_member_name() has been proposed. With that,
|
||||||
|
IncrementalRemove() handles own copy of mdstat content and there is no
|
||||||
|
need to repeat reading for external stop.
|
||||||
|
|
||||||
|
Additionally, It proposed few helper to avoid repeating
|
||||||
|
mdstat_ent->metadata_version checks across code.
|
||||||
|
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
Assemble.c | 9 ++--
|
||||||
|
Incremental.c | 37 +++++++++------
|
||||||
|
Manage.c | 6 +--
|
||||||
|
Monitor.c | 18 +++----
|
||||||
|
config.c | 49 ++++++++++---------
|
||||||
|
mapfile.c | 12 ++---
|
||||||
|
mdadm.h | 6 ++-
|
||||||
|
mdmon.c | 4 +-
|
||||||
|
mdmon.h | 2 +-
|
||||||
|
mdstat.c | 129 ++++++++++++++++++++++++++++++++++++--------------
|
||||||
|
super-intel.c | 9 ++--
|
||||||
|
util.c | 10 ----
|
||||||
|
12 files changed, 167 insertions(+), 124 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Assemble.c b/Assemble.c
|
||||||
|
index 77f2b50e..a2bb7b64 100644
|
||||||
|
--- a/Assemble.c
|
||||||
|
+++ b/Assemble.c
|
||||||
|
@@ -114,14 +114,11 @@ static int is_member_busy(char *metadata_version)
|
||||||
|
int busy = 0;
|
||||||
|
|
||||||
|
for (ent = mdstat; ent; ent = ent->next) {
|
||||||
|
- if (ent->metadata_version == NULL)
|
||||||
|
- continue;
|
||||||
|
- if (strncmp(ent->metadata_version, "external:", 9) != 0)
|
||||||
|
- continue;
|
||||||
|
- if (!is_subarray(&ent->metadata_version[9]))
|
||||||
|
+ if (!is_mdstat_ent_subarray(ent))
|
||||||
|
continue;
|
||||||
|
+
|
||||||
|
/* Skip first char - it can be '/' or '-' */
|
||||||
|
- if (strcmp(&ent->metadata_version[10], metadata_version+1) == 0) {
|
||||||
|
+ if (strcmp(&ent->metadata_version[10], metadata_version + 1) == 0) {
|
||||||
|
busy = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
diff --git a/Incremental.c b/Incremental.c
|
||||||
|
index 83db0712..abc7721b 100644
|
||||||
|
--- a/Incremental.c
|
||||||
|
+++ b/Incremental.c
|
||||||
|
@@ -1686,12 +1686,13 @@ static void remove_from_member_array(struct mdstat_ent *memb,
|
||||||
|
*/
|
||||||
|
int IncrementalRemove(char *devname, char *id_path, int verbose)
|
||||||
|
{
|
||||||
|
- int mdfd;
|
||||||
|
- int rv = 0;
|
||||||
|
- struct mdstat_ent *ent;
|
||||||
|
+ struct mdstat_ent *ent = NULL;
|
||||||
|
+ char buf[SYSFS_MAX_BUF_SIZE];
|
||||||
|
+ struct mdstat_ent *mdstat;
|
||||||
|
struct mddev_dev devlist;
|
||||||
|
struct mdinfo mdi;
|
||||||
|
- char buf[SYSFS_MAX_BUF_SIZE];
|
||||||
|
+ int rv = 1;
|
||||||
|
+ int mdfd;
|
||||||
|
|
||||||
|
if (!id_path)
|
||||||
|
dprintf("incremental removal without --path <id_path> lacks the possibility to re-add new device in this port\n");
|
||||||
|
@@ -1700,16 +1701,25 @@ int IncrementalRemove(char *devname, char *id_path, int verbose)
|
||||||
|
pr_err("incremental removal requires a kernel device name, not a file: %s\n", devname);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
- ent = mdstat_by_component(devname);
|
||||||
|
+
|
||||||
|
+ mdstat = mdstat_read(0, 0);
|
||||||
|
+ if (!mdstat) {
|
||||||
|
+ pr_err("Cannot read /proc/mdstat file, aborting\n");
|
||||||
|
+ return 1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ent = mdstat_find_by_member_name(mdstat, devname);
|
||||||
|
if (!ent) {
|
||||||
|
if (verbose >= 0)
|
||||||
|
pr_err("%s does not appear to be a component of any array\n", devname);
|
||||||
|
- return 1;
|
||||||
|
+ goto out;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
if (sysfs_init(&mdi, -1, ent->devnm)) {
|
||||||
|
pr_err("unable to initialize sysfs for: %s\n", devname);
|
||||||
|
- return 1;
|
||||||
|
+ goto out;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
mdfd = open_dev_excl(ent->devnm);
|
||||||
|
if (is_fd_valid(mdfd)) {
|
||||||
|
close_fd(&mdfd);
|
||||||
|
@@ -1725,8 +1735,7 @@ int IncrementalRemove(char *devname, char *id_path, int verbose)
|
||||||
|
if (mdfd < 0) {
|
||||||
|
if (verbose >= 0)
|
||||||
|
pr_err("Cannot open array %s!!\n", ent->devnm);
|
||||||
|
- free_mdstat(ent);
|
||||||
|
- return 1;
|
||||||
|
+ goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (id_path) {
|
||||||
|
@@ -1741,16 +1750,13 @@ int IncrementalRemove(char *devname, char *id_path, int verbose)
|
||||||
|
devlist.devname = devname;
|
||||||
|
devlist.disposition = 'I';
|
||||||
|
/* for a container, we must fail each member array */
|
||||||
|
- if (ent->metadata_version &&
|
||||||
|
- strncmp(ent->metadata_version, "external:", 9) == 0) {
|
||||||
|
- struct mdstat_ent *mdstat = mdstat_read(0, 0);
|
||||||
|
+ if (is_mdstat_ent_external(ent)) {
|
||||||
|
struct mdstat_ent *memb;
|
||||||
|
for (memb = mdstat ; memb ; memb = memb->next) {
|
||||||
|
if (is_container_member(memb, ent->devnm))
|
||||||
|
remove_from_member_array(memb,
|
||||||
|
&devlist, verbose);
|
||||||
|
}
|
||||||
|
- free_mdstat(mdstat);
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* This 'I' incremental remove is a try-best effort,
|
||||||
|
@@ -1765,7 +1771,8 @@ int IncrementalRemove(char *devname, char *id_path, int verbose)
|
||||||
|
rv = Manage_subdevs(ent->devnm, mdfd, &devlist,
|
||||||
|
verbose, 0, UOPT_UNDEFINED, 0);
|
||||||
|
|
||||||
|
- close(mdfd);
|
||||||
|
- free_mdstat(ent);
|
||||||
|
+ close_fd(&mdfd);
|
||||||
|
+out:
|
||||||
|
+ free_mdstat(mdstat);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
diff --git a/Manage.c b/Manage.c
|
||||||
|
index f0304e1e..241de055 100644
|
||||||
|
--- a/Manage.c
|
||||||
|
+++ b/Manage.c
|
||||||
|
@@ -276,10 +276,8 @@ int Manage_stop(char *devname, int fd, int verbose, int will_retry)
|
||||||
|
*/
|
||||||
|
mds = mdstat_read(0, 0);
|
||||||
|
for (m = mds; m; m = m->next)
|
||||||
|
- if (m->metadata_version &&
|
||||||
|
- strncmp(m->metadata_version, "external:", 9)==0 &&
|
||||||
|
- metadata_container_matches(m->metadata_version+9,
|
||||||
|
- devnm)) {
|
||||||
|
+ if (is_mdstat_ent_external(m) &&
|
||||||
|
+ metadata_container_matches(m->metadata_version + 9, devnm)) {
|
||||||
|
if (verbose >= 0)
|
||||||
|
pr_err("Cannot stop container %s: member %s still active\n",
|
||||||
|
devname, m->devnm);
|
||||||
|
diff --git a/Monitor.c b/Monitor.c
|
||||||
|
index 26c53e13..cf14fbb3 100644
|
||||||
|
--- a/Monitor.c
|
||||||
|
+++ b/Monitor.c
|
||||||
|
@@ -879,9 +879,7 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
|
||||||
|
}
|
||||||
|
last_disk = i;
|
||||||
|
|
||||||
|
- if (mse->metadata_version &&
|
||||||
|
- strncmp(mse->metadata_version, "external:", 9) == 0 &&
|
||||||
|
- is_subarray(mse->metadata_version+9)) {
|
||||||
|
+ if (is_mdstat_ent_subarray(mse)) {
|
||||||
|
char *sl;
|
||||||
|
snprintf(st->parent_devnm, MD_NAME_MAX, "%s", mse->metadata_version + 10);
|
||||||
|
sl = strchr(st->parent_devnm, '/');
|
||||||
|
@@ -991,13 +989,12 @@ static int add_new_arrays(struct mdstat_ent *mdstat, struct state **statelist)
|
||||||
|
snprintf(st->devnm, MD_NAME_MAX, "%s", mse->devnm);
|
||||||
|
st->percent = RESYNC_UNKNOWN;
|
||||||
|
st->expected_spares = -1;
|
||||||
|
- if (mse->metadata_version &&
|
||||||
|
- strncmp(mse->metadata_version,
|
||||||
|
- "external:", 9) == 0 &&
|
||||||
|
- is_subarray(mse->metadata_version+9)) {
|
||||||
|
+
|
||||||
|
+ if (is_mdstat_ent_subarray(mse)) {
|
||||||
|
char *sl;
|
||||||
|
- snprintf(st->parent_devnm, MD_NAME_MAX,
|
||||||
|
- "%s", mse->metadata_version + 10);
|
||||||
|
+
|
||||||
|
+ snprintf(st->parent_devnm, MD_NAME_MAX, "%s",
|
||||||
|
+ mse->metadata_version + 10);
|
||||||
|
sl = strchr(st->parent_devnm, '/');
|
||||||
|
if (sl)
|
||||||
|
*sl = 0;
|
||||||
|
@@ -1297,8 +1294,7 @@ int Wait(char *dev)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!e || e->percent == RESYNC_NONE) {
|
||||||
|
- if (e && e->metadata_version &&
|
||||||
|
- strncmp(e->metadata_version, "external:", 9) == 0) {
|
||||||
|
+ if (e && is_mdstat_ent_external(e)) {
|
||||||
|
if (is_subarray(&e->metadata_version[9]))
|
||||||
|
ping_monitor(&e->metadata_version[9]);
|
||||||
|
else
|
||||||
|
diff --git a/config.c b/config.c
|
||||||
|
index 6ea905f3..5411a480 100644
|
||||||
|
--- a/config.c
|
||||||
|
+++ b/config.c
|
||||||
|
@@ -360,35 +360,38 @@ struct mddev_dev *load_partitions(void)
|
||||||
|
struct mddev_dev *load_containers(void)
|
||||||
|
{
|
||||||
|
struct mdstat_ent *mdstat = mdstat_read(0, 0);
|
||||||
|
+ struct mddev_dev *dev_list = NULL;
|
||||||
|
+ struct map_ent *map_list = NULL;
|
||||||
|
struct mdstat_ent *ent;
|
||||||
|
- struct mddev_dev *d;
|
||||||
|
- struct mddev_dev *rv = NULL;
|
||||||
|
- struct map_ent *map = NULL, *me;
|
||||||
|
|
||||||
|
- if (!mdstat)
|
||||||
|
- return NULL;
|
||||||
|
+ for (ent = mdstat; ent; ent = ent->next) {
|
||||||
|
+ struct mddev_dev *d;
|
||||||
|
+ struct map_ent *map;
|
||||||
|
|
||||||
|
- for (ent = mdstat; ent; ent = ent->next)
|
||||||
|
- if (ent->metadata_version &&
|
||||||
|
- strncmp(ent->metadata_version, "external:", 9) == 0 &&
|
||||||
|
- !is_subarray(&ent->metadata_version[9])) {
|
||||||
|
- d = xcalloc(1, sizeof(*d));
|
||||||
|
- me = map_by_devnm(&map, ent->devnm);
|
||||||
|
- if (me)
|
||||||
|
- d->devname = xstrdup(me->path);
|
||||||
|
- else if (asprintf(&d->devname, "/dev/%s", ent->devnm) < 0) {
|
||||||
|
- free(d);
|
||||||
|
- continue;
|
||||||
|
- }
|
||||||
|
- d->next = rv;
|
||||||
|
- rv = d;
|
||||||
|
- map_free(map);
|
||||||
|
- map = NULL;
|
||||||
|
+ if (!is_mdstat_ent_external(ent))
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ if (is_mdstat_ent_subarray(ent))
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ d = xcalloc(1, sizeof(*d));
|
||||||
|
+
|
||||||
|
+ map = map_by_devnm(&map_list, ent->devnm);
|
||||||
|
+ if (map) {
|
||||||
|
+ d->devname = xstrdup(map->path);
|
||||||
|
+ } else if (asprintf(&d->devname, "/dev/%s", ent->devnm) < 0) {
|
||||||
|
+ free(d);
|
||||||
|
+ continue;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ d->next = dev_list;
|
||||||
|
+ dev_list = d;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
free_mdstat(mdstat);
|
||||||
|
- map_free(map);
|
||||||
|
+ map_free(map_list);
|
||||||
|
|
||||||
|
- return rv;
|
||||||
|
+ return dev_list;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct createinfo createinfo = {
|
||||||
|
diff --git a/mapfile.c b/mapfile.c
|
||||||
|
index ea9837ac..632cf5e8 100644
|
||||||
|
--- a/mapfile.c
|
||||||
|
+++ b/mapfile.c
|
||||||
|
@@ -339,18 +339,14 @@ struct map_ent *map_by_name(struct map_ent **map, char *name)
|
||||||
|
*/
|
||||||
|
static char *get_member_info(struct mdstat_ent *ent)
|
||||||
|
{
|
||||||
|
+ char *subarray;
|
||||||
|
|
||||||
|
- if (ent->metadata_version == NULL ||
|
||||||
|
- strncmp(ent->metadata_version, "external:", 9) != 0)
|
||||||
|
+ if (!is_mdstat_ent_subarray(ent))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
- if (is_subarray(&ent->metadata_version[9])) {
|
||||||
|
- char *subarray;
|
||||||
|
+ subarray = strrchr(ent->metadata_version, '/');
|
||||||
|
|
||||||
|
- subarray = strrchr(ent->metadata_version, '/');
|
||||||
|
- return subarray + 1;
|
||||||
|
- }
|
||||||
|
- return NULL;
|
||||||
|
+ return subarray + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RebuildMap(void)
|
||||||
|
diff --git a/mdadm.h b/mdadm.h
|
||||||
|
index 22d5e8f4..5c3a9836 100644
|
||||||
|
--- a/mdadm.h
|
||||||
|
+++ b/mdadm.h
|
||||||
|
@@ -743,8 +743,12 @@ extern int mdstat_wait(int seconds);
|
||||||
|
extern void mdstat_wait_fd(int fd, const sigset_t *sigmask);
|
||||||
|
extern int mddev_busy(char *devnm);
|
||||||
|
extern struct mdstat_ent *mdstat_by_component(char *name);
|
||||||
|
+extern struct mdstat_ent *mdstat_find_by_member_name(struct mdstat_ent *mdstat, char *member_devnm);
|
||||||
|
extern struct mdstat_ent *mdstat_by_subdev(char *subdev, char *container);
|
||||||
|
|
||||||
|
+extern bool is_mdstat_ent_external(struct mdstat_ent *ent);
|
||||||
|
+extern bool is_mdstat_ent_subarray(struct mdstat_ent *ent);
|
||||||
|
+
|
||||||
|
struct map_ent {
|
||||||
|
struct map_ent *next;
|
||||||
|
char devnm[32];
|
||||||
|
@@ -1771,7 +1775,7 @@ extern int is_mddev(char *dev);
|
||||||
|
extern int open_container(int fd);
|
||||||
|
extern int metadata_container_matches(char *metadata, char *devnm);
|
||||||
|
extern int metadata_subdev_matches(char *metadata, char *devnm);
|
||||||
|
-extern int is_container_member(struct mdstat_ent *ent, char *devname);
|
||||||
|
+extern bool is_container_member(struct mdstat_ent *ent, char *devname);
|
||||||
|
extern int is_subarray_active(char *subarray, char *devname);
|
||||||
|
extern int open_subarray(char *dev, char *subarray, struct supertype *st, int quiet);
|
||||||
|
extern struct superswitch *version_to_superswitch(char *vers);
|
||||||
|
diff --git a/mdmon.c b/mdmon.c
|
||||||
|
index 5fdb5cdb..95e350f4 100644
|
||||||
|
--- a/mdmon.c
|
||||||
|
+++ b/mdmon.c
|
||||||
|
@@ -394,9 +394,7 @@ int main(int argc, char *argv[])
|
||||||
|
/* launch an mdmon instance for each container found */
|
||||||
|
mdstat = mdstat_read(0, 0);
|
||||||
|
for (e = mdstat; e; e = e->next) {
|
||||||
|
- if (e->metadata_version &&
|
||||||
|
- strncmp(e->metadata_version, "external:", 9) == 0 &&
|
||||||
|
- !is_subarray(&e->metadata_version[9])) {
|
||||||
|
+ if (is_mdstat_ent_external(e) && !is_mdstat_ent_subarray(e)) {
|
||||||
|
/* update cmdline so this mdmon instance can be
|
||||||
|
* distinguished from others in a call to ps(1)
|
||||||
|
*/
|
||||||
|
diff --git a/mdmon.h b/mdmon.h
|
||||||
|
index b3d72ac3..110cbef2 100644
|
||||||
|
--- a/mdmon.h
|
||||||
|
+++ b/mdmon.h
|
||||||
|
@@ -78,7 +78,7 @@ void do_manager(struct supertype *container);
|
||||||
|
extern int sigterm;
|
||||||
|
|
||||||
|
int read_dev_state(int fd);
|
||||||
|
-int is_container_member(struct mdstat_ent *mdstat, char *container);
|
||||||
|
+bool is_container_member(struct mdstat_ent *mdstat, char *container);
|
||||||
|
|
||||||
|
struct mdstat_ent *mdstat_read(int hold, int start);
|
||||||
|
|
||||||
|
diff --git a/mdstat.c b/mdstat.c
|
||||||
|
index e233f094..cbbace3d 100644
|
||||||
|
--- a/mdstat.c
|
||||||
|
+++ b/mdstat.c
|
||||||
|
@@ -110,6 +110,28 @@ static int add_member_devname(struct dev_member **m, char *name)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
+/* Detach element from the list, it may modify list_head */
|
||||||
|
+static void mdstat_ent_list_detach_element(struct mdstat_ent **list_head, struct mdstat_ent *el)
|
||||||
|
+{
|
||||||
|
+ struct mdstat_ent *ent = *list_head;
|
||||||
|
+
|
||||||
|
+ if (ent == el) {
|
||||||
|
+ *list_head = ent->next;
|
||||||
|
+ } else {
|
||||||
|
+ while (ent) {
|
||||||
|
+ if (ent->next == el) {
|
||||||
|
+ ent->next = el->next;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ent = ent->next;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ assert(ent);
|
||||||
|
+ ent->next = NULL;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void free_mdstat(struct mdstat_ent *ms)
|
||||||
|
{
|
||||||
|
while (ms) {
|
||||||
|
@@ -124,6 +146,32 @@ void free_mdstat(struct mdstat_ent *ms)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+bool is_mdstat_ent_external(struct mdstat_ent *ent)
|
||||||
|
+{
|
||||||
|
+ if (!ent->metadata_version)
|
||||||
|
+ return false;
|
||||||
|
+
|
||||||
|
+ if (strncmp(ent->metadata_version, "external:", 9) == 0)
|
||||||
|
+ return true;
|
||||||
|
+ return false;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+bool is_mdstat_ent_subarray(struct mdstat_ent *ent)
|
||||||
|
+{
|
||||||
|
+ if (is_mdstat_ent_external(ent) && is_subarray(ent->metadata_version + 9))
|
||||||
|
+ return true;
|
||||||
|
+ return false;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+bool is_container_member(struct mdstat_ent *mdstat, char *container)
|
||||||
|
+{
|
||||||
|
+ if (is_mdstat_ent_external(mdstat) &&
|
||||||
|
+ metadata_container_matches(mdstat->metadata_version + 9, container))
|
||||||
|
+ return true;
|
||||||
|
+
|
||||||
|
+ return false;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int mdstat_fd = -1;
|
||||||
|
struct mdstat_ent *mdstat_read(int hold, int start)
|
||||||
|
{
|
||||||
|
@@ -382,61 +430,70 @@ int mddev_busy(char *devnm)
|
||||||
|
return me != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
-struct mdstat_ent *mdstat_by_component(char *name)
|
||||||
|
+/**
|
||||||
|
+ * mdstat_find_by_member_devnm()- Return first array or external container with member device.
|
||||||
|
+ * @mdstat: Preloaded mdstat to iterate over.
|
||||||
|
+ * @member_devnm: devnm of the device to find.
|
||||||
|
+ *
|
||||||
|
+ * External subarrays are skipped.
|
||||||
|
+ */
|
||||||
|
+struct mdstat_ent *mdstat_find_by_member_name(struct mdstat_ent *mdstat, char *member_devnm)
|
||||||
|
{
|
||||||
|
- struct mdstat_ent *mdstat = mdstat_read(0, 0);
|
||||||
|
+ struct mdstat_ent *ent;
|
||||||
|
|
||||||
|
- while (mdstat) {
|
||||||
|
- struct dev_member *m;
|
||||||
|
- struct mdstat_ent *ent;
|
||||||
|
- if (mdstat->metadata_version &&
|
||||||
|
- strncmp(mdstat->metadata_version, "external:", 9) == 0 &&
|
||||||
|
- is_subarray(mdstat->metadata_version+9))
|
||||||
|
- /* don't return subarrays, only containers */
|
||||||
|
- ;
|
||||||
|
- else for (m = mdstat->members; m; m = m->next) {
|
||||||
|
- if (strcmp(m->name, name) == 0) {
|
||||||
|
- free_mdstat(mdstat->next);
|
||||||
|
- mdstat->next = NULL;
|
||||||
|
- return mdstat;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- ent = mdstat;
|
||||||
|
- mdstat = mdstat->next;
|
||||||
|
- ent->next = NULL;
|
||||||
|
- free_mdstat(ent);
|
||||||
|
+ for (ent = mdstat; ent; ent = ent->next) {
|
||||||
|
+ struct dev_member *member;
|
||||||
|
+
|
||||||
|
+ if (is_mdstat_ent_subarray(ent))
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ for (member = ent->members; member; member = member->next)
|
||||||
|
+ if (strcmp(member->name, member_devnm) == 0)
|
||||||
|
+ return ent;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
+
|
||||||
|
+struct mdstat_ent *mdstat_by_component(char *name)
|
||||||
|
+{
|
||||||
|
+ struct mdstat_ent *mdstat = mdstat_read(0, 0);
|
||||||
|
+ struct mdstat_ent *ent = mdstat_find_by_member_name(mdstat, name);
|
||||||
|
+
|
||||||
|
+ if (ent)
|
||||||
|
+ mdstat_ent_list_detach_element(&mdstat, ent);
|
||||||
|
+
|
||||||
|
+ free_mdstat(mdstat);
|
||||||
|
+
|
||||||
|
+ return ent;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
struct mdstat_ent *mdstat_by_subdev(char *subdev, char *container)
|
||||||
|
{
|
||||||
|
struct mdstat_ent *mdstat = mdstat_read(0, 0);
|
||||||
|
struct mdstat_ent *ent = NULL;
|
||||||
|
|
||||||
|
- while (mdstat) {
|
||||||
|
+ for (ent = mdstat; ent; ent = ent->next) {
|
||||||
|
/* metadata version must match:
|
||||||
|
* external:[/-]%s/%s
|
||||||
|
* where first %s is 'container' and second %s is 'subdev'
|
||||||
|
*/
|
||||||
|
- if (ent)
|
||||||
|
- free_mdstat(ent);
|
||||||
|
- ent = mdstat;
|
||||||
|
- mdstat = mdstat->next;
|
||||||
|
- ent->next = NULL;
|
||||||
|
|
||||||
|
- if (ent->metadata_version == NULL ||
|
||||||
|
- strncmp(ent->metadata_version, "external:", 9) != 0)
|
||||||
|
+ if (!is_mdstat_ent_external(ent))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
- if (!metadata_container_matches(ent->metadata_version+9,
|
||||||
|
- container) ||
|
||||||
|
- !metadata_subdev_matches(ent->metadata_version+9,
|
||||||
|
- subdev))
|
||||||
|
+ if (!metadata_container_matches(ent->metadata_version + 9, container))
|
||||||
|
+ continue;
|
||||||
|
+ if (!metadata_subdev_matches(ent->metadata_version + 9, subdev))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
- free_mdstat(mdstat);
|
||||||
|
- return ent;
|
||||||
|
+ break;
|
||||||
|
}
|
||||||
|
- return NULL;
|
||||||
|
+
|
||||||
|
+ if (ent)
|
||||||
|
+ mdstat_ent_list_detach_element(&mdstat, ent);
|
||||||
|
+
|
||||||
|
+ free_mdstat(mdstat);
|
||||||
|
+ return ent;
|
||||||
|
}
|
||||||
|
diff --git a/super-intel.c b/super-intel.c
|
||||||
|
index 713bfccf..c215b910 100644
|
||||||
|
--- a/super-intel.c
|
||||||
|
+++ b/super-intel.c
|
||||||
|
@@ -6974,13 +6974,11 @@ active_arrays_by_format(char *name, char* hba, struct md_list **devlist,
|
||||||
|
int found;
|
||||||
|
|
||||||
|
for (memb = mdstat ; memb ; memb = memb->next) {
|
||||||
|
- if (memb->metadata_version &&
|
||||||
|
- (strncmp(memb->metadata_version, "external:", 9) == 0) &&
|
||||||
|
- (strcmp(&memb->metadata_version[9], name) == 0) &&
|
||||||
|
- !is_subarray(memb->metadata_version+9) &&
|
||||||
|
- memb->members) {
|
||||||
|
+ if (is_mdstat_ent_external(memb) && !is_subarray(memb->metadata_version + 9) &&
|
||||||
|
+ strcmp(&memb->metadata_version[9], name) == 0 && memb->members) {
|
||||||
|
struct dev_member *dev = memb->members;
|
||||||
|
int fd = -1;
|
||||||
|
+
|
||||||
|
while (dev && !is_fd_valid(fd)) {
|
||||||
|
char *path = xmalloc(strlen(dev->name) + strlen("/dev/") + 1);
|
||||||
|
num = snprintf(path, PATH_MAX, "%s%s", "/dev/", dev->name);
|
||||||
|
@@ -6998,7 +6996,6 @@ active_arrays_by_format(char *name, char* hba, struct md_list **devlist,
|
||||||
|
struct mdstat_ent *vol;
|
||||||
|
for (vol = mdstat ; vol ; vol = vol->next) {
|
||||||
|
if (vol->active > 0 &&
|
||||||
|
- vol->metadata_version &&
|
||||||
|
is_container_member(vol, memb->devnm)) {
|
||||||
|
found++;
|
||||||
|
count++;
|
||||||
|
diff --git a/util.c b/util.c
|
||||||
|
index 908f8430..83d42833 100644
|
||||||
|
--- a/util.c
|
||||||
|
+++ b/util.c
|
||||||
|
@@ -1671,16 +1671,6 @@ int metadata_subdev_matches(char *metadata, char *devnm)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-int is_container_member(struct mdstat_ent *mdstat, char *container)
|
||||||
|
-{
|
||||||
|
- if (mdstat->metadata_version == NULL ||
|
||||||
|
- strncmp(mdstat->metadata_version, "external:", 9) != 0 ||
|
||||||
|
- !metadata_container_matches(mdstat->metadata_version+9, container))
|
||||||
|
- return 0;
|
||||||
|
-
|
||||||
|
- return 1;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
int is_subarray_active(char *subarray, char *container)
|
||||||
|
{
|
||||||
|
struct mdstat_ent *mdstat = mdstat_read(0, 0);
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
56
0134-mdadm-managemon.c-fix-coverity-issues.patch
Normal file
56
0134-mdadm-managemon.c-fix-coverity-issues.patch
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
From 2a4c40766d654dcbf5911d1b7b63bbbe8b2c0128 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Nigel Croxon <ncroxon@redhat.com>
|
||||||
|
Date: Wed, 24 Jul 2024 09:04:08 -0400
|
||||||
|
Subject: [PATCH 134/157] mdadm: managemon.c fix coverity issues
|
||||||
|
|
||||||
|
Fixing the following coding errors the coverity tools found:
|
||||||
|
|
||||||
|
* Event check_return: Calling "fcntl(fd, 4, fl)" without checking
|
||||||
|
return value. This library function may fail and return an error code.
|
||||||
|
|
||||||
|
* Event check_after_deref: Null-checking "new" suggests that it may
|
||||||
|
be null, but it has already been dereferenced on all paths leading
|
||||||
|
to the check.
|
||||||
|
|
||||||
|
Signed-off-by: Nigel Croxon <ncroxon@redhat.com>
|
||||||
|
---
|
||||||
|
managemon.c | 15 ++++++++++-----
|
||||||
|
1 file changed, 10 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/managemon.c b/managemon.c
|
||||||
|
index 358459e7..add6a79e 100644
|
||||||
|
--- a/managemon.c
|
||||||
|
+++ b/managemon.c
|
||||||
|
@@ -776,10 +776,8 @@ static void manage_new(struct mdstat_ent *mdstat,
|
||||||
|
|
||||||
|
error:
|
||||||
|
pr_err("failed to monitor %s\n", mdstat->metadata_version);
|
||||||
|
- if (new) {
|
||||||
|
- new->container = NULL;
|
||||||
|
- free_aa(new);
|
||||||
|
- }
|
||||||
|
+ new->container = NULL;
|
||||||
|
+ free_aa(new);
|
||||||
|
if (mdi)
|
||||||
|
sysfs_free(mdi);
|
||||||
|
}
|
||||||
|
@@ -870,8 +868,15 @@ void read_sock(struct supertype *container)
|
||||||
|
return;
|
||||||
|
|
||||||
|
fl = fcntl(fd, F_GETFL, 0);
|
||||||
|
+ if (fl < 0) {
|
||||||
|
+ close_fd(&fd);
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
fl |= O_NONBLOCK;
|
||||||
|
- fcntl(fd, F_SETFL, fl);
|
||||||
|
+ if (fcntl(fd, F_SETFL, fl) < 0) {
|
||||||
|
+ close_fd(&fd);
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
do {
|
||||||
|
msg.buf = NULL;
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
40
0135-mdadm-msg.c-fix-coverity-issues.patch
Normal file
40
0135-mdadm-msg.c-fix-coverity-issues.patch
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
From 87f96c870399cd029933a9742ba72e85e3251c3e Mon Sep 17 00:00:00 2001
|
||||||
|
From: Nigel Croxon <ncroxon@redhat.com>
|
||||||
|
Date: Wed, 24 Jul 2024 09:20:28 -0400
|
||||||
|
Subject: [PATCH 135/157] mdadm: msg.c fix coverity issues
|
||||||
|
|
||||||
|
Fixing the following coding errors the coverity tools found:
|
||||||
|
|
||||||
|
* Event check_return: Calling "fcntl(sfd, 4, fl)" without
|
||||||
|
checking return value. This library function may fail and
|
||||||
|
return an error code.
|
||||||
|
|
||||||
|
Signed-off-by: Nigel Croxon <ncroxon@redhat.com>
|
||||||
|
---
|
||||||
|
msg.c | 9 ++++++++-
|
||||||
|
1 file changed, 8 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/msg.c b/msg.c
|
||||||
|
index f0772b3f..b6da91d3 100644
|
||||||
|
--- a/msg.c
|
||||||
|
+++ b/msg.c
|
||||||
|
@@ -176,8 +176,15 @@ int connect_monitor(char *devname)
|
||||||
|
}
|
||||||
|
|
||||||
|
fl = fcntl(sfd, F_GETFL, 0);
|
||||||
|
+ if (fl < 0) {
|
||||||
|
+ close(sfd);
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
fl |= O_NONBLOCK;
|
||||||
|
- fcntl(sfd, F_SETFL, fl);
|
||||||
|
+ if (fcntl(sfd, F_SETFL, fl) < 0) {
|
||||||
|
+ close(sfd);
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
return sfd;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
150
0136-imsm-refactor-chunk-size-print.patch
Normal file
150
0136-imsm-refactor-chunk-size-print.patch
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
From a944180a7e6a7d6d4cd08f6afcb83e58986c35f9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Blazej Kucman <blazej.kucman@intel.com>
|
||||||
|
Date: Wed, 24 Jul 2024 22:17:42 +0200
|
||||||
|
Subject: [PATCH 136/157] imsm: refactor chunk size print
|
||||||
|
|
||||||
|
- add imsm_chunk_ops struct for better code readability,
|
||||||
|
- move chunk size mapping to string into array,
|
||||||
|
- add function to print supported chunk sizes by IMSM controller.
|
||||||
|
|
||||||
|
Signed-off-by: Blazej Kucman <blazej.kucman@intel.com>
|
||||||
|
---
|
||||||
|
super-intel.c | 92 +++++++++++++++++++++++++++------------------------
|
||||||
|
1 file changed, 49 insertions(+), 43 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/super-intel.c b/super-intel.c
|
||||||
|
index c215b910..ab9b5d3f 100644
|
||||||
|
--- a/super-intel.c
|
||||||
|
+++ b/super-intel.c
|
||||||
|
@@ -647,6 +647,31 @@ static const char *_sys_dev_type[] = {
|
||||||
|
[SYS_DEV_SATA_VMD] = "SATA VMD"
|
||||||
|
};
|
||||||
|
|
||||||
|
+struct imsm_chunk_ops {
|
||||||
|
+ uint chunk;
|
||||||
|
+ char *chunk_str;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct imsm_chunk_ops imsm_chunk_ops[] = {
|
||||||
|
+ {IMSM_OROM_SSS_2kB, "2k"},
|
||||||
|
+ {IMSM_OROM_SSS_4kB, "4k"},
|
||||||
|
+ {IMSM_OROM_SSS_8kB, "8k"},
|
||||||
|
+ {IMSM_OROM_SSS_16kB, "16k"},
|
||||||
|
+ {IMSM_OROM_SSS_32kB, "32k"},
|
||||||
|
+ {IMSM_OROM_SSS_64kB, "64k"},
|
||||||
|
+ {IMSM_OROM_SSS_128kB, "128k"},
|
||||||
|
+ {IMSM_OROM_SSS_256kB, "256k"},
|
||||||
|
+ {IMSM_OROM_SSS_512kB, "512k"},
|
||||||
|
+ {IMSM_OROM_SSS_1MB, "1M"},
|
||||||
|
+ {IMSM_OROM_SSS_2MB, "2M"},
|
||||||
|
+ {IMSM_OROM_SSS_4MB, "4M"},
|
||||||
|
+ {IMSM_OROM_SSS_8MB, "8M"},
|
||||||
|
+ {IMSM_OROM_SSS_16MB, "16M"},
|
||||||
|
+ {IMSM_OROM_SSS_32MB, "32M"},
|
||||||
|
+ {IMSM_OROM_SSS_64MB, "64M"},
|
||||||
|
+ {0, NULL}
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static int no_platform = -1;
|
||||||
|
|
||||||
|
static int check_no_platform(void)
|
||||||
|
@@ -2626,6 +2651,16 @@ static void print_imsm_level_capability(const struct imsm_orom *orom)
|
||||||
|
printf("%s ", imsm_level_ops[idx].name);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void print_imsm_chunk_size_capability(const struct imsm_orom *orom)
|
||||||
|
+{
|
||||||
|
+ int idx;
|
||||||
|
+
|
||||||
|
+ for (idx = 0; imsm_chunk_ops[idx].chunk_str; idx++)
|
||||||
|
+ if (imsm_chunk_ops[idx].chunk & orom->sss)
|
||||||
|
+ printf("%s ", imsm_chunk_ops[idx].chunk_str);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
static void print_imsm_capability(const struct imsm_orom *orom)
|
||||||
|
{
|
||||||
|
printf(" Platform : Intel(R) ");
|
||||||
|
@@ -2638,41 +2673,25 @@ static void print_imsm_capability(const struct imsm_orom *orom)
|
||||||
|
imsm_orom_is_enterprise(orom) ? " enterprise" : "");
|
||||||
|
if (orom->major_ver || orom->minor_ver || orom->hotfix_ver || orom->build) {
|
||||||
|
if (imsm_orom_is_vmd_without_efi(orom))
|
||||||
|
- printf(" Version : %d.%d\n", orom->major_ver,
|
||||||
|
- orom->minor_ver);
|
||||||
|
+ printf(" Version : %d.%d\n", orom->major_ver, orom->minor_ver);
|
||||||
|
else
|
||||||
|
- printf(" Version : %d.%d.%d.%d\n", orom->major_ver,
|
||||||
|
- orom->minor_ver, orom->hotfix_ver, orom->build);
|
||||||
|
+ printf(" Version : %d.%d.%d.%d\n", orom->major_ver, orom->minor_ver,
|
||||||
|
+ orom->hotfix_ver, orom->build);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf(" RAID Levels : ");
|
||||||
|
print_imsm_level_capability(orom);
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
- printf(" Chunk Sizes :%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
|
||||||
|
- imsm_orom_has_chunk(orom, 2) ? " 2k" : "",
|
||||||
|
- imsm_orom_has_chunk(orom, 4) ? " 4k" : "",
|
||||||
|
- imsm_orom_has_chunk(orom, 8) ? " 8k" : "",
|
||||||
|
- imsm_orom_has_chunk(orom, 16) ? " 16k" : "",
|
||||||
|
- imsm_orom_has_chunk(orom, 32) ? " 32k" : "",
|
||||||
|
- imsm_orom_has_chunk(orom, 64) ? " 64k" : "",
|
||||||
|
- imsm_orom_has_chunk(orom, 128) ? " 128k" : "",
|
||||||
|
- imsm_orom_has_chunk(orom, 256) ? " 256k" : "",
|
||||||
|
- imsm_orom_has_chunk(orom, 512) ? " 512k" : "",
|
||||||
|
- imsm_orom_has_chunk(orom, 1024*1) ? " 1M" : "",
|
||||||
|
- imsm_orom_has_chunk(orom, 1024*2) ? " 2M" : "",
|
||||||
|
- imsm_orom_has_chunk(orom, 1024*4) ? " 4M" : "",
|
||||||
|
- imsm_orom_has_chunk(orom, 1024*8) ? " 8M" : "",
|
||||||
|
- imsm_orom_has_chunk(orom, 1024*16) ? " 16M" : "",
|
||||||
|
- imsm_orom_has_chunk(orom, 1024*32) ? " 32M" : "",
|
||||||
|
- imsm_orom_has_chunk(orom, 1024*64) ? " 64M" : "");
|
||||||
|
- printf(" 2TB volumes :%s supported\n",
|
||||||
|
- (orom->attr & IMSM_OROM_ATTR_2TB)?"":" not");
|
||||||
|
+ printf(" Chunk Sizes : ");
|
||||||
|
+ print_imsm_chunk_size_capability(orom);
|
||||||
|
+ printf("\n");
|
||||||
|
+
|
||||||
|
+ printf(" 2TB volumes :%s supported\n", (orom->attr & IMSM_OROM_ATTR_2TB) ? "" : " not");
|
||||||
|
printf(" 2TB disks :%s supported\n",
|
||||||
|
- (orom->attr & IMSM_OROM_ATTR_2TB_DISK)?"":" not");
|
||||||
|
+ (orom->attr & IMSM_OROM_ATTR_2TB_DISK) ? "" : " not");
|
||||||
|
printf(" Max Disks : %d\n", orom->tds);
|
||||||
|
- printf(" Max Volumes : %d per array, %d per %s\n",
|
||||||
|
- orom->vpa, orom->vphba,
|
||||||
|
+ printf(" Max Volumes : %d per array, %d per %s\n", orom->vpa, orom->vphba,
|
||||||
|
imsm_orom_is_nvme(orom) ? "platform" : "controller");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
@@ -2688,23 +2707,10 @@ static void print_imsm_capability_export(const struct imsm_orom *orom)
|
||||||
|
print_imsm_level_capability(orom);
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
- printf("IMSM_SUPPORTED_CHUNK_SIZES=%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
|
||||||
|
- imsm_orom_has_chunk(orom, 2) ? "2k " : "",
|
||||||
|
- imsm_orom_has_chunk(orom, 4) ? "4k " : "",
|
||||||
|
- imsm_orom_has_chunk(orom, 8) ? "8k " : "",
|
||||||
|
- imsm_orom_has_chunk(orom, 16) ? "16k " : "",
|
||||||
|
- imsm_orom_has_chunk(orom, 32) ? "32k " : "",
|
||||||
|
- imsm_orom_has_chunk(orom, 64) ? "64k " : "",
|
||||||
|
- imsm_orom_has_chunk(orom, 128) ? "128k " : "",
|
||||||
|
- imsm_orom_has_chunk(orom, 256) ? "256k " : "",
|
||||||
|
- imsm_orom_has_chunk(orom, 512) ? "512k " : "",
|
||||||
|
- imsm_orom_has_chunk(orom, 1024*1) ? "1M " : "",
|
||||||
|
- imsm_orom_has_chunk(orom, 1024*2) ? "2M " : "",
|
||||||
|
- imsm_orom_has_chunk(orom, 1024*4) ? "4M " : "",
|
||||||
|
- imsm_orom_has_chunk(orom, 1024*8) ? "8M " : "",
|
||||||
|
- imsm_orom_has_chunk(orom, 1024*16) ? "16M " : "",
|
||||||
|
- imsm_orom_has_chunk(orom, 1024*32) ? "32M " : "",
|
||||||
|
- imsm_orom_has_chunk(orom, 1024*64) ? "64M " : "");
|
||||||
|
+ printf("IMSM_SUPPORTED_CHUNK_SIZES=");
|
||||||
|
+ print_imsm_chunk_size_capability(orom);
|
||||||
|
+ printf("\n");
|
||||||
|
+
|
||||||
|
printf("IMSM_2TB_VOLUMES=%s\n",(orom->attr & IMSM_OROM_ATTR_2TB) ? "yes" : "no");
|
||||||
|
printf("IMSM_2TB_DISKS=%s\n",(orom->attr & IMSM_OROM_ATTR_2TB_DISK) ? "yes" : "no");
|
||||||
|
printf("IMSM_MAX_DISKS=%d\n",orom->tds);
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
109
0137-mdadm-Grow-fix-coverity-issue-CHECKED_RETURN.patch
Normal file
109
0137-mdadm-Grow-fix-coverity-issue-CHECKED_RETURN.patch
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
From e0373b734db511cdfec248ff6d769270ec8fd492 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Fri, 26 Jul 2024 15:14:03 +0800
|
||||||
|
Subject: [PATCH 137/157] mdadm/Grow: fix coverity issue CHECKED_RETURN
|
||||||
|
|
||||||
|
It needs to check return value when functions have return value.
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
Grow.c | 43 ++++++++++++++++++++++++++++++++++++-------
|
||||||
|
1 file changed, 36 insertions(+), 7 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Grow.c b/Grow.c
|
||||||
|
index b135930d..7ae967bd 100644
|
||||||
|
--- a/Grow.c
|
||||||
|
+++ b/Grow.c
|
||||||
|
@@ -3261,7 +3261,12 @@ static int reshape_array(char *container, int fd, char *devname,
|
||||||
|
/* This is a spare that wants to
|
||||||
|
* be part of the array.
|
||||||
|
*/
|
||||||
|
- add_disk(fd, st, info2, d);
|
||||||
|
+ if (add_disk(fd, st, info2, d) < 0) {
|
||||||
|
+ pr_err("Can not add disk %s\n",
|
||||||
|
+ d->sys_name);
|
||||||
|
+ free(info2);
|
||||||
|
+ goto release;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sysfs_free(info2);
|
||||||
|
@@ -4413,7 +4418,10 @@ static void validate(int afd, int bfd, unsigned long long offset)
|
||||||
|
*/
|
||||||
|
if (afd < 0)
|
||||||
|
return;
|
||||||
|
- lseek64(bfd, offset - 4096, 0);
|
||||||
|
+ if (lseek64(bfd, offset - 4096, 0) < 0) {
|
||||||
|
+ pr_err("lseek64 fails %d:%s\n", errno, strerror(errno));
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
if (read(bfd, &bsb2, 512) != 512)
|
||||||
|
fail("cannot read bsb");
|
||||||
|
if (bsb2.sb_csum != bsb_csum((char*)&bsb2,
|
||||||
|
@@ -4444,12 +4452,19 @@ static void validate(int afd, int bfd, unsigned long long offset)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- lseek64(bfd, offset, 0);
|
||||||
|
+ if (lseek64(bfd, offset, 0) < 0) {
|
||||||
|
+ pr_err("lseek64 fails %d:%s\n", errno, strerror(errno));
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
if ((unsigned long long)read(bfd, bbuf, len) != len) {
|
||||||
|
//printf("len %llu\n", len);
|
||||||
|
fail("read first backup failed");
|
||||||
|
}
|
||||||
|
- lseek64(afd, __le64_to_cpu(bsb2.arraystart)*512, 0);
|
||||||
|
+
|
||||||
|
+ if (lseek64(afd, __le64_to_cpu(bsb2.arraystart)*512, 0) < 0) {
|
||||||
|
+ pr_err("lseek64 fails %d:%s\n", errno, strerror(errno));
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
if ((unsigned long long)read(afd, abuf, len) != len)
|
||||||
|
fail("read first from array failed");
|
||||||
|
if (memcmp(bbuf, abuf, len) != 0)
|
||||||
|
@@ -4466,15 +4481,25 @@ static void validate(int afd, int bfd, unsigned long long offset)
|
||||||
|
bbuf = xmalloc(abuflen);
|
||||||
|
}
|
||||||
|
|
||||||
|
- lseek64(bfd, offset+__le64_to_cpu(bsb2.devstart2)*512, 0);
|
||||||
|
+ if (lseek64(bfd, offset+__le64_to_cpu(bsb2.devstart2)*512, 0) < 0) {
|
||||||
|
+ pr_err("lseek64 fails %d:%s\n", errno, strerror(errno));
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
if ((unsigned long long)read(bfd, bbuf, len) != len)
|
||||||
|
fail("read second backup failed");
|
||||||
|
- lseek64(afd, __le64_to_cpu(bsb2.arraystart2)*512, 0);
|
||||||
|
+ if (lseek64(afd, __le64_to_cpu(bsb2.arraystart2)*512, 0) < 0) {
|
||||||
|
+ pr_err("lseek64 fails %d:%s\n", errno, strerror(errno));
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
if ((unsigned long long)read(afd, abuf, len) != len)
|
||||||
|
fail("read second from array failed");
|
||||||
|
if (memcmp(bbuf, abuf, len) != 0)
|
||||||
|
fail("data2 compare failed");
|
||||||
|
}
|
||||||
|
+out:
|
||||||
|
+ free(abuf);
|
||||||
|
+ free(bbuf);
|
||||||
|
+ return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int child_monitor(int afd, struct mdinfo *sra, struct reshape *reshape,
|
||||||
|
@@ -5033,7 +5058,11 @@ int Grow_continue_command(char *devname, int fd, struct context *c)
|
||||||
|
goto Grow_continue_command_exit;
|
||||||
|
}
|
||||||
|
content = &array;
|
||||||
|
- sysfs_init(content, fd, NULL);
|
||||||
|
+ if (sysfs_init(content, fd, NULL) < 0) {
|
||||||
|
+ pr_err("sysfs_init fails\n");
|
||||||
|
+ ret_val = 1;
|
||||||
|
+ goto Grow_continue_command_exit;
|
||||||
|
+ }
|
||||||
|
/* Need to load a superblock.
|
||||||
|
* FIXME we should really get what we need from
|
||||||
|
* sysfs
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
166
0138-mdadm-Grow-fix-coverity-issue-RESOURCE_LEAK.patch
Normal file
166
0138-mdadm-Grow-fix-coverity-issue-RESOURCE_LEAK.patch
Normal file
@ -0,0 +1,166 @@
|
|||||||
|
From 54c09eaa8bc057dfd88ae20d259f88457f67fd1c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Fri, 26 Jul 2024 15:14:04 +0800
|
||||||
|
Subject: [PATCH 138/157] mdadm/Grow: fix coverity issue RESOURCE_LEAK
|
||||||
|
|
||||||
|
Fix some resource leak problems.
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
Grow.c | 42 +++++++++++++++++++++++++++++++-----------
|
||||||
|
1 file changed, 31 insertions(+), 11 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Grow.c b/Grow.c
|
||||||
|
index 7ae967bd..907a6e1b 100644
|
||||||
|
--- a/Grow.c
|
||||||
|
+++ b/Grow.c
|
||||||
|
@@ -530,8 +530,10 @@ int Grow_addbitmap(char *devname, int fd, struct context *c, struct shape *s)
|
||||||
|
pr_err("Cannot add bitmap while array is resyncing or reshaping etc.\n");
|
||||||
|
pr_err("Cannot set bitmap file for %s: %s\n",
|
||||||
|
devname, strerror(err));
|
||||||
|
+ close_fd(&bitmap_fd);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
+ close_fd(&bitmap_fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
@@ -3083,6 +3085,7 @@ static int reshape_array(char *container, int fd, char *devname,
|
||||||
|
int done;
|
||||||
|
struct mdinfo *sra = NULL;
|
||||||
|
char buf[SYSFS_MAX_BUF_SIZE];
|
||||||
|
+ bool located_backup = false;
|
||||||
|
|
||||||
|
/* when reshaping a RAID0, the component_size might be zero.
|
||||||
|
* So try to fix that up.
|
||||||
|
@@ -3165,8 +3168,10 @@ static int reshape_array(char *container, int fd, char *devname,
|
||||||
|
goto release;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (!backup_file)
|
||||||
|
+ if (!backup_file) {
|
||||||
|
backup_file = locate_backup(sra->sys_name);
|
||||||
|
+ located_backup = true;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
goto started;
|
||||||
|
}
|
||||||
|
@@ -3612,15 +3617,13 @@ started:
|
||||||
|
mdstat_wait(30 - (delayed-1) * 25);
|
||||||
|
} while (delayed);
|
||||||
|
mdstat_close();
|
||||||
|
- if (check_env("MDADM_GROW_VERIFY"))
|
||||||
|
- fd = open(devname, O_RDONLY | O_DIRECT);
|
||||||
|
- else
|
||||||
|
- fd = -1;
|
||||||
|
mlockall(MCL_FUTURE);
|
||||||
|
|
||||||
|
if (signal_s(SIGTERM, catch_term) == SIG_ERR)
|
||||||
|
goto release;
|
||||||
|
|
||||||
|
+ if (check_env("MDADM_GROW_VERIFY"))
|
||||||
|
+ fd = open(devname, O_RDONLY | O_DIRECT);
|
||||||
|
if (st->ss->external) {
|
||||||
|
/* metadata handler takes it from here */
|
||||||
|
done = st->ss->manage_reshape(
|
||||||
|
@@ -3632,6 +3635,7 @@ started:
|
||||||
|
fd, sra, &reshape, st, blocks, fdlist, offsets,
|
||||||
|
d - odisks, fdlist + odisks, offsets + odisks);
|
||||||
|
|
||||||
|
+ close_fd(&fd);
|
||||||
|
free(fdlist);
|
||||||
|
free(offsets);
|
||||||
|
|
||||||
|
@@ -3701,6 +3705,8 @@ out:
|
||||||
|
exit(0);
|
||||||
|
|
||||||
|
release:
|
||||||
|
+ if (located_backup)
|
||||||
|
+ free(backup_file);
|
||||||
|
free(fdlist);
|
||||||
|
free(offsets);
|
||||||
|
if (orig_level != UnSet && sra) {
|
||||||
|
@@ -3839,6 +3845,7 @@ int reshape_container(char *container, char *devname,
|
||||||
|
pr_err("Unable to initialize sysfs for %s\n",
|
||||||
|
mdstat->devnm);
|
||||||
|
rv = 1;
|
||||||
|
+ close_fd(&fd);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -4717,6 +4724,7 @@ int Grow_restart(struct supertype *st, struct mdinfo *info, int *fdlist,
|
||||||
|
unsigned long long *offsets;
|
||||||
|
unsigned long long nstripe, ostripe;
|
||||||
|
int ndata, odata;
|
||||||
|
+ int fd, backup_fd = -1;
|
||||||
|
|
||||||
|
odata = info->array.raid_disks - info->delta_disks - 1;
|
||||||
|
if (info->array.level == 6)
|
||||||
|
@@ -4732,9 +4740,18 @@ int Grow_restart(struct supertype *st, struct mdinfo *info, int *fdlist,
|
||||||
|
* been used
|
||||||
|
*/
|
||||||
|
old_disks = cnt;
|
||||||
|
+
|
||||||
|
+ if (backup_file) {
|
||||||
|
+ backup_fd = open(backup_file, O_RDONLY);
|
||||||
|
+ if (!is_fd_valid(backup_fd)) {
|
||||||
|
+ pr_err("Can't open backup file %s : %s\n",
|
||||||
|
+ backup_file, strerror(errno));
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
for (i=old_disks-(backup_file?1:0); i<cnt; i++) {
|
||||||
|
struct mdinfo dinfo;
|
||||||
|
- int fd;
|
||||||
|
int bsbsize;
|
||||||
|
char *devname, namebuf[20];
|
||||||
|
unsigned long long lo, hi;
|
||||||
|
@@ -4747,12 +4764,9 @@ int Grow_restart(struct supertype *st, struct mdinfo *info, int *fdlist,
|
||||||
|
* else restore data and update all superblocks
|
||||||
|
*/
|
||||||
|
if (i == old_disks-1) {
|
||||||
|
- fd = open(backup_file, O_RDONLY);
|
||||||
|
- if (fd<0) {
|
||||||
|
- pr_err("backup file %s inaccessible: %s\n",
|
||||||
|
- backup_file, strerror(errno));
|
||||||
|
+ if (!is_fd_valid(backup_fd))
|
||||||
|
continue;
|
||||||
|
- }
|
||||||
|
+ fd = backup_fd;
|
||||||
|
devname = backup_file;
|
||||||
|
} else {
|
||||||
|
fd = fdlist[i];
|
||||||
|
@@ -4907,6 +4921,7 @@ int Grow_restart(struct supertype *st, struct mdinfo *info, int *fdlist,
|
||||||
|
pr_err("Error restoring backup from %s\n",
|
||||||
|
devname);
|
||||||
|
free(offsets);
|
||||||
|
+ close_fd(&backup_fd);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -4923,6 +4938,7 @@ int Grow_restart(struct supertype *st, struct mdinfo *info, int *fdlist,
|
||||||
|
pr_err("Error restoring second backup from %s\n",
|
||||||
|
devname);
|
||||||
|
free(offsets);
|
||||||
|
+ close_fd(&backup_fd);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -4984,8 +5000,12 @@ int Grow_restart(struct supertype *st, struct mdinfo *info, int *fdlist,
|
||||||
|
st->ss->store_super(st, fdlist[j]);
|
||||||
|
st->ss->free_super(st);
|
||||||
|
}
|
||||||
|
+ close_fd(&backup_fd);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ close_fd(&backup_fd);
|
||||||
|
+
|
||||||
|
/* Didn't find any backup data, try to see if any
|
||||||
|
* was needed.
|
||||||
|
*/
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
29
0139-mdadm-Grow-fix-coverity-issue-STRING_OVERFLOW.patch
Normal file
29
0139-mdadm-Grow-fix-coverity-issue-STRING_OVERFLOW.patch
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
From 13c1f4a56b3bedbf802d66e86afd787e318e25fb Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Fri, 26 Jul 2024 15:14:05 +0800
|
||||||
|
Subject: [PATCH 139/157] mdadm/Grow: fix coverity issue STRING_OVERFLOW
|
||||||
|
|
||||||
|
Fix string overflow problems in Grow.c
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
Grow.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/Grow.c b/Grow.c
|
||||||
|
index 907a6e1b..a5f9027d 100644
|
||||||
|
--- a/Grow.c
|
||||||
|
+++ b/Grow.c
|
||||||
|
@@ -1694,7 +1694,7 @@ char *analyse_change(char *devname, struct mdinfo *info, struct reshape *re)
|
||||||
|
/* Current RAID6 layout has a RAID5
|
||||||
|
* equivalent - good
|
||||||
|
*/
|
||||||
|
- strcat(strcpy(layout, ls), "-6");
|
||||||
|
+ snprintf(layout, 40, "%s-6", ls);
|
||||||
|
l = map_name(r6layout, layout);
|
||||||
|
if (l == UnSet)
|
||||||
|
return "Cannot find RAID6 layout to convert to";
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
87
0140-mdadm-Incremental-fix-coverity-issues.patch
Normal file
87
0140-mdadm-Incremental-fix-coverity-issues.patch
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
From 17c99bab3e2e3606961d7ecec62c29921b5d6660 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Fri, 26 Jul 2024 15:14:06 +0800
|
||||||
|
Subject: [PATCH 140/157] mdadm/Incremental: fix coverity issues.
|
||||||
|
|
||||||
|
There are two issues PW.PARAMETER_HIDDEN (declaration hides
|
||||||
|
parameter 'devname') and INTEGER_OVERFLOW.
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
Incremental.c | 20 ++++++++++----------
|
||||||
|
1 file changed, 10 insertions(+), 10 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Incremental.c b/Incremental.c
|
||||||
|
index abc7721b..fc4e68ff 100644
|
||||||
|
--- a/Incremental.c
|
||||||
|
+++ b/Incremental.c
|
||||||
|
@@ -770,7 +770,7 @@ static int count_active(struct supertype *st, struct mdinfo *sra,
|
||||||
|
replcnt++;
|
||||||
|
st->ss->free_super(st);
|
||||||
|
}
|
||||||
|
- if (max_journal_events >= max_events - 1)
|
||||||
|
+ if (max_events > 0 && max_journal_events >= max_events - 1)
|
||||||
|
bestinfo->journal_clean = 1;
|
||||||
|
|
||||||
|
if (!avail)
|
||||||
|
@@ -1113,7 +1113,7 @@ static int partition_try_spare(char *devname, int *dfdp, struct dev_policy *pol,
|
||||||
|
int fd = -1;
|
||||||
|
struct mdinfo info;
|
||||||
|
struct supertype *st2 = NULL;
|
||||||
|
- char *devname = NULL;
|
||||||
|
+ char *dev_path_name = NULL;
|
||||||
|
unsigned long long devsectors;
|
||||||
|
char *pathlist[2];
|
||||||
|
|
||||||
|
@@ -1142,14 +1142,14 @@ static int partition_try_spare(char *devname, int *dfdp, struct dev_policy *pol,
|
||||||
|
domain_free(domlist);
|
||||||
|
domlist = NULL;
|
||||||
|
|
||||||
|
- if (asprintf(&devname, "/dev/disk/by-path/%s", de->d_name) != 1) {
|
||||||
|
- devname = NULL;
|
||||||
|
+ if (asprintf(&dev_path_name, "/dev/disk/by-path/%s", de->d_name) != 1) {
|
||||||
|
+ dev_path_name = NULL;
|
||||||
|
goto next;
|
||||||
|
}
|
||||||
|
- fd = open(devname, O_RDONLY);
|
||||||
|
+ fd = open(dev_path_name, O_RDONLY);
|
||||||
|
if (fd < 0)
|
||||||
|
goto next;
|
||||||
|
- if (get_dev_size(fd, devname, &devsectors) == 0)
|
||||||
|
+ if (get_dev_size(fd, dev_path_name, &devsectors) == 0)
|
||||||
|
goto next;
|
||||||
|
devsectors >>= 9;
|
||||||
|
|
||||||
|
@@ -1188,8 +1188,8 @@ static int partition_try_spare(char *devname, int *dfdp, struct dev_policy *pol,
|
||||||
|
if (chosen == NULL || chosen_size < info.component_size) {
|
||||||
|
chosen_size = info.component_size;
|
||||||
|
free(chosen);
|
||||||
|
- chosen = devname;
|
||||||
|
- devname = NULL;
|
||||||
|
+ chosen = dev_path_name;
|
||||||
|
+ dev_path_name = NULL;
|
||||||
|
if (chosen_st) {
|
||||||
|
chosen_st->ss->free_super(chosen_st);
|
||||||
|
free(chosen_st);
|
||||||
|
@@ -1199,7 +1199,7 @@ static int partition_try_spare(char *devname, int *dfdp, struct dev_policy *pol,
|
||||||
|
}
|
||||||
|
|
||||||
|
next:
|
||||||
|
- free(devname);
|
||||||
|
+ free(dev_path_name);
|
||||||
|
domain_free(domlist);
|
||||||
|
dev_policy_free(pol2);
|
||||||
|
if (st2)
|
||||||
|
@@ -1246,7 +1246,7 @@ static int is_bare(int dfd)
|
||||||
|
|
||||||
|
/* OK, first 4K appear blank, try the end. */
|
||||||
|
get_dev_size(dfd, NULL, &size);
|
||||||
|
- if (lseek(dfd, size-4096, SEEK_SET) < 0 ||
|
||||||
|
+ if ((size >= 4096 && lseek(dfd, size-4096, SEEK_SET) < 0) ||
|
||||||
|
read(dfd, buf, 4096) != 4096)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
46
0141-mdadm-mdmon-fix-coverity-issue-CHECKED_RETURN.patch
Normal file
46
0141-mdadm-mdmon-fix-coverity-issue-CHECKED_RETURN.patch
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
From f9949a04355f0fca29c6bc02ead8425e76daa573 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Fri, 26 Jul 2024 15:14:07 +0800
|
||||||
|
Subject: [PATCH 141/157] mdadm/mdmon: fix coverity issue CHECKED_RETURN
|
||||||
|
|
||||||
|
It needs to check return values when functions have return value.
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
mdmon.c | 11 +++++++++--
|
||||||
|
1 file changed, 9 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/mdmon.c b/mdmon.c
|
||||||
|
index 95e350f4..cae63841 100644
|
||||||
|
--- a/mdmon.c
|
||||||
|
+++ b/mdmon.c
|
||||||
|
@@ -198,8 +198,12 @@ static void try_kill_monitor(pid_t pid, char *devname, int sock)
|
||||||
|
/* Wait for monitor to exit by reading from the socket, after
|
||||||
|
* clearing the non-blocking flag */
|
||||||
|
fl = fcntl(sock, F_GETFL, 0);
|
||||||
|
+ if (fl < 0)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
fl &= ~O_NONBLOCK;
|
||||||
|
- fcntl(sock, F_SETFL, fl);
|
||||||
|
+ if (fcntl(sock, F_SETFL, fl) < 0)
|
||||||
|
+ return;
|
||||||
|
n = read(sock, buf, 100);
|
||||||
|
|
||||||
|
/* If there is I/O going on it might took some time to get to
|
||||||
|
@@ -249,7 +253,10 @@ static int make_control_sock(char *devname)
|
||||||
|
listen(sfd, 10);
|
||||||
|
fl = fcntl(sfd, F_GETFL, 0);
|
||||||
|
fl |= O_NONBLOCK;
|
||||||
|
- fcntl(sfd, F_SETFL, fl);
|
||||||
|
+ if (fcntl(sfd, F_SETFL, fl) < 0) {
|
||||||
|
+ close_fd(&sfd);
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
return sfd;
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
49
0142-mdadm-mdmon-fix-coverity-issue-RESOURCE_LEAK.patch
Normal file
49
0142-mdadm-mdmon-fix-coverity-issue-RESOURCE_LEAK.patch
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
From e7623d5ae4724c72e873e8af17f2ed6bfdc54427 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Fri, 26 Jul 2024 15:14:08 +0800
|
||||||
|
Subject: [PATCH 142/157] mdadm/mdmon: fix coverity issue RESOURCE_LEAK
|
||||||
|
|
||||||
|
Fix resource leak problem in mdmon.c
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
mdmon.c | 9 ++++++---
|
||||||
|
1 file changed, 6 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/mdmon.c b/mdmon.c
|
||||||
|
index cae63841..6e28b56e 100644
|
||||||
|
--- a/mdmon.c
|
||||||
|
+++ b/mdmon.c
|
||||||
|
@@ -456,22 +456,25 @@ static int mdmon(char *devnm, int must_fork, int takeover)
|
||||||
|
if (must_fork) {
|
||||||
|
if (pipe(pfd) != 0) {
|
||||||
|
pr_err("failed to create pipe\n");
|
||||||
|
+ close_fd(&mdfd);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
switch(fork()) {
|
||||||
|
case -1:
|
||||||
|
pr_err("failed to fork: %s\n", strerror(errno));
|
||||||
|
+ close_fd(&mdfd);
|
||||||
|
return 1;
|
||||||
|
case 0: /* child */
|
||||||
|
- close(pfd[0]);
|
||||||
|
+ close_fd(&pfd[0]);
|
||||||
|
break;
|
||||||
|
default: /* parent */
|
||||||
|
- close(pfd[1]);
|
||||||
|
+ close_fd(&pfd[1]);
|
||||||
|
if (read(pfd[0], &status, sizeof(status)) != sizeof(status)) {
|
||||||
|
wait(&status);
|
||||||
|
status = WEXITSTATUS(status);
|
||||||
|
}
|
||||||
|
- close(pfd[0]);
|
||||||
|
+ close_fd(&pfd[0]);
|
||||||
|
+ close_fd(&mdfd);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
33
0143-mdadm-mdopen-fix-coverity-issue-CHECKED_RETURN.patch
Normal file
33
0143-mdadm-mdopen-fix-coverity-issue-CHECKED_RETURN.patch
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
From f34040081c36ff92180674b89c39ddc7bdd47288 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Fri, 26 Jul 2024 15:14:09 +0800
|
||||||
|
Subject: [PATCH 143/157] mdadm/mdopen: fix coverity issue CHECKED_RETURN
|
||||||
|
|
||||||
|
It needs to check return values when functions return value.
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
mdopen.c | 6 +++++-
|
||||||
|
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/mdopen.c b/mdopen.c
|
||||||
|
index eaa59b59..c9fda131 100644
|
||||||
|
--- a/mdopen.c
|
||||||
|
+++ b/mdopen.c
|
||||||
|
@@ -406,7 +406,11 @@ int create_mddev(char *dev, char *name, int autof, int trustworthy,
|
||||||
|
perror("chown");
|
||||||
|
if (chmod(devname, ci->mode))
|
||||||
|
perror("chmod");
|
||||||
|
- stat(devname, &stb);
|
||||||
|
+ if (stat(devname, &stb) < 0) {
|
||||||
|
+ pr_err("failed to stat %s\n",
|
||||||
|
+ devname);
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
add_dev(devname, &stb, 0, NULL);
|
||||||
|
}
|
||||||
|
if (use_mdp == 1)
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
29
0144-mdadm-mdopen-fix-coverity-issue-STRING_OVERFLOW.patch
Normal file
29
0144-mdadm-mdopen-fix-coverity-issue-STRING_OVERFLOW.patch
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
From debf421db02c85f176b5eda2e8dcc9d17d89623c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Fri, 26 Jul 2024 15:14:10 +0800
|
||||||
|
Subject: [PATCH 144/157] mdadm/mdopen: fix coverity issue STRING_OVERFLOW
|
||||||
|
|
||||||
|
Fix string overflow problems in mdopen.c
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
mdopen.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/mdopen.c b/mdopen.c
|
||||||
|
index c9fda131..e49defb6 100644
|
||||||
|
--- a/mdopen.c
|
||||||
|
+++ b/mdopen.c
|
||||||
|
@@ -376,7 +376,7 @@ int create_mddev(char *dev, char *name, int autof, int trustworthy,
|
||||||
|
|
||||||
|
sprintf(devname, "/dev/%s", devnm);
|
||||||
|
|
||||||
|
- if (dev && dev[0] == '/')
|
||||||
|
+ if (dev && dev[0] == '/' && strlen(dev) < 400)
|
||||||
|
strcpy(chosen, dev);
|
||||||
|
else if (cname[0] == 0)
|
||||||
|
strcpy(chosen, devname);
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
46
0145-mdadm-mdstat-fix-coverity-issue-CHECKED_RETURN.patch
Normal file
46
0145-mdadm-mdstat-fix-coverity-issue-CHECKED_RETURN.patch
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
From 6984814b6fd879efae178acb057c1025aa4c64e8 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Fri, 26 Jul 2024 15:14:11 +0800
|
||||||
|
Subject: [PATCH 145/157] mdadm/mdstat: fix coverity issue CHECKED_RETURN
|
||||||
|
|
||||||
|
It needs to check return values when functions return value.
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
mdstat.c | 12 +++++++++---
|
||||||
|
1 file changed, 9 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/mdstat.c b/mdstat.c
|
||||||
|
index cbbace3d..a971a957 100644
|
||||||
|
--- a/mdstat.c
|
||||||
|
+++ b/mdstat.c
|
||||||
|
@@ -194,8 +194,11 @@ struct mdstat_ent *mdstat_read(int hold, int start)
|
||||||
|
f = fopen("/proc/mdstat", "r");
|
||||||
|
if (f == NULL)
|
||||||
|
return NULL;
|
||||||
|
- else
|
||||||
|
- fcntl(fileno(f), F_SETFD, FD_CLOEXEC);
|
||||||
|
+
|
||||||
|
+ if (fcntl(fileno(f), F_SETFD, FD_CLOEXEC) < 0) {
|
||||||
|
+ fclose(f);
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
all = NULL;
|
||||||
|
end = &all;
|
||||||
|
@@ -329,7 +332,10 @@ struct mdstat_ent *mdstat_read(int hold, int start)
|
||||||
|
}
|
||||||
|
if (hold && mdstat_fd == -1) {
|
||||||
|
mdstat_fd = dup(fileno(f));
|
||||||
|
- fcntl(mdstat_fd, F_SETFD, FD_CLOEXEC);
|
||||||
|
+ if (fcntl(mdstat_fd, F_SETFD, FD_CLOEXEC) < 0) {
|
||||||
|
+ fclose(f);
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
fclose(f);
|
||||||
|
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
@ -0,0 +1,56 @@
|
|||||||
|
From e055d9236a7d0dca2a311e8bb8013018dc571d6a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Fri, 26 Jul 2024 15:14:12 +0800
|
||||||
|
Subject: [PATCH 146/157] mdadm/super0: fix coverity issue CHECKED_RETURN and
|
||||||
|
EVALUATION_ORDER
|
||||||
|
|
||||||
|
Fix coverity problems in super0. It needs to check return value when
|
||||||
|
functions return value. And fix EVALUATION_ORDER problems in super0.c
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
super0.c | 10 +++++++---
|
||||||
|
1 file changed, 7 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/super0.c b/super0.c
|
||||||
|
index 9b4e187e..c428e2a6 100644
|
||||||
|
--- a/super0.c
|
||||||
|
+++ b/super0.c
|
||||||
|
@@ -83,6 +83,9 @@ static void examine_super0(struct supertype *st, char *homehost)
|
||||||
|
int d;
|
||||||
|
int delta_extra = 0;
|
||||||
|
char *c;
|
||||||
|
+ unsigned long expected_csum = 0;
|
||||||
|
+
|
||||||
|
+ expected_csum = calc_sb0_csum(sb);
|
||||||
|
|
||||||
|
printf(" Magic : %08x\n", sb->md_magic);
|
||||||
|
printf(" Version : %d.%02d.%02d\n",
|
||||||
|
@@ -187,11 +190,11 @@ static void examine_super0(struct supertype *st, char *homehost)
|
||||||
|
printf("Working Devices : %d\n", sb->working_disks);
|
||||||
|
printf(" Failed Devices : %d\n", sb->failed_disks);
|
||||||
|
printf(" Spare Devices : %d\n", sb->spare_disks);
|
||||||
|
- if (calc_sb0_csum(sb) == sb->sb_csum)
|
||||||
|
+ if (expected_csum == sb->sb_csum)
|
||||||
|
printf(" Checksum : %x - correct\n", sb->sb_csum);
|
||||||
|
else
|
||||||
|
printf(" Checksum : %x - expected %lx\n",
|
||||||
|
- sb->sb_csum, calc_sb0_csum(sb));
|
||||||
|
+ sb->sb_csum, expected_csum);
|
||||||
|
printf(" Events : %llu\n",
|
||||||
|
((unsigned long long)sb->events_hi << 32) + sb->events_lo);
|
||||||
|
printf("\n");
|
||||||
|
@@ -1212,7 +1215,8 @@ static int locate_bitmap0(struct supertype *st, int fd, int node_num)
|
||||||
|
|
||||||
|
offset += MD_SB_BYTES;
|
||||||
|
|
||||||
|
- lseek64(fd, offset, 0);
|
||||||
|
+ if (lseek64(fd, offset, 0) < 0)
|
||||||
|
+ return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
67
0147-mdadm-super1-fix-coverity-issue-CHECKED_RETURN.patch
Normal file
67
0147-mdadm-super1-fix-coverity-issue-CHECKED_RETURN.patch
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
From eb9834599c8c9764bb3e711b6f291b10797eff27 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Fri, 26 Jul 2024 15:14:13 +0800
|
||||||
|
Subject: [PATCH 147/157] mdadm/super1: fix coverity issue CHECKED_RETURN
|
||||||
|
|
||||||
|
It needs to check return value when functions return value.
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
super1.c | 20 ++++++++++++++++----
|
||||||
|
1 file changed, 16 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/super1.c b/super1.c
|
||||||
|
index 81d29a65..4e4c7bfd 100644
|
||||||
|
--- a/super1.c
|
||||||
|
+++ b/super1.c
|
||||||
|
@@ -260,7 +260,10 @@ static int aread(struct align_fd *afd, void *buf, int len)
|
||||||
|
n = read(afd->fd, b, iosize);
|
||||||
|
if (n <= 0)
|
||||||
|
return n;
|
||||||
|
- lseek(afd->fd, len - n, 1);
|
||||||
|
+ if (lseek(afd->fd, len - n, 1) < 0) {
|
||||||
|
+ pr_err("lseek fails\n");
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
if (n > len)
|
||||||
|
n = len;
|
||||||
|
memcpy(buf, b, n);
|
||||||
|
@@ -294,14 +297,20 @@ static int awrite(struct align_fd *afd, void *buf, int len)
|
||||||
|
n = read(afd->fd, b, iosize);
|
||||||
|
if (n <= 0)
|
||||||
|
return n;
|
||||||
|
- lseek(afd->fd, -n, 1);
|
||||||
|
+ if (lseek(afd->fd, -n, 1) < 0) {
|
||||||
|
+ pr_err("lseek fails\n");
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(b, buf, len);
|
||||||
|
n = write(afd->fd, b, iosize);
|
||||||
|
if (n <= 0)
|
||||||
|
return n;
|
||||||
|
- lseek(afd->fd, len - n, 1);
|
||||||
|
+ if (lseek(afd->fd, len - n, 1) < 0) {
|
||||||
|
+ pr_err("lseek fails\n");
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -2667,7 +2676,10 @@ static int locate_bitmap1(struct supertype *st, int fd, int node_num)
|
||||||
|
}
|
||||||
|
if (mustfree)
|
||||||
|
free(sb);
|
||||||
|
- lseek64(fd, offset<<9, 0);
|
||||||
|
+ if (lseek64(fd, offset<<9, 0) < 0) {
|
||||||
|
+ pr_err("lseek fails\n");
|
||||||
|
+ ret = -1;
|
||||||
|
+ }
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
29
0148-mdadm-super1-fix-coverity-issue-DEADCODE.patch
Normal file
29
0148-mdadm-super1-fix-coverity-issue-DEADCODE.patch
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
From 7904dc1c576a742c601c40dab4d0a6e562c4d00c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Fri, 26 Jul 2024 15:14:14 +0800
|
||||||
|
Subject: [PATCH 148/157] mdadm/super1: fix coverity issue DEADCODE
|
||||||
|
|
||||||
|
optimal_space is at most 2046. So space can't be larger than UINT16_MAX.
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
super1.c | 2 --
|
||||||
|
1 file changed, 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/super1.c b/super1.c
|
||||||
|
index 4e4c7bfd..24bc1026 100644
|
||||||
|
--- a/super1.c
|
||||||
|
+++ b/super1.c
|
||||||
|
@@ -1466,8 +1466,6 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
|
||||||
|
__le32_to_cpu(sb->chunksize));
|
||||||
|
if (space > optimal_space)
|
||||||
|
space = optimal_space;
|
||||||
|
- if (space > UINT16_MAX)
|
||||||
|
- space = UINT16_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
|
sb->ppl.offset = __cpu_to_le16(offset);
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
46
0149-mdadm-super1-fix-coverity-issue-EVALUATION_ORDER.patch
Normal file
46
0149-mdadm-super1-fix-coverity-issue-EVALUATION_ORDER.patch
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
From 38f712dba339bb9bd6a73cc7219d217871e7f27a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Fri, 26 Jul 2024 15:14:15 +0800
|
||||||
|
Subject: [PATCH 149/157] mdadm/super1: fix coverity issue EVALUATION_ORDER
|
||||||
|
|
||||||
|
Fix evaluation order problems in super1.c
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
super1.c | 7 +++++--
|
||||||
|
1 file changed, 5 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/super1.c b/super1.c
|
||||||
|
index 24bc1026..243eeb1a 100644
|
||||||
|
--- a/super1.c
|
||||||
|
+++ b/super1.c
|
||||||
|
@@ -340,6 +340,9 @@ static void examine_super1(struct supertype *st, char *homehost)
|
||||||
|
unsigned long long sb_offset;
|
||||||
|
struct mdinfo info;
|
||||||
|
int inconsistent = 0;
|
||||||
|
+ unsigned int expected_csum = 0;
|
||||||
|
+
|
||||||
|
+ expected_csum = calc_sb_1_csum(sb);
|
||||||
|
|
||||||
|
printf(" Magic : %08x\n", __le32_to_cpu(sb->magic));
|
||||||
|
printf(" Version : 1");
|
||||||
|
@@ -507,13 +510,13 @@ static void examine_super1(struct supertype *st, char *homehost)
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (calc_sb_1_csum(sb) == sb->sb_csum)
|
||||||
|
+ if (expected_csum == sb->sb_csum)
|
||||||
|
printf(" Checksum : %x - correct\n",
|
||||||
|
__le32_to_cpu(sb->sb_csum));
|
||||||
|
else
|
||||||
|
printf(" Checksum : %x - expected %x\n",
|
||||||
|
__le32_to_cpu(sb->sb_csum),
|
||||||
|
- __le32_to_cpu(calc_sb_1_csum(sb)));
|
||||||
|
+ __le32_to_cpu(expected_csum));
|
||||||
|
printf(" Events : %llu\n",
|
||||||
|
(unsigned long long)__le64_to_cpu(sb->events));
|
||||||
|
printf("\n");
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
41
0150-mdadm-super1-fix-coverity-issue-RESOURCE_LEAK.patch
Normal file
41
0150-mdadm-super1-fix-coverity-issue-RESOURCE_LEAK.patch
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
From ae2308ddf38b8f24a2b5e8e14e31153dfe608239 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xiao Ni <xni@redhat.com>
|
||||||
|
Date: Fri, 26 Jul 2024 15:14:16 +0800
|
||||||
|
Subject: [PATCH 150/157] mdadm/super1: fix coverity issue RESOURCE_LEAK
|
||||||
|
|
||||||
|
Fix resource leak problems in super1.c
|
||||||
|
|
||||||
|
Signed-off-by: Xiao Ni <xni@redhat.com>
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
super1.c | 3 +++
|
||||||
|
1 file changed, 3 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/super1.c b/super1.c
|
||||||
|
index 243eeb1a..9c9c7dd1 100644
|
||||||
|
--- a/super1.c
|
||||||
|
+++ b/super1.c
|
||||||
|
@@ -923,10 +923,12 @@ static int examine_badblocks_super1(struct supertype *st, int fd, char *devname)
|
||||||
|
offset <<= 9;
|
||||||
|
if (lseek64(fd, offset, 0) < 0) {
|
||||||
|
pr_err("Cannot seek to bad-blocks list\n");
|
||||||
|
+ free(bbl);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (read(fd, bbl, size) != size) {
|
||||||
|
pr_err("Cannot read bad-blocks list\n");
|
||||||
|
+ free(bbl);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
/* 64bits per entry. 10 bits is block-count, 54 bits is block
|
||||||
|
@@ -947,6 +949,7 @@ static int examine_badblocks_super1(struct supertype *st, int fd, char *devname)
|
||||||
|
|
||||||
|
printf("%20llu for %d sectors\n", sector, count);
|
||||||
|
}
|
||||||
|
+ free(bbl);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
66
0151-policy.c-Fix-check_return-issue-in-Write_rules.patch
Normal file
66
0151-policy.c-Fix-check_return-issue-in-Write_rules.patch
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
From 44c2a293260952fbb14db23d1ad07e6066641e0a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Anna Sztukowska <anna.sztukowska@intel.com>
|
||||||
|
Date: Thu, 11 Jul 2024 14:31:57 +0200
|
||||||
|
Subject: [PATCH 151/157] policy.c: Fix check_return issue in Write_rules()
|
||||||
|
|
||||||
|
Refactor Write_rules() in policy.c to eliminate check_return issue found
|
||||||
|
by SAST analysis. Create udev rules file directly using rule_name
|
||||||
|
instead of creating temporary file and renaming it.
|
||||||
|
|
||||||
|
Signed-off-by: Anna Sztukowska <anna.sztukowska@intel.com>
|
||||||
|
---
|
||||||
|
policy.c | 25 +++++++++----------------
|
||||||
|
1 file changed, 9 insertions(+), 16 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/policy.c b/policy.c
|
||||||
|
index dfaafdc0..4d4b248d 100644
|
||||||
|
--- a/policy.c
|
||||||
|
+++ b/policy.c
|
||||||
|
@@ -969,19 +969,13 @@ int generate_entries(int fd)
|
||||||
|
*/
|
||||||
|
int Write_rules(char *rule_name)
|
||||||
|
{
|
||||||
|
- int fd;
|
||||||
|
- char udev_rule_file[PATH_MAX];
|
||||||
|
+ int fd = fileno(stdout);
|
||||||
|
|
||||||
|
- if (rule_name) {
|
||||||
|
- strncpy(udev_rule_file, rule_name, sizeof(udev_rule_file) - 6);
|
||||||
|
- udev_rule_file[sizeof(udev_rule_file) - 6] = '\0';
|
||||||
|
- strcat(udev_rule_file, ".temp");
|
||||||
|
- fd = creat(udev_rule_file,
|
||||||
|
- S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
|
||||||
|
- if (fd == -1)
|
||||||
|
- return 1;
|
||||||
|
- } else
|
||||||
|
- fd = 1;
|
||||||
|
+ if (rule_name)
|
||||||
|
+ fd = creat(rule_name, 0644);
|
||||||
|
+
|
||||||
|
+ if (!is_fd_valid(fd))
|
||||||
|
+ return 1;
|
||||||
|
|
||||||
|
/* write static invocation */
|
||||||
|
if (write(fd, udev_template_start, sizeof(udev_template_start) - 1) !=
|
||||||
|
@@ -993,15 +987,14 @@ int Write_rules(char *rule_name)
|
||||||
|
goto abort;
|
||||||
|
|
||||||
|
fsync(fd);
|
||||||
|
- if (rule_name) {
|
||||||
|
+ if (rule_name)
|
||||||
|
close(fd);
|
||||||
|
- rename(udev_rule_file, rule_name);
|
||||||
|
- }
|
||||||
|
+
|
||||||
|
return 0;
|
||||||
|
abort:
|
||||||
|
if (rule_name) {
|
||||||
|
close(fd);
|
||||||
|
- unlink(udev_rule_file);
|
||||||
|
+ unlink(rule_name);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
40
0152-super-gpt.c-Fix-check_return-issue-in-load_gpt.patch
Normal file
40
0152-super-gpt.c-Fix-check_return-issue-in-load_gpt.patch
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
From 483ff037f1036f5f604e085cf76097a87e2be348 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Anna Sztukowska <anna.sztukowska@intel.com>
|
||||||
|
Date: Wed, 24 Jul 2024 11:46:57 +0200
|
||||||
|
Subject: [PATCH 152/157] super-gpt.c: Fix check_return issue in load_gpt()
|
||||||
|
|
||||||
|
Fix check_return issue in load_gpt() reported by SAST analysis in
|
||||||
|
super-gpt.c.
|
||||||
|
|
||||||
|
Signed-off-by: Anna Sztukowska <anna.sztukowska@intel.com>
|
||||||
|
---
|
||||||
|
super-gpt.c | 6 ++++--
|
||||||
|
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/super-gpt.c b/super-gpt.c
|
||||||
|
index a1e9aa9d..ec3cf53f 100644
|
||||||
|
--- a/super-gpt.c
|
||||||
|
+++ b/super-gpt.c
|
||||||
|
@@ -105,7 +105,8 @@ static int load_gpt(struct supertype *st, int fd, char *devname)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
/* Set offset to second block (GPT header) */
|
||||||
|
- lseek(fd, sector_size, SEEK_SET);
|
||||||
|
+ if (lseek(fd, sector_size, SEEK_SET) == -1L)
|
||||||
|
+ goto no_read;
|
||||||
|
/* Seem to have GPT, load the header */
|
||||||
|
gpt_head = (struct GPT*)(super+1);
|
||||||
|
if (read(fd, gpt_head, sizeof(*gpt_head)) != sizeof(*gpt_head))
|
||||||
|
@@ -118,7 +119,8 @@ static int load_gpt(struct supertype *st, int fd, char *devname)
|
||||||
|
to_read = __le32_to_cpu(gpt_head->part_cnt) * sizeof(struct GPT_part_entry);
|
||||||
|
to_read = ((to_read+511)/512) * 512;
|
||||||
|
/* Set offset to third block (GPT entries) */
|
||||||
|
- lseek(fd, sector_size*2, SEEK_SET);
|
||||||
|
+ if (lseek(fd, sector_size * 2, SEEK_SET) == -1L)
|
||||||
|
+ goto no_read;
|
||||||
|
if (read(fd, gpt_head+1, to_read) != to_read)
|
||||||
|
goto no_read;
|
||||||
|
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
46
0153-super-intel-fix-compilation-error.patch
Normal file
46
0153-super-intel-fix-compilation-error.patch
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
From 734de8b02022bf3b7a5f2111f5314a87ddebcc83 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kinga Stefaniuk <kinga.stefaniuk@intel.com>
|
||||||
|
Date: Tue, 6 Aug 2024 11:14:02 +0200
|
||||||
|
Subject: [PATCH 153/157] super-intel: fix compilation error
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
Fix compilation error:
|
||||||
|
|
||||||
|
super-intel.c: In function ‘end_migration’:
|
||||||
|
super-intel.c:4360:29: error: writing 2 bytes into a region
|
||||||
|
of size 0 [-Werror=stringop-overflow=]
|
||||||
|
4360 | dev->vol.migr_state = 0;
|
||||||
|
| ~~~~~~~~~~~~~~~~~~~~^~~
|
||||||
|
cc1: note: destination object is likely at address zero
|
||||||
|
cc1: all warnings being treated as errors
|
||||||
|
make: *** [Makefile:232: super-intel.o] Error 1
|
||||||
|
|
||||||
|
reported, when GCC 14 is used. Return when dev is NULL, to avoid it.
|
||||||
|
|
||||||
|
Signed-off-by: Kinga Stefaniuk <kinga.stefaniuk@intel.com>
|
||||||
|
---
|
||||||
|
super-intel.c | 6 ++++++
|
||||||
|
1 file changed, 6 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/super-intel.c b/super-intel.c
|
||||||
|
index ab9b5d3f..f6745e10 100644
|
||||||
|
--- a/super-intel.c
|
||||||
|
+++ b/super-intel.c
|
||||||
|
@@ -4330,6 +4330,12 @@ static void migrate(struct imsm_dev *dev, struct intel_super *super,
|
||||||
|
static void end_migration(struct imsm_dev *dev, struct intel_super *super,
|
||||||
|
__u8 map_state)
|
||||||
|
{
|
||||||
|
+ /* To avoid compilation error, saying dev can't be NULL when
|
||||||
|
+ * migr_state is assigned.
|
||||||
|
+ */
|
||||||
|
+ if (dev == NULL)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
struct imsm_map *map = get_imsm_map(dev, MAP_0);
|
||||||
|
struct imsm_map *prev = get_imsm_map(dev, dev->vol.migr_state == 0 ?
|
||||||
|
MAP_0 : MAP_1);
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
92
0154-super-intel-add-define-for-migr_state.patch
Normal file
92
0154-super-intel-add-define-for-migr_state.patch
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
From 125217e0903ab0eb574d20c698c49b04e3b1a99c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kinga Stefaniuk <kinga.stefaniuk@intel.com>
|
||||||
|
Date: Wed, 31 Jul 2024 15:06:42 +0200
|
||||||
|
Subject: [PATCH 154/157] super-intel: add define for migr_state
|
||||||
|
|
||||||
|
Represent migr_state with the define, which helps in code readability.
|
||||||
|
Add new values for Normal and Migration states.
|
||||||
|
|
||||||
|
Signed-off-by: Kinga Stefaniuk <kinga.stefaniuk@intel.com>
|
||||||
|
---
|
||||||
|
super-intel.c | 16 +++++++++-------
|
||||||
|
1 file changed, 9 insertions(+), 7 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/super-intel.c b/super-intel.c
|
||||||
|
index f6745e10..354c292a 100644
|
||||||
|
--- a/super-intel.c
|
||||||
|
+++ b/super-intel.c
|
||||||
|
@@ -194,6 +194,8 @@ ASSERT_SIZE(imsm_map, 52)
|
||||||
|
struct imsm_vol {
|
||||||
|
__u32 curr_migr_unit_lo;
|
||||||
|
__u32 checkpoint_id; /* id to access curr_migr_unit */
|
||||||
|
+#define MIGR_STATE_NORMAL 0
|
||||||
|
+#define MIGR_STATE_MIGRATING 1
|
||||||
|
__u8 migr_state; /* Normal or Migrating */
|
||||||
|
#define MIGR_INIT 0
|
||||||
|
#define MIGR_REBUILD 1
|
||||||
|
@@ -4303,7 +4305,7 @@ static void migrate(struct imsm_dev *dev, struct intel_super *super,
|
||||||
|
struct imsm_map *dest;
|
||||||
|
struct imsm_map *src = get_imsm_map(dev, MAP_0);
|
||||||
|
|
||||||
|
- dev->vol.migr_state = 1;
|
||||||
|
+ dev->vol.migr_state = MIGR_STATE_MIGRATING;
|
||||||
|
set_migr_type(dev, migr_type);
|
||||||
|
set_vol_curr_migr_unit(dev, 0);
|
||||||
|
dest = get_imsm_map(dev, MAP_1);
|
||||||
|
@@ -4337,7 +4339,7 @@ static void end_migration(struct imsm_dev *dev, struct intel_super *super,
|
||||||
|
return;
|
||||||
|
|
||||||
|
struct imsm_map *map = get_imsm_map(dev, MAP_0);
|
||||||
|
- struct imsm_map *prev = get_imsm_map(dev, dev->vol.migr_state == 0 ?
|
||||||
|
+ struct imsm_map *prev = get_imsm_map(dev, dev->vol.migr_state == MIGR_STATE_NORMAL ?
|
||||||
|
MAP_0 : MAP_1);
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
@@ -4369,7 +4371,7 @@ static void end_migration(struct imsm_dev *dev, struct intel_super *super,
|
||||||
|
map_state = imsm_check_degraded(super, dev, failed, MAP_0);
|
||||||
|
}
|
||||||
|
|
||||||
|
- dev->vol.migr_state = 0;
|
||||||
|
+ dev->vol.migr_state = MIGR_STATE_NORMAL;
|
||||||
|
set_migr_type(dev, 0);
|
||||||
|
set_vol_curr_migr_unit(dev, 0);
|
||||||
|
map->map_state = map_state;
|
||||||
|
@@ -4449,7 +4451,7 @@ int check_mpb_migr_compatibility(struct intel_super *super)
|
||||||
|
for (i = 0; i < super->anchor->num_raid_devs; i++) {
|
||||||
|
struct imsm_dev *dev_iter = __get_imsm_dev(super->anchor, i);
|
||||||
|
|
||||||
|
- if (dev_iter->vol.migr_state == 1 &&
|
||||||
|
+ if (dev_iter->vol.migr_state == MIGR_STATE_MIGRATING &&
|
||||||
|
dev_iter->vol.migr_type == MIGR_GEN_MIGR) {
|
||||||
|
/* This device is migrating */
|
||||||
|
map0 = get_imsm_map(dev_iter, MAP_0);
|
||||||
|
@@ -5654,7 +5656,7 @@ static int init_super_imsm_volume(struct supertype *st, mdu_array_info_t *info,
|
||||||
|
set_imsm_dev_size(dev, array_blocks);
|
||||||
|
dev->status = (DEV_READ_COALESCING | DEV_WRITE_COALESCING);
|
||||||
|
vol = &dev->vol;
|
||||||
|
- vol->migr_state = 0;
|
||||||
|
+ vol->migr_state = MIGR_STATE_NORMAL;
|
||||||
|
set_migr_type(dev, MIGR_INIT);
|
||||||
|
vol->dirty = !info->state;
|
||||||
|
set_vol_curr_migr_unit(dev, 0);
|
||||||
|
@@ -8631,7 +8633,7 @@ static void imsm_progress_container_reshape(struct intel_super *super)
|
||||||
|
copy_map_size = sizeof_imsm_map(map);
|
||||||
|
prev_num_members = map->num_members;
|
||||||
|
map->num_members = prev_disks;
|
||||||
|
- dev->vol.migr_state = 1;
|
||||||
|
+ dev->vol.migr_state = MIGR_STATE_MIGRATING;
|
||||||
|
set_vol_curr_migr_unit(dev, 0);
|
||||||
|
set_migr_type(dev, MIGR_GEN_MIGR);
|
||||||
|
for (i = prev_num_members;
|
||||||
|
@@ -9863,7 +9865,7 @@ static int apply_reshape_container_disks_update(struct imsm_update_reshape *u,
|
||||||
|
dprintf("imsm: modifying subdev: %i\n",
|
||||||
|
id->index);
|
||||||
|
devices_to_reshape--;
|
||||||
|
- newdev->vol.migr_state = 1;
|
||||||
|
+ newdev->vol.migr_state = MIGR_STATE_MIGRATING;
|
||||||
|
set_vol_curr_migr_unit(newdev, 0);
|
||||||
|
set_migr_type(newdev, MIGR_GEN_MIGR);
|
||||||
|
newmap->num_members = u->new_raid_disks;
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
@ -0,0 +1,52 @@
|
|||||||
|
From c653054b322a03e8912ac05accc87b6a1ba8daab Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kinga Stefaniuk <kinga.stefaniuk@intel.com>
|
||||||
|
Date: Fri, 26 Apr 2024 08:33:00 +0200
|
||||||
|
Subject: [PATCH 156/157] Grow_reshape: set only component_size for size grow
|
||||||
|
|
||||||
|
Component_size couldn't be set using ioctl when new drive size is big
|
||||||
|
(e.g. 5TB). Command value is bigger than 32 bits and error is reported
|
||||||
|
- it is known ioctl limitation. Remove updating array properties using
|
||||||
|
ioctl, use sysfs instead. Sysfs was introduced in 3.10, so now it is old
|
||||||
|
enough to be safely used. Array_size in sysfs should be set for every
|
||||||
|
size change for external metadata, when grow is performed without
|
||||||
|
errors.
|
||||||
|
|
||||||
|
Signed-off-by: Kinga Stefaniuk <kinga.stefaniuk@intel.com>
|
||||||
|
---
|
||||||
|
Grow.c | 19 +++++++------------
|
||||||
|
1 file changed, 7 insertions(+), 12 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Grow.c b/Grow.c
|
||||||
|
index a5f9027d..5810b128 100644
|
||||||
|
--- a/Grow.c
|
||||||
|
+++ b/Grow.c
|
||||||
|
@@ -2149,19 +2149,14 @@ int Grow_reshape(char *devname, int fd,
|
||||||
|
if (s->size == MAX_SIZE)
|
||||||
|
s->size = 0;
|
||||||
|
array.size = s->size;
|
||||||
|
- if (s->size & ~INT32_MAX) {
|
||||||
|
- /* got truncated to 32bit, write to
|
||||||
|
- * component_size instead
|
||||||
|
- */
|
||||||
|
- rv = sysfs_set_num(sra, NULL, "component_size", s->size);
|
||||||
|
- } else {
|
||||||
|
- rv = md_set_array_info(fd, &array);
|
||||||
|
+ rv = sysfs_set_num(sra, NULL, "component_size", s->size);
|
||||||
|
|
||||||
|
- /* manage array size when it is managed externally
|
||||||
|
- */
|
||||||
|
- if ((rv == 0) && st->ss->external)
|
||||||
|
- rv = set_array_size(st, sra, sra->text_version);
|
||||||
|
- }
|
||||||
|
+ /*
|
||||||
|
+ * For native metadata, md/array_size is updated by kernel,
|
||||||
|
+ * for external management update it here.
|
||||||
|
+ */
|
||||||
|
+ if (st->ss->external && rv == MDADM_STATUS_SUCCESS)
|
||||||
|
+ rv = set_array_size(st, sra, sra->text_version);
|
||||||
|
|
||||||
|
if (raid0_takeover) {
|
||||||
|
/* do not recync non-existing parity,
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
43
0157-mdstat-fix-list-detach-issues.patch
Normal file
43
0157-mdstat-fix-list-detach-issues.patch
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
From 4b041873ff5556882bc6f17ac3de00c72eebcc4f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
Date: Tue, 6 Aug 2024 16:11:18 +0200
|
||||||
|
Subject: [PATCH 157/157] mdstat: fix list detach issues
|
||||||
|
|
||||||
|
Move ent = ent->next; to while. It was outside the loop so if there
|
||||||
|
are more than 2 elements and we are looking for 3rd element it causes
|
||||||
|
infinite loop..
|
||||||
|
|
||||||
|
Fix el->next zeroing. It causes segfault in mdstat_free(). Theses
|
||||||
|
issues were not visible in my testing because I had only 2 MD devices.
|
||||||
|
|
||||||
|
Fixes: 4b3644ab4ce6 ("mdstat: Rework mdstat external arrays handling")
|
||||||
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
||||||
|
---
|
||||||
|
mdstat.c | 6 ++++--
|
||||||
|
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/mdstat.c b/mdstat.c
|
||||||
|
index a971a957..29e78362 100644
|
||||||
|
--- a/mdstat.c
|
||||||
|
+++ b/mdstat.c
|
||||||
|
@@ -123,13 +123,15 @@ static void mdstat_ent_list_detach_element(struct mdstat_ent **list_head, struct
|
||||||
|
ent->next = el->next;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ ent = ent->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
- ent = ent->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /* Guard if not found or list is empty - not allowed */
|
||||||
|
assert(ent);
|
||||||
|
- ent->next = NULL;
|
||||||
|
+ el->next = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void free_mdstat(struct mdstat_ent *ms)
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
91
mdadm.spec
91
mdadm.spec
@ -3,8 +3,8 @@
|
|||||||
Name: mdadm
|
Name: mdadm
|
||||||
Version: 4.3
|
Version: 4.3
|
||||||
# extraversion is used to define rhel internal version
|
# extraversion is used to define rhel internal version
|
||||||
%define extraversion 2
|
%define extraversion 3
|
||||||
Release: %{extraversion}%{?dist}.2
|
Release: %{extraversion}%{?dist}
|
||||||
Summary: The mdadm program controls Linux md devices (software RAID arrays)
|
Summary: The mdadm program controls Linux md devices (software RAID arrays)
|
||||||
URL: http://www.kernel.org/pub/linux/utils/raid/mdadm/
|
URL: http://www.kernel.org/pub/linux/utils/raid/mdadm/
|
||||||
License: GPLv2+
|
License: GPLv2+
|
||||||
@ -88,6 +88,89 @@ Patch063: 0064-tests-23rdev-lifetime-fix-a-typo.patch
|
|||||||
Patch064: 0065-util.c-change-devnm-to-const-in-mdmon-functions.patch
|
Patch064: 0065-util.c-change-devnm-to-const-in-mdmon-functions.patch
|
||||||
Patch065: 0066-Wait-for-mdmon-when-it-is-stared-via-systemd.patch
|
Patch065: 0066-Wait-for-mdmon-when-it-is-stared-via-systemd.patch
|
||||||
Patch066: 0069-mdadm-Fix-compilation-for-32-bit-arch.patch
|
Patch066: 0069-mdadm-Fix-compilation-for-32-bit-arch.patch
|
||||||
|
Patch067: 0070-add-checking-of-return-status-on-fstat-calls.patch
|
||||||
|
Patch068: 0071-super-intel-fix-typo-in-error-msg.patch
|
||||||
|
Patch069: 0072-mdadm-super-intel-remove-dead-code.patch
|
||||||
|
Patch070: 0073-mdadm-super-intel-fix-bad-shift.patch
|
||||||
|
Patch071: 0074-mdadm-deprecate-bitmap-custom-file.patch
|
||||||
|
Patch072: 0075-Makefile-fix-make-s-detection.patch
|
||||||
|
Patch073: 0076-Change-some-error-messages-to-info-level.patch
|
||||||
|
Patch074: 0077-mdadm-Start-update_opt-from-0.patch
|
||||||
|
Patch075: 0078-Don-t-control-reshape-speed-in-daemon.patch
|
||||||
|
Patch076: 0079-mdadm-tests-test-enhance.patch
|
||||||
|
Patch077: 0080-mdadm-tests-test-don-t-fail-when-systemd-reports-err.patch
|
||||||
|
Patch078: 0081-mdadm-tests-names_template-enhance.patch
|
||||||
|
Patch079: 0082-mdadm-tests-03assem-incr-enhance.patch
|
||||||
|
Patch080: 0083-mdadm-tests-03r0assem-enhance.patch
|
||||||
|
Patch081: 0084-mdadm-tests-remove-03r5assem-failed.patch
|
||||||
|
Patch082: 0085-mdadm-tests-03r5assemV1.patch
|
||||||
|
Patch083: 0086-mdadm-tests-remove-04r5swap.broken.patch
|
||||||
|
Patch084: 0087-tests-04update-metadata-skip-linear.patch
|
||||||
|
Patch085: 0088-mdadm-tests-05r5-internalbitmap.patch
|
||||||
|
Patch086: 0089-mdadm-tests-06name-enhance.patch
|
||||||
|
Patch087: 0090-mdadm-tests-07autoassemble.patch
|
||||||
|
Patch088: 0091-mdadm-tests-07autodetect.broken-can-be-removed.patch
|
||||||
|
Patch089: 0092-mdadm-tests-07changelevelintr.patch
|
||||||
|
Patch090: 0093-mdadm-tests-disable-selinux.patch
|
||||||
|
Patch091: 0094-mdadm-platform-intel-buffer-overflow-detected.patch
|
||||||
|
Patch092: 0095-mdadm-tests-bitmap-cases-enhance.patch
|
||||||
|
Patch093: 0096-mdadm-tests-04update-uuid.patch
|
||||||
|
Patch094: 0097-mdadm-tests-05r1-re-add-nosuper.patch
|
||||||
|
Patch095: 0098-mdadm-tests-remove-strace-test.patch
|
||||||
|
Patch096: 0099-mdadm.h-provide-basename-if-GLIBC-is-not-avialable.patch
|
||||||
|
Patch097: 0100-imsm-fix-first-volume-autolayout-with-IMSM_NO_PLATFO.patch
|
||||||
|
Patch098: 0101-imsm-make-freesize-required-to-volume-autolayout.patch
|
||||||
|
Patch099: 0102-mdadm-Fix-hang-race-condition-in-wait_for_zero_forks.patch
|
||||||
|
Patch100: 0103-mdadm-Block-SIGCHLD-processes-before-starting-childr.patch
|
||||||
|
Patch101: 0104-test-pass-flags-to-services.patch
|
||||||
|
Patch102: 0105-mdadm-Fix-socket-connection-failure-when-mdmon-runs-.patch
|
||||||
|
Patch103: 0106-Makefile-Do-not-call-gcc-directly.patch
|
||||||
|
Patch104: 0107-mdadm-tests-judge-foreign-array-in-test-cases.patch
|
||||||
|
Patch105: 0108-Revert-mdadm-Fix-socket-connection-failure-when-mdmo.patch
|
||||||
|
Patch106: 0109-mdadm-Assemble.c-fix-coverity-issues.patch
|
||||||
|
Patch107: 0111-mdadm-Fix-socket-connection-failure-when-mdmon-runs-.patch
|
||||||
|
Patch108: 0113-config.c-Fix-memory-leak-in-load_containers.patch
|
||||||
|
Patch109: 0114-mdadm-Build.c-fix-coverity-issues.patch
|
||||||
|
Patch110: 0115-mdadm-Create.c-fix-coverity-issues.patch
|
||||||
|
Patch111: 0116-mdadm-super-ddf.c-fix-coverity-issues.patch
|
||||||
|
Patch112: 0117-mdadm-clustermd_tests-add-some-APIs-in-func.sh-to-su.patch
|
||||||
|
Patch113: 0118-mdadm-clustermd_tests-adjust-test-cases-to-support-m.patch
|
||||||
|
Patch114: 0119-mapfile.c-Fix-STRING_OVERFLOW-issue.patch
|
||||||
|
Patch115: 0120-mdadm-Manage.c-fix-coverity-issues.patch
|
||||||
|
Patch116: 0121-Manage-fix-is_remove_safe.patch
|
||||||
|
Patch117: 0122-imsm-add-indent-for-encryption-details.patch
|
||||||
|
Patch118: 0123-mdadm-Monitor.c-fix-coverity-issues.patch
|
||||||
|
Patch119: 0124-mdadm-Query.c-fix-coverity-issues.patch
|
||||||
|
Patch120: 0125-mdadm-lib.c-fix-coverity-issues.patch
|
||||||
|
Patch121: 0126-mdadm-do-not-allow-leading-dot-in-MD-device-name.patch
|
||||||
|
Patch122: 0128-Detail-fix-detail-export-for-uuid_zero.patch
|
||||||
|
Patch123: 0129-drive_encryption-Fix-ata-passthrough12-verify.patch
|
||||||
|
Patch124: 0130-super0-use-define-for-char-array-in-examine_super0.patch
|
||||||
|
Patch125: 0131-Makefile-add-more-compiler-flags.patch
|
||||||
|
Patch126: 0133-mdstat-Rework-mdstat-external-arrays-handling.patch
|
||||||
|
Patch127: 0134-mdadm-managemon.c-fix-coverity-issues.patch
|
||||||
|
Patch128: 0135-mdadm-msg.c-fix-coverity-issues.patch
|
||||||
|
Patch129: 0136-imsm-refactor-chunk-size-print.patch
|
||||||
|
Patch130: 0137-mdadm-Grow-fix-coverity-issue-CHECKED_RETURN.patch
|
||||||
|
Patch131: 0138-mdadm-Grow-fix-coverity-issue-RESOURCE_LEAK.patch
|
||||||
|
Patch132: 0139-mdadm-Grow-fix-coverity-issue-STRING_OVERFLOW.patch
|
||||||
|
Patch133: 0140-mdadm-Incremental-fix-coverity-issues.patch
|
||||||
|
Patch134: 0141-mdadm-mdmon-fix-coverity-issue-CHECKED_RETURN.patch
|
||||||
|
Patch135: 0142-mdadm-mdmon-fix-coverity-issue-RESOURCE_LEAK.patch
|
||||||
|
Patch136: 0143-mdadm-mdopen-fix-coverity-issue-CHECKED_RETURN.patch
|
||||||
|
Patch137: 0144-mdadm-mdopen-fix-coverity-issue-STRING_OVERFLOW.patch
|
||||||
|
Patch138: 0145-mdadm-mdstat-fix-coverity-issue-CHECKED_RETURN.patch
|
||||||
|
Patch139: 0146-mdadm-super0-fix-coverity-issue-CHECKED_RETURN-and-E.patch
|
||||||
|
Patch140: 0147-mdadm-super1-fix-coverity-issue-CHECKED_RETURN.patch
|
||||||
|
Patch141: 0148-mdadm-super1-fix-coverity-issue-DEADCODE.patch
|
||||||
|
Patch142: 0149-mdadm-super1-fix-coverity-issue-EVALUATION_ORDER.patch
|
||||||
|
Patch143: 0150-mdadm-super1-fix-coverity-issue-RESOURCE_LEAK.patch
|
||||||
|
Patch144: 0151-policy.c-Fix-check_return-issue-in-Write_rules.patch
|
||||||
|
Patch145: 0152-super-gpt.c-Fix-check_return-issue-in-load_gpt.patch
|
||||||
|
Patch146: 0153-super-intel-fix-compilation-error.patch
|
||||||
|
Patch147: 0154-super-intel-add-define-for-migr_state.patch
|
||||||
|
Patch148: 0156-Grow_reshape-set-only-component_size-for-size-grow.patch
|
||||||
|
Patch149: 0157-mdstat-fix-list-detach-issues.patch
|
||||||
|
|
||||||
# Fedora customization patches
|
# Fedora customization patches
|
||||||
Patch197: mdadm-udev.patch
|
Patch197: mdadm-udev.patch
|
||||||
@ -171,6 +254,10 @@ install -m644 %{SOURCE5} %{buildroot}/etc/libreport/events.d
|
|||||||
/usr/share/mdadm/mdcheck
|
/usr/share/mdadm/mdcheck
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Sun Aug 11 2024 Xiao Ni <xni@redhat.com> - 4.3-3
|
||||||
|
- Fix coverity issue and update to latest upstream
|
||||||
|
- Resolves: RHEL-34533, RHEL-50776
|
||||||
|
|
||||||
* Tue Jul 16 2024 Michal Srb <michal@redhat.com> - 4.3-2.2
|
* Tue Jul 16 2024 Michal Srb <michal@redhat.com> - 4.3-2.2
|
||||||
- Avoid libreport dependency on RHEL
|
- Avoid libreport dependency on RHEL
|
||||||
- Resolves: RHEL-45523
|
- Resolves: RHEL-45523
|
||||||
|
Loading…
Reference in New Issue
Block a user