device-mapper-multipath-0.9.0-3
Update to the head of the upstream staging branch * Patches 0005-0042 are from the upstream staging branch * Previous patches 0005 & 0006 are now patches 0023 & 0005 Rename redhat patches * Previous patches 0007-0017 are now patches 0043-0053 Change from using readline to libedit * readline is licensed GPL v3, and multipathd includes code licensed gpl v2. Remove README.alua * information moved to README.md
This commit is contained in:
parent
ca605574d1
commit
ef9089f4e8
@ -19,6 +19,7 @@ Cc: Christophe Varoqui <christophe.varoqui@opensvc.com>
|
||||
Cc: DM-DEVEL ML <dm-devel@redhat.com>
|
||||
Signed-off-by: Xose Vazquez Perez <xose.vazquez@gmail.com>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/hwtable.c | 2 +-
|
||||
|
@ -12,6 +12,7 @@ Cc: Christophe Varoqui <christophe.varoqui@opensvc.com>
|
||||
Cc: DM-DEVEL ML <dm-devel@redhat.com>
|
||||
Signed-off-by: Xose Vazquez Perez <xose.vazquez@gmail.com>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/hwtable.c | 2 +-
|
||||
|
@ -1,13 +1,15 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Tue, 28 Jun 2022 15:38:28 -0500
|
||||
Date: Tue, 12 Jul 2022 17:02:51 -0500
|
||||
Subject: [PATCH] libmultipath: fix find_multipaths_timeout for unknown
|
||||
hardware
|
||||
|
||||
pp->hwe is now a vector that will always be allocated for all path
|
||||
devices. Instead of checking if it is NULL, check if it is empty.
|
||||
|
||||
Fixes: f0462f0 ("libmultipath: use vector for for pp->hwe and mp->hwe")
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
---
|
||||
libmultipath/propsel.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
@ -0,0 +1,52 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Xose Vazquez Perez <xose.vazquez@gmail.com>
|
||||
Date: Thu, 14 Jul 2022 21:05:39 +0200
|
||||
Subject: [PATCH] multipath-tools: update devel repo info in README.md
|
||||
|
||||
Cc: Martin Wilck <mwilck@suse.com>
|
||||
Cc: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Cc: Christophe Varoqui <christophe.varoqui@opensvc.com>
|
||||
Cc: DM-DEVEL ML <dm-devel@redhat.com>
|
||||
Signed-off-by: Xose Vazquez Perez <xose.vazquez@gmail.com>
|
||||
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
README.md | 10 +++-------
|
||||
1 file changed, 3 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/README.md b/README.md
|
||||
index f06f8cea..dcf51f20 100644
|
||||
--- a/README.md
|
||||
+++ b/README.md
|
||||
@@ -3,7 +3,6 @@
|
||||
multipath-tools for Linux
|
||||
=========================
|
||||
|
||||
-
|
||||
https://github.com/opensvc/multipath-tools
|
||||
|
||||
This package provides the following binaries to drive the Device Mapper multipathing driver:
|
||||
@@ -42,14 +41,12 @@ Go to: https://github.com/opensvc/multipath-tools/tags
|
||||
Select a release-tag and then click on "zip" or "tar.gz".
|
||||
|
||||
|
||||
-Source code
|
||||
-===========
|
||||
+Devel code
|
||||
+==========
|
||||
|
||||
To get latest devel code:
|
||||
|
||||
- git clone https://github.com/opensvc/multipath-tools.git
|
||||
-
|
||||
-Github page: https://github.com/opensvc/multipath-tools
|
||||
+ git clone -b queue https://github.com/openSUSE/multipath-tools
|
||||
|
||||
|
||||
Building multipath-tools
|
||||
@@ -149,4 +146,3 @@ The multipath-tools source code is covered by several different licences.
|
||||
Refer to the individual source files for details.
|
||||
Source files which do not specify a licence are shipped under LGPL-2.0
|
||||
(see `LICENSES/LGPL-2.0`).
|
||||
-
|
48
0007-multipath-tools-delete-README.alua.patch
Normal file
48
0007-multipath-tools-delete-README.alua.patch
Normal file
@ -0,0 +1,48 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Xose Vazquez Perez <xose.vazquez@gmail.com>
|
||||
Date: Thu, 14 Jul 2022 21:05:40 +0200
|
||||
Subject: [PATCH] multipath-tools: delete README.alua
|
||||
|
||||
Cc: Martin Wilck <mwilck@suse.com>
|
||||
Cc: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Cc: Christophe Varoqui <christophe.varoqui@opensvc.com>
|
||||
Cc: DM-DEVEL ML <dm-devel@redhat.com>
|
||||
Signed-off-by: Xose Vazquez Perez <xose.vazquez@gmail.com>
|
||||
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
README.alua | 24 ------------------------
|
||||
1 file changed, 24 deletions(-)
|
||||
delete mode 100644 README.alua
|
||||
|
||||
diff --git a/README.alua b/README.alua
|
||||
deleted file mode 100644
|
||||
index 5d2b1c64..00000000
|
||||
--- a/README.alua
|
||||
+++ /dev/null
|
||||
@@ -1,24 +0,0 @@
|
||||
-This is a rough guide, consult your storage device manufacturer documentation.
|
||||
-
|
||||
-ALUA is supported in some devices, but usually it's disabled by default.
|
||||
-To enable ALUA, the following options should be changed:
|
||||
-
|
||||
-- EMC CLARiiON/VNX:
|
||||
- "Failover Mode" should be changed to "4" or "Active-Active mode(ALUA)-failover mode 4"
|
||||
-
|
||||
-- HPE 3PAR, Primera, and Alletra 9000:
|
||||
- "Host:" should be changed to "Generic-ALUA Persona 2 (UARepLun, SESLun, ALUA)".
|
||||
-
|
||||
-- Promise VTrak/Vess:
|
||||
- "LUN Affinity" and "ALUA" should be changed to "Enable", "Redundancy Type"
|
||||
- must be "Active-Active".
|
||||
-
|
||||
-- LSI/Engenio/NetApp RDAC class, as NetApp SANtricity E/EF Series and OEM arrays:
|
||||
- "Select operating system:" should be changed to "Linux DM-MP (Kernel 3.10 or later)".
|
||||
-
|
||||
-- NetApp ONTAP:
|
||||
- To check ALUA state: "igroup show -v <igroup_name>", and to enable ALUA:
|
||||
- "igroup set <igroup_name> alua yes".
|
||||
-
|
||||
-- Huawei OceanStor:
|
||||
- "Host Access Mode" should be changed to "Asymmetric".
|
53
0008-multipath-tools-add-ALUA-info-to-README.md.patch
Normal file
53
0008-multipath-tools-add-ALUA-info-to-README.md.patch
Normal file
@ -0,0 +1,53 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Xose Vazquez Perez <xose.vazquez@gmail.com>
|
||||
Date: Thu, 14 Jul 2022 23:14:31 +0200
|
||||
Subject: [PATCH] multipath-tools: add ALUA info to README.md
|
||||
|
||||
Cc: Martin Wilck <mwilck@suse.com>
|
||||
Cc: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Cc: Christophe Varoqui <christophe.varoqui@opensvc.com>
|
||||
Cc: DM-DEVEL ML <dm-devel@redhat.com>
|
||||
Signed-off-by: Xose Vazquez Perez <xose.vazquez@gmail.com>
|
||||
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
README.md | 28 ++++++++++++++++++++++++++++
|
||||
1 file changed, 28 insertions(+)
|
||||
|
||||
diff --git a/README.md b/README.md
|
||||
index dcf51f20..2322082c 100644
|
||||
--- a/README.md
|
||||
+++ b/README.md
|
||||
@@ -146,3 +146,31 @@ The multipath-tools source code is covered by several different licences.
|
||||
Refer to the individual source files for details.
|
||||
Source files which do not specify a licence are shipped under LGPL-2.0
|
||||
(see `LICENSES/LGPL-2.0`).
|
||||
+
|
||||
+
|
||||
+ALUA
|
||||
+====
|
||||
+This is a rough guide, consult your storage device manufacturer documentation.
|
||||
+
|
||||
+ALUA is supported in some devices, but usually it's disabled by default.
|
||||
+To enable ALUA, the following options should be changed:
|
||||
+
|
||||
+- EMC CLARiiON/VNX:
|
||||
+ "Failover Mode" should be changed to "4" or "Active-Active mode(ALUA)-failover mode 4"
|
||||
+
|
||||
+- HPE 3PAR, Primera, and Alletra 9000:
|
||||
+ "Host:" should be changed to "Generic-ALUA Persona 2 (UARepLun, SESLun, ALUA)".
|
||||
+
|
||||
+- Promise VTrak/Vess:
|
||||
+ "LUN Affinity" and "ALUA" should be changed to "Enable", "Redundancy Type"
|
||||
+ must be "Active-Active".
|
||||
+
|
||||
+- LSI/Engenio/NetApp RDAC class, as NetApp SANtricity E/EF Series and OEM arrays:
|
||||
+ "Select operating system:" should be changed to "Linux DM-MP (Kernel 3.10 or later)".
|
||||
+
|
||||
+- NetApp ONTAP:
|
||||
+ To check ALUA state: "igroup show -v <igroup_name>", and to enable ALUA:
|
||||
+ "igroup set <igroup_name> alua yes".
|
||||
+
|
||||
+- Huawei OceanStor:
|
||||
+ "Host Access Mode" should be changed to "Asymmetric".
|
95
0009-libmultipath-alua-remove-get_sysfs_pg83.patch
Normal file
95
0009-libmultipath-alua-remove-get_sysfs_pg83.patch
Normal file
@ -0,0 +1,95 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Wilck <mwilck@suse.com>
|
||||
Date: Wed, 6 Jul 2022 15:57:21 +0200
|
||||
Subject: [PATCH] libmultipath: alua: remove get_sysfs_pg83()
|
||||
|
||||
Since b72e753 ("libmultipath: alua: try to retrieve inquiry data from sysfs"),
|
||||
we fetch inquiry and VPD data from sysfs anyway. No need to do this twice.
|
||||
|
||||
Signed-off-by: Martin Wilck <mwilck@suse.com>
|
||||
|
||||
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/prioritizers/alua_rtpg.c | 57 ++++++++-------------------
|
||||
1 file changed, 16 insertions(+), 41 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/prioritizers/alua_rtpg.c b/libmultipath/prioritizers/alua_rtpg.c
|
||||
index 3f9c0e73..4db13c20 100644
|
||||
--- a/libmultipath/prioritizers/alua_rtpg.c
|
||||
+++ b/libmultipath/prioritizers/alua_rtpg.c
|
||||
@@ -228,25 +228,6 @@ get_target_port_group_support(const struct path *pp, unsigned int timeout)
|
||||
return rc;
|
||||
}
|
||||
|
||||
-static int
|
||||
-get_sysfs_pg83(const struct path *pp, unsigned char *buff, int buflen)
|
||||
-{
|
||||
- struct udev_device *parent = pp->udev;
|
||||
-
|
||||
- while (parent) {
|
||||
- const char *subsys = udev_device_get_subsystem(parent);
|
||||
- if (subsys && !strncmp(subsys, "scsi", 4))
|
||||
- break;
|
||||
- parent = udev_device_get_parent(parent);
|
||||
- }
|
||||
-
|
||||
- if (!parent || sysfs_get_vpd(parent, 0x83, buff, buflen) <= 0) {
|
||||
- PRINT_DEBUG("failed to read sysfs vpd pg83");
|
||||
- return -1;
|
||||
- }
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
int
|
||||
get_target_port_group(const struct path * pp, unsigned int timeout)
|
||||
{
|
||||
@@ -265,32 +246,26 @@ get_target_port_group(const struct path * pp, unsigned int timeout)
|
||||
}
|
||||
|
||||
memset(buf, 0, buflen);
|
||||
+ rc = do_inquiry(pp, 1, 0x83, buf, buflen, timeout);
|
||||
+ if (rc < 0)
|
||||
+ goto out;
|
||||
|
||||
- rc = get_sysfs_pg83(pp, buf, buflen);
|
||||
-
|
||||
- if (rc < 0) {
|
||||
+ scsi_buflen = get_unaligned_be16(&buf[2]) + 4;
|
||||
+ if (scsi_buflen >= USHRT_MAX)
|
||||
+ scsi_buflen = USHRT_MAX;
|
||||
+ if (buflen < scsi_buflen) {
|
||||
+ free(buf);
|
||||
+ buf = (unsigned char *)malloc(scsi_buflen);
|
||||
+ if (!buf) {
|
||||
+ PRINT_DEBUG("malloc failed: could not allocate"
|
||||
+ "%u bytes", scsi_buflen);
|
||||
+ return -RTPG_RTPG_FAILED;
|
||||
+ }
|
||||
+ buflen = scsi_buflen;
|
||||
+ memset(buf, 0, buflen);
|
||||
rc = do_inquiry(pp, 1, 0x83, buf, buflen, timeout);
|
||||
if (rc < 0)
|
||||
goto out;
|
||||
-
|
||||
- scsi_buflen = get_unaligned_be16(&buf[2]) + 4;
|
||||
- /* Paranoia */
|
||||
- if (scsi_buflen >= USHRT_MAX)
|
||||
- scsi_buflen = USHRT_MAX;
|
||||
- if (buflen < scsi_buflen) {
|
||||
- free(buf);
|
||||
- buf = (unsigned char *)malloc(scsi_buflen);
|
||||
- if (!buf) {
|
||||
- PRINT_DEBUG("malloc failed: could not allocate"
|
||||
- "%u bytes", scsi_buflen);
|
||||
- return -RTPG_RTPG_FAILED;
|
||||
- }
|
||||
- buflen = scsi_buflen;
|
||||
- memset(buf, 0, buflen);
|
||||
- rc = do_inquiry(pp, 1, 0x83, buf, buflen, timeout);
|
||||
- if (rc < 0)
|
||||
- goto out;
|
||||
- }
|
||||
}
|
||||
|
||||
vpd83 = (struct vpd83_data *) buf;
|
77
0010-libmultipath-remove-sysfs_get_binary.patch
Normal file
77
0010-libmultipath-remove-sysfs_get_binary.patch
Normal file
@ -0,0 +1,77 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Wilck <mwilck@suse.com>
|
||||
Date: Tue, 5 Jul 2022 10:54:02 +0200
|
||||
Subject: [PATCH] libmultipath: remove sysfs_get_binary()
|
||||
|
||||
This function adds no value on top of sysfs_bin_attr_get_value().
|
||||
Remove it.
|
||||
|
||||
Signed-off-by: Martin Wilck <mwilck@suse.com>
|
||||
|
||||
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/discovery.c | 26 ++------------------------
|
||||
tests/test-lib.c | 1 -
|
||||
2 files changed, 2 insertions(+), 25 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
|
||||
index 0d8a558c..7e09e4e2 100644
|
||||
--- a/libmultipath/discovery.c
|
||||
+++ b/libmultipath/discovery.c
|
||||
@@ -263,41 +263,19 @@ declare_sysfs_get_str(vendor);
|
||||
declare_sysfs_get_str(model);
|
||||
declare_sysfs_get_str(rev);
|
||||
|
||||
-static ssize_t
|
||||
-sysfs_get_binary (struct udev_device * udev, const char *attrname,
|
||||
- unsigned char *buff, size_t len)
|
||||
-{
|
||||
- ssize_t attr_len;
|
||||
- const char * devname;
|
||||
-
|
||||
- if (!udev) {
|
||||
- condlog(3, "No udev device given\n");
|
||||
- return -ENOSYS;
|
||||
- }
|
||||
-
|
||||
- devname = udev_device_get_sysname(udev);
|
||||
- attr_len = sysfs_bin_attr_get_value(udev, attrname, buff, len);
|
||||
- if (attr_len < 0) {
|
||||
- condlog(3, "%s: attribute %s not found in sysfs",
|
||||
- devname, attrname);
|
||||
- return attr_len;
|
||||
- }
|
||||
- return attr_len;
|
||||
-}
|
||||
-
|
||||
ssize_t sysfs_get_vpd(struct udev_device * udev, unsigned char pg,
|
||||
unsigned char *buff, size_t len)
|
||||
{
|
||||
char attrname[9];
|
||||
|
||||
snprintf(attrname, sizeof(attrname), "vpd_pg%02x", pg);
|
||||
- return sysfs_get_binary(udev, attrname, buff, len);
|
||||
+ return sysfs_bin_attr_get_value(udev, attrname, buff, len);
|
||||
}
|
||||
|
||||
ssize_t sysfs_get_inquiry(struct udev_device * udev,
|
||||
unsigned char *buff, size_t len)
|
||||
{
|
||||
- return sysfs_get_binary(udev, "inquiry", buff, len);
|
||||
+ return sysfs_bin_attr_get_value(udev, "inquiry", buff, len);
|
||||
}
|
||||
|
||||
int
|
||||
diff --git a/tests/test-lib.c b/tests/test-lib.c
|
||||
index 6dd3ee88..0bc49d53 100644
|
||||
--- a/tests/test-lib.c
|
||||
+++ b/tests/test-lib.c
|
||||
@@ -334,7 +334,6 @@ void mock_pathinfo(int mask, const struct mocked_path *mp)
|
||||
if (mask & DI_SERIAL) {
|
||||
will_return(__wrap_udev_device_get_subsystem, "scsi");
|
||||
will_return(__wrap_udev_device_get_sysname, hbtl);
|
||||
- will_return(__wrap_udev_device_get_sysname, hbtl);
|
||||
}
|
||||
|
||||
if (mask & DI_WWID) {
|
@ -0,0 +1,65 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Wilck <mwilck@suse.com>
|
||||
Date: Tue, 5 Jul 2022 10:47:51 +0200
|
||||
Subject: [PATCH] libmultipath: sysfs_bin_attr_get_value(): no error if buffer
|
||||
is filled
|
||||
|
||||
sysfs_bin_attr_get_value() sets the length of bytes read to 0
|
||||
when the provided buffer was too small, truncating potentially
|
||||
useful data. This is harmful e.g. in do_inquiry(), if the "inquiry"
|
||||
sysfs attribute contains more than 96 bytes (which is possible).
|
||||
|
||||
Actually, binary attributes don't need to be 0-terminated. Thus,
|
||||
unlike for string attributes, it's not an error if the requested number of
|
||||
bytes is exactly equal to the number of bytes read. We expect that
|
||||
the caller knows how many bytes it needs to read.
|
||||
|
||||
Signed-off-by: Martin Wilck <mwilck@suse.com>
|
||||
|
||||
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/discovery.c | 10 ++++++----
|
||||
libmultipath/sysfs.c | 5 +----
|
||||
2 files changed, 7 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
|
||||
index 7e09e4e2..f5b8401c 100644
|
||||
--- a/libmultipath/discovery.c
|
||||
+++ b/libmultipath/discovery.c
|
||||
@@ -1341,13 +1341,15 @@ static int
|
||||
get_vpd_sysfs (struct udev_device *parent, int pg, char * str, int maxlen)
|
||||
{
|
||||
int len;
|
||||
- size_t buff_len;
|
||||
+ ssize_t buff_len;
|
||||
unsigned char buff[VPD_BUFLEN];
|
||||
|
||||
memset(buff, 0x0, VPD_BUFLEN);
|
||||
- if (!parent || sysfs_get_vpd(parent, pg, buff, VPD_BUFLEN) <= 0) {
|
||||
- condlog(3, "failed to read sysfs vpd pg%02x", pg);
|
||||
- return -EINVAL;
|
||||
+ buff_len = sysfs_get_vpd(parent, pg, buff, VPD_BUFLEN);
|
||||
+ if (buff_len < 0) {
|
||||
+ condlog(3, "failed to read sysfs vpd pg%02x: %s",
|
||||
+ pg, strerror(-buff_len));
|
||||
+ return buff_len;
|
||||
}
|
||||
|
||||
if (buff[1] != pg) {
|
||||
diff --git a/libmultipath/sysfs.c b/libmultipath/sysfs.c
|
||||
index f45dbee1..3ec92512 100644
|
||||
--- a/libmultipath/sysfs.c
|
||||
+++ b/libmultipath/sysfs.c
|
||||
@@ -146,10 +146,7 @@ ssize_t sysfs_bin_attr_get_value(struct udev_device *dev, const char *attr_name,
|
||||
if (size < 0) {
|
||||
condlog(4, "read from %s failed: %s", devpath, strerror(errno));
|
||||
size = -errno;
|
||||
- } else if (size == (ssize_t)value_len) {
|
||||
- condlog(4, "overflow while reading from %s", devpath);
|
||||
- size = 0;
|
||||
- }
|
||||
+ };
|
||||
|
||||
close(fd);
|
||||
return size;
|
115
0012-libmultipath-common-code-path-for-sysfs_attr_get_val.patch
Normal file
115
0012-libmultipath-common-code-path-for-sysfs_attr_get_val.patch
Normal file
@ -0,0 +1,115 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Wilck <mwilck@suse.com>
|
||||
Date: Tue, 5 Jul 2022 11:14:30 +0200
|
||||
Subject: [PATCH] libmultipath: common code path for sysfs_attr_get_value()
|
||||
|
||||
The code for sysfs_attr_get_value and sysfs_bin_attr_get_value() was
|
||||
almost identical. Use a common code path.
|
||||
|
||||
Signed-off-by: Martin Wilck <mwilck@suse.com>
|
||||
|
||||
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/sysfs.c | 70 +++++++++++---------------------------------
|
||||
1 file changed, 17 insertions(+), 53 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/sysfs.c b/libmultipath/sysfs.c
|
||||
index 3ec92512..4db911cc 100644
|
||||
--- a/libmultipath/sysfs.c
|
||||
+++ b/libmultipath/sysfs.c
|
||||
@@ -44,8 +44,8 @@
|
||||
* as libudev lacks the capability to update an attribute value.
|
||||
* So for modified attributes we need to implement our own function.
|
||||
*/
|
||||
-ssize_t sysfs_attr_get_value(struct udev_device *dev, const char *attr_name,
|
||||
- char * value, size_t value_len)
|
||||
+static ssize_t __sysfs_attr_get_value(struct udev_device *dev, const char *attr_name,
|
||||
+ char *value, size_t value_len, bool binary)
|
||||
{
|
||||
char devpath[PATH_SIZE];
|
||||
struct stat statbuf;
|
||||
@@ -87,12 +87,14 @@ ssize_t sysfs_attr_get_value(struct udev_device *dev, const char *attr_name,
|
||||
if (size < 0) {
|
||||
condlog(4, "read from %s failed: %s", devpath, strerror(errno));
|
||||
size = -errno;
|
||||
- value[0] = '\0';
|
||||
- } else if (size == (ssize_t)value_len) {
|
||||
+ if (!binary)
|
||||
+ value[0] = '\0';
|
||||
+ } else if (!binary && size == (ssize_t)value_len) {
|
||||
+ condlog(3, "%s: overflow reading from %s (required len: %zu)",
|
||||
+ __func__, devpath, size);
|
||||
value[size - 1] = '\0';
|
||||
- condlog(4, "overflow while reading from %s", devpath);
|
||||
size = 0;
|
||||
- } else {
|
||||
+ } else if (!binary) {
|
||||
value[size] = '\0';
|
||||
size = strchop(value);
|
||||
}
|
||||
@@ -101,55 +103,17 @@ ssize_t sysfs_attr_get_value(struct udev_device *dev, const char *attr_name,
|
||||
return size;
|
||||
}
|
||||
|
||||
-ssize_t sysfs_bin_attr_get_value(struct udev_device *dev, const char *attr_name,
|
||||
- unsigned char * value, size_t value_len)
|
||||
+ssize_t sysfs_attr_get_value(struct udev_device *dev, const char *attr_name,
|
||||
+ char *value, size_t value_len)
|
||||
{
|
||||
- char devpath[PATH_SIZE];
|
||||
- struct stat statbuf;
|
||||
- int fd;
|
||||
- ssize_t size = -1;
|
||||
-
|
||||
- if (!dev || !attr_name || !value)
|
||||
- return 0;
|
||||
-
|
||||
- snprintf(devpath, PATH_SIZE, "%s/%s", udev_device_get_syspath(dev),
|
||||
- attr_name);
|
||||
- condlog(4, "open '%s'", devpath);
|
||||
- /* read attribute value */
|
||||
- fd = open(devpath, O_RDONLY);
|
||||
- if (fd < 0) {
|
||||
- condlog(4, "attribute '%s' can not be opened: %s",
|
||||
- devpath, strerror(errno));
|
||||
- return -errno;
|
||||
- }
|
||||
- if (fstat(fd, &statbuf) != 0) {
|
||||
- condlog(4, "stat '%s' failed: %s", devpath, strerror(errno));
|
||||
- close(fd);
|
||||
- return -ENXIO;
|
||||
- }
|
||||
-
|
||||
- /* skip directories */
|
||||
- if (S_ISDIR(statbuf.st_mode)) {
|
||||
- condlog(4, "%s is a directory", devpath);
|
||||
- close(fd);
|
||||
- return -EISDIR;
|
||||
- }
|
||||
-
|
||||
- /* skip non-writeable files */
|
||||
- if ((statbuf.st_mode & S_IRUSR) == 0) {
|
||||
- condlog(4, "%s is not readable", devpath);
|
||||
- close(fd);
|
||||
- return -EPERM;
|
||||
- }
|
||||
-
|
||||
- size = read(fd, value, value_len);
|
||||
- if (size < 0) {
|
||||
- condlog(4, "read from %s failed: %s", devpath, strerror(errno));
|
||||
- size = -errno;
|
||||
- };
|
||||
+ return __sysfs_attr_get_value(dev, attr_name, value, value_len, false);
|
||||
+}
|
||||
|
||||
- close(fd);
|
||||
- return size;
|
||||
+ssize_t sysfs_bin_attr_get_value(struct udev_device *dev, const char *attr_name,
|
||||
+ unsigned char *value, size_t value_len)
|
||||
+{
|
||||
+ return __sysfs_attr_get_value(dev, attr_name, (char *)value,
|
||||
+ value_len, true);
|
||||
}
|
||||
|
||||
ssize_t sysfs_attr_set_value(struct udev_device *dev, const char *attr_name,
|
165
0013-libmultipath-sanitize-error-checking-in-sysfs-access.patch
Normal file
165
0013-libmultipath-sanitize-error-checking-in-sysfs-access.patch
Normal file
@ -0,0 +1,165 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Wilck <mwilck@suse.com>
|
||||
Date: Tue, 5 Jul 2022 11:41:40 +0200
|
||||
Subject: [PATCH] libmultipath: sanitize error checking in sysfs accessors
|
||||
|
||||
udev_device_get_syspath() may return NULL; check for it, and check
|
||||
for pathname overflow. Disallow a zero buffer length. The fstat()
|
||||
calls were superfluous, as a read() or write() on the fd would
|
||||
return the respective error codes depending on file type or permissions,
|
||||
the extra system call and code complexity adds no value.
|
||||
|
||||
Log levels should be moderate in sysfs.c, because it depends
|
||||
on the caller whether errors getting/setting certain attributes are
|
||||
fatal.
|
||||
|
||||
Signed-off-by: Martin Wilck <mwilck@suse.com>
|
||||
|
||||
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/sysfs.c | 94 ++++++++++++++++++--------------------------
|
||||
1 file changed, 39 insertions(+), 55 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/sysfs.c b/libmultipath/sysfs.c
|
||||
index 4db911cc..1f0f2074 100644
|
||||
--- a/libmultipath/sysfs.c
|
||||
+++ b/libmultipath/sysfs.c
|
||||
@@ -47,46 +47,38 @@
|
||||
static ssize_t __sysfs_attr_get_value(struct udev_device *dev, const char *attr_name,
|
||||
char *value, size_t value_len, bool binary)
|
||||
{
|
||||
+ const char *syspath;
|
||||
char devpath[PATH_SIZE];
|
||||
- struct stat statbuf;
|
||||
int fd;
|
||||
ssize_t size = -1;
|
||||
|
||||
- if (!dev || !attr_name || !value)
|
||||
- return 0;
|
||||
+ if (!dev || !attr_name || !value || !value_len) {
|
||||
+ condlog(1, "%s: invalid parameters", __func__);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
|
||||
- snprintf(devpath, PATH_SIZE, "%s/%s", udev_device_get_syspath(dev),
|
||||
- attr_name);
|
||||
+ syspath = udev_device_get_syspath(dev);
|
||||
+ if (!syspath) {
|
||||
+ condlog(3, "%s: invalid udevice", __func__);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+ if (safe_sprintf(devpath, "%s/%s", syspath, attr_name)) {
|
||||
+ condlog(3, "%s: devpath overflow", __func__);
|
||||
+ return -EOVERFLOW;
|
||||
+ }
|
||||
condlog(4, "open '%s'", devpath);
|
||||
/* read attribute value */
|
||||
fd = open(devpath, O_RDONLY);
|
||||
if (fd < 0) {
|
||||
- condlog(4, "attribute '%s' can not be opened: %s",
|
||||
- devpath, strerror(errno));
|
||||
+ condlog(3, "%s: attribute '%s' can not be opened: %s",
|
||||
+ __func__, devpath, strerror(errno));
|
||||
return -errno;
|
||||
}
|
||||
- if (fstat(fd, &statbuf) < 0) {
|
||||
- condlog(4, "stat '%s' failed: %s", devpath, strerror(errno));
|
||||
- close(fd);
|
||||
- return -ENXIO;
|
||||
- }
|
||||
- /* skip directories */
|
||||
- if (S_ISDIR(statbuf.st_mode)) {
|
||||
- condlog(4, "%s is a directory", devpath);
|
||||
- close(fd);
|
||||
- return -EISDIR;
|
||||
- }
|
||||
- /* skip non-writeable files */
|
||||
- if ((statbuf.st_mode & S_IRUSR) == 0) {
|
||||
- condlog(4, "%s is not readable", devpath);
|
||||
- close(fd);
|
||||
- return -EPERM;
|
||||
- }
|
||||
-
|
||||
size = read(fd, value, value_len);
|
||||
if (size < 0) {
|
||||
- condlog(4, "read from %s failed: %s", devpath, strerror(errno));
|
||||
size = -errno;
|
||||
+ condlog(3, "%s: read from %s failed: %s", __func__, devpath,
|
||||
+ strerror(errno));
|
||||
if (!binary)
|
||||
value[0] = '\0';
|
||||
} else if (!binary && size == (ssize_t)value_len) {
|
||||
@@ -119,51 +111,43 @@ ssize_t sysfs_bin_attr_get_value(struct udev_device *dev, const char *attr_name,
|
||||
ssize_t sysfs_attr_set_value(struct udev_device *dev, const char *attr_name,
|
||||
const char * value, size_t value_len)
|
||||
{
|
||||
+ const char *syspath;
|
||||
char devpath[PATH_SIZE];
|
||||
- struct stat statbuf;
|
||||
int fd;
|
||||
ssize_t size = -1;
|
||||
|
||||
- if (!dev || !attr_name || !value || !value_len)
|
||||
- return 0;
|
||||
+ if (!dev || !attr_name || !value || !value_len) {
|
||||
+ condlog(1, "%s: invalid parameters", __func__);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ syspath = udev_device_get_syspath(dev);
|
||||
+ if (!syspath) {
|
||||
+ condlog(3, "%s: invalid udevice", __func__);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+ if (safe_sprintf(devpath, "%s/%s", syspath, attr_name)) {
|
||||
+ condlog(3, "%s: devpath overflow", __func__);
|
||||
+ return -EOVERFLOW;
|
||||
+ }
|
||||
|
||||
- snprintf(devpath, PATH_SIZE, "%s/%s", udev_device_get_syspath(dev),
|
||||
- attr_name);
|
||||
condlog(4, "open '%s'", devpath);
|
||||
/* write attribute value */
|
||||
fd = open(devpath, O_WRONLY);
|
||||
if (fd < 0) {
|
||||
- condlog(4, "attribute '%s' can not be opened: %s",
|
||||
- devpath, strerror(errno));
|
||||
- return -errno;
|
||||
- }
|
||||
- if (fstat(fd, &statbuf) != 0) {
|
||||
- condlog(4, "stat '%s' failed: %s", devpath, strerror(errno));
|
||||
- close(fd);
|
||||
+ condlog(2, "%s: attribute '%s' can not be opened: %s",
|
||||
+ __func__, devpath, strerror(errno));
|
||||
return -errno;
|
||||
}
|
||||
|
||||
- /* skip directories */
|
||||
- if (S_ISDIR(statbuf.st_mode)) {
|
||||
- condlog(4, "%s is a directory", devpath);
|
||||
- close(fd);
|
||||
- return -EISDIR;
|
||||
- }
|
||||
-
|
||||
- /* skip non-writeable files */
|
||||
- if ((statbuf.st_mode & S_IWUSR) == 0) {
|
||||
- condlog(4, "%s is not writeable", devpath);
|
||||
- close(fd);
|
||||
- return -EPERM;
|
||||
- }
|
||||
-
|
||||
size = write(fd, value, value_len);
|
||||
if (size < 0) {
|
||||
- condlog(4, "write to %s failed: %s", devpath, strerror(errno));
|
||||
size = -errno;
|
||||
+ condlog(3, "%s: write to %s failed: %s", __func__,
|
||||
+ devpath, strerror(errno));
|
||||
} else if (size < (ssize_t)value_len) {
|
||||
- condlog(4, "tried to write %ld to %s. Wrote %ld",
|
||||
- (long)value_len, devpath, (long)size);
|
||||
+ condlog(3, "%s: underflow writing %zu bytes to %s. Wrote %zd bytes",
|
||||
+ __func__, value_len, devpath, size);
|
||||
size = 0;
|
||||
}
|
||||
|
115
0014-libmultipath-get-rid-of-PATH_SIZE.patch
Normal file
115
0014-libmultipath-get-rid-of-PATH_SIZE.patch
Normal file
@ -0,0 +1,115 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Wilck <mwilck@suse.com>
|
||||
Date: Tue, 5 Jul 2022 11:52:42 +0200
|
||||
Subject: [PATCH] libmultipath: get rid of PATH_SIZE
|
||||
|
||||
replace PATH_SIZE with the system limit PATH_MAX. In some places,
|
||||
PATH_SIZE was used for file names. Use FILE_NAME_SIZE in these cases.
|
||||
Also, use a constant for "multipathd.service" in systemd_service_enabled_in().
|
||||
|
||||
Signed-off-by: Martin Wilck <mwilck@suse.com>
|
||||
|
||||
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/structs.h | 3 ---
|
||||
libmultipath/sysfs.c | 8 ++++----
|
||||
libmultipath/util.c | 8 +++++---
|
||||
multipathd/cli_handlers.c | 2 +-
|
||||
4 files changed, 10 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/structs.h b/libmultipath/structs.h
|
||||
index a6a09441..dfa12ff9 100644
|
||||
--- a/libmultipath/structs.h
|
||||
+++ b/libmultipath/structs.h
|
||||
@@ -17,7 +17,6 @@
|
||||
#define FILE_NAME_SIZE 256
|
||||
#define CALLOUT_MAX_SIZE 256
|
||||
#define BLK_DEV_SIZE 33
|
||||
-#define PATH_SIZE 512
|
||||
#define NAME_SIZE 512
|
||||
#define HOST_NAME_LEN 16
|
||||
#define SLOT_NAME_SIZE 40
|
||||
@@ -519,6 +518,4 @@ int pathcmp (const struct pathgroup *, const struct pathgroup *);
|
||||
int add_feature (char **, const char *);
|
||||
int remove_feature (char **, const char *);
|
||||
|
||||
-extern char sysfs_path[PATH_SIZE];
|
||||
-
|
||||
#endif /* _STRUCTS_H */
|
||||
diff --git a/libmultipath/sysfs.c b/libmultipath/sysfs.c
|
||||
index 1f0f2074..e48b05ec 100644
|
||||
--- a/libmultipath/sysfs.c
|
||||
+++ b/libmultipath/sysfs.c
|
||||
@@ -48,7 +48,7 @@ static ssize_t __sysfs_attr_get_value(struct udev_device *dev, const char *attr_
|
||||
char *value, size_t value_len, bool binary)
|
||||
{
|
||||
const char *syspath;
|
||||
- char devpath[PATH_SIZE];
|
||||
+ char devpath[PATH_MAX];
|
||||
int fd;
|
||||
ssize_t size = -1;
|
||||
|
||||
@@ -112,7 +112,7 @@ ssize_t sysfs_attr_set_value(struct udev_device *dev, const char *attr_name,
|
||||
const char * value, size_t value_len)
|
||||
{
|
||||
const char *syspath;
|
||||
- char devpath[PATH_SIZE];
|
||||
+ char devpath[PATH_MAX];
|
||||
int fd;
|
||||
ssize_t size = -1;
|
||||
|
||||
@@ -184,7 +184,7 @@ sysfs_get_size (struct path *pp, unsigned long long * size)
|
||||
int sysfs_check_holders(char * check_devt, char * new_devt)
|
||||
{
|
||||
unsigned int major, new_minor, table_minor;
|
||||
- char path[PATH_MAX], check_dev[PATH_SIZE];
|
||||
+ char path[PATH_MAX], check_dev[FILE_NAME_SIZE];
|
||||
char * table_name;
|
||||
DIR *dirfd;
|
||||
struct dirent *holder;
|
||||
@@ -194,7 +194,7 @@ int sysfs_check_holders(char * check_devt, char * new_devt)
|
||||
return 0;
|
||||
}
|
||||
|
||||
- if (devt2devname(check_dev, PATH_SIZE, check_devt)) {
|
||||
+ if (devt2devname(check_dev, sizeof(check_dev), check_devt)) {
|
||||
condlog(1, "can't get devname for %s", check_devt);
|
||||
return 0;
|
||||
}
|
||||
diff --git a/libmultipath/util.c b/libmultipath/util.c
|
||||
index ce5ea73e..e7e7d4c1 100644
|
||||
--- a/libmultipath/util.c
|
||||
+++ b/libmultipath/util.c
|
||||
@@ -242,13 +242,15 @@ setup_thread_attr(pthread_attr_t *attr, size_t stacksize, int detached)
|
||||
|
||||
int systemd_service_enabled_in(const char *dev, const char *prefix)
|
||||
{
|
||||
- char path[PATH_SIZE], file[PATH_MAX], service[PATH_SIZE];
|
||||
+ static const char service[] = "multipathd.service";
|
||||
+ char path[PATH_MAX], file[PATH_MAX];
|
||||
DIR *dirfd;
|
||||
struct dirent *d;
|
||||
int found = 0;
|
||||
|
||||
- snprintf(service, PATH_SIZE, "multipathd.service");
|
||||
- snprintf(path, PATH_SIZE, "%s/systemd/system", prefix);
|
||||
+ if (safe_sprintf(path, "%s/systemd/system", prefix))
|
||||
+ return 0;
|
||||
+
|
||||
condlog(3, "%s: checking for %s in %s", dev, service, path);
|
||||
|
||||
dirfd = opendir(path);
|
||||
diff --git a/multipathd/cli_handlers.c b/multipathd/cli_handlers.c
|
||||
index d79cdd7c..db4d4412 100644
|
||||
--- a/multipathd/cli_handlers.c
|
||||
+++ b/multipathd/cli_handlers.c
|
||||
@@ -688,7 +688,7 @@ cli_add_map (void * v, struct strbuf *reply, void * data)
|
||||
struct vectors * vecs = (struct vectors *)data;
|
||||
char * param = get_keyparam(v, MAP);
|
||||
int major = -1, minor = -1;
|
||||
- char dev_path[PATH_SIZE];
|
||||
+ char dev_path[FILE_NAME_SIZE];
|
||||
char *refwwid, *alias = NULL;
|
||||
int rc, count = 0;
|
||||
struct config *conf;
|
172
0015-libmultipath-sysfs_attr_get_value-don-t-return-0-if-.patch
Normal file
172
0015-libmultipath-sysfs_attr_get_value-don-t-return-0-if-.patch
Normal file
@ -0,0 +1,172 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Wilck <mwilck@suse.com>
|
||||
Date: Tue, 5 Jul 2022 13:33:51 +0200
|
||||
Subject: [PATCH] libmultipath: sysfs_attr_get_value(): don't return 0 if
|
||||
buffer too small
|
||||
|
||||
If the passed read buffer is too small to hold the value read plus
|
||||
terminating 0 byte, return the given size value rather than 0.
|
||||
|
||||
This way we get similar semantics as for sysfs_bin_attr_get_get_value(),
|
||||
except that sysfs_attr_get_value() must always 0-terminate the value;
|
||||
thus a return value equal to the length parameter is an error for
|
||||
the non-binary case.
|
||||
|
||||
Provide a helper macro to test this "overflow" condition.
|
||||
|
||||
Signed-off-by: Martin Wilck <mwilck@suse.com>
|
||||
|
||||
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/configure.c | 2 +-
|
||||
libmultipath/discovery.c | 14 +++++++-------
|
||||
libmultipath/propsel.c | 6 +++++-
|
||||
libmultipath/sysfs.c | 3 +--
|
||||
libmultipath/sysfs.h | 13 +++++++++++++
|
||||
multipathd/main.c | 2 +-
|
||||
6 files changed, 28 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/configure.c b/libmultipath/configure.c
|
||||
index 09ae708d..467bbaa6 100644
|
||||
--- a/libmultipath/configure.c
|
||||
+++ b/libmultipath/configure.c
|
||||
@@ -589,7 +589,7 @@ sysfs_set_max_sectors_kb(struct multipath *mpp, int is_reload)
|
||||
ret = sysfs_attr_get_value(udd, "queue/max_sectors_kb", buff,
|
||||
sizeof(buff));
|
||||
udev_device_unref(udd);
|
||||
- if (ret <= 0) {
|
||||
+ if (!sysfs_attr_value_ok(ret, sizeof(buff))) {
|
||||
condlog(1, "failed to get current max_sectors_kb from %s", mpp->alias);
|
||||
return 1;
|
||||
}
|
||||
diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
|
||||
index f5b8401c..54b1caf0 100644
|
||||
--- a/libmultipath/discovery.c
|
||||
+++ b/libmultipath/discovery.c
|
||||
@@ -560,10 +560,10 @@ sysfs_get_asymmetric_access_state(struct path *pp, char *buff, int buflen)
|
||||
if (!parent)
|
||||
return -1;
|
||||
|
||||
- if (sysfs_attr_get_value(parent, "access_state", buff, buflen) <= 0)
|
||||
+ if (!sysfs_attr_get_value_ok(parent, "access_state", buff, buflen))
|
||||
return -1;
|
||||
|
||||
- if (sysfs_attr_get_value(parent, "preferred_path", value, 16) <= 0)
|
||||
+ if (!sysfs_attr_get_value_ok(parent, "preferred_path", value, sizeof(value)))
|
||||
return 0;
|
||||
|
||||
preferred = strtoul(value, &eptr, 0);
|
||||
@@ -638,8 +638,8 @@ sysfs_set_rport_tmo(struct multipath *mpp, struct path *pp)
|
||||
/*
|
||||
* read the current dev_loss_tmo value from sysfs
|
||||
*/
|
||||
- ret = sysfs_attr_get_value(rport_dev, "dev_loss_tmo", value, 16);
|
||||
- if (ret <= 0) {
|
||||
+ ret = sysfs_attr_get_value(rport_dev, "dev_loss_tmo", value, sizeof(value));
|
||||
+ if (!sysfs_attr_value_ok(ret, sizeof(value))) {
|
||||
condlog(0, "%s: failed to read dev_loss_tmo value, "
|
||||
"error %d", rport_id, -ret);
|
||||
goto out;
|
||||
@@ -1737,8 +1737,8 @@ path_offline (struct path * pp)
|
||||
}
|
||||
|
||||
memset(buff, 0x0, SCSI_STATE_SIZE);
|
||||
- err = sysfs_attr_get_value(parent, "state", buff, SCSI_STATE_SIZE);
|
||||
- if (err <= 0) {
|
||||
+ err = sysfs_attr_get_value(parent, "state", buff, sizeof(buff));
|
||||
+ if (!sysfs_attr_value_ok(err, sizeof(buff))) {
|
||||
if (err == -ENXIO)
|
||||
return PATH_REMOVED;
|
||||
else
|
||||
@@ -2142,7 +2142,7 @@ static ssize_t uid_fallback(struct path *pp, int path_state,
|
||||
return -1;
|
||||
len = sysfs_attr_get_value(pp->udev, "wwid", value,
|
||||
sizeof(value));
|
||||
- if (len <= 0)
|
||||
+ if (!sysfs_attr_value_ok(len, sizeof(value)))
|
||||
return -1;
|
||||
len = strlcpy(pp->wwid, value, WWID_SIZE);
|
||||
if (len >= WWID_SIZE) {
|
||||
diff --git a/libmultipath/propsel.c b/libmultipath/propsel.c
|
||||
index f782f251..98e3aad1 100644
|
||||
--- a/libmultipath/propsel.c
|
||||
+++ b/libmultipath/propsel.c
|
||||
@@ -435,6 +435,7 @@ out:
|
||||
static int get_dh_state(struct path *pp, char *value, size_t value_len)
|
||||
{
|
||||
struct udev_device *ud;
|
||||
+ ssize_t rc;
|
||||
|
||||
if (pp->udev == NULL)
|
||||
return -1;
|
||||
@@ -444,7 +445,10 @@ static int get_dh_state(struct path *pp, char *value, size_t value_len)
|
||||
if (ud == NULL)
|
||||
return -1;
|
||||
|
||||
- return sysfs_attr_get_value(ud, "dh_state", value, value_len);
|
||||
+ rc = sysfs_attr_get_value(ud, "dh_state", value, value_len);
|
||||
+ if (!sysfs_attr_value_ok(rc, value_len))
|
||||
+ return -1;
|
||||
+ return rc;
|
||||
}
|
||||
|
||||
int select_hwhandler(struct config *conf, struct multipath *mp)
|
||||
diff --git a/libmultipath/sysfs.c b/libmultipath/sysfs.c
|
||||
index e48b05ec..125f1c2b 100644
|
||||
--- a/libmultipath/sysfs.c
|
||||
+++ b/libmultipath/sysfs.c
|
||||
@@ -85,7 +85,6 @@ static ssize_t __sysfs_attr_get_value(struct udev_device *dev, const char *attr_
|
||||
condlog(3, "%s: overflow reading from %s (required len: %zu)",
|
||||
__func__, devpath, size);
|
||||
value[size - 1] = '\0';
|
||||
- size = 0;
|
||||
} else if (!binary) {
|
||||
value[size] = '\0';
|
||||
size = strchop(value);
|
||||
@@ -165,7 +164,7 @@ sysfs_get_size (struct path *pp, unsigned long long * size)
|
||||
return 1;
|
||||
|
||||
attr[0] = '\0';
|
||||
- if (sysfs_attr_get_value(pp->udev, "size", attr, 255) <= 0) {
|
||||
+ if (!sysfs_attr_get_value_ok(pp->udev, "size", attr, sizeof(attr))) {
|
||||
condlog(3, "%s: No size attribute in sysfs", pp->dev);
|
||||
return 1;
|
||||
}
|
||||
diff --git a/libmultipath/sysfs.h b/libmultipath/sysfs.h
|
||||
index 72b39ab2..cdc84e40 100644
|
||||
--- a/libmultipath/sysfs.h
|
||||
+++ b/libmultipath/sysfs.h
|
||||
@@ -12,6 +12,19 @@ ssize_t sysfs_attr_get_value(struct udev_device *dev, const char *attr_name,
|
||||
char * value, size_t value_len);
|
||||
ssize_t sysfs_bin_attr_get_value(struct udev_device *dev, const char *attr_name,
|
||||
unsigned char * value, size_t value_len);
|
||||
+#define sysfs_attr_value_ok(rc, value_len) \
|
||||
+ ({ \
|
||||
+ ssize_t __r = rc; \
|
||||
+ __r >= 0 && (size_t)__r < (size_t)value_len; \
|
||||
+ })
|
||||
+
|
||||
+#define sysfs_attr_get_value_ok(dev, attr, val, len) \
|
||||
+ ({ \
|
||||
+ size_t __l = (len); \
|
||||
+ ssize_t __rc = sysfs_attr_get_value(dev, attr, val, __l); \
|
||||
+ sysfs_attr_value_ok(__rc, __l); \
|
||||
+ })
|
||||
+
|
||||
int sysfs_get_size (struct path *pp, unsigned long long * size);
|
||||
int sysfs_check_holders(char * check_devt, char * new_devt);
|
||||
bool sysfs_is_multipathed(struct path *pp, bool set_wwid);
|
||||
diff --git a/multipathd/main.c b/multipathd/main.c
|
||||
index 2f2b9d4c..68eca925 100644
|
||||
--- a/multipathd/main.c
|
||||
+++ b/multipathd/main.c
|
||||
@@ -1126,7 +1126,7 @@ sysfs_get_ro (struct path *pp)
|
||||
if (!pp->udev)
|
||||
return -1;
|
||||
|
||||
- if (sysfs_attr_get_value(pp->udev, "ro", buff, sizeof(buff)) <= 0) {
|
||||
+ if (!sysfs_attr_get_value_ok(pp->udev, "ro", buff, sizeof(buff))) {
|
||||
condlog(3, "%s: Cannot read ro attribute in sysfs", pp->dev);
|
||||
return -1;
|
||||
}
|
251
0016-libmultipath-sysfs_attr_set_value-don-t-return-0-on-.patch
Normal file
251
0016-libmultipath-sysfs_attr_set_value-don-t-return-0-on-.patch
Normal file
@ -0,0 +1,251 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Wilck <mwilck@suse.com>
|
||||
Date: Tue, 5 Jul 2022 17:51:41 +0200
|
||||
Subject: [PATCH] libmultipath: sysfs_attr_set_value(): don't return 0 on
|
||||
partial write
|
||||
|
||||
sysfs_attr_set_value() returned 0 if not all requested bytes were written.
|
||||
Change this to return the number of bytes written. Error checking is now
|
||||
somewhat more involved; provide a helper macro for it.
|
||||
|
||||
Signed-off-by: Martin Wilck <mwilck@suse.com>
|
||||
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/configure.c | 10 ++++--
|
||||
libmultipath/discovery.c | 74 +++++++++++++++++++++++++---------------
|
||||
libmultipath/sysfs.c | 6 ++--
|
||||
libmultipath/sysfs.h | 10 ++++++
|
||||
4 files changed, 66 insertions(+), 34 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/configure.c b/libmultipath/configure.c
|
||||
index 467bbaa6..0607dbac 100644
|
||||
--- a/libmultipath/configure.c
|
||||
+++ b/libmultipath/configure.c
|
||||
@@ -568,6 +568,7 @@ sysfs_set_max_sectors_kb(struct multipath *mpp, int is_reload)
|
||||
struct pathgroup * pgp;
|
||||
struct path *pp;
|
||||
char buff[11];
|
||||
+ ssize_t len;
|
||||
int i, j, ret, err = 0;
|
||||
struct udev_device *udd;
|
||||
int max_sectors_kb;
|
||||
@@ -600,14 +601,17 @@ sysfs_set_max_sectors_kb(struct multipath *mpp, int is_reload)
|
||||
}
|
||||
}
|
||||
snprintf(buff, 11, "%d", max_sectors_kb);
|
||||
+ len = strlen(buff);
|
||||
|
||||
vector_foreach_slot (mpp->pg, pgp, i) {
|
||||
vector_foreach_slot(pgp->paths, pp, j) {
|
||||
ret = sysfs_attr_set_value(pp->udev,
|
||||
"queue/max_sectors_kb",
|
||||
- buff, strlen(buff));
|
||||
- if (ret < 0) {
|
||||
- condlog(1, "failed setting max_sectors_kb on %s : %s", pp->dev, strerror(-ret));
|
||||
+ buff, len);
|
||||
+ if (ret != len) {
|
||||
+ log_sysfs_attr_set_value(1, ret,
|
||||
+ "failed setting max_sectors_kb on %s",
|
||||
+ pp->dev);
|
||||
err = 1;
|
||||
}
|
||||
}
|
||||
diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
|
||||
index 54b1caf0..ee290093 100644
|
||||
--- a/libmultipath/discovery.c
|
||||
+++ b/libmultipath/discovery.c
|
||||
@@ -598,13 +598,15 @@ sysfs_set_eh_deadline(struct path *pp)
|
||||
len = sprintf(value, "%d", pp->eh_deadline);
|
||||
|
||||
ret = sysfs_attr_set_value(hostdev, "eh_deadline",
|
||||
- value, len + 1);
|
||||
+ value, len);
|
||||
/*
|
||||
* not all scsi drivers support setting eh_deadline, so failing
|
||||
* is totally reasonable
|
||||
*/
|
||||
- if (ret <= 0)
|
||||
- condlog(3, "%s: failed to set eh_deadline to %s, error %d", udev_device_get_sysname(hostdev), value, -ret);
|
||||
+ if (ret != len)
|
||||
+ log_sysfs_attr_set_value(3, ret,
|
||||
+ "%s: failed to set eh_deadline to %s",
|
||||
+ udev_device_get_sysname(hostdev), value);
|
||||
|
||||
udev_device_unref(hostdev);
|
||||
return (ret <= 0);
|
||||
@@ -667,19 +669,22 @@ sysfs_set_rport_tmo(struct multipath *mpp, struct path *pp)
|
||||
pp->fast_io_fail != MP_FAST_IO_FAIL_OFF) {
|
||||
/* Check if we need to temporarily increase dev_loss_tmo */
|
||||
if ((unsigned int)pp->fast_io_fail >= tmo) {
|
||||
+ ssize_t len;
|
||||
+
|
||||
/* Increase dev_loss_tmo temporarily */
|
||||
snprintf(value, sizeof(value), "%u",
|
||||
(unsigned int)pp->fast_io_fail + 1);
|
||||
+ len = strlen(value);
|
||||
ret = sysfs_attr_set_value(rport_dev, "dev_loss_tmo",
|
||||
- value, strlen(value));
|
||||
- if (ret <= 0) {
|
||||
+ value, len);
|
||||
+ if (ret != len) {
|
||||
if (ret == -EBUSY)
|
||||
condlog(3, "%s: rport blocked",
|
||||
rport_id);
|
||||
else
|
||||
- condlog(0, "%s: failed to set "
|
||||
- "dev_loss_tmo to %s, error %d",
|
||||
- rport_id, value, -ret);
|
||||
+ log_sysfs_attr_set_value(0, ret,
|
||||
+ "%s: failed to set dev_loss_tmo to %s",
|
||||
+ rport_id, value);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
@@ -691,32 +696,39 @@ sysfs_set_rport_tmo(struct multipath *mpp, struct path *pp)
|
||||
pp->dev_loss = DEFAULT_DEV_LOSS_TMO;
|
||||
}
|
||||
if (pp->fast_io_fail != MP_FAST_IO_FAIL_UNSET) {
|
||||
+ ssize_t len;
|
||||
+
|
||||
if (pp->fast_io_fail == MP_FAST_IO_FAIL_OFF)
|
||||
sprintf(value, "off");
|
||||
else if (pp->fast_io_fail == MP_FAST_IO_FAIL_ZERO)
|
||||
sprintf(value, "0");
|
||||
else
|
||||
snprintf(value, 16, "%u", pp->fast_io_fail);
|
||||
+ len = strlen(value);
|
||||
ret = sysfs_attr_set_value(rport_dev, "fast_io_fail_tmo",
|
||||
- value, strlen(value));
|
||||
- if (ret <= 0) {
|
||||
+ value, len);
|
||||
+ if (ret != len) {
|
||||
if (ret == -EBUSY)
|
||||
condlog(3, "%s: rport blocked", rport_id);
|
||||
else
|
||||
- condlog(0, "%s: failed to set fast_io_fail_tmo to %s, error %d",
|
||||
- rport_id, value, -ret);
|
||||
+ log_sysfs_attr_set_value(0, ret,
|
||||
+ "%s: failed to set fast_io_fail_tmo to %s",
|
||||
+ rport_id, value);
|
||||
}
|
||||
}
|
||||
if (pp->dev_loss != DEV_LOSS_TMO_UNSET) {
|
||||
+ ssize_t len;
|
||||
+
|
||||
snprintf(value, 16, "%u", pp->dev_loss);
|
||||
- ret = sysfs_attr_set_value(rport_dev, "dev_loss_tmo",
|
||||
- value, strlen(value));
|
||||
- if (ret <= 0) {
|
||||
+ len = strlen(value);
|
||||
+ ret = sysfs_attr_set_value(rport_dev, "dev_loss_tmo", value, len);
|
||||
+ if (ret != len) {
|
||||
if (ret == -EBUSY)
|
||||
condlog(3, "%s: rport blocked", rport_id);
|
||||
else
|
||||
- condlog(0, "%s: failed to set dev_loss_tmo to %s, error %d",
|
||||
- rport_id, value, -ret);
|
||||
+ log_sysfs_attr_set_value(0, ret,
|
||||
+ "%s: failed to set dev_loss_tmo to %s",
|
||||
+ rport_id, value);
|
||||
}
|
||||
}
|
||||
out:
|
||||
@@ -754,12 +766,16 @@ sysfs_set_session_tmo(struct path *pp)
|
||||
condlog(3, "%s: can't set fast_io_fail_tmo to '0'"
|
||||
"on iSCSI", pp->dev);
|
||||
} else {
|
||||
+ ssize_t len, ret;
|
||||
+
|
||||
snprintf(value, 11, "%u", pp->fast_io_fail);
|
||||
- if (sysfs_attr_set_value(session_dev, "recovery_tmo",
|
||||
- value, strlen(value)) <= 0) {
|
||||
- condlog(3, "%s: Failed to set recovery_tmo, "
|
||||
- " error %d", pp->dev, errno);
|
||||
- }
|
||||
+ len = strlen(value);
|
||||
+ ret = sysfs_attr_set_value(session_dev, "recovery_tmo",
|
||||
+ value, len);
|
||||
+ if (ret != len)
|
||||
+ log_sysfs_attr_set_value(3, ret,
|
||||
+ "%s: Failed to set recovery_tmo to %s",
|
||||
+ pp->dev, value);
|
||||
}
|
||||
}
|
||||
udev_device_unref(session_dev);
|
||||
@@ -802,12 +818,16 @@ sysfs_set_nexus_loss_tmo(struct path *pp)
|
||||
pp->sg_id.channel, pp->sg_id.scsi_id, end_dev_id);
|
||||
|
||||
if (pp->dev_loss != DEV_LOSS_TMO_UNSET) {
|
||||
+ ssize_t len, ret;
|
||||
+
|
||||
snprintf(value, 11, "%u", pp->dev_loss);
|
||||
- if (sysfs_attr_set_value(sas_dev, "I_T_nexus_loss_timeout",
|
||||
- value, strlen(value)) <= 0)
|
||||
- condlog(3, "%s: failed to update "
|
||||
- "I_T Nexus loss timeout, error %d",
|
||||
- pp->dev, errno);
|
||||
+ len = strlen(value);
|
||||
+ ret = sysfs_attr_set_value(sas_dev, "I_T_nexus_loss_timeout",
|
||||
+ value, len);
|
||||
+ if (ret != len)
|
||||
+ log_sysfs_attr_set_value(3, ret,
|
||||
+ "%s: failed to update I_T Nexus loss timeout",
|
||||
+ pp->dev);
|
||||
}
|
||||
udev_device_unref(sas_dev);
|
||||
return;
|
||||
diff --git a/libmultipath/sysfs.c b/libmultipath/sysfs.c
|
||||
index 125f1c2b..9c84af70 100644
|
||||
--- a/libmultipath/sysfs.c
|
||||
+++ b/libmultipath/sysfs.c
|
||||
@@ -134,7 +134,7 @@ ssize_t sysfs_attr_set_value(struct udev_device *dev, const char *attr_name,
|
||||
/* write attribute value */
|
||||
fd = open(devpath, O_WRONLY);
|
||||
if (fd < 0) {
|
||||
- condlog(2, "%s: attribute '%s' can not be opened: %s",
|
||||
+ condlog(3, "%s: attribute '%s' can not be opened: %s",
|
||||
__func__, devpath, strerror(errno));
|
||||
return -errno;
|
||||
}
|
||||
@@ -144,11 +144,9 @@ ssize_t sysfs_attr_set_value(struct udev_device *dev, const char *attr_name,
|
||||
size = -errno;
|
||||
condlog(3, "%s: write to %s failed: %s", __func__,
|
||||
devpath, strerror(errno));
|
||||
- } else if (size < (ssize_t)value_len) {
|
||||
+ } else if (size < (ssize_t)value_len)
|
||||
condlog(3, "%s: underflow writing %zu bytes to %s. Wrote %zd bytes",
|
||||
__func__, value_len, devpath, size);
|
||||
- size = 0;
|
||||
- }
|
||||
|
||||
close(fd);
|
||||
return size;
|
||||
diff --git a/libmultipath/sysfs.h b/libmultipath/sysfs.h
|
||||
index cdc84e40..799f68e9 100644
|
||||
--- a/libmultipath/sysfs.h
|
||||
+++ b/libmultipath/sysfs.h
|
||||
@@ -5,6 +5,7 @@
|
||||
#ifndef _LIBMULTIPATH_SYSFS_H
|
||||
#define _LIBMULTIPATH_SYSFS_H
|
||||
#include <stdbool.h>
|
||||
+#include "strbuf.h"
|
||||
|
||||
ssize_t sysfs_attr_set_value(struct udev_device *dev, const char *attr_name,
|
||||
const char * value, size_t value_len);
|
||||
@@ -25,6 +26,15 @@ ssize_t sysfs_bin_attr_get_value(struct udev_device *dev, const char *attr_name,
|
||||
sysfs_attr_value_ok(__rc, __l); \
|
||||
})
|
||||
|
||||
+#define log_sysfs_attr_set_value(prio, rc, fmt, __args...) \
|
||||
+do { \
|
||||
+ STRBUF_ON_STACK(__buf); \
|
||||
+ if (print_strbuf(&__buf, fmt, ##__args) >= 0 && \
|
||||
+ print_strbuf(&__buf, ": %s", rc < 0 ? strerror(-rc) : \
|
||||
+ "write underflow") >= 0) \
|
||||
+ condlog(prio, "%s", get_strbuf_str(&__buf)); \
|
||||
+} while(0)
|
||||
+
|
||||
int sysfs_get_size (struct path *pp, unsigned long long * size);
|
||||
int sysfs_check_holders(char * check_devt, char * new_devt);
|
||||
bool sysfs_is_multipathed(struct path *pp, bool set_wwid);
|
@ -0,0 +1,71 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Wilck <mwilck@suse.com>
|
||||
Date: Tue, 5 Jul 2022 18:07:57 +0200
|
||||
Subject: [PATCH] libmultipath: sysfs: cleanup file descriptors on
|
||||
pthread_cancel()
|
||||
|
||||
Signed-off-by: Martin Wilck <mwilck@suse.com>
|
||||
|
||||
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/sysfs.c | 11 +++++++----
|
||||
1 file changed, 7 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/sysfs.c b/libmultipath/sysfs.c
|
||||
index 9c84af70..64946385 100644
|
||||
--- a/libmultipath/sysfs.c
|
||||
+++ b/libmultipath/sysfs.c
|
||||
@@ -49,7 +49,7 @@ static ssize_t __sysfs_attr_get_value(struct udev_device *dev, const char *attr_
|
||||
{
|
||||
const char *syspath;
|
||||
char devpath[PATH_MAX];
|
||||
- int fd;
|
||||
+ long fd;
|
||||
ssize_t size = -1;
|
||||
|
||||
if (!dev || !attr_name || !value || !value_len) {
|
||||
@@ -74,6 +74,8 @@ static ssize_t __sysfs_attr_get_value(struct udev_device *dev, const char *attr_
|
||||
__func__, devpath, strerror(errno));
|
||||
return -errno;
|
||||
}
|
||||
+ pthread_cleanup_push(close_fd, (void *)fd);
|
||||
+
|
||||
size = read(fd, value, value_len);
|
||||
if (size < 0) {
|
||||
size = -errno;
|
||||
@@ -90,7 +92,7 @@ static ssize_t __sysfs_attr_get_value(struct udev_device *dev, const char *attr_
|
||||
size = strchop(value);
|
||||
}
|
||||
|
||||
- close(fd);
|
||||
+ pthread_cleanup_pop(1);
|
||||
return size;
|
||||
}
|
||||
|
||||
@@ -112,7 +114,7 @@ ssize_t sysfs_attr_set_value(struct udev_device *dev, const char *attr_name,
|
||||
{
|
||||
const char *syspath;
|
||||
char devpath[PATH_MAX];
|
||||
- int fd;
|
||||
+ long fd;
|
||||
ssize_t size = -1;
|
||||
|
||||
if (!dev || !attr_name || !value || !value_len) {
|
||||
@@ -138,6 +140,7 @@ ssize_t sysfs_attr_set_value(struct udev_device *dev, const char *attr_name,
|
||||
__func__, devpath, strerror(errno));
|
||||
return -errno;
|
||||
}
|
||||
+ pthread_cleanup_push(close_fd, (void *)fd);
|
||||
|
||||
size = write(fd, value, value_len);
|
||||
if (size < 0) {
|
||||
@@ -148,7 +151,7 @@ ssize_t sysfs_attr_set_value(struct udev_device *dev, const char *attr_name,
|
||||
condlog(3, "%s: underflow writing %zu bytes to %s. Wrote %zd bytes",
|
||||
__func__, value_len, devpath, size);
|
||||
|
||||
- close(fd);
|
||||
+ pthread_cleanup_pop(1);
|
||||
return size;
|
||||
}
|
||||
|
168
0018-libmultipath-multipathd-log-failure-setting-sysfs-at.patch
Normal file
168
0018-libmultipath-multipathd-log-failure-setting-sysfs-at.patch
Normal file
@ -0,0 +1,168 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Wilck <mwilck@suse.com>
|
||||
Date: Tue, 5 Jul 2022 18:45:11 +0200
|
||||
Subject: [PATCH] libmultipath, multipathd: log failure setting sysfs
|
||||
attributes
|
||||
|
||||
Failure to set a sysfs attribute is worth noting, normally.
|
||||
|
||||
Signed-off-by: Martin Wilck <mwilck@suse.com>
|
||||
|
||||
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/configure.c | 18 ++++++++++++++---
|
||||
multipathd/fpin_handlers.c | 11 +++++++++--
|
||||
multipathd/main.c | 40 ++++++++++++++++++++++++++++++--------
|
||||
3 files changed, 56 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/configure.c b/libmultipath/configure.c
|
||||
index 0607dbac..4427f910 100644
|
||||
--- a/libmultipath/configure.c
|
||||
+++ b/libmultipath/configure.c
|
||||
@@ -489,9 +489,15 @@ void trigger_partitions_udev_change(struct udev_device *dev,
|
||||
|
||||
devtype = udev_device_get_devtype(part);
|
||||
if (devtype && !strcmp("partition", devtype)) {
|
||||
+ ssize_t ret;
|
||||
+
|
||||
condlog(4, "%s: triggering %s event for %s", __func__,
|
||||
action, syspath);
|
||||
- sysfs_attr_set_value(part, "uevent", action, len);
|
||||
+ ret = sysfs_attr_set_value(part, "uevent", action, len);
|
||||
+ if (ret != len)
|
||||
+ log_sysfs_attr_set_value(2, ret,
|
||||
+ "%s: failed to trigger %s uevent",
|
||||
+ syspath, action);
|
||||
}
|
||||
udev_device_unref(part);
|
||||
}
|
||||
@@ -510,6 +516,7 @@ trigger_path_udev_change(struct path *pp, bool is_mpath)
|
||||
*/
|
||||
const char *action = is_mpath ? "change" : "add";
|
||||
const char *env;
|
||||
+ ssize_t len, ret;
|
||||
|
||||
if (!pp->udev)
|
||||
return;
|
||||
@@ -536,8 +543,13 @@ trigger_path_udev_change(struct path *pp, bool is_mpath)
|
||||
|
||||
condlog(3, "triggering %s uevent for %s (is %smultipath member)",
|
||||
action, pp->dev, is_mpath ? "" : "no ");
|
||||
- sysfs_attr_set_value(pp->udev, "uevent",
|
||||
- action, strlen(action));
|
||||
+
|
||||
+ len = strlen(action);
|
||||
+ ret = sysfs_attr_set_value(pp->udev, "uevent", action, len);
|
||||
+ if (ret != len)
|
||||
+ log_sysfs_attr_set_value(2, ret,
|
||||
+ "%s: failed to trigger %s uevent",
|
||||
+ pp->dev, action);
|
||||
trigger_partitions_udev_change(pp->udev, action,
|
||||
strlen(action));
|
||||
}
|
||||
diff --git a/multipathd/fpin_handlers.c b/multipathd/fpin_handlers.c
|
||||
index 384ae318..00195721 100644
|
||||
--- a/multipathd/fpin_handlers.c
|
||||
+++ b/multipathd/fpin_handlers.c
|
||||
@@ -172,8 +172,15 @@ fpin_els_add_li_frame(struct fc_nl_event *fc_event)
|
||||
/*Sets the rport port_state to marginal*/
|
||||
static void fpin_set_rport_marginal(struct udev_device *rport_dev)
|
||||
{
|
||||
- sysfs_attr_set_value(rport_dev, "port_state",
|
||||
- "Marginal", strlen("Marginal"));
|
||||
+ static const char marginal[] = "Marginal";
|
||||
+ ssize_t ret;
|
||||
+
|
||||
+ ret = sysfs_attr_set_value(rport_dev, "port_state",
|
||||
+ marginal, sizeof(marginal) - 1);
|
||||
+ if (ret != sizeof(marginal) - 1)
|
||||
+ log_sysfs_attr_set_value(2, ret,
|
||||
+ "%s: failed to set port_state to marginal",
|
||||
+ udev_device_get_syspath(rport_dev));
|
||||
}
|
||||
|
||||
/*Add the marginal devices info into the list*/
|
||||
diff --git a/multipathd/main.c b/multipathd/main.c
|
||||
index 68eca925..a160c824 100644
|
||||
--- a/multipathd/main.c
|
||||
+++ b/multipathd/main.c
|
||||
@@ -911,14 +911,22 @@ rescan_path(struct udev_device *ud)
|
||||
{
|
||||
ud = udev_device_get_parent_with_subsystem_devtype(ud, "scsi",
|
||||
"scsi_device");
|
||||
- if (ud)
|
||||
- sysfs_attr_set_value(ud, "rescan", "1", strlen("1"));
|
||||
+ if (ud) {
|
||||
+ ssize_t ret =
|
||||
+ sysfs_attr_set_value(ud, "rescan", "1", strlen("1"));
|
||||
+ if (ret != strlen("1"))
|
||||
+ log_sysfs_attr_set_value(1, ret,
|
||||
+ "%s: failed to trigger rescan",
|
||||
+ udev_device_get_syspath(ud));
|
||||
+ }
|
||||
}
|
||||
|
||||
void
|
||||
handle_path_wwid_change(struct path *pp, struct vectors *vecs)
|
||||
{
|
||||
struct udev_device *udd;
|
||||
+ static const char add[] = "add";
|
||||
+ ssize_t ret;
|
||||
|
||||
if (!pp || !pp->udev)
|
||||
return;
|
||||
@@ -929,8 +937,12 @@ handle_path_wwid_change(struct path *pp, struct vectors *vecs)
|
||||
dm_fail_path(pp->mpp->alias, pp->dev_t);
|
||||
}
|
||||
rescan_path(udd);
|
||||
- sysfs_attr_set_value(udd, "uevent", "add", strlen("add"));
|
||||
+ ret = sysfs_attr_set_value(udd, "uevent", add, sizeof(add) - 1);
|
||||
udev_device_unref(udd);
|
||||
+ if (ret != sizeof(add) - 1)
|
||||
+ log_sysfs_attr_set_value(1, ret,
|
||||
+ "%s: failed to trigger add event",
|
||||
+ pp->dev);
|
||||
}
|
||||
|
||||
bool
|
||||
@@ -2003,9 +2015,14 @@ partial_retrigger_tick(vector pathvec)
|
||||
--pp->partial_retrigger_delay == 0) {
|
||||
const char *msg = udev_device_get_is_initialized(pp->udev) ?
|
||||
"change" : "add";
|
||||
-
|
||||
- sysfs_attr_set_value(pp->udev, "uevent", msg,
|
||||
- strlen(msg));
|
||||
+ ssize_t len = strlen(msg);
|
||||
+ ssize_t ret = sysfs_attr_set_value(pp->udev, "uevent", msg,
|
||||
+ len);
|
||||
+
|
||||
+ if (len != ret)
|
||||
+ log_sysfs_attr_set_value(2, ret,
|
||||
+ "%s: failed to trigger %s event",
|
||||
+ pp->dev, msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2245,12 +2262,19 @@ check_path (struct vectors * vecs, struct path * pp, unsigned int ticks)
|
||||
|
||||
if (!pp->mpp && pp->initialized == INIT_MISSING_UDEV) {
|
||||
if (pp->retriggers < retrigger_tries) {
|
||||
+ static const char change[] = "change";
|
||||
+ ssize_t ret;
|
||||
+
|
||||
condlog(2, "%s: triggering change event to reinitialize",
|
||||
pp->dev);
|
||||
pp->initialized = INIT_REQUESTED_UDEV;
|
||||
pp->retriggers++;
|
||||
- sysfs_attr_set_value(pp->udev, "uevent", "change",
|
||||
- strlen("change"));
|
||||
+ ret = sysfs_attr_set_value(pp->udev, "uevent", change,
|
||||
+ sizeof(change) - 1);
|
||||
+ if (ret != sizeof(change) - 1)
|
||||
+ log_sysfs_attr_set_value(1, ret,
|
||||
+ "%s: failed to trigger change event",
|
||||
+ pp->dev);
|
||||
return 0;
|
||||
} else {
|
||||
condlog(1, "%s: not initialized after %d udev retriggers",
|
@ -0,0 +1,37 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Wilck <mwilck@suse.com>
|
||||
Date: Tue, 5 Jul 2022 23:18:07 +0200
|
||||
Subject: [PATCH] multipath tests: expect_condlog: skip depending on verbosity
|
||||
|
||||
otherwise we'll get failures if verbosity level is low.
|
||||
|
||||
Signed-off-by: Martin Wilck <mwilck@suse.com>
|
||||
|
||||
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
tests/test-log.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/tests/test-log.c b/tests/test-log.c
|
||||
index 14f25b9b..0c17cd96 100644
|
||||
--- a/tests/test-log.c
|
||||
+++ b/tests/test-log.c
|
||||
@@ -6,6 +6,8 @@
|
||||
#include <cmocka.h>
|
||||
#include "log.h"
|
||||
#include "test-log.h"
|
||||
+#include "debug.h"
|
||||
+
|
||||
|
||||
__attribute__((format(printf, 2, 0)))
|
||||
void __wrap_dlog (int prio, const char * fmt, ...)
|
||||
@@ -24,6 +26,8 @@ void __wrap_dlog (int prio, const char * fmt, ...)
|
||||
|
||||
void expect_condlog(int prio, char *string)
|
||||
{
|
||||
+ if (prio > MAX_VERBOSITY || prio > libmp_verbosity)
|
||||
+ return;
|
||||
expect_value(__wrap_dlog, prio, prio);
|
||||
will_return(__wrap_dlog, string);
|
||||
}
|
27
0020-multipath-tests-__wrap_dlog-print-log-message.patch
Normal file
27
0020-multipath-tests-__wrap_dlog-print-log-message.patch
Normal file
@ -0,0 +1,27 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Wilck <mwilck@suse.com>
|
||||
Date: Wed, 6 Jul 2022 11:15:27 +0200
|
||||
Subject: [PATCH] multipath tests: __wrap_dlog: print log message
|
||||
|
||||
This makes it easier to analyze errors from __wrap_dlog().
|
||||
|
||||
Signed-off-by: Martin Wilck <mwilck@suse.com>
|
||||
|
||||
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
tests/test-log.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/tests/test-log.c b/tests/test-log.c
|
||||
index 0c17cd96..c1745872 100644
|
||||
--- a/tests/test-log.c
|
||||
+++ b/tests/test-log.c
|
||||
@@ -20,6 +20,7 @@ void __wrap_dlog (int prio, const char * fmt, ...)
|
||||
va_start(ap, fmt);
|
||||
vsnprintf(buff, MAX_MSG_SIZE, fmt, ap);
|
||||
va_end(ap);
|
||||
+ fprintf(stderr, "%s(%d): %s", __func__, prio, buff);
|
||||
expected = mock_ptr_type(char *);
|
||||
assert_memory_equal(buff, expected, strlen(expected));
|
||||
}
|
538
0021-multipath-tests-add-sysfs-test.patch
Normal file
538
0021-multipath-tests-add-sysfs-test.patch
Normal file
@ -0,0 +1,538 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Wilck <mwilck@suse.com>
|
||||
Date: Tue, 5 Jul 2022 23:19:30 +0200
|
||||
Subject: [PATCH] multipath tests: add sysfs test
|
||||
|
||||
Signed-off-by: Martin Wilck <mwilck@suse.com>
|
||||
|
||||
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
tests/Makefile | 5 +-
|
||||
tests/sysfs.c | 494 +++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 498 insertions(+), 1 deletion(-)
|
||||
create mode 100644 tests/sysfs.c
|
||||
|
||||
diff --git a/tests/Makefile b/tests/Makefile
|
||||
index d20ef236..95a99908 100644
|
||||
--- a/tests/Makefile
|
||||
+++ b/tests/Makefile
|
||||
@@ -16,7 +16,7 @@ CFLAGS += $(BIN_CFLAGS) -Wno-unused-parameter $(W_MISSING_INITIALIZERS)
|
||||
LIBDEPS += -L. -L$(mpathcmddir) -lmultipath -lmpathcmd -lcmocka
|
||||
|
||||
TESTS := uevent parser util dmevents hwtable blacklist unaligned vpd pgpolicy \
|
||||
- alias directio valid devt mpathvalid strbuf
|
||||
+ alias directio valid devt mpathvalid strbuf sysfs
|
||||
HELPERS := test-lib.o test-log.o
|
||||
|
||||
.SILENT: $(TESTS:%=%.o)
|
||||
@@ -70,6 +70,9 @@ ifneq ($(DIO_TEST_DEV),)
|
||||
directio-test_LIBDEPS := -laio
|
||||
endif
|
||||
strbuf-test_OBJDEPS := ../libmultipath/strbuf.o
|
||||
+sysfs-test_TESTDEPS := test-log.o
|
||||
+sysfs-test_OBJDEPS := ../libmultipath/sysfs.o ../libmultipath/util.o
|
||||
+sysfs-test_LIBDEPS := -ludev -lpthread -ldl
|
||||
|
||||
%.o: %.c
|
||||
$(CC) $(CPPFLAGS) $(CFLAGS) $($*-test_FLAGS) -c -o $@ $<
|
||||
diff --git a/tests/sysfs.c b/tests/sysfs.c
|
||||
new file mode 100644
|
||||
index 00000000..0ec135bf
|
||||
--- /dev/null
|
||||
+++ b/tests/sysfs.c
|
||||
@@ -0,0 +1,494 @@
|
||||
+/*
|
||||
+ * Copyright (c) 2021 SUSE LLC
|
||||
+ * SPDX-License-Identifier: GPL-2.0-only
|
||||
+ */
|
||||
+
|
||||
+#define _GNU_SOURCE
|
||||
+#include <stdbool.h>
|
||||
+#include <stdarg.h>
|
||||
+#include <stddef.h>
|
||||
+#include <setjmp.h>
|
||||
+#include <stdlib.h>
|
||||
+#include <cmocka.h>
|
||||
+#include <libudev.h>
|
||||
+#include <fcntl.h>
|
||||
+#include <errno.h>
|
||||
+#include "debug.h"
|
||||
+#include "globals.c"
|
||||
+#include "test-log.h"
|
||||
+#include "sysfs.h"
|
||||
+#include "util.h"
|
||||
+
|
||||
+#define TEST_FD 123
|
||||
+
|
||||
+char *__wrap_udev_device_get_syspath(struct udev_device *ud)
|
||||
+{
|
||||
+ char *val = mock_ptr_type(char *);
|
||||
+
|
||||
+ return val;
|
||||
+}
|
||||
+
|
||||
+int __wrap_open(const char *pathname, int flags)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ check_expected(pathname);
|
||||
+ check_expected(flags);
|
||||
+ ret = mock_type(int);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+ssize_t __wrap_read(int fd, void *buf, size_t count)
|
||||
+{
|
||||
+ ssize_t ret;
|
||||
+ char *val;
|
||||
+
|
||||
+ check_expected(fd);
|
||||
+ check_expected(count);
|
||||
+ ret = mock_type(int);
|
||||
+ val = mock_ptr_type(char *);
|
||||
+ if (ret >= (ssize_t)count)
|
||||
+ ret = count;
|
||||
+ if (ret >= 0 && val) {
|
||||
+ fprintf(stderr, "%s: '%s' -> %zd\n", __func__, val, ret);
|
||||
+ memcpy(buf, val, ret);
|
||||
+ }
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+ssize_t __wrap_write(int fd, void *buf, size_t count)
|
||||
+{
|
||||
+ ssize_t ret;
|
||||
+
|
||||
+ check_expected(fd);
|
||||
+ check_expected(count);
|
||||
+ ret = mock_type(int);
|
||||
+ if (ret >= (ssize_t)count)
|
||||
+ ret = count;
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+int __real_close(int fd);
|
||||
+int __wrap_close(int fd) {
|
||||
+ if (fd != TEST_FD)
|
||||
+ return __real_close(fd);
|
||||
+ return mock_type(int);
|
||||
+}
|
||||
+
|
||||
+static int setup(void **state)
|
||||
+{
|
||||
+ udev = udev_new();
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int teardown(void **state)
|
||||
+{
|
||||
+ udev_unref(udev);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void expect_sagv_invalid(void)
|
||||
+{
|
||||
+ expect_condlog(1, "__sysfs_attr_get_value: invalid parameters");
|
||||
+}
|
||||
+
|
||||
+static void test_sagv_invalid(void **state)
|
||||
+{
|
||||
+ expect_sagv_invalid();
|
||||
+ assert_int_equal(sysfs_attr_get_value(NULL, NULL, NULL, 0), -EINVAL);
|
||||
+ expect_sagv_invalid();
|
||||
+ assert_int_equal(sysfs_bin_attr_get_value(NULL, NULL, NULL, 0), -EINVAL);
|
||||
+
|
||||
+ expect_sagv_invalid();
|
||||
+ assert_int_equal(sysfs_attr_get_value(NULL, (void *)state, (void *)state, 1),
|
||||
+ -EINVAL);
|
||||
+ expect_sagv_invalid();
|
||||
+ assert_int_equal(sysfs_bin_attr_get_value(NULL, (void *)state, (void *)state, 1),
|
||||
+ -EINVAL);
|
||||
+
|
||||
+ expect_sagv_invalid();
|
||||
+ assert_int_equal(sysfs_attr_get_value((void *)state, NULL, (void *)state, 1),
|
||||
+ -EINVAL);
|
||||
+ expect_sagv_invalid();
|
||||
+ assert_int_equal(sysfs_bin_attr_get_value((void *)state, NULL, (void *)state, 1),
|
||||
+ -EINVAL);
|
||||
+
|
||||
+ expect_sagv_invalid();
|
||||
+ assert_int_equal(sysfs_attr_get_value((void *)state, (void *)state, NULL, 1),
|
||||
+ -EINVAL);
|
||||
+ expect_sagv_invalid();
|
||||
+ assert_int_equal(sysfs_bin_attr_get_value((void *)state, (void *)state, NULL, 1),
|
||||
+ -EINVAL);
|
||||
+
|
||||
+ expect_sagv_invalid();
|
||||
+ assert_int_equal(sysfs_attr_get_value((void *)state, (void *)state,
|
||||
+ (void *)state, 0), -EINVAL);
|
||||
+ expect_sagv_invalid();
|
||||
+ assert_int_equal(sysfs_bin_attr_get_value((void *)state, (void *)state,
|
||||
+ (void *)state, 0), -EINVAL);
|
||||
+}
|
||||
+
|
||||
+static void test_sagv_bad_udev(void **state)
|
||||
+{
|
||||
+ will_return(__wrap_udev_device_get_syspath, NULL);
|
||||
+ expect_condlog(3, "__sysfs_attr_get_value: invalid udevice");
|
||||
+ assert_int_equal(sysfs_attr_get_value((void *)state, (void *)state,
|
||||
+ (void *)state, 1), -EINVAL);
|
||||
+
|
||||
+ will_return(__wrap_udev_device_get_syspath, NULL);
|
||||
+ expect_condlog(3, "__sysfs_attr_get_value: invalid udevice");
|
||||
+ assert_int_equal(sysfs_bin_attr_get_value((void *)state, (void *)state,
|
||||
+ (void *)state, 1), -EINVAL);
|
||||
+}
|
||||
+
|
||||
+static void test_sagv_bad_snprintf(void **state)
|
||||
+{
|
||||
+ char longstr[PATH_MAX + 1];
|
||||
+ char buf[1];
|
||||
+
|
||||
+ memset(longstr, 'a', sizeof(longstr) - 1);
|
||||
+ longstr[sizeof(longstr) - 1] = '\0';
|
||||
+
|
||||
+ will_return(__wrap_udev_device_get_syspath, "/foo");
|
||||
+ expect_condlog(3, "__sysfs_attr_get_value: devpath overflow");
|
||||
+ assert_int_equal(sysfs_attr_get_value((void *)state, longstr,
|
||||
+ buf, sizeof(buf)), -EOVERFLOW);
|
||||
+ will_return(__wrap_udev_device_get_syspath, "/foo");
|
||||
+ expect_condlog(3, "__sysfs_attr_get_value: devpath overflow");
|
||||
+ assert_int_equal(sysfs_bin_attr_get_value((void *)state, longstr,
|
||||
+ (unsigned char *)buf, sizeof(buf)),
|
||||
+ -EOVERFLOW);
|
||||
+}
|
||||
+
|
||||
+static void test_sagv_open_fail(void **state)
|
||||
+{
|
||||
+ char buf[1];
|
||||
+
|
||||
+ will_return(__wrap_udev_device_get_syspath, "/foo");
|
||||
+ expect_condlog(4, "open '/foo/bar'");
|
||||
+ expect_string(__wrap_open, pathname, "/foo/bar");
|
||||
+ expect_value(__wrap_open, flags, O_RDONLY);
|
||||
+ errno = ENOENT;
|
||||
+ will_return(__wrap_open, -1);
|
||||
+ expect_condlog(3, "__sysfs_attr_get_value: attribute '/foo/bar' can not be opened");
|
||||
+ assert_int_equal(sysfs_attr_get_value((void *)state, "bar",
|
||||
+ buf, sizeof(buf)), -ENOENT);
|
||||
+}
|
||||
+
|
||||
+static void test_sagv_read_fail(void **state)
|
||||
+{
|
||||
+ char buf[1];
|
||||
+
|
||||
+ will_return(__wrap_udev_device_get_syspath, "/foo");
|
||||
+ expect_condlog(4, "open '/foo/bar'");
|
||||
+ expect_string(__wrap_open, pathname, "/foo/bar");
|
||||
+ expect_value(__wrap_open, flags, O_RDONLY);
|
||||
+ will_return(__wrap_open, TEST_FD);
|
||||
+ expect_value(__wrap_read, fd, TEST_FD);
|
||||
+ expect_value(__wrap_read, count, sizeof(buf));
|
||||
+ errno = EISDIR;
|
||||
+ will_return(__wrap_read, -1);
|
||||
+ will_return(__wrap_read, NULL);
|
||||
+ expect_condlog(3, "__sysfs_attr_get_value: read from /foo/bar failed:");
|
||||
+ will_return(__wrap_close, 0);
|
||||
+ assert_int_equal(sysfs_attr_get_value((void *)state, "bar",
|
||||
+ buf, sizeof(buf)), -EISDIR);
|
||||
+
|
||||
+ will_return(__wrap_udev_device_get_syspath, "/foo");
|
||||
+ expect_condlog(4, "open '/foo/baz'");
|
||||
+ expect_string(__wrap_open, pathname, "/foo/baz");
|
||||
+ expect_value(__wrap_open, flags, O_RDONLY);
|
||||
+ will_return(__wrap_open, TEST_FD);
|
||||
+ expect_value(__wrap_read, fd, TEST_FD);
|
||||
+ expect_value(__wrap_read, count, sizeof(buf));
|
||||
+ errno = EPERM;
|
||||
+ will_return(__wrap_read, -1);
|
||||
+ will_return(__wrap_read, NULL);
|
||||
+ expect_condlog(3, "__sysfs_attr_get_value: read from /foo/baz failed:");
|
||||
+ will_return(__wrap_close, 0);
|
||||
+ assert_int_equal(sysfs_bin_attr_get_value((void *)state, "baz",
|
||||
+ (unsigned char *)buf, sizeof(buf)),
|
||||
+ -EPERM);
|
||||
+
|
||||
+}
|
||||
+
|
||||
+static void _test_sagv_read(void **state, unsigned int bufsz)
|
||||
+{
|
||||
+ char buf[16];
|
||||
+ char input[] = "01234567";
|
||||
+ unsigned int n, trunc;
|
||||
+
|
||||
+ assert_in_range(bufsz, 1, sizeof(buf));
|
||||
+ memset(buf, '.', sizeof(buf));
|
||||
+ will_return(__wrap_udev_device_get_syspath, "/foo");
|
||||
+ expect_condlog(4, "open '/foo/bar'");
|
||||
+ expect_string(__wrap_open, pathname, "/foo/bar");
|
||||
+ expect_value(__wrap_open, flags, O_RDONLY);
|
||||
+ will_return(__wrap_open, TEST_FD);
|
||||
+ expect_value(__wrap_read, fd, TEST_FD);
|
||||
+ expect_value(__wrap_read, count, bufsz);
|
||||
+ will_return(__wrap_read, sizeof(input) - 1);
|
||||
+ will_return(__wrap_read, input);
|
||||
+
|
||||
+ /* If the buffer is too small, input will be truncated by a 0 byte */
|
||||
+ if (bufsz <= sizeof(input) - 1) {
|
||||
+ n = bufsz;
|
||||
+ trunc = 1;
|
||||
+ expect_condlog(3, "__sysfs_attr_get_value: overflow reading from /foo/bar");
|
||||
+ } else {
|
||||
+ n = sizeof(input) - 1;
|
||||
+ trunc = 0;
|
||||
+ }
|
||||
+ will_return(__wrap_close, 0);
|
||||
+ assert_int_equal(sysfs_attr_get_value((void *)state, "bar",
|
||||
+ buf, bufsz), n);
|
||||
+ assert_memory_equal(buf, input, n - trunc);
|
||||
+ assert_int_equal(buf[n - trunc], '\0');
|
||||
+
|
||||
+ /* Binary input is not truncated */
|
||||
+ memset(buf, '.', sizeof(buf));
|
||||
+ will_return(__wrap_udev_device_get_syspath, "/foo");
|
||||
+ expect_condlog(4, "open '/foo/baz'");
|
||||
+ expect_string(__wrap_open, pathname, "/foo/baz");
|
||||
+ expect_value(__wrap_open, flags, O_RDONLY);
|
||||
+ will_return(__wrap_open, TEST_FD);
|
||||
+ expect_value(__wrap_read, fd, TEST_FD);
|
||||
+ expect_value(__wrap_read, count, bufsz);
|
||||
+ will_return(__wrap_read, sizeof(input) - 1);
|
||||
+ will_return(__wrap_read, input);
|
||||
+ will_return(__wrap_close, 0);
|
||||
+ n = bufsz < sizeof(input) - 1 ? bufsz : sizeof(input) - 1;
|
||||
+ assert_int_equal(sysfs_bin_attr_get_value((void *)state, "baz",
|
||||
+ (unsigned char *)buf,
|
||||
+ bufsz),
|
||||
+ n);
|
||||
+ assert_memory_equal(buf, input, n);
|
||||
+}
|
||||
+
|
||||
+static void test_sagv_read_overflow_8(void **state)
|
||||
+{
|
||||
+ _test_sagv_read(state, 8);
|
||||
+}
|
||||
+
|
||||
+static void test_sagv_read_overflow_4(void **state)
|
||||
+{
|
||||
+ _test_sagv_read(state, 4);
|
||||
+}
|
||||
+
|
||||
+static void test_sagv_read_overflow_1(void **state)
|
||||
+{
|
||||
+ _test_sagv_read(state, 1);
|
||||
+}
|
||||
+
|
||||
+static void test_sagv_read_good_9(void **state)
|
||||
+{
|
||||
+ _test_sagv_read(state, 9);
|
||||
+}
|
||||
+
|
||||
+static void test_sagv_read_good_15(void **state)
|
||||
+{
|
||||
+ _test_sagv_read(state, 15);
|
||||
+}
|
||||
+
|
||||
+static void _test_sagv_read_zeroes(void **state, unsigned int bufsz)
|
||||
+{
|
||||
+ char buf[16];
|
||||
+ char input[] = { '\0','\0','\0','\0','\0','\0','\0','\0' };
|
||||
+ unsigned int n;
|
||||
+
|
||||
+ assert_in_range(bufsz, 1, sizeof(buf));
|
||||
+ memset(buf, '.', sizeof(buf));
|
||||
+ will_return(__wrap_udev_device_get_syspath, "/foo");
|
||||
+ expect_condlog(4, "open '/foo/bar'");
|
||||
+ expect_string(__wrap_open, pathname, "/foo/bar");
|
||||
+ expect_value(__wrap_open, flags, O_RDONLY);
|
||||
+ will_return(__wrap_open, TEST_FD);
|
||||
+ expect_value(__wrap_read, fd, TEST_FD);
|
||||
+ expect_value(__wrap_read, count, bufsz);
|
||||
+ will_return(__wrap_read, sizeof(input) - 1);
|
||||
+ will_return(__wrap_read, input);
|
||||
+
|
||||
+ if (bufsz <= sizeof(input) - 1) {
|
||||
+ n = bufsz;
|
||||
+ expect_condlog(3, "__sysfs_attr_get_value: overflow reading from /foo/bar");
|
||||
+ } else
|
||||
+ n = 0;
|
||||
+
|
||||
+ will_return(__wrap_close, 0);
|
||||
+ assert_int_equal(sysfs_attr_get_value((void *)state, "bar",
|
||||
+ buf, bufsz), n);
|
||||
+
|
||||
+ /*
|
||||
+ * The return value of sysfs_attr_get_value ignores zero bytes,
|
||||
+ * but the read data should have been copied to the buffer
|
||||
+ */
|
||||
+ assert_memory_equal(buf, input, n == 0 ? bufsz : n);
|
||||
+}
|
||||
+
|
||||
+static void test_sagv_read_zeroes_4(void **state)
|
||||
+{
|
||||
+ _test_sagv_read_zeroes(state, 4);
|
||||
+}
|
||||
+
|
||||
+static void expect_sasv_invalid(void)
|
||||
+{
|
||||
+ expect_condlog(1, "sysfs_attr_set_value: invalid parameters");
|
||||
+}
|
||||
+
|
||||
+static void test_sasv_invalid(void **state)
|
||||
+{
|
||||
+ expect_sasv_invalid();
|
||||
+ assert_int_equal(sysfs_attr_set_value(NULL, NULL, NULL, 0), -EINVAL);
|
||||
+
|
||||
+ expect_sasv_invalid();
|
||||
+ assert_int_equal(sysfs_attr_set_value(NULL, (void *)state, (void *)state, 1),
|
||||
+ -EINVAL);
|
||||
+
|
||||
+ expect_sasv_invalid();
|
||||
+ assert_int_equal(sysfs_attr_set_value((void *)state, NULL, (void *)state, 1),
|
||||
+ -EINVAL);
|
||||
+
|
||||
+ expect_sasv_invalid();
|
||||
+ assert_int_equal(sysfs_attr_set_value((void *)state, (void *)state, NULL, 1),
|
||||
+ -EINVAL);
|
||||
+
|
||||
+ expect_sasv_invalid();
|
||||
+ assert_int_equal(sysfs_attr_set_value((void *)state, (void *)state,
|
||||
+ (void *)state, 0), -EINVAL);
|
||||
+}
|
||||
+
|
||||
+static void test_sasv_bad_udev(void **state)
|
||||
+{
|
||||
+ will_return(__wrap_udev_device_get_syspath, NULL);
|
||||
+ expect_condlog(3, "sysfs_attr_set_value: invalid udevice");
|
||||
+ assert_int_equal(sysfs_attr_set_value((void *)state, (void *)state,
|
||||
+ (void *)state, 1), -EINVAL);
|
||||
+}
|
||||
+
|
||||
+static void test_sasv_bad_snprintf(void **state)
|
||||
+{
|
||||
+ char longstr[PATH_MAX + 1];
|
||||
+ char buf[1];
|
||||
+
|
||||
+ memset(longstr, 'a', sizeof(longstr) - 1);
|
||||
+ longstr[sizeof(longstr) - 1] = '\0';
|
||||
+
|
||||
+ will_return(__wrap_udev_device_get_syspath, "/foo");
|
||||
+ expect_condlog(3, "sysfs_attr_set_value: devpath overflow");
|
||||
+ assert_int_equal(sysfs_attr_set_value((void *)state, longstr,
|
||||
+ buf, sizeof(buf)), -EOVERFLOW);
|
||||
+}
|
||||
+
|
||||
+static void test_sasv_open_fail(void **state)
|
||||
+{
|
||||
+ char buf[1];
|
||||
+
|
||||
+ will_return(__wrap_udev_device_get_syspath, "/foo");
|
||||
+ expect_condlog(4, "open '/foo/bar'");
|
||||
+ expect_string(__wrap_open, pathname, "/foo/bar");
|
||||
+ expect_value(__wrap_open, flags, O_WRONLY);
|
||||
+ errno = EPERM;
|
||||
+ will_return(__wrap_open, -1);
|
||||
+ expect_condlog(3, "sysfs_attr_set_value: attribute '/foo/bar' can not be opened");
|
||||
+ assert_int_equal(sysfs_attr_set_value((void *)state, "bar",
|
||||
+ buf, sizeof(buf)), -EPERM);
|
||||
+}
|
||||
+
|
||||
+static void test_sasv_write_fail(void **state)
|
||||
+{
|
||||
+ char buf[1];
|
||||
+
|
||||
+ will_return(__wrap_udev_device_get_syspath, "/foo");
|
||||
+ expect_condlog(4, "open '/foo/bar'");
|
||||
+ expect_string(__wrap_open, pathname, "/foo/bar");
|
||||
+ expect_value(__wrap_open, flags, O_WRONLY);
|
||||
+ will_return(__wrap_open, TEST_FD);
|
||||
+ expect_value(__wrap_write, fd, TEST_FD);
|
||||
+ expect_value(__wrap_write, count, sizeof(buf));
|
||||
+ errno = EISDIR;
|
||||
+ will_return(__wrap_write, -1);
|
||||
+ expect_condlog(3, "sysfs_attr_set_value: write to /foo/bar failed:");
|
||||
+ will_return(__wrap_close, 0);
|
||||
+ assert_int_equal(sysfs_attr_set_value((void *)state, "bar",
|
||||
+ buf, sizeof(buf)), -EISDIR);
|
||||
+
|
||||
+}
|
||||
+
|
||||
+static void _test_sasv_write(void **state, unsigned int n_written)
|
||||
+{
|
||||
+ char buf[8];
|
||||
+
|
||||
+ assert_in_range(n_written, 0, sizeof(buf));
|
||||
+ will_return(__wrap_udev_device_get_syspath, "/foo");
|
||||
+ expect_condlog(4, "open '/foo/bar'");
|
||||
+ expect_string(__wrap_open, pathname, "/foo/bar");
|
||||
+ expect_value(__wrap_open, flags, O_WRONLY);
|
||||
+ will_return(__wrap_open, TEST_FD);
|
||||
+ expect_value(__wrap_write, fd, TEST_FD);
|
||||
+ expect_value(__wrap_write, count, sizeof(buf));
|
||||
+ will_return(__wrap_write, n_written);
|
||||
+
|
||||
+ if (n_written < sizeof(buf))
|
||||
+ expect_condlog(3, "sysfs_attr_set_value: underflow writing");
|
||||
+ will_return(__wrap_close, 0);
|
||||
+ assert_int_equal(sysfs_attr_set_value((void *)state, "bar",
|
||||
+ buf, sizeof(buf)),
|
||||
+ n_written);
|
||||
+}
|
||||
+
|
||||
+static void test_sasv_write_0(void **state)
|
||||
+{
|
||||
+ _test_sasv_write(state, 0);
|
||||
+}
|
||||
+
|
||||
+static void test_sasv_write_4(void **state)
|
||||
+{
|
||||
+ _test_sasv_write(state, 4);
|
||||
+}
|
||||
+
|
||||
+static void test_sasv_write_7(void **state)
|
||||
+{
|
||||
+ _test_sasv_write(state, 7);
|
||||
+}
|
||||
+
|
||||
+static void test_sasv_write_8(void **state)
|
||||
+{
|
||||
+ _test_sasv_write(state, 8);
|
||||
+}
|
||||
+
|
||||
+static int test_sysfs(void)
|
||||
+{
|
||||
+ const struct CMUnitTest tests[] = {
|
||||
+ cmocka_unit_test(test_sagv_invalid),
|
||||
+ cmocka_unit_test(test_sagv_bad_udev),
|
||||
+ cmocka_unit_test(test_sagv_bad_snprintf),
|
||||
+ cmocka_unit_test(test_sagv_open_fail),
|
||||
+ cmocka_unit_test(test_sagv_read_fail),
|
||||
+ cmocka_unit_test(test_sagv_read_overflow_1),
|
||||
+ cmocka_unit_test(test_sagv_read_overflow_4),
|
||||
+ cmocka_unit_test(test_sagv_read_overflow_8),
|
||||
+ cmocka_unit_test(test_sagv_read_good_9),
|
||||
+ cmocka_unit_test(test_sagv_read_good_15),
|
||||
+ cmocka_unit_test(test_sagv_read_zeroes_4),
|
||||
+ cmocka_unit_test(test_sasv_invalid),
|
||||
+ cmocka_unit_test(test_sasv_bad_udev),
|
||||
+ cmocka_unit_test(test_sasv_bad_snprintf),
|
||||
+ cmocka_unit_test(test_sasv_open_fail),
|
||||
+ cmocka_unit_test(test_sasv_write_fail),
|
||||
+ cmocka_unit_test(test_sasv_write_0),
|
||||
+ cmocka_unit_test(test_sasv_write_4),
|
||||
+ cmocka_unit_test(test_sasv_write_7),
|
||||
+ cmocka_unit_test(test_sasv_write_8),
|
||||
+ };
|
||||
+
|
||||
+ return cmocka_run_group_tests(tests, setup, teardown);
|
||||
+}
|
||||
+
|
||||
+int main(void)
|
||||
+{
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ init_test_verbosity(4);
|
||||
+ ret += test_sysfs();
|
||||
+ return ret;
|
||||
+}
|
@ -0,0 +1,43 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Wilck <mwilck@suse.com>
|
||||
Date: Wed, 6 Jul 2022 12:45:33 +0200
|
||||
Subject: [PATCH] libmultipath.version: bump version for sysfs accessors
|
||||
|
||||
Formally, the ABI is still the same, but the semantics of the
|
||||
return value have changed.
|
||||
|
||||
Signed-off-by: Martin Wilck <mwilck@suse.com>
|
||||
|
||||
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/libmultipath.version | 8 ++++++--
|
||||
1 file changed, 6 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/libmultipath.version b/libmultipath/libmultipath.version
|
||||
index b3690ac0..c1d9b156 100644
|
||||
--- a/libmultipath/libmultipath.version
|
||||
+++ b/libmultipath/libmultipath.version
|
||||
@@ -207,7 +207,6 @@ global:
|
||||
strchop;
|
||||
strlcpy;
|
||||
sync_map_state;
|
||||
- sysfs_attr_set_value;
|
||||
sysfs_get_size;
|
||||
sysfs_is_multipathed;
|
||||
timespeccmp;
|
||||
@@ -264,8 +263,13 @@ global:
|
||||
|
||||
/* foreign */
|
||||
free_scandir_result;
|
||||
- sysfs_attr_get_value;
|
||||
|
||||
local:
|
||||
*;
|
||||
};
|
||||
+
|
||||
+LIBMULTIPATH_16.0.0 {
|
||||
+global:
|
||||
+ sysfs_attr_set_value;
|
||||
+ sysfs_attr_get_value;
|
||||
+};
|
@ -1,6 +1,6 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Tue, 10 May 2022 14:17:22 -0500
|
||||
Date: Tue, 7 Jun 2022 17:45:01 -0500
|
||||
Subject: [PATCH] libmultipath: unset detect_checker for clariion / Unity
|
||||
arrays
|
||||
|
||||
@ -12,6 +12,7 @@ checker.
|
||||
|
||||
Cc: vincent.chen1@dell.com
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
---
|
||||
libmultipath/hwtable.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
26
0024-libmultipath-spelling-cplusplus.patch
Normal file
26
0024-libmultipath-spelling-cplusplus.patch
Normal file
@ -0,0 +1,26 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Josh Soref <2119212+jsoref@users.noreply.github.com>
|
||||
Date: Sun, 31 Jul 2022 13:11:15 -0400
|
||||
Subject: [PATCH] libmultipath: spelling: cplusplus
|
||||
|
||||
Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
|
||||
Reviewed-by: Xose Vazquez Perez <xose.vazquez@gmail.com>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmpathvalid/mpath_valid.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/libmpathvalid/mpath_valid.h b/libmpathvalid/mpath_valid.h
|
||||
index ed06196e..ec2f9392 100644
|
||||
--- a/libmpathvalid/mpath_valid.h
|
||||
+++ b/libmpathvalid/mpath_valid.h
|
||||
@@ -20,7 +20,7 @@
|
||||
#ifndef LIB_MPATH_VALID_H
|
||||
#define LIB_MPATH_VALID_H
|
||||
|
||||
-#ifdef __cpluscplus
|
||||
+#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
25
0025-libmultipath-spelling-ascii.patch
Normal file
25
0025-libmultipath-spelling-ascii.patch
Normal file
@ -0,0 +1,25 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Josh Soref <2119212+jsoref@users.noreply.github.com>
|
||||
Date: Sun, 31 Jul 2022 13:11:12 -0400
|
||||
Subject: [PATCH] libmultipath: spelling: ascii
|
||||
|
||||
Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/prioritizers/alua_spc3.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/libmultipath/prioritizers/alua_spc3.h b/libmultipath/prioritizers/alua_spc3.h
|
||||
index 08e992bd..e1a6c071 100644
|
||||
--- a/libmultipath/prioritizers/alua_spc3.h
|
||||
+++ b/libmultipath/prioritizers/alua_spc3.h
|
||||
@@ -143,7 +143,7 @@ inquiry_data_get_tpgs(struct inquiry_data *id)
|
||||
*-----------------------------------------------------------------------------
|
||||
*/
|
||||
#define CODESET_BINARY 0x1
|
||||
-#define CODESET_ACSII 0x2
|
||||
+#define CODESET_ASCII 0x2
|
||||
#define CODESET_UTF8 0x3
|
||||
|
||||
#define ASSOCIATION_UNIT 0x0
|
25
0026-libmultipath-spelling-progress.patch
Normal file
25
0026-libmultipath-spelling-progress.patch
Normal file
@ -0,0 +1,25 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Josh Soref <2119212+jsoref@users.noreply.github.com>
|
||||
Date: Sun, 31 Jul 2022 13:11:22 -0400
|
||||
Subject: [PATCH] libmultipath: spelling: progress
|
||||
|
||||
Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/nvme/linux/nvme.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/libmultipath/nvme/linux/nvme.h b/libmultipath/nvme/linux/nvme.h
|
||||
index a6975549..9fc2ae7f 100644
|
||||
--- a/libmultipath/nvme/linux/nvme.h
|
||||
+++ b/libmultipath/nvme/linux/nvme.h
|
||||
@@ -1035,7 +1035,7 @@ enum {
|
||||
NVME_SANITIZE_LOG_STATUS_MASK = 0x0007,
|
||||
NVME_SANITIZE_LOG_NEVER_SANITIZED = 0x0000,
|
||||
NVME_SANITIZE_LOG_COMPLETED_SUCCESS = 0x0001,
|
||||
- NVME_SANITIZE_LOG_IN_PROGESS = 0x0002,
|
||||
+ NVME_SANITIZE_LOG_IN_PROGRESS = 0x0002,
|
||||
NVME_SANITIZE_LOG_COMPLETED_FAILED = 0x0003,
|
||||
NVME_SANITIZE_LOG_ND_COMPLETED_SUCCESS = 0x0004,
|
||||
};
|
599
0027-multipath-tools-spelling-fixes.patch
Normal file
599
0027-multipath-tools-spelling-fixes.patch
Normal file
@ -0,0 +1,599 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Josh Soref <2119212+jsoref@users.noreply.github.com>
|
||||
Date: Sun, 31 Jul 2022 13:17:53 -0400
|
||||
Subject: [PATCH] multipath-tools: spelling fixes
|
||||
|
||||
Spelling errors detected by the GitHub check-spelling action:
|
||||
https://github.com/marketplace/actions/check-spelling
|
||||
|
||||
Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
.github/workflows/foreign.yaml | 2 +-
|
||||
kpartx/crc32.c | 2 +-
|
||||
kpartx/gpt.c | 2 +-
|
||||
libdmmp/libdmmp_path.c | 2 +-
|
||||
libmpathcmd/mpath_cmd.h | 2 +-
|
||||
libmpathpersist/mpath_persist_int.c | 2 +-
|
||||
libmpathvalid/mpath_valid.h | 4 ++--
|
||||
libmultipath/checkers/directio.c | 2 +-
|
||||
libmultipath/config.h | 2 +-
|
||||
libmultipath/configure.c | 2 +-
|
||||
libmultipath/discovery.c | 2 +-
|
||||
libmultipath/nvme/nvme.h | 2 +-
|
||||
libmultipath/prioritizers/datacore.c | 4 ++--
|
||||
libmultipath/prioritizers/hds.c | 2 +-
|
||||
libmultipath/prioritizers/path_latency.c | 4 ++--
|
||||
libmultipath/strbuf.h | 4 ++--
|
||||
libmultipath/structs_vec.c | 2 +-
|
||||
libmultipath/uevent.c | 2 +-
|
||||
libmultipath/valid.h | 2 +-
|
||||
mpathpersist/main.c | 2 +-
|
||||
multipath/multipath.conf.5 | 14 +++++++-------
|
||||
multipathd/main.c | 10 +++++-----
|
||||
tests/directio.c | 2 +-
|
||||
tests/hwtable.c | 10 +++++-----
|
||||
tests/mpathvalid.c | 2 +-
|
||||
tests/pgpolicy.c | 2 +-
|
||||
tests/valid.c | 4 ++--
|
||||
third-party/valgrind/valgrind.h | 8 ++++----
|
||||
28 files changed, 50 insertions(+), 50 deletions(-)
|
||||
|
||||
diff --git a/.github/workflows/foreign.yaml b/.github/workflows/foreign.yaml
|
||||
index e9ffd3d8..32915186 100644
|
||||
--- a/.github/workflows/foreign.yaml
|
||||
+++ b/.github/workflows/foreign.yaml
|
||||
@@ -56,7 +56,7 @@ jobs:
|
||||
- name: enable foreign arch
|
||||
run: sudo docker run --rm --privileged multiarch/qemu-user-static:register --reset
|
||||
- name: run tests
|
||||
- # Github actions doesn't support referencing docker images with
|
||||
+ # GitHub actions doesn't support referencing docker images with
|
||||
# context variables. Workaround: use mosteo-actions/docker-run action
|
||||
# See https://github.community/t/expressions-in-docker-uri/16271
|
||||
uses: mosteo-actions/docker-run@v1
|
||||
diff --git a/kpartx/crc32.c b/kpartx/crc32.c
|
||||
index e688f8e9..df6c6878 100644
|
||||
--- a/kpartx/crc32.c
|
||||
+++ b/kpartx/crc32.c
|
||||
@@ -290,7 +290,7 @@ uint32_t attribute((pure)) crc32_be(uint32_t crc, unsigned char const *p, size_t
|
||||
* the end, so we have to add 32 extra cycles shifting in zeros at the
|
||||
* end of every message,
|
||||
*
|
||||
- * So the standard trick is to rearrage merging in the next_input_bit()
|
||||
+ * So the standard trick is to rearrange merging in the next_input_bit()
|
||||
* until the moment it's needed. Then the first 32 cycles can be precomputed,
|
||||
* and merging in the final 32 zero bits to make room for the CRC can be
|
||||
* skipped entirely.
|
||||
diff --git a/kpartx/gpt.c b/kpartx/gpt.c
|
||||
index 34a910cf..47d8743e 100644
|
||||
--- a/kpartx/gpt.c
|
||||
+++ b/kpartx/gpt.c
|
||||
@@ -357,7 +357,7 @@ is_gpt_valid(int fd, uint64_t lba,
|
||||
__le32_to_cpu((*gpt)->num_partition_entries) *
|
||||
__le32_to_cpu((*gpt)->sizeof_partition_entry));
|
||||
if (crc != __le32_to_cpu((*gpt)->partition_entry_array_crc32)) {
|
||||
- // printf("GUID Partitition Entry Array CRC check failed.\n");
|
||||
+ // printf("GUID Partition Entry Array CRC check failed.\n");
|
||||
free(*gpt);
|
||||
*gpt = NULL;
|
||||
free(*ptes);
|
||||
diff --git a/libdmmp/libdmmp_path.c b/libdmmp/libdmmp_path.c
|
||||
index 47a2162c..21714b15 100644
|
||||
--- a/libdmmp/libdmmp_path.c
|
||||
+++ b/libdmmp/libdmmp_path.c
|
||||
@@ -28,7 +28,7 @@
|
||||
#include "libdmmp_private.h"
|
||||
|
||||
#define _DMMP_SHOW_PS_INDEX_BLK_NAME 0
|
||||
-#define _DMMP_SHOW_PS_INDEX_SATAUS 1
|
||||
+#define _DMMP_SHOW_PS_INDEX_STATUS 1
|
||||
#define _DMMP_SHOW_PS_INDEX_WWID 2
|
||||
#define _DMMP_SHOW_PS_INDEX_PGID 3
|
||||
|
||||
diff --git a/libmpathcmd/mpath_cmd.h b/libmpathcmd/mpath_cmd.h
|
||||
index 30838b02..0c293c71 100644
|
||||
--- a/libmpathcmd/mpath_cmd.h
|
||||
+++ b/libmpathcmd/mpath_cmd.h
|
||||
@@ -65,7 +65,7 @@ int mpath_connect(void);
|
||||
/*
|
||||
* DESCRIPTION:
|
||||
* Disconnect from the multipathd daemon. This function must be
|
||||
- * run after after processing all the multipath commands.
|
||||
+ * run after processing all the multipath commands.
|
||||
*
|
||||
* RETURNS:
|
||||
* 0 on success. -1 on failure (with errno set).
|
||||
diff --git a/libmpathpersist/mpath_persist_int.c b/libmpathpersist/mpath_persist_int.c
|
||||
index e34fc32d..6924b379 100644
|
||||
--- a/libmpathpersist/mpath_persist_int.c
|
||||
+++ b/libmpathpersist/mpath_persist_int.c
|
||||
@@ -601,7 +601,7 @@ static int mpath_prout_rel(struct multipath *mpp,int rq_servact, int rq_scope,
|
||||
if (get_be64(mpp->reservation_key) &&
|
||||
memcmp(pr_buff->prin_descriptor.prin_readfd.descriptors[i]->key,
|
||||
&mpp->reservation_key, 8)){
|
||||
- /*register with tarnsport id*/
|
||||
+ /*register with transport id*/
|
||||
memset(pamp, 0, length);
|
||||
pamp->trnptid_list[0] = pptr;
|
||||
memset (pamp->trnptid_list[0], 0, sizeof (struct transportid));
|
||||
diff --git a/libmpathvalid/mpath_valid.h b/libmpathvalid/mpath_valid.h
|
||||
index ec2f9392..3e34b1fd 100644
|
||||
--- a/libmpathvalid/mpath_valid.h
|
||||
+++ b/libmpathvalid/mpath_valid.h
|
||||
@@ -112,7 +112,7 @@ int mpathvalid_exit(void);
|
||||
* RETURNS:
|
||||
* MPATH_STRICT, MPATH_SMART, MPATH_GREEDY, or MPATH_MODE_ERROR
|
||||
*
|
||||
- * MPATH_STRICT = find_multiapths (yes|on|no|off)
|
||||
+ * MPATH_STRICT = find_multipaths (yes|on|no|off)
|
||||
* MPATH_SMART = find_multipaths smart
|
||||
* MPATH_GREEDY = find_multipaths greedy
|
||||
* MPATH_MODE_ERROR = multipath configuration not initialized
|
||||
@@ -126,7 +126,7 @@ unsigned int mpathvalid_get_mode(void);
|
||||
* potentially claimed (MPATH_IS_VALID, MPATH_IS_VALID_NO_CHECK,
|
||||
* or MPATH_IS_MAYBE_VALID) and wwid is not NULL, then *wiid will
|
||||
* be set to point to the wwid of device. If set, *wwid must be
|
||||
- * freed by the caller. path_wwids is an obptional parameter that
|
||||
+ * freed by the caller. path_wwids is an optional parameter that
|
||||
* points to an array of wwids, that were returned from previous
|
||||
* calls to mpathvalid_is_path(). These are wwids of existing
|
||||
* devices that are or potentially are claimed by device-mapper
|
||||
diff --git a/libmultipath/checkers/directio.c b/libmultipath/checkers/directio.c
|
||||
index bc7b7be5..a326e37b 100644
|
||||
--- a/libmultipath/checkers/directio.c
|
||||
+++ b/libmultipath/checkers/directio.c
|
||||
@@ -124,7 +124,7 @@ remove_aio_group(struct aio_group *aio_grp)
|
||||
|
||||
/* If an aio_group is completely full of orphans, then no checkers can
|
||||
* use it, which means that no checkers can clear out the orphans. To
|
||||
- * avoid keeping the useless group around, simply remove remove the
|
||||
+ * avoid keeping the useless group around, simply remove the
|
||||
* group */
|
||||
static void
|
||||
check_orphaned_group(struct aio_group *aio_grp)
|
||||
diff --git a/libmultipath/config.h b/libmultipath/config.h
|
||||
index 36d40157..fdcdff0a 100644
|
||||
--- a/libmultipath/config.h
|
||||
+++ b/libmultipath/config.h
|
||||
@@ -248,7 +248,7 @@ struct config {
|
||||
* libmultipath calls. If an application wants to keep using the
|
||||
* udev variable after calling libmultipath_exit(), it should have taken
|
||||
* an additional reference on it beforehand. This is the case e.g.
|
||||
- * after initiazing udev with udev_new().
|
||||
+ * after initializing udev with udev_new().
|
||||
*/
|
||||
extern struct udev *udev;
|
||||
|
||||
diff --git a/libmultipath/configure.c b/libmultipath/configure.c
|
||||
index 4427f910..8af7cd79 100644
|
||||
--- a/libmultipath/configure.c
|
||||
+++ b/libmultipath/configure.c
|
||||
@@ -397,7 +397,7 @@ int setup_map(struct multipath *mpp, char **params, struct vectors *vecs)
|
||||
* into a mp->params strings to feed the device-mapper
|
||||
*/
|
||||
if (assemble_map(mpp, params)) {
|
||||
- condlog(0, "%s: problem assembing map", mpp->alias);
|
||||
+ condlog(0, "%s: problem assembling map", mpp->alias);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
|
||||
index ee290093..15560f8c 100644
|
||||
--- a/libmultipath/discovery.c
|
||||
+++ b/libmultipath/discovery.c
|
||||
@@ -1344,7 +1344,7 @@ parse_vpd_c0_hp3par(const unsigned char *in, size_t in_len,
|
||||
condlog(3, "HP/3PAR vendor specific VPD page length too short: %zu", in_len);
|
||||
return -EINVAL;
|
||||
}
|
||||
- if (in[4] <= 3) /* revision must be > 3 to have Vomlume Name */
|
||||
+ if (in[4] <= 3) /* revision must be > 3 to have Volume Name */
|
||||
return -ENODATA;
|
||||
len = get_unaligned_be32(&in[40]);
|
||||
if (len > out_len || len + 44 > in_len) {
|
||||
diff --git a/libmultipath/nvme/nvme.h b/libmultipath/nvme/nvme.h
|
||||
index 7e0278b5..57f82a31 100644
|
||||
--- a/libmultipath/nvme/nvme.h
|
||||
+++ b/libmultipath/nvme/nvme.h
|
||||
@@ -224,7 +224,7 @@ char *nvme_char_from_block(char *block);
|
||||
* Notes: This function does not care about transport so that the offset is
|
||||
* not going to be checked inside of this function for the unsupported fields
|
||||
* in a specific transport. For example, BPMBL(Boot Partition Memory Buffer
|
||||
- * Location) register is not supported by fabrics, but it can be chcked here.
|
||||
+ * Location) register is not supported by fabrics, but it can be checked here.
|
||||
*/
|
||||
static inline bool is_64bit_reg(__u32 offset)
|
||||
{
|
||||
diff --git a/libmultipath/prioritizers/datacore.c b/libmultipath/prioritizers/datacore.c
|
||||
index 02dc2e27..d1d473d4 100644
|
||||
--- a/libmultipath/prioritizers/datacore.c
|
||||
+++ b/libmultipath/prioritizers/datacore.c
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* (C) 2010 Christophe Varoqui
|
||||
- * (C) 2009 Dembach Goo Infromatik GmbH & Co KG
|
||||
+ * (C) 2009 Dembach Goo Informatik GmbH & Co KG
|
||||
* Manon Goo <manon.goo@dg-i.net>
|
||||
*
|
||||
* datacore.c
|
||||
@@ -10,7 +10,7 @@
|
||||
* Matthias Rudolph <matthias.rudolph@hds.com>
|
||||
*
|
||||
* This work is made available on the basis of the
|
||||
- * GPLv2 for detials see <http://www.gnu.org/licenses/>.
|
||||
+ * GPLv2 for details see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Manon Goo 2009
|
||||
*
|
||||
diff --git a/libmultipath/prioritizers/hds.c b/libmultipath/prioritizers/hds.c
|
||||
index 88cac5f0..d569f2d7 100644
|
||||
--- a/libmultipath/prioritizers/hds.c
|
||||
+++ b/libmultipath/prioritizers/hds.c
|
||||
@@ -32,7 +32,7 @@
|
||||
* Half of the LUNs are accessed via one HBA/storage controller and the other
|
||||
* half via the other HBA/storage controller.
|
||||
*
|
||||
- * In cluster environmemnts (RAC) it also guarantees that all cluster nodes have
|
||||
+ * In cluster environments (RAC) it also guarantees that all cluster nodes have
|
||||
* access to the LDEVs via the same controller.
|
||||
*
|
||||
* You can run the prioritizer manually in verbose mode:
|
||||
diff --git a/libmultipath/prioritizers/path_latency.c b/libmultipath/prioritizers/path_latency.c
|
||||
index e155f6dc..2f5be9b9 100644
|
||||
--- a/libmultipath/prioritizers/path_latency.c
|
||||
+++ b/libmultipath/prioritizers/path_latency.c
|
||||
@@ -64,7 +64,7 @@ static int prepare_directio_read(int fd, int *blksz, char **pbuf,
|
||||
long flags;
|
||||
|
||||
if (ioctl(fd, BLKBSZGET, blksz) < 0) {
|
||||
- pp_pl_log(3,"catnnot get blocksize, set default");
|
||||
+ pp_pl_log(3,"cannot get blocksize, set default");
|
||||
*blksz = DEF_BLK_SIZE;
|
||||
}
|
||||
if (posix_memalign((void **)pbuf, pgsize, *blksz))
|
||||
@@ -193,7 +193,7 @@ out:
|
||||
}
|
||||
|
||||
/*
|
||||
- * Do not scale the prioriy in a certain range such as [0, 1024]
|
||||
+ * Do not scale the priority in a certain range such as [0, 1024]
|
||||
* because scaling will eliminate the effect of base_num.
|
||||
*/
|
||||
int calcPrio(double lg_avglatency, double lg_maxavglatency,
|
||||
diff --git a/libmultipath/strbuf.h b/libmultipath/strbuf.h
|
||||
index 41d7d54f..31ab519a 100644
|
||||
--- a/libmultipath/strbuf.h
|
||||
+++ b/libmultipath/strbuf.h
|
||||
@@ -159,7 +159,7 @@ int fill_strbuf(struct strbuf *buf, char c, int slen);
|
||||
*
|
||||
* Appends the given string to @strbuf, with leading and trailing double
|
||||
* quotes (") added, expanding @strbuf's size as necessary. Any double quote
|
||||
- * characters (") in the string are transformed to double double quotes ("").
|
||||
+ * characters (") in the string are transformed to a pair of double quotes ("").
|
||||
* If the function returns an error, @strbuf is unchanged.
|
||||
*/
|
||||
int append_strbuf_quoted(struct strbuf *buf, const char *str);
|
||||
@@ -171,7 +171,7 @@ int append_strbuf_quoted(struct strbuf *buf, const char *str);
|
||||
* @returns: number of appended characters if successful, (excluding
|
||||
* terminating '\0'); negative error code otherwise
|
||||
*
|
||||
- * Appends the the arguments following @fmt, formatted as in printf(), to
|
||||
+ * Appends the arguments following @fmt, formatted as in printf(), to
|
||||
* @strbuf, expanding @strbuf's size as necessary. The function makes sure that
|
||||
* the output @strbuf is always 0-terminated.
|
||||
* If the function returns an error, @strbuf is unchanged.
|
||||
diff --git a/libmultipath/structs_vec.c b/libmultipath/structs_vec.c
|
||||
index a69f0643..645896c6 100644
|
||||
--- a/libmultipath/structs_vec.c
|
||||
+++ b/libmultipath/structs_vec.c
|
||||
@@ -205,7 +205,7 @@ static bool update_pathvec_from_dm(vector pathvec, struct multipath *mpp,
|
||||
continue;
|
||||
|
||||
/*
|
||||
- * At this point, pp->udev is valid and and pp->wwid
|
||||
+ * At this point, pp->udev is valid and pp->wwid
|
||||
* is the best we could get
|
||||
*/
|
||||
if (*pp->wwid && strcmp(mpp->wwid, pp->wwid)) {
|
||||
diff --git a/libmultipath/uevent.c b/libmultipath/uevent.c
|
||||
index 5793af94..57447ca0 100644
|
||||
--- a/libmultipath/uevent.c
|
||||
+++ b/libmultipath/uevent.c
|
||||
@@ -373,7 +373,7 @@ uevent_filter(struct uevent *later, struct uevent_filter_state *st)
|
||||
|
||||
list_for_some_entry_reverse_safe(earlier, tmp, &later->node, &st->uevq, node) {
|
||||
/*
|
||||
- * filter unnessary earlier uevents
|
||||
+ * filter unnecessary earlier uevents
|
||||
* by the later uevent
|
||||
*/
|
||||
if (!list_empty(&earlier->merge_node)) {
|
||||
diff --git a/libmultipath/valid.h b/libmultipath/valid.h
|
||||
index ce1c7cbf..731e6eff 100644
|
||||
--- a/libmultipath/valid.h
|
||||
+++ b/libmultipath/valid.h
|
||||
@@ -23,7 +23,7 @@
|
||||
* already.
|
||||
* PATH_IS_VALID is returned by is_path_valid, when the path is
|
||||
* valid only if it hasn't been released to systemd already.
|
||||
- * PATH_IS_MAYBE_VALID is returned when the the path would be valid
|
||||
+ * PATH_IS_MAYBE_VALID is returned when the path would be valid
|
||||
* if other paths with the same wwid existed. It is up to the caller
|
||||
* to check for these other paths.
|
||||
*/
|
||||
diff --git a/mpathpersist/main.c b/mpathpersist/main.c
|
||||
index 4bdd55c2..894e8c94 100644
|
||||
--- a/mpathpersist/main.c
|
||||
+++ b/mpathpersist/main.c
|
||||
@@ -480,7 +480,7 @@ static int handle_args(int argc, char * argv[], int nline)
|
||||
}
|
||||
if ((verbose > 2) && num_transportids)
|
||||
{
|
||||
- fprintf (stderr, "number of tranport-ids decoded from "
|
||||
+ fprintf (stderr, "number of transport-ids decoded from "
|
||||
"command line : %d\n", num_transportids);
|
||||
}
|
||||
|
||||
diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5
|
||||
index c2d34f18..853e0feb 100644
|
||||
--- a/multipath/multipath.conf.5
|
||||
+++ b/multipath/multipath.conf.5
|
||||
@@ -455,7 +455,7 @@ precedence. See KNOWN ISSUES.
|
||||
(Since kernel 2.6.38) Number of msecs before pg_init retry, it must be between 0 and 60000.
|
||||
.TP
|
||||
.I queue_mode <mode>
|
||||
-(Since kernel 4.8) Select the the queueing mode per multipath device.
|
||||
+(Since kernel 4.8) Select the queueing mode per multipath device.
|
||||
<mode> can be \fIbio\fR, \fIrq\fR or \fImq\fR, which corresponds to
|
||||
bio-based, request-based, and block-multiqueue (blk-mq) request-based,
|
||||
respectively.
|
||||
@@ -935,7 +935,7 @@ This option is not supported any more. The value is ignored.
|
||||
.B san_path_err_threshold
|
||||
If set to a value greater than 0, multipathd will watch paths and check how many
|
||||
times a path has been failed due to errors.If the number of failures on a particular
|
||||
-path is greater then the san_path_err_threshold, then the path will not reinstate
|
||||
+path is greater than the san_path_err_threshold, then the path will not reinstate
|
||||
till san_path_err_recovery_time. These path failures should occur within a
|
||||
san_path_err_forget_rate checks, if not we will consider the path is good enough
|
||||
to reinstantate. See "Shaky paths detection" below.
|
||||
@@ -949,7 +949,7 @@ The default is: \fBno\fR
|
||||
.B san_path_err_forget_rate
|
||||
If set to a value greater than 0, multipathd will check whether the path failures
|
||||
has exceeded the san_path_err_threshold within this many checks i.e
|
||||
-san_path_err_forget_rate . If so we will not reinstante the path till
|
||||
+san_path_err_forget_rate . If so we will not reinstate the path till
|
||||
san_path_err_recovery_time. See "Shaky paths detection" below.
|
||||
.RS
|
||||
.TP
|
||||
@@ -962,7 +962,7 @@ The default is: \fBno\fR
|
||||
If set to a value greater than 0, multipathd will make sure that when path failures
|
||||
has exceeded the san_path_err_threshold within san_path_err_forget_rate then the path
|
||||
will be placed in failed state for san_path_err_recovery_time duration.Once san_path_err_recovery_time
|
||||
-has timeout we will reinstante the failed path .
|
||||
+has timeout we will reinstate the failed path .
|
||||
san_path_err_recovery_time value should be in secs.
|
||||
See "Shaky paths detection" below.
|
||||
.RS
|
||||
@@ -1000,7 +1000,7 @@ If the rate of IO error on a particular path is greater than the
|
||||
\fImarginal_path_err_rate_threshold\fR, then the path will not reinstate for
|
||||
\fImarginal_path_err_recheck_gap_time\fR seconds unless there is only one
|
||||
active path. After \fImarginal_path_err_recheck_gap_time\fR expires, the path
|
||||
-will be requeueed for rechecking. If checking result is good enough, the
|
||||
+will be requeued for rechecking. If checking result is good enough, the
|
||||
path will be reinstated. See "Shaky paths detection" below.
|
||||
.RS
|
||||
.TP
|
||||
@@ -1031,7 +1031,7 @@ value, the failed path of which the IO error rate is larger than
|
||||
\fImarginal_path_err_rate_threshold\fR will be kept in failed state for
|
||||
\fImarginal_path_err_recheck_gap_time\fR seconds. When
|
||||
\fImarginal_path_err_recheck_gap_time\fR seconds expires, the path will be
|
||||
-requeueed for checking. If checking result is good enough, the path will be
|
||||
+requeued for checking. If checking result is good enough, the path will be
|
||||
reinstated, or else it will keep failed. See "Shaky paths detection" below.
|
||||
.RS
|
||||
.TP
|
||||
@@ -1379,7 +1379,7 @@ The protocol that a path is using can be viewed by running
|
||||
\fBmultipathd show paths format "%d %P"\fR
|
||||
.RE
|
||||
.LP
|
||||
-For every device, these 5 blacklist criteria are evaluated in the the order
|
||||
+For every device, these 5 blacklist criteria are evaluated in the order
|
||||
"property, dev\%node, device, protocol, wwid". If a device turns out to be
|
||||
blacklisted by any criterion, it's excluded from handling by multipathd, and
|
||||
the later criteria aren't evaluated any more. For each
|
||||
diff --git a/multipathd/main.c b/multipathd/main.c
|
||||
index a160c824..defee10a 100644
|
||||
--- a/multipathd/main.c
|
||||
+++ b/multipathd/main.c
|
||||
@@ -583,7 +583,7 @@ retry:
|
||||
if (mpp->prflag) {
|
||||
vector_foreach_slot(mpp->paths, pp, i) {
|
||||
if ((pp->state == PATH_UP) || (pp->state == PATH_GHOST)) {
|
||||
- /* persistent reseravtion check*/
|
||||
+ /* persistent reservation check*/
|
||||
mpath_pr_event_handle(pp);
|
||||
}
|
||||
}
|
||||
@@ -1515,7 +1515,7 @@ uev_update_path (struct uevent *uev, struct vectors * vecs)
|
||||
condlog(3, "%s: error in change_foreign", __func__);
|
||||
break;
|
||||
default:
|
||||
- condlog(1, "%s: return code %d of change_forein is unsupported",
|
||||
+ condlog(1, "%s: return code %d of change_foreign is unsupported",
|
||||
__func__, rc);
|
||||
break;
|
||||
}
|
||||
@@ -1966,7 +1966,7 @@ ghost_delay_tick(struct vectors *vecs)
|
||||
}
|
||||
|
||||
static void
|
||||
-defered_failback_tick (vector mpvec)
|
||||
+deferred_failback_tick (vector mpvec)
|
||||
{
|
||||
struct multipath * mpp;
|
||||
unsigned int i;
|
||||
@@ -2186,7 +2186,7 @@ static int check_path_reinstate_state(struct path * pp) {
|
||||
get_monotonic_time(&curr_time);
|
||||
/* when path failures has exceeded the san_path_err_threshold
|
||||
* place the path in delayed state till san_path_err_recovery_time
|
||||
- * so that the cutomer can rectify the issue within this time. After
|
||||
+ * so that the customer can rectify the issue within this time. After
|
||||
* the completion of san_path_err_recovery_time it should
|
||||
* automatically reinstate the path
|
||||
* (note: we know that san_path_err_threshold > 0 here).
|
||||
@@ -2647,7 +2647,7 @@ checkerloop (void *ap)
|
||||
pthread_cleanup_push(cleanup_lock, &vecs->lock);
|
||||
lock(&vecs->lock);
|
||||
pthread_testcancel();
|
||||
- defered_failback_tick(vecs->mpvec);
|
||||
+ deferred_failback_tick(vecs->mpvec);
|
||||
retry_count_tick(vecs->mpvec);
|
||||
missing_uev_wait_tick(vecs);
|
||||
ghost_delay_tick(vecs);
|
||||
diff --git a/tests/directio.c b/tests/directio.c
|
||||
index 20ccc47a..01fdef28 100644
|
||||
--- a/tests/directio.c
|
||||
+++ b/tests/directio.c
|
||||
@@ -497,7 +497,7 @@ static void test_free_with_pending(void **state)
|
||||
do_libcheck_reset(1);
|
||||
}
|
||||
|
||||
-/* test removing orpahed aio_group on free */
|
||||
+/* test removing orphaned aio_group on free */
|
||||
static void test_orphaned_aio_group(void **state)
|
||||
{
|
||||
struct checker c[AIO_GROUP_SIZE] = {{.cls = NULL}};
|
||||
diff --git a/tests/hwtable.c b/tests/hwtable.c
|
||||
index bfaf613f..334b75e8 100644
|
||||
--- a/tests/hwtable.c
|
||||
+++ b/tests/hwtable.c
|
||||
@@ -29,7 +29,7 @@
|
||||
|
||||
#define N_CONF_FILES 2
|
||||
|
||||
-static const char tmplate[] = "/tmp/hwtable-XXXXXX";
|
||||
+static const char template[] = "/tmp/hwtable-XXXXXX";
|
||||
|
||||
struct key_value {
|
||||
const char *key;
|
||||
@@ -136,7 +136,7 @@ static int setup(void **state)
|
||||
if (hwt == NULL)
|
||||
return -1;
|
||||
|
||||
- snprintf(buf, sizeof(buf), "%s", tmplate);
|
||||
+ snprintf(buf, sizeof(buf), "%s", template);
|
||||
if (mkdtemp(buf) == NULL) {
|
||||
condlog(0, "mkdtemp: %s", strerror(errno));
|
||||
goto err;
|
||||
@@ -255,7 +255,7 @@ static void write_defaults(const struct hwt_state *hwt)
|
||||
{ "detect_prio", "no" },
|
||||
{ "detect_checker", "no" },
|
||||
};
|
||||
- char buf[sizeof(tmplate) + sizeof(bindings_name)];
|
||||
+ char buf[sizeof(template) + sizeof(bindings_name)];
|
||||
char dirbuf[PATH_MAX];
|
||||
|
||||
snprintf(buf, sizeof(buf), "%s/%s", hwt->tmpname, bindings_name);
|
||||
@@ -308,7 +308,7 @@ static void write_device(FILE *ff, int nkv, const struct key_value *kv)
|
||||
}
|
||||
|
||||
/*
|
||||
- * Some macros to avoid boilerplace code
|
||||
+ * Some macros to avoid boilerplate code
|
||||
*/
|
||||
|
||||
#define CHECK_STATE(state) ({ \
|
||||
@@ -448,7 +448,7 @@ static const struct key_value npr_queue = { _no_path_retry, "queue" };
|
||||
/***** BEGIN TESTS SECTION *****/
|
||||
|
||||
/*
|
||||
- * Dump the configuration, subistitute the dumped configuration
|
||||
+ * Dump the configuration, substitute the dumped configuration
|
||||
* for the current one, and verify that the result is identical.
|
||||
*/
|
||||
static void replicate_config(const struct hwt_state *hwt, bool local)
|
||||
diff --git a/tests/mpathvalid.c b/tests/mpathvalid.c
|
||||
index 0230a88f..df66ed6a 100644
|
||||
--- a/tests/mpathvalid.c
|
||||
+++ b/tests/mpathvalid.c
|
||||
@@ -399,7 +399,7 @@ static void test_mpathvalid_is_path_good3(void **state)
|
||||
free(wwid);
|
||||
}
|
||||
|
||||
-/* mabybe valid with no matching paths */
|
||||
+/* maybe valid with no matching paths */
|
||||
static void test_mpathvalid_is_path_good4(void **state)
|
||||
{
|
||||
const char *wwids[] = { "WWID_A", "WWID_B", "WWID_C", "WWID_D" };
|
||||
diff --git a/tests/pgpolicy.c b/tests/pgpolicy.c
|
||||
index f116d12c..43be831f 100644
|
||||
--- a/tests/pgpolicy.c
|
||||
+++ b/tests/pgpolicy.c
|
||||
@@ -191,7 +191,7 @@ verify_pathgroups(struct multipath *mp, struct path *pp, int **groups,
|
||||
/* Test names instead of pointers to get a more
|
||||
* useful error message */
|
||||
assert_string_equal(pgp_path->dev, pp_path->dev);
|
||||
- /* This test is just a backkup in case the
|
||||
+ /* This test is just a backup in case the
|
||||
* something wenth wrong naming the paths */
|
||||
assert_ptr_equal(pgp_path, pp_path);
|
||||
}
|
||||
diff --git a/tests/valid.c b/tests/valid.c
|
||||
index e7393a1c..398b771e 100644
|
||||
--- a/tests/valid.c
|
||||
+++ b/tests/valid.c
|
||||
@@ -293,7 +293,7 @@ static void test_sysfs_is_multipathed(void **state)
|
||||
|
||||
memset(&pp, 0, sizeof(pp));
|
||||
conf.find_multipaths = FIND_MULTIPATHS_STRICT;
|
||||
- /* test for already existing multiapthed device */
|
||||
+ /* test for already existing multipathed device */
|
||||
will_return(__wrap_sysfs_is_multipathed, true);
|
||||
will_return(__wrap_sysfs_is_multipathed, wwid);
|
||||
assert_int_equal(is_path_valid(name, &conf, &pp, true),
|
||||
@@ -452,7 +452,7 @@ static void test_greedy(void **state)
|
||||
assert_string_equal(pp.dev, name);
|
||||
assert_ptr_equal(pp.udev, &test_udev);
|
||||
assert_string_equal(pp.wwid, wwid);
|
||||
- /* test greedy success without checking multiapthd */
|
||||
+ /* test greedy success without checking multipathd */
|
||||
memset(&pp, 0, sizeof(pp));
|
||||
setup_passing(name, wwid, CHECK_MPATHD_SKIP, STAGE_IS_FAILED);
|
||||
assert_int_equal(is_path_valid(name, &conf, &pp, false),
|
||||
diff --git a/third-party/valgrind/valgrind.h b/third-party/valgrind/valgrind.h
|
||||
index 577c8f05..1633b318 100644
|
||||
--- a/third-party/valgrind/valgrind.h
|
||||
+++ b/third-party/valgrind/valgrind.h
|
||||
@@ -1075,7 +1075,7 @@ typedef
|
||||
|
||||
/* Use these to write the name of your wrapper. NOTE: duplicates
|
||||
VG_WRAP_FUNCTION_Z{U,Z} in pub_tool_redir.h. NOTE also: inserts
|
||||
- the default behaviour equivalance class tag "0000" into the name.
|
||||
+ the default behaviour equivalence class tag "0000" into the name.
|
||||
See pub_tool_redir.h for details -- normally you don't need to
|
||||
think about this, though. */
|
||||
|
||||
@@ -1620,11 +1620,11 @@ typedef
|
||||
and say that %r15 is trashed instead. gcc seems happy to go with
|
||||
that.
|
||||
|
||||
- Oh .. and this all needs to be conditionalised so that it is
|
||||
+ Oh .. and this all needs to be conditionalized so that it is
|
||||
unchanged from before this commit, when compiled with older gccs
|
||||
that don't support __builtin_dwarf_cfa. Furthermore, since
|
||||
this header file is freestanding, it has to be independent of
|
||||
- config.h, and so the following conditionalisation cannot depend on
|
||||
+ config.h, and so the following conditionalization cannot depend on
|
||||
configure time checks.
|
||||
|
||||
Although it's not clear from
|
||||
@@ -1673,7 +1673,7 @@ typedef
|
||||
/* NB 9 Sept 07. There is a nasty kludge here in all these CALL_FN_
|
||||
macros. In order not to trash the stack redzone, we need to drop
|
||||
%rsp by 128 before the hidden call, and restore afterwards. The
|
||||
- nastyness is that it is only by luck that the stack still appears
|
||||
+ nastiness is that it is only by luck that the stack still appears
|
||||
to be unwindable during the hidden call - since then the behaviour
|
||||
of any routine using this macro does not match what the CFI data
|
||||
says. Sigh.
|
@ -0,0 +1,57 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Xose Vazquez Perez <xose.vazquez@gmail.com>
|
||||
Date: Thu, 21 Jul 2022 19:22:04 +0200
|
||||
Subject: [PATCH] multipath-tools: remove list of rebranded arrays vendors from
|
||||
man page
|
||||
|
||||
It does not provide useful info, and it is incomplete.
|
||||
|
||||
Cc: Martin Wilck <mwilck@suse.com>
|
||||
Cc: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Cc: Christophe Varoqui <christophe.varoqui@opensvc.com>
|
||||
Cc: DM-DEVEL ML <dm-devel@redhat.com>
|
||||
Signed-off-by: Xose Vazquez Perez <xose.vazquez@gmail.com>
|
||||
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
multipath/multipath.conf.5 | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5
|
||||
index 853e0feb..8b7dc511 100644
|
||||
--- a/multipath/multipath.conf.5
|
||||
+++ b/multipath/multipath.conf.5
|
||||
@@ -315,12 +315,12 @@ accepts the optional prio_arg \fIexclusive_pref_bit\fR.
|
||||
.TP
|
||||
.I ontap
|
||||
(Hardware-dependent)
|
||||
-Generate the path priority for NetApp ONTAP class and OEM arrays as IBM NSeries.
|
||||
+Generate the path priority for NetApp ONTAP class, and rebranded arrays.
|
||||
.TP
|
||||
.I rdac
|
||||
(Hardware-dependent)
|
||||
Generate the path priority for LSI/Engenio/NetApp RDAC class as NetApp SANtricity
|
||||
-E/EF Series, and OEM arrays from IBM DELL SGI STK and SUN.
|
||||
+E/EF Series, and rebranded arrays.
|
||||
.TP
|
||||
.I hp_sw
|
||||
(Hardware-dependent)
|
||||
@@ -496,7 +496,7 @@ Active/Standby mode exclusively.
|
||||
.I rdac
|
||||
(Hardware-dependent)
|
||||
Check the path state for LSI/Engenio/NetApp RDAC class as NetApp SANtricity E/EF
|
||||
-Series, and OEM arrays from IBM DELL SGI STK and SUN.
|
||||
+Series, and rebranded arrays.
|
||||
.TP
|
||||
.I directio
|
||||
Read the first sector with direct I/O. This checker could cause spurious path
|
||||
@@ -1568,7 +1568,7 @@ families.
|
||||
.I 1 rdac
|
||||
(Hardware-dependent)
|
||||
Hardware handler for LSI/Engenio/NetApp RDAC class as NetApp SANtricity E/EF
|
||||
-Series, and OEM arrays from IBM DELL SGI STK and SUN.
|
||||
+Series, and rebranded arrays.
|
||||
.TP
|
||||
.I 1 hp_sw
|
||||
(Hardware-dependent)
|
@ -0,0 +1,47 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Xose Vazquez Perez <xose.vazquez@gmail.com>
|
||||
Date: Sat, 23 Jul 2022 00:01:13 +0200
|
||||
Subject: [PATCH] multipath-tools: correct CLARiiON info from multipath.conf
|
||||
man page
|
||||
|
||||
Remove "Unity" from emc prio and hardware_handler, because
|
||||
Unity does not support PNR mode, just ALUA (page 113 and 153):
|
||||
https://www.delltechnologies.com/asset/en-us/products/storage/technical-support/docu5128.pdf
|
||||
And add PNR info.
|
||||
|
||||
Cc: Yanfei Chen <vincent.chen1@dell.com>
|
||||
Cc: Martin Wilck <mwilck@suse.com>
|
||||
Cc: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Cc: Christophe Varoqui <christophe.varoqui@opensvc.com>
|
||||
Cc: DM-DEVEL ML <dm-devel@redhat.com>
|
||||
Signed-off-by: Xose Vazquez Perez <xose.vazquez@gmail.com>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
multipath/multipath.conf.5 | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5
|
||||
index 8b7dc511..acdd1ae6 100644
|
||||
--- a/multipath/multipath.conf.5
|
||||
+++ b/multipath/multipath.conf.5
|
||||
@@ -306,7 +306,7 @@ generate the path priority. This prioritizer accepts the optional prio_arg
|
||||
.I emc
|
||||
(Hardware-dependent)
|
||||
Generate the path priority for DGC class arrays as CLARiiON CX/AX and
|
||||
-EMC VNX and Unity families.
|
||||
+EMC VNX families with Failover Mode 1 (Passive Not Ready(PNR)).
|
||||
.TP
|
||||
.I alua
|
||||
(Hardware-dependent)
|
||||
@@ -1562,8 +1562,8 @@ The following hardware handler are implemented:
|
||||
.TP 12
|
||||
.I 1 emc
|
||||
(Hardware-dependent)
|
||||
-Hardware handler for DGC class arrays as CLARiiON CX/AX and EMC VNX and Unity
|
||||
-families.
|
||||
+Hardware handler for DGC class arrays as CLARiiON CX/AX and EMC VNX families
|
||||
+with Failover Mode 1 (Passive Not Ready(PNR)).
|
||||
.TP
|
||||
.I 1 rdac
|
||||
(Hardware-dependent)
|
@ -0,0 +1,41 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Xose Vazquez Perez <xose.vazquez@gmail.com>
|
||||
Date: Sat, 23 Jul 2022 15:12:04 +0200
|
||||
Subject: [PATCH] multipath-tools: add basic info on how to use multipath-tools
|
||||
with NVMe devices
|
||||
|
||||
Cc: Martin Wilck <mwilck@suse.com>
|
||||
Cc: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Cc: Christophe Varoqui <christophe.varoqui@opensvc.com>
|
||||
Cc: DM-DEVEL ML <dm-devel@redhat.com>
|
||||
Signed-off-by: Xose Vazquez Perez <xose.vazquez@gmail.com>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
README.md | 16 ++++++++++++++++
|
||||
1 file changed, 16 insertions(+)
|
||||
|
||||
diff --git a/README.md b/README.md
|
||||
index 2322082c..b05b1332 100644
|
||||
--- a/README.md
|
||||
+++ b/README.md
|
||||
@@ -174,3 +174,19 @@ To enable ALUA, the following options should be changed:
|
||||
|
||||
- Huawei OceanStor:
|
||||
"Host Access Mode" should be changed to "Asymmetric".
|
||||
+
|
||||
+
|
||||
+NVMe
|
||||
+====
|
||||
+To use Device Mapper/multipath-tools with NVMe devices,
|
||||
+if the Native NVMe Multipath subsystem is enabled
|
||||
+( "Y" in `/sys/module/nvme_core/parameters/multipath` ),
|
||||
+it has to be disabled:
|
||||
+
|
||||
+`echo "options nvme_core multipath=N" > /etc/modprobe.d/01-nvme_core-mp.conf`,
|
||||
+regenerate the initramfs (`dracut -f` or `update-initramfs`) and reboot.
|
||||
+
|
||||
+Check that it is disabled(N) with:
|
||||
+`cat /sys/module/nvme_core/parameters/multipath`
|
||||
+or
|
||||
+`systool -m nvme_core -A multipath`
|
@ -0,0 +1,90 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Tue, 9 Aug 2022 16:46:26 -0500
|
||||
Subject: [PATCH] multipathd: factor out the code to flush a map with no paths
|
||||
|
||||
The code to flush a multipath device because all of its paths have
|
||||
been removed will be used by another caller, so factor it out of
|
||||
ev_remove_path().
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
---
|
||||
multipathd/main.c | 56 ++++++++++++++++++++++++-----------------------
|
||||
1 file changed, 29 insertions(+), 27 deletions(-)
|
||||
|
||||
diff --git a/multipathd/main.c b/multipathd/main.c
|
||||
index defee10a..53cbdb61 100644
|
||||
--- a/multipathd/main.c
|
||||
+++ b/multipathd/main.c
|
||||
@@ -561,6 +561,30 @@ int update_multipath (struct vectors *vecs, char *mapname, int reset)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static bool
|
||||
+flush_map_nopaths(struct multipath *mpp, struct vectors *vecs) {
|
||||
+ char alias[WWID_SIZE];
|
||||
+
|
||||
+ /*
|
||||
+ * flush_map will fail if the device is open
|
||||
+ */
|
||||
+ strlcpy(alias, mpp->alias, WWID_SIZE);
|
||||
+ if (mpp->flush_on_last_del == FLUSH_ENABLED) {
|
||||
+ condlog(2, "%s Last path deleted, disabling queueing",
|
||||
+ mpp->alias);
|
||||
+ mpp->retry_tick = 0;
|
||||
+ mpp->no_path_retry = NO_PATH_RETRY_FAIL;
|
||||
+ mpp->disable_queueing = 1;
|
||||
+ mpp->stat_map_failures++;
|
||||
+ dm_queue_if_no_path(mpp->alias, 0);
|
||||
+ }
|
||||
+ if (!flush_map(mpp, vecs, 1)) {
|
||||
+ condlog(2, "%s: removed map after removing all paths", alias);
|
||||
+ return true;
|
||||
+ }
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
static int
|
||||
update_map (struct multipath *mpp, struct vectors *vecs, int new_map)
|
||||
{
|
||||
@@ -1363,34 +1387,12 @@ ev_remove_path (struct path *pp, struct vectors * vecs, int need_do_map)
|
||||
vector_del_slot(mpp->paths, i);
|
||||
|
||||
/*
|
||||
- * remove the map IF removing the last path
|
||||
+ * remove the map IF removing the last path. If
|
||||
+ * flush_map_nopaths succeeds, the path has been removed.
|
||||
*/
|
||||
- if (VECTOR_SIZE(mpp->paths) == 0) {
|
||||
- char alias[WWID_SIZE];
|
||||
-
|
||||
- /*
|
||||
- * flush_map will fail if the device is open
|
||||
- */
|
||||
- strlcpy(alias, mpp->alias, WWID_SIZE);
|
||||
- if (mpp->flush_on_last_del == FLUSH_ENABLED) {
|
||||
- condlog(2, "%s Last path deleted, disabling queueing", mpp->alias);
|
||||
- mpp->retry_tick = 0;
|
||||
- mpp->no_path_retry = NO_PATH_RETRY_FAIL;
|
||||
- mpp->disable_queueing = 1;
|
||||
- mpp->stat_map_failures++;
|
||||
- dm_queue_if_no_path(mpp->alias, 0);
|
||||
- }
|
||||
- if (!flush_map(mpp, vecs, 1)) {
|
||||
- condlog(2, "%s: removed map after"
|
||||
- " removing all paths",
|
||||
- alias);
|
||||
- /* flush_map() has freed the path */
|
||||
- goto out;
|
||||
- }
|
||||
- /*
|
||||
- * Not an error, continue
|
||||
- */
|
||||
- }
|
||||
+ if (VECTOR_SIZE(mpp->paths) == 0 &&
|
||||
+ flush_map_nopaths(mpp, vecs))
|
||||
+ goto out;
|
||||
|
||||
if (setup_map(mpp, ¶ms, vecs)) {
|
||||
condlog(0, "%s: failed to setup map for"
|
@ -0,0 +1,47 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Tue, 9 Aug 2022 16:46:27 -0500
|
||||
Subject: [PATCH] libmultipath: return success if we raced to remove a map and
|
||||
lost
|
||||
|
||||
_dm_flush_map() was returning failure if it failed to remove a map,
|
||||
even if that was because the map had already been removed. Return
|
||||
success in this case.
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
---
|
||||
libmultipath/devmapper.c | 4 ++++
|
||||
multipathd/main.c | 4 ----
|
||||
2 files changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/devmapper.c b/libmultipath/devmapper.c
|
||||
index 1748d258..a49db3b0 100644
|
||||
--- a/libmultipath/devmapper.c
|
||||
+++ b/libmultipath/devmapper.c
|
||||
@@ -1111,6 +1111,10 @@ int _dm_flush_map (const char * mapname, int need_sync, int deferred_remove,
|
||||
}
|
||||
condlog(4, "multipath map %s removed", mapname);
|
||||
return 0;
|
||||
+ } else if (dm_is_mpath(mapname) != 1) {
|
||||
+ condlog(4, "multipath map %s removed externally",
|
||||
+ mapname);
|
||||
+ return 0; /*we raced with someone else removing it */
|
||||
} else {
|
||||
condlog(2, "failed to remove multipath map %s",
|
||||
mapname);
|
||||
diff --git a/multipathd/main.c b/multipathd/main.c
|
||||
index 53cbdb61..3fcd6bdb 100644
|
||||
--- a/multipathd/main.c
|
||||
+++ b/multipathd/main.c
|
||||
@@ -758,10 +758,6 @@ flush_map(struct multipath * mpp, struct vectors * vecs, int nopaths)
|
||||
* the spurious uevent we may generate with the dm_flush_map call below
|
||||
*/
|
||||
if (r) {
|
||||
- /*
|
||||
- * May not really be an error -- if the map was already flushed
|
||||
- * from the device mapper by dmsetup(8) for instance.
|
||||
- */
|
||||
if (r == 1)
|
||||
condlog(0, "%s: can't flush", mpp->alias);
|
||||
else {
|
36
0033-multipathd-Handle-losing-all-path-in-update_map.patch
Normal file
36
0033-multipathd-Handle-losing-all-path-in-update_map.patch
Normal file
@ -0,0 +1,36 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Tue, 9 Aug 2022 16:46:28 -0500
|
||||
Subject: [PATCH] multipathd: Handle losing all path in update_map
|
||||
|
||||
Its possible that when a multipath device is being updated, it will end
|
||||
up that all the paths for it are gone. This can happen if paths are
|
||||
added and then removed again before multipathd processes the uevent for
|
||||
the newly created multipath device. In this case multipathd wasn't
|
||||
taking the proper action for the case where all the paths had been
|
||||
removed. If flush_on_last_del was set, multipathd wasn't disabling
|
||||
flushing and if deferred_remove was set, it wasn't doing a deferred
|
||||
remove. Multipathd should call flush_map_nopaths(), just like
|
||||
ev_remove_path() does when the last path is removed.
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
---
|
||||
multipathd/main.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/multipathd/main.c b/multipathd/main.c
|
||||
index 3fcd6bdb..7d127dbe 100644
|
||||
--- a/multipathd/main.c
|
||||
+++ b/multipathd/main.c
|
||||
@@ -602,6 +602,10 @@ retry:
|
||||
goto fail;
|
||||
}
|
||||
verify_paths(mpp);
|
||||
+ if (VECTOR_SIZE(mpp->paths) == 0 &&
|
||||
+ flush_map_nopaths(mpp, vecs))
|
||||
+ return 1;
|
||||
+
|
||||
mpp->action = ACT_RELOAD;
|
||||
|
||||
if (mpp->prflag) {
|
35
0034-multipath-fix-systemd-timers-in-the-initramfs.patch
Normal file
35
0034-multipath-fix-systemd-timers-in-the-initramfs.patch
Normal file
@ -0,0 +1,35 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Fri, 5 Aug 2022 18:16:03 -0500
|
||||
Subject: [PATCH] multipath: fix systemd timers in the initramfs
|
||||
|
||||
The systemd timers created for "find_multipaths smart" conflict with
|
||||
shutdown.target, but not with initrd-cleanup.service. This can make
|
||||
these timers trigger after the inirtd has started shutting down,
|
||||
restarting multipathd (which then stops initrd-cleanup.service, since it
|
||||
conflicts). To avoid this, make sure the timers and the unit they
|
||||
trigger conflict with inird-cleanup.service. Also don't make them start
|
||||
multipathd. "multipath -u" will not return "maybe" if multipathd isn't
|
||||
running or set to run, and since we no longer wait for udev-settle,
|
||||
multipathd starts up pretty quickly, so it shouldn't be a problem to
|
||||
not trigger it here.
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
---
|
||||
multipath/multipath.rules | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/multipath/multipath.rules b/multipath/multipath.rules
|
||||
index 9df11a95..f993d996 100644
|
||||
--- a/multipath/multipath.rules
|
||||
+++ b/multipath/multipath.rules
|
||||
@@ -71,7 +71,7 @@ ENV{.SAVED_FM_WAIT_UNTIL}=="?*", GOTO="pretend_mpath"
|
||||
#
|
||||
# We must trigger an "add" event because LVM2 will only act on those.
|
||||
|
||||
-RUN+="/usr/bin/systemd-run --unit=cancel-multipath-wait-$kernel --description 'cancel waiting for multipath siblings of $kernel' --no-block --timer-property DefaultDependencies=no --timer-property Conflicts=shutdown.target --timer-property Before=shutdown.target --timer-property AccuracySec=500ms --property DefaultDependencies=no --property Conflicts=shutdown.target --property Before=shutdown.target --property Wants=multipathd.service --property After=multipathd.service --on-active=$env{FIND_MULTIPATHS_WAIT_UNTIL} /usr/bin/udevadm trigger --action=add $sys$devpath"
|
||||
+RUN+="/usr/bin/systemd-run --unit=cancel-multipath-wait-$kernel --description 'cancel waiting for multipath siblings of $kernel' --no-block --timer-property DefaultDependencies=no --timer-property Conflicts=shutdown.target --timer-property Before=shutdown.target --timer-property Conflicts=initrd-cleanup.service --timer-property Before=initrd-cleanup.service --timer-property AccuracySec=500ms --property DefaultDependencies=no --property Conflicts=shutdown.target --property Before=shutdown.target --property Conflicts=initrd-cleanup.service --property Before=initrd-cleanup.service --on-active=$env{FIND_MULTIPATHS_WAIT_UNTIL} /usr/bin/udevadm trigger --action=add $sys$devpath"
|
||||
|
||||
LABEL="pretend_mpath"
|
||||
ENV{DM_MULTIPATH_DEVICE_PATH}="1"
|
26
0035-multipathd-Add-missing-ctype-include.patch
Normal file
26
0035-multipathd-Add-missing-ctype-include.patch
Normal file
@ -0,0 +1,26 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Bastian Germann <bage@debian.org>
|
||||
Date: Thu, 14 Oct 2021 00:34:33 +0200
|
||||
Subject: [PATCH] multipathd: Add missing ctype include
|
||||
|
||||
In uxclnt.c, there are isspace calls. Add an explicit include.
|
||||
|
||||
Signed-off-by: Bastian Germann <bage@debian.org>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
multipathd/uxclnt.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/multipathd/uxclnt.c b/multipathd/uxclnt.c
|
||||
index b1b058bd..bdcc7c3f 100644
|
||||
--- a/multipathd/uxclnt.c
|
||||
+++ b/multipathd/uxclnt.c
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <stdarg.h>
|
||||
+#include <ctype.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <sys/ioctl.h>
|
102
0036-multipathd-replace-libreadline-with-libedit.patch
Normal file
102
0036-multipathd-replace-libreadline-with-libedit.patch
Normal file
@ -0,0 +1,102 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Wilck <mwilck@suse.com>
|
||||
Date: Fri, 12 Aug 2022 18:58:15 +0200
|
||||
Subject: [PATCH] multipathd: replace libreadline with libedit
|
||||
|
||||
Linking multipathd with libreadline may cause a license conflict,
|
||||
because libreadline is licensed under GPL-3.0-or-later, and
|
||||
libmultipath contains several files under GPL-2.0.
|
||||
|
||||
See:
|
||||
https://github.com/opensvc/multipath-tools/issues/36
|
||||
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=979095
|
||||
https://www.gnu.org/licenses/gpl-faq.html#AllCompatibility
|
||||
|
||||
Replace the readline functionality with libedit, which comes under
|
||||
a BSD license. The readline library can still be enabled (e.g. for
|
||||
binaries not intended to be distributed) by running
|
||||
"make READLINE=libreadline".
|
||||
|
||||
Signed-off-by: Martin Wilck <mwilck@suse.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
Makefile.inc | 5 +++++
|
||||
multipathd/Makefile | 11 ++++++++++-
|
||||
multipathd/cli.c | 5 +++++
|
||||
multipathd/uxclnt.c | 6 ++++++
|
||||
4 files changed, 26 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/Makefile.inc b/Makefile.inc
|
||||
index bcd2212a..ad7afd04 100644
|
||||
--- a/Makefile.inc
|
||||
+++ b/Makefile.inc
|
||||
@@ -8,6 +8,11 @@
|
||||
#
|
||||
# Uncomment to disable dmevents polling support
|
||||
# ENABLE_DMEVENTS_POLL = 0
|
||||
+#
|
||||
+# Readline library to use, libedit or libreadline
|
||||
+# Caution: Using libreadline may make the multipathd binary undistributable,
|
||||
+# see https://github.com/opensvc/multipath-tools/issues/36
|
||||
+READLINE = libedit
|
||||
|
||||
# List of scsi device handler modules to load on boot, e.g.
|
||||
# SCSI_DH_MODULES_PRELOAD := scsi_dh_alua scsi_dh_rdac
|
||||
diff --git a/multipathd/Makefile b/multipathd/Makefile
|
||||
index c937cd55..95acd887 100644
|
||||
--- a/multipathd/Makefile
|
||||
+++ b/multipathd/Makefile
|
||||
@@ -22,7 +22,16 @@ CFLAGS += $(BIN_CFLAGS)
|
||||
LDFLAGS += $(BIN_LDFLAGS)
|
||||
LIBDEPS += -L$(multipathdir) -lmultipath -L$(mpathpersistdir) -lmpathpersist \
|
||||
-L$(mpathcmddir) -lmpathcmd -ludev -ldl -lurcu -lpthread \
|
||||
- -ldevmapper -lreadline
|
||||
+ -ldevmapper
|
||||
+
|
||||
+ifeq ($(READLINE),libedit)
|
||||
+CPPFLAGS += -DUSE_LIBEDIT
|
||||
+LIBDEPS += -ledit
|
||||
+endif
|
||||
+ifeq ($(READLINE),libreadline)
|
||||
+CPPFLAGS += -DUSE_LIBREADLINE
|
||||
+LIBDEPS += -lreadline
|
||||
+endif
|
||||
|
||||
ifdef SYSTEMD
|
||||
CPPFLAGS += -DUSE_SYSTEMD=$(SYSTEMD)
|
||||
diff --git a/multipathd/cli.c b/multipathd/cli.c
|
||||
index b2ee9a99..fa482a67 100644
|
||||
--- a/multipathd/cli.c
|
||||
+++ b/multipathd/cli.c
|
||||
@@ -11,7 +11,12 @@
|
||||
#include "parser.h"
|
||||
#include "util.h"
|
||||
#include "version.h"
|
||||
+#ifdef USE_LIBEDIT
|
||||
+#include <editline/readline.h>
|
||||
+#endif
|
||||
+#ifdef USE_LIBREADLINE
|
||||
#include <readline/readline.h>
|
||||
+#endif
|
||||
|
||||
#include "mpath_cmd.h"
|
||||
#include "cli.h"
|
||||
diff --git a/multipathd/uxclnt.c b/multipathd/uxclnt.c
|
||||
index bdcc7c3f..251e7d75 100644
|
||||
--- a/multipathd/uxclnt.c
|
||||
+++ b/multipathd/uxclnt.c
|
||||
@@ -16,8 +16,14 @@
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
#include <poll.h>
|
||||
+
|
||||
+#ifdef USE_LIBEDIT
|
||||
+#include <editline/readline.h>
|
||||
+#endif
|
||||
+#ifdef USE_LIBREADLINE
|
||||
#include <readline/readline.h>
|
||||
#include <readline/history.h>
|
||||
+#endif
|
||||
|
||||
#include "mpath_cmd.h"
|
||||
#include "uxsock.h"
|
@ -0,0 +1,42 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Wilck <mwilck@suse.com>
|
||||
Date: Fri, 12 Aug 2022 21:25:37 +0200
|
||||
Subject: [PATCH] libmultipath: convert license of strbuf code to GPL-2.0+
|
||||
|
||||
This (partly) fixes the license incompatibility reported in
|
||||
https://github.com/opensvc/multipath-tools/issues/36
|
||||
|
||||
As I'm the only author (except for a trivial spelling fix),
|
||||
I see no issue with changing the license.
|
||||
|
||||
Signed-off-by: Martin Wilck <mwilck@suse.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/strbuf.c | 2 +-
|
||||
libmultipath/strbuf.h | 2 +-
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/strbuf.c b/libmultipath/strbuf.c
|
||||
index f654594d..e23b65e8 100644
|
||||
--- a/libmultipath/strbuf.c
|
||||
+++ b/libmultipath/strbuf.c
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2021 SUSE LLC
|
||||
- * SPDX-License-Identifier: GPL-2.0-only
|
||||
+ * SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
#include <inttypes.h>
|
||||
#include <stdint.h>
|
||||
diff --git a/libmultipath/strbuf.h b/libmultipath/strbuf.h
|
||||
index 31ab519a..ae863417 100644
|
||||
--- a/libmultipath/strbuf.h
|
||||
+++ b/libmultipath/strbuf.h
|
||||
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2021 SUSE LLC
|
||||
- * SPDX-License-Identifier: GPL-2.0-only
|
||||
+ * SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
#ifndef _STRBUF_H
|
||||
#define _STRBUF_H
|
@ -0,0 +1,44 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Wilck <mwilck@suse.com>
|
||||
Date: Tue, 16 Aug 2022 14:10:39 +0200
|
||||
Subject: [PATCH] github workflows: build-and-unittest.yaml: add libedit-dev
|
||||
|
||||
This is is required after switching from libreadline to libedit.
|
||||
|
||||
Signed-off-by: Martin Wilck <mwilck@suse.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
.github/workflows/build-and-unittest.yaml | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/.github/workflows/build-and-unittest.yaml b/.github/workflows/build-and-unittest.yaml
|
||||
index 7ff45842..1ab0d36c 100644
|
||||
--- a/.github/workflows/build-and-unittest.yaml
|
||||
+++ b/.github/workflows/build-and-unittest.yaml
|
||||
@@ -27,7 +27,7 @@ jobs:
|
||||
sudo apt-get install --yes gcc
|
||||
make perl-base pkg-config valgrind
|
||||
libdevmapper-dev libreadline-dev libaio-dev libsystemd-dev
|
||||
- libudev-dev libjson-c-dev liburcu-dev libcmocka-dev
|
||||
+ libudev-dev libjson-c-dev liburcu-dev libcmocka-dev libedit-dev
|
||||
- name: build
|
||||
run: make -O -j$(grep -c ^processor /proc/cpuinfo)
|
||||
- name: test
|
||||
@@ -55,7 +55,7 @@ jobs:
|
||||
sudo apt-get install --yes gcc-10
|
||||
make perl-base pkg-config valgrind
|
||||
libdevmapper-dev libreadline-dev libaio-dev libsystemd-dev
|
||||
- libudev-dev libjson-c-dev liburcu-dev libcmocka-dev
|
||||
+ libudev-dev libjson-c-dev liburcu-dev libcmocka-dev libedit-dev
|
||||
- name: set CC
|
||||
run: echo CC=gcc-10 >> $GITHUB_ENV
|
||||
- name: build
|
||||
@@ -85,7 +85,7 @@ jobs:
|
||||
sudo apt-get install --yes clang
|
||||
make perl-base pkg-config valgrind
|
||||
libdevmapper-dev libreadline-dev libaio-dev libsystemd-dev
|
||||
- libudev-dev libjson-c-dev liburcu-dev libcmocka-dev
|
||||
+ libudev-dev libjson-c-dev liburcu-dev libcmocka-dev libedit-dev
|
||||
- name: set CC
|
||||
run: echo CC=clang >> $GITHUB_ENV
|
||||
- name: build
|
26
0039-github-workflows-coverity.yaml-add-libedit-dev.patch
Normal file
26
0039-github-workflows-coverity.yaml-add-libedit-dev.patch
Normal file
@ -0,0 +1,26 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Wilck <mwilck@suse.com>
|
||||
Date: Tue, 16 Aug 2022 14:10:39 +0200
|
||||
Subject: [PATCH] github workflows: coverity.yaml: add libedit-dev
|
||||
|
||||
This is is required after switching from libreadline to libedit.
|
||||
|
||||
Signed-off-by: Martin Wilck <mwilck@suse.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
.github/workflows/coverity.yaml | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/.github/workflows/coverity.yaml b/.github/workflows/coverity.yaml
|
||||
index a8b56d43..3c6b3824 100644
|
||||
--- a/.github/workflows/coverity.yaml
|
||||
+++ b/.github/workflows/coverity.yaml
|
||||
@@ -15,7 +15,7 @@ jobs:
|
||||
sudo apt-get install --yes
|
||||
gcc make pkg-config
|
||||
libdevmapper-dev libreadline-dev libaio-dev libsystemd-dev
|
||||
- libudev-dev libjson-c-dev liburcu-dev libcmocka-dev
|
||||
+ libudev-dev libjson-c-dev liburcu-dev libcmocka-dev libedit-dev
|
||||
- name: download coverity
|
||||
run: >
|
||||
curl -o cov-analysis-linux64.tar.gz
|
26
0040-github-workflows-abi.yaml-add-libedit-dev.patch
Normal file
26
0040-github-workflows-abi.yaml-add-libedit-dev.patch
Normal file
@ -0,0 +1,26 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Wilck <mwilck@suse.com>
|
||||
Date: Tue, 16 Aug 2022 14:10:39 +0200
|
||||
Subject: [PATCH] github workflows: abi.yaml: add libedit-dev
|
||||
|
||||
This is is required after switching from libreadline to libedit.
|
||||
|
||||
Signed-off-by: Martin Wilck <mwilck@suse.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
.github/workflows/abi.yaml | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/.github/workflows/abi.yaml b/.github/workflows/abi.yaml
|
||||
index 0a40104a..89b971cd 100644
|
||||
--- a/.github/workflows/abi.yaml
|
||||
+++ b/.github/workflows/abi.yaml
|
||||
@@ -30,7 +30,7 @@ jobs:
|
||||
sudo apt-get install --yes gcc
|
||||
gcc make pkg-config abigail-tools
|
||||
libdevmapper-dev libreadline-dev libaio-dev libsystemd-dev
|
||||
- libudev-dev libjson-c-dev liburcu-dev libcmocka-dev
|
||||
+ libudev-dev libjson-c-dev liburcu-dev libcmocka-dev libedit-dev
|
||||
- name: create ABI
|
||||
run: make -O -j$(grep -c ^processor /proc/cpuinfo) abi.tar.gz
|
||||
- name: save ABI
|
@ -0,0 +1,71 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Wilck <mwilck@suse.com>
|
||||
Date: Tue, 16 Aug 2022 16:52:07 +0200
|
||||
Subject: [PATCH] GitHub workflows: native.yaml: add libedit-dev, except for
|
||||
jessie
|
||||
|
||||
This is is required after switching from libreadline to libedit.
|
||||
|
||||
On jessie, we can use libreadline5 (libreadline-gpl2-dev) without
|
||||
license issues. Trying to compile against libedit results in an
|
||||
"incompatible pointer type" error on jessie, because libedit
|
||||
uses a different prototype for rl_completion_entry_function.
|
||||
|
||||
Signed-off-by: Martin Wilck <mwilck@suse.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
.github/workflows/native.yaml | 15 ++++++++++++++-
|
||||
1 file changed, 14 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/.github/workflows/native.yaml b/.github/workflows/native.yaml
|
||||
index ddfd4a09..8b599209 100644
|
||||
--- a/.github/workflows/native.yaml
|
||||
+++ b/.github/workflows/native.yaml
|
||||
@@ -22,13 +22,24 @@ jobs:
|
||||
- name: checkout
|
||||
uses: actions/checkout@v1
|
||||
- name: build and test
|
||||
+ if: ${{ matrix.os != 'jessie' }}
|
||||
run: make test
|
||||
+ - name: build and test (jessie)
|
||||
+ # On jessie, we use libreadline 5 (no licensing issue)
|
||||
+ if: ${{ matrix.os == 'jessie' }}
|
||||
+ run: make READLINE=libreadline test
|
||||
- name: clean
|
||||
run: make clean
|
||||
- name: clang
|
||||
+ if: ${{ matrix.os != 'jessie' }}
|
||||
env:
|
||||
CC: clang
|
||||
run: make test
|
||||
+ - name: clang (jessie)
|
||||
+ if: ${{ matrix.os == 'jessie' }}
|
||||
+ env:
|
||||
+ CC: clang
|
||||
+ run: make READLINE=libreadline test
|
||||
|
||||
rolling:
|
||||
runs-on: ubuntu-20.04
|
||||
@@ -56,12 +67,13 @@ jobs:
|
||||
libjson-c-dev
|
||||
liburcu-dev
|
||||
libcmocka-dev
|
||||
+ libedit-dev
|
||||
- name: dependencies-alpine
|
||||
if: ${{ matrix.os == 'alpine' }}
|
||||
run: >
|
||||
apk add make gcc clang cmocka
|
||||
musl-dev lvm2-dev libaio-dev readline-dev ncurses-dev eudev-dev
|
||||
- userspace-rcu-dev json-c-dev cmocka-dev
|
||||
+ userspace-rcu-dev json-c-dev cmocka-dev libedit-dev
|
||||
- name: dependencies-fedora
|
||||
if: ${{ matrix.os == 'fedora:rawhide' }}
|
||||
run: >
|
||||
@@ -76,6 +88,7 @@ jobs:
|
||||
userspace-rcu-devel
|
||||
json-c-devel
|
||||
libcmocka-devel
|
||||
+ libedit-devel
|
||||
- name: checkout
|
||||
uses: actions/checkout@v1
|
||||
- name: build and test
|
@ -0,0 +1,40 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Wilck <mwilck@suse.com>
|
||||
Date: Tue, 16 Aug 2022 23:38:18 +0200
|
||||
Subject: [PATCH] GitHub workflows: foreign.yaml: switch to Debian 11
|
||||
(bullseye)
|
||||
|
||||
Building the containers in the build-multipath project recently
|
||||
started failing for buster/s390x and buster/ppc64el. That failure
|
||||
had nothing to do with the switch to libedit.
|
||||
|
||||
It's about time to switch to bullseye anyway.
|
||||
|
||||
Signed-off-by: Martin Wilck <mwilck@suse.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
.github/workflows/foreign.yaml | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/.github/workflows/foreign.yaml b/.github/workflows/foreign.yaml
|
||||
index 32915186..f6e69709 100644
|
||||
--- a/.github/workflows/foreign.yaml
|
||||
+++ b/.github/workflows/foreign.yaml
|
||||
@@ -13,7 +13,7 @@ jobs:
|
||||
runs-on: ubuntu-20.04
|
||||
strategy:
|
||||
matrix:
|
||||
- os: [buster]
|
||||
+ os: [bullseye]
|
||||
arch: ['ppc64le', 'aarch64', 's390x']
|
||||
container: mwilck/multipath-build-${{ matrix.os }}-${{ matrix.arch }}
|
||||
steps:
|
||||
@@ -44,7 +44,7 @@ jobs:
|
||||
needs: build
|
||||
strategy:
|
||||
matrix:
|
||||
- os: [buster]
|
||||
+ os: [bullseye]
|
||||
arch: ['ppc64le', 'aarch64', 's390x']
|
||||
steps:
|
||||
- name: get binaries
|
@ -15,10 +15,10 @@ Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
3 files changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/Makefile.inc b/Makefile.inc
|
||||
index bcd2212a..40cfbd0c 100644
|
||||
index ad7afd04..03450610 100644
|
||||
--- a/Makefile.inc
|
||||
+++ b/Makefile.inc
|
||||
@@ -76,7 +76,7 @@ endif
|
||||
@@ -81,7 +81,7 @@ endif
|
||||
prefix =
|
||||
exec_prefix = $(prefix)
|
||||
usr_prefix = $(prefix)
|
@ -43,7 +43,7 @@ index 8d15d2ea..eff690fd 100644
|
||||
udev_device_get_properties_list_entry(udev)) {
|
||||
|
||||
diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5
|
||||
index c2d34f18..18a55b70 100644
|
||||
index acdd1ae6..5ab770ba 100644
|
||||
--- a/multipath/multipath.conf.5
|
||||
+++ b/multipath/multipath.conf.5
|
||||
@@ -1348,9 +1348,14 @@ keywords. Both are regular expressions. For a full description of these keywords
|
@ -45,7 +45,7 @@ index ab8b26e7..f06fcbf9 100644
|
||||
|
||||
conf->processed_main_config = 1;
|
||||
diff --git a/libmultipath/config.h b/libmultipath/config.h
|
||||
index 36d40157..115b463b 100644
|
||||
index fdcdff0a..affba937 100644
|
||||
--- a/libmultipath/config.h
|
||||
+++ b/libmultipath/config.h
|
||||
@@ -9,6 +9,7 @@
|
||||
@ -57,7 +57,7 @@ index 36d40157..115b463b 100644
|
||||
enum devtypes {
|
||||
DEV_NONE,
|
||||
diff --git a/multipath/multipath.rules b/multipath/multipath.rules
|
||||
index 9df11a95..0486bf70 100644
|
||||
index f993d996..68c30644 100644
|
||||
--- a/multipath/multipath.rules
|
||||
+++ b/multipath/multipath.rules
|
||||
@@ -9,6 +9,7 @@ IMPORT{cmdline}="nompath"
|
@ -13,10 +13,10 @@ Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
1 file changed, 18 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/Makefile.inc b/Makefile.inc
|
||||
index 40cfbd0c..307b6b4d 100644
|
||||
index 03450610..2cf6e85f 100644
|
||||
--- a/Makefile.inc
|
||||
+++ b/Makefile.inc
|
||||
@@ -136,18 +136,30 @@ ERROR_DISCARDED_QUALIFIERS := $(call TEST_CC_OPTION,-Werror=discarded-qualifiers
|
||||
@@ -141,18 +141,30 @@ ERROR_DISCARDED_QUALIFIERS := $(call TEST_CC_OPTION,-Werror=discarded-qualifiers
|
||||
WNOCLOBBERED := $(call TEST_CC_OPTION,-Wno-clobbered -Wno-error=clobbered,)
|
||||
WFORMATOVERFLOW := $(call TEST_CC_OPTION,-Wformat-overflow=2,)
|
||||
|
@ -14,10 +14,10 @@ Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
2 files changed, 8 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
|
||||
index 0d8a558c..0c73b754 100644
|
||||
index 15560f8c..2339c9a9 100644
|
||||
--- a/libmultipath/discovery.c
|
||||
+++ b/libmultipath/discovery.c
|
||||
@@ -1177,13 +1177,9 @@ parse_vpd_pg83(const unsigned char *in, size_t in_len,
|
||||
@@ -1175,13 +1175,9 @@ parse_vpd_pg83(const unsigned char *in, size_t in_len,
|
||||
good_len = 8;
|
||||
break;
|
||||
case 2:
|
||||
@ -33,7 +33,7 @@ index 0d8a558c..0c73b754 100644
|
||||
good_len = 8;
|
||||
break;
|
||||
default:
|
||||
@@ -1201,10 +1197,6 @@ parse_vpd_pg83(const unsigned char *in, size_t in_len,
|
||||
@@ -1199,10 +1195,6 @@ parse_vpd_pg83(const unsigned char *in, size_t in_len,
|
||||
break;
|
||||
case 0x8:
|
||||
/* SCSI Name: Prio 3 */
|
@ -11,10 +11,10 @@ Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/Makefile.inc b/Makefile.inc
|
||||
index 307b6b4d..8f64c700 100644
|
||||
index 2cf6e85f..7277cf5f 100644
|
||||
--- a/Makefile.inc
|
||||
+++ b/Makefile.inc
|
||||
@@ -11,7 +11,7 @@
|
||||
@@ -16,7 +16,7 @@ READLINE = libedit
|
||||
|
||||
# List of scsi device handler modules to load on boot, e.g.
|
||||
# SCSI_DH_MODULES_PRELOAD := scsi_dh_alua scsi_dh_rdac
|
@ -1,6 +1,6 @@
|
||||
Name: device-mapper-multipath
|
||||
Version: 0.9.0
|
||||
Release: 2%{?dist}
|
||||
Release: 3%{?dist}
|
||||
Summary: Tools to manage multipath devices using device-mapper
|
||||
License: GPLv2
|
||||
URL: http://christophe.varoqui.free.fr/
|
||||
@ -14,25 +14,62 @@ Patch0001: 0001-github-workflows-switch-to-fedora-36.patch
|
||||
Patch0002: 0002-multipath-tools-fix-multipath-ll-bug-for-Native-NVME.patch
|
||||
Patch0003: 0003-multipath-tools-update-Huawei-OceanStor-NVMe-vendor-.patch
|
||||
Patch0004: 0004-multipath-tools-update-Generic-NVMe-vendor-regex-in-.patch
|
||||
Patch0005: 0005-libmultipath-unset-detect_checker-for-clariion-Unity.patch
|
||||
Patch0006: 0006-libmultipath-fix-find_multipaths_timeout-for-unknown.patch
|
||||
Patch0007: 0007-RH-fixup-udev-rules-for-redhat.patch
|
||||
Patch0008: 0008-RH-Remove-the-property-blacklist-exception-builtin.patch
|
||||
Patch0009: 0009-RH-don-t-start-without-a-config-file.patch
|
||||
Patch0010: 0010-RH-Fix-nvme-function-missing-argument.patch
|
||||
Patch0011: 0011-RH-use-rpm-optflags-if-present.patch
|
||||
Patch0012: 0012-RH-add-mpathconf.patch
|
||||
Patch0013: 0013-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch
|
||||
Patch0014: 0014-RH-reset-default-find_mutipaths-value-to-off.patch
|
||||
Patch0015: 0015-RH-attempt-to-get-ANA-info-via-sysfs-first.patch
|
||||
Patch0016: 0016-RH-make-parse_vpd_pg83-match-scsi_id-output.patch
|
||||
Patch0017: 0017-RH-add-scsi-device-handlers-to-modules-load.d.patch
|
||||
Patch0005: 0005-libmultipath-fix-find_multipaths_timeout-for-unknown.patch
|
||||
Patch0006: 0006-multipath-tools-update-devel-repo-info-in-README.md.patch
|
||||
Patch0007: 0007-multipath-tools-delete-README.alua.patch
|
||||
Patch0008: 0008-multipath-tools-add-ALUA-info-to-README.md.patch
|
||||
Patch0009: 0009-libmultipath-alua-remove-get_sysfs_pg83.patch
|
||||
Patch0010: 0010-libmultipath-remove-sysfs_get_binary.patch
|
||||
Patch0011: 0011-libmultipath-sysfs_bin_attr_get_value-no-error-if-bu.patch
|
||||
Patch0012: 0012-libmultipath-common-code-path-for-sysfs_attr_get_val.patch
|
||||
Patch0013: 0013-libmultipath-sanitize-error-checking-in-sysfs-access.patch
|
||||
Patch0014: 0014-libmultipath-get-rid-of-PATH_SIZE.patch
|
||||
Patch0015: 0015-libmultipath-sysfs_attr_get_value-don-t-return-0-if-.patch
|
||||
Patch0016: 0016-libmultipath-sysfs_attr_set_value-don-t-return-0-on-.patch
|
||||
Patch0017: 0017-libmultipath-sysfs-cleanup-file-descriptors-on-pthre.patch
|
||||
Patch0018: 0018-libmultipath-multipathd-log-failure-setting-sysfs-at.patch
|
||||
Patch0019: 0019-multipath-tests-expect_condlog-skip-depending-on-ver.patch
|
||||
Patch0020: 0020-multipath-tests-__wrap_dlog-print-log-message.patch
|
||||
Patch0021: 0021-multipath-tests-add-sysfs-test.patch
|
||||
Patch0022: 0022-libmultipath.version-bump-version-for-sysfs-accessor.patch
|
||||
Patch0023: 0023-libmultipath-unset-detect_checker-for-clariion-Unity.patch
|
||||
Patch0024: 0024-libmultipath-spelling-cplusplus.patch
|
||||
Patch0025: 0025-libmultipath-spelling-ascii.patch
|
||||
Patch0026: 0026-libmultipath-spelling-progress.patch
|
||||
Patch0027: 0027-multipath-tools-spelling-fixes.patch
|
||||
Patch0028: 0028-multipath-tools-remove-list-of-rebranded-arrays-vend.patch
|
||||
Patch0029: 0029-multipath-tools-correct-CLARiiON-info-from-multipath.patch
|
||||
Patch0030: 0030-multipath-tools-add-basic-info-on-how-to-use-multipa.patch
|
||||
Patch0031: 0031-multipathd-factor-out-the-code-to-flush-a-map-with-n.patch
|
||||
Patch0032: 0032-libmultipath-return-success-if-we-raced-to-remove-a-.patch
|
||||
Patch0033: 0033-multipathd-Handle-losing-all-path-in-update_map.patch
|
||||
Patch0034: 0034-multipath-fix-systemd-timers-in-the-initramfs.patch
|
||||
Patch0035: 0035-multipathd-Add-missing-ctype-include.patch
|
||||
Patch0036: 0036-multipathd-replace-libreadline-with-libedit.patch
|
||||
Patch0037: 0037-libmultipath-convert-license-of-strbuf-code-to-GPL-2.patch
|
||||
Patch0038: 0038-github-workflows-build-and-unittest.yaml-add-libedit.patch
|
||||
Patch0039: 0039-github-workflows-coverity.yaml-add-libedit-dev.patch
|
||||
Patch0040: 0040-github-workflows-abi.yaml-add-libedit-dev.patch
|
||||
Patch0041: 0041-GitHub-workflows-native.yaml-add-libedit-dev-except-.patch
|
||||
Patch0042: 0042-GitHub-workflows-foreign.yaml-switch-to-Debian-11-bu.patch
|
||||
Patch0043: 0043-RH-fixup-udev-rules-for-redhat.patch
|
||||
Patch0044: 0044-RH-Remove-the-property-blacklist-exception-builtin.patch
|
||||
Patch0045: 0045-RH-don-t-start-without-a-config-file.patch
|
||||
Patch0046: 0046-RH-Fix-nvme-function-missing-argument.patch
|
||||
Patch0047: 0047-RH-use-rpm-optflags-if-present.patch
|
||||
Patch0048: 0048-RH-add-mpathconf.patch
|
||||
Patch0049: 0049-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch
|
||||
Patch0050: 0050-RH-reset-default-find_mutipaths-value-to-off.patch
|
||||
Patch0051: 0051-RH-attempt-to-get-ANA-info-via-sysfs-first.patch
|
||||
Patch0052: 0052-RH-make-parse_vpd_pg83-match-scsi_id-output.patch
|
||||
Patch0053: 0053-RH-add-scsi-device-handlers-to-modules-load.d.patch
|
||||
|
||||
# runtime
|
||||
Requires: %{name}-libs = %{version}-%{release}
|
||||
Requires: kpartx = %{version}-%{release}
|
||||
Requires: device-mapper >= 1.02.96
|
||||
Requires: userspace-rcu
|
||||
Requires: libedit
|
||||
Requires(post): systemd-units
|
||||
Requires(preun): systemd-units
|
||||
Requires(postun): systemd-units
|
||||
@ -50,7 +87,7 @@ Conflicts: udisks2 < 2.8.0-2
|
||||
# build/setup
|
||||
BuildRequires: libaio-devel, device-mapper-devel >= 1.02.89
|
||||
BuildRequires: libselinux-devel, libsepol-devel
|
||||
BuildRequires: readline-devel, ncurses-devel
|
||||
BuildRequires: libedit-devel, ncurses-devel
|
||||
BuildRequires: systemd-units, systemd-devel
|
||||
BuildRequires: json-c-devel, perl-interpreter, pkgconfig, gcc
|
||||
BuildRequires: userspace-rcu-devel
|
||||
@ -172,7 +209,6 @@ fi
|
||||
/usr/lib/modules-load.d/multipath.conf
|
||||
/usr/lib/modules-load.d/scsi_dh.conf
|
||||
%doc README.md
|
||||
%doc README.alua
|
||||
%doc multipath.conf
|
||||
%dir /etc/multipath
|
||||
|
||||
@ -227,6 +263,18 @@ fi
|
||||
%{_pkgconfdir}/libdmmp.pc
|
||||
|
||||
%changelog
|
||||
* Fri Aug 19 2022 Benjamin Marzinski <bmarzins@redhat.com> - 0.9.0-3
|
||||
- Update to the head of the upstream staging branch
|
||||
* Patches 0005-0042 are from the upstream staging branch
|
||||
* Previous patches 0005 & 0006 are now patches 0023 & 0005
|
||||
- Rename redhat patches
|
||||
* Previous patches 0007-0017 are now patches 0043-0053
|
||||
- Change from using readline to libedit
|
||||
* readline is licensed GPL v3, and multipathd includes code
|
||||
licensed gpl v2.
|
||||
- Remove README.alua
|
||||
* information moved to README.md
|
||||
|
||||
* Thu Jul 21 2022 Fedora Release Engineering <releng@fedoraproject.org> - 0.9.0-2
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user