import device-mapper-multipath-0.8.7-3.el9
This commit is contained in:
parent
9ddf9f007a
commit
c4837d47aa
@ -1 +1 @@
|
|||||||
a8afc76e75aeaba7e21c066ca95e236be3bfc5b4 SOURCES/multipath-tools-0.8.6.tgz
|
067d668de8e3a70b7c176bbf0c0616d5835bbe44 SOURCES/multipath-tools-0.8.7.tgz
|
||||||
|
2
.gitignore
vendored
2
.gitignore
vendored
@ -1 +1 @@
|
|||||||
SOURCES/multipath-tools-0.8.6.tgz
|
SOURCES/multipath-tools-0.8.7.tgz
|
||||||
|
@ -0,0 +1,45 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xose Vazquez Perez <xose.vazquez@gmail.com>
|
||||||
|
Date: Wed, 8 Sep 2021 22:33:54 +0200
|
||||||
|
Subject: [PATCH] multipath-tools: add info about IO affinity path selector to
|
||||||
|
manpage
|
||||||
|
|
||||||
|
Added in 5.11: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e4d2e82b2300b03f66b3ca8417590c86e661fab1
|
||||||
|
|
||||||
|
Cc: Mike Christie <michael.christie@oracle.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, 5 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5
|
||||||
|
index d6b8c7f6..42a15ffd 100644
|
||||||
|
--- a/multipath/multipath.conf.5
|
||||||
|
+++ b/multipath/multipath.conf.5
|
||||||
|
@@ -6,7 +6,7 @@
|
||||||
|
.\"
|
||||||
|
.\" ----------------------------------------------------------------------------
|
||||||
|
.
|
||||||
|
-.TH MULTIPATH.CONF 5 2018-05-21 Linux
|
||||||
|
+.TH MULTIPATH.CONF 5 2021-09-08 Linux
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.\" ----------------------------------------------------------------------------
|
||||||
|
@@ -210,6 +210,10 @@ of outstanding I/O to the path and its relative throughput.
|
||||||
|
estimation of future service time based on the history of previous I/O submitted
|
||||||
|
to each path.
|
||||||
|
.TP
|
||||||
|
+.I "io-affinity 0"
|
||||||
|
+(Since 5.11 kernel) Choose the path for the next bunch of I/O based on a CPU to
|
||||||
|
+path mapping the user passes in and what CPU we are executing on.
|
||||||
|
+.TP
|
||||||
|
The default is: \fBservice-time 0\fR
|
||||||
|
.RE
|
||||||
|
.
|
@ -0,0 +1,52 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: lixiaokeng <lixiaokeng@huawei.com>
|
||||||
|
Date: Mon, 13 Sep 2021 10:43:14 +0800
|
||||||
|
Subject: [PATCH] multipathd: fix missing persistent reseravtion for active
|
||||||
|
path
|
||||||
|
|
||||||
|
There are two paths(sucu as sda and adb) for one LUN. The two
|
||||||
|
paths log in, but before the two uevents have been processed
|
||||||
|
(for example there are many uevent), users use multipathd add
|
||||||
|
path /dev/sda to cause mpatha and use mpathpersist -o -I to
|
||||||
|
register prkey for mpatha. The add map uevent is after add path
|
||||||
|
uevent, the the uevent(add sdb) will delay and missing persistent
|
||||||
|
reseravtion check.
|
||||||
|
|
||||||
|
Here, we add persistent reseravtion check in update_map() which
|
||||||
|
is called ev_add_map().
|
||||||
|
|
||||||
|
Signed-off-by: Lixiaokeng <lixiaokeng@huawei.com>
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
---
|
||||||
|
multipathd/main.c | 11 +++++++++++
|
||||||
|
1 file changed, 11 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/multipathd/main.c b/multipathd/main.c
|
||||||
|
index 3aff241d..1defeaf1 100644
|
||||||
|
--- a/multipathd/main.c
|
||||||
|
+++ b/multipathd/main.c
|
||||||
|
@@ -490,6 +490,8 @@ update_map (struct multipath *mpp, struct vectors *vecs, int new_map)
|
||||||
|
{
|
||||||
|
int retries = 3;
|
||||||
|
char *params __attribute__((cleanup(cleanup_charp))) = NULL;
|
||||||
|
+ struct path *pp;
|
||||||
|
+ int i;
|
||||||
|
|
||||||
|
retry:
|
||||||
|
condlog(4, "%s: updating new map", mpp->alias);
|
||||||
|
@@ -502,6 +504,15 @@ retry:
|
||||||
|
verify_paths(mpp);
|
||||||
|
mpp->action = ACT_RELOAD;
|
||||||
|
|
||||||
|
+ if (mpp->prflag) {
|
||||||
|
+ vector_foreach_slot(mpp->paths, pp, i) {
|
||||||
|
+ if ((pp->state == PATH_UP) || (pp->state == PATH_GHOST)) {
|
||||||
|
+ /* persistent reseravtion check*/
|
||||||
|
+ mpath_pr_event_handle(pp);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (setup_map(mpp, ¶ms, vecs)) {
|
||||||
|
condlog(0, "%s: failed to setup new map in update", mpp->alias);
|
||||||
|
retries = -1;
|
@ -0,0 +1,48 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xose Vazquez Perez <xose.vazquez@gmail.com>
|
||||||
|
Date: Thu, 16 Sep 2021 00:44:49 +0200
|
||||||
|
Subject: [PATCH] multipath-tools: minor fixes to multipath.conf.5 man page
|
||||||
|
|
||||||
|
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>
|
||||||
|
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 42a15ffd..c74129bd 100644
|
||||||
|
--- a/multipath/multipath.conf.5
|
||||||
|
+++ b/multipath/multipath.conf.5
|
||||||
|
@@ -1,9 +1,9 @@
|
||||||
|
.\" ----------------------------------------------------------------------------
|
||||||
|
-.\" Update the date below if you make any significant change.
|
||||||
|
.\" Make sure there are no errors with:
|
||||||
|
.\" groff -z -wall -b -e -t multipath/multipath.conf.5
|
||||||
|
.\" man --warnings -E UTF-8 -l -Tutf8 -Z multipath/multipath.conf.5 >/dev/null
|
||||||
|
.\"
|
||||||
|
+.\" Update the date below if you make any significant change.
|
||||||
|
.\" ----------------------------------------------------------------------------
|
||||||
|
.
|
||||||
|
.TH MULTIPATH.CONF 5 2021-09-08 Linux
|
||||||
|
@@ -189,7 +189,7 @@ The default is: \fB<system dependent>\fR
|
||||||
|
.TP
|
||||||
|
.B path_selector
|
||||||
|
The default path selector algorithm to use; they are offered by the
|
||||||
|
-kernel multipath target. There are three selector algorithms:
|
||||||
|
+kernel multipath target:
|
||||||
|
.RS
|
||||||
|
.TP 12
|
||||||
|
.I "round-robin 0"
|
||||||
|
@@ -206,7 +206,7 @@ of outstanding I/O to the path.
|
||||||
|
of outstanding I/O to the path and its relative throughput.
|
||||||
|
.TP
|
||||||
|
.I "historical-service-time 0"
|
||||||
|
-(Since 5.8 kernel) Choose the path for the next bunch of IOs based on the
|
||||||
|
+(Since 5.8 kernel) Choose the path for the next bunch of I/O based on the
|
||||||
|
estimation of future service time based on the history of previous I/O submitted
|
||||||
|
to each path.
|
||||||
|
.TP
|
@ -0,0 +1,39 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xose Vazquez Perez <xose.vazquez@gmail.com>
|
||||||
|
Date: Sat, 25 Sep 2021 00:27:36 +0200
|
||||||
|
Subject: [PATCH] multipath-tools: make IBM/XIV config work with alua and
|
||||||
|
multibus
|
||||||
|
|
||||||
|
And add recommended pgfailback value.
|
||||||
|
|
||||||
|
ALUA is supported since XIV_Gen2 and microcode 10.2.1
|
||||||
|
(All ports across all controllers in single Target Port Group)
|
||||||
|
|
||||||
|
https://www.ibm.com/support/pages/ibm-flashsystem%C2%AE-a9000-and-a9000r-hyperswap-solution-deployment-linux%C2%AE-ibm-z-systems%C2%AE
|
||||||
|
https://www.google.com/search?q=%222810XIV%22+%22path_grouping_policy%22+site%3Aibm.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>
|
||||||
|
---
|
||||||
|
libmultipath/hwtable.c | 3 ++-
|
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c
|
||||||
|
index 0caac0da..72f81c60 100644
|
||||||
|
--- a/libmultipath/hwtable.c
|
||||||
|
+++ b/libmultipath/hwtable.c
|
||||||
|
@@ -712,7 +712,8 @@ static struct hwentry default_hw[] = {
|
||||||
|
.vendor = "(XIV|IBM)",
|
||||||
|
.product = "(NEXTRA|2810XIV)",
|
||||||
|
.no_path_retry = NO_PATH_RETRY_QUEUE,
|
||||||
|
- .pgpolicy = MULTIBUS,
|
||||||
|
+ .pgpolicy = GROUP_BY_PRIO,
|
||||||
|
+ .pgfailback = 15,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/* TMS RamSan / FlashSystem 710/720/810/820/840/900 */
|
@ -0,0 +1,32 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Luca BRUNO <luca.bruno@coreos.com>
|
||||||
|
Date: Fri, 24 Sep 2021 09:34:01 +0000
|
||||||
|
Subject: [PATCH] multipathd.socket: add missing conditions from service unit
|
||||||
|
|
||||||
|
This aligns 'multipathd' socket and service units, by adding the
|
||||||
|
start conditions that are set on the service but not on the socket.
|
||||||
|
It should help avoiding situations where the socket unit ends up
|
||||||
|
marked as failed after hitting its retry-limit.
|
||||||
|
|
||||||
|
Fixes: https://github.com/opensvc/multipath-tools/issues/15
|
||||||
|
Signed-off-by: Luca BRUNO <luca.bruno@coreos.com>
|
||||||
|
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
---
|
||||||
|
multipathd/multipathd.socket | 3 +++
|
||||||
|
1 file changed, 3 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/multipathd/multipathd.socket b/multipathd/multipathd.socket
|
||||||
|
index 0ed4a1f7..c777e5e3 100644
|
||||||
|
--- a/multipathd/multipathd.socket
|
||||||
|
+++ b/multipathd/multipathd.socket
|
||||||
|
@@ -1,6 +1,9 @@
|
||||||
|
[Unit]
|
||||||
|
Description=multipathd control socket
|
||||||
|
DefaultDependencies=no
|
||||||
|
+ConditionKernelCommandLine=!nompath
|
||||||
|
+ConditionKernelCommandLine=!multipath=off
|
||||||
|
+ConditionVirtualization=!container
|
||||||
|
Before=sockets.target
|
||||||
|
|
||||||
|
[Socket]
|
@ -0,0 +1,40 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xose Vazquez Perez <xose.vazquez@gmail.com>
|
||||||
|
Date: Tue, 28 Sep 2021 18:52:10 +0200
|
||||||
|
Subject: [PATCH] multipath-tools: make IBM/2107900 (DS8000) config work with
|
||||||
|
alua and multibus
|
||||||
|
|
||||||
|
ALUA is supported since the beginning:
|
||||||
|
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/scsi/device_handler/scsi_dh_alua.c?id=057ea7c9683c3d684128cced796f03c179ecf1c2#n683
|
||||||
|
|
||||||
|
... the DS8000 is an Asymmetric Logical Unit Access (ALUA) capable storage array,
|
||||||
|
pag#160(144): https://www.redbooks.ibm.com/redbooks/pdfs/sg248887.pdf
|
||||||
|
|
||||||
|
kernel log:
|
||||||
|
https://marc.info/?l=linux-scsi&m=156407413807511&q=mbox
|
||||||
|
|
||||||
|
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>
|
||||||
|
---
|
||||||
|
libmultipath/hwtable.c | 3 ++-
|
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c
|
||||||
|
index 72f81c60..f115c4f9 100644
|
||||||
|
--- a/libmultipath/hwtable.c
|
||||||
|
+++ b/libmultipath/hwtable.c
|
||||||
|
@@ -656,7 +656,8 @@ static struct hwentry default_hw[] = {
|
||||||
|
.vendor = "IBM",
|
||||||
|
.product = "^2107900",
|
||||||
|
.no_path_retry = NO_PATH_RETRY_QUEUE,
|
||||||
|
- .pgpolicy = MULTIBUS,
|
||||||
|
+ .pgpolicy = GROUP_BY_PRIO,
|
||||||
|
+ .pgfailback = -FAILBACK_IMMEDIATE,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// Storwize V5000 and V7000 lines / SAN Volume Controller (SVC) / Flex System V7000 /
|
@ -0,0 +1,35 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xose Vazquez Perez <xose.vazquez@gmail.com>
|
||||||
|
Date: Tue, 28 Sep 2021 19:20:59 +0200
|
||||||
|
Subject: [PATCH] multipath-tools: make EMC/SYMMETRIX config work with alua and
|
||||||
|
multibus
|
||||||
|
|
||||||
|
ALUA is supported since VMAX3 and HYPERMAX OS 5977.811.784, pag#113:
|
||||||
|
https://www.delltechnologies.com/en-us/collaterals/unauth/technical-guides-support-information/products/storage-2/docu5128.pdf
|
||||||
|
|
||||||
|
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>
|
||||||
|
---
|
||||||
|
libmultipath/hwtable.c | 3 ++-
|
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c
|
||||||
|
index f115c4f9..7095aaf1 100644
|
||||||
|
--- a/libmultipath/hwtable.c
|
||||||
|
+++ b/libmultipath/hwtable.c
|
||||||
|
@@ -329,8 +329,9 @@ static struct hwentry default_hw[] = {
|
||||||
|
/* Symmetrix / DMX / VMAX / PowerMax */
|
||||||
|
.vendor = "EMC",
|
||||||
|
.product = "SYMMETRIX",
|
||||||
|
- .pgpolicy = MULTIBUS,
|
||||||
|
+ .pgpolicy = GROUP_BY_PRIO,
|
||||||
|
.no_path_retry = 6,
|
||||||
|
+ .pgfailback = -FAILBACK_IMMEDIATE,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/* DGC CLARiiON CX/AX / VNX and Unity */
|
@ -0,0 +1,37 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xose Vazquez Perez <xose.vazquez@gmail.com>
|
||||||
|
Date: Tue, 28 Sep 2021 19:31:21 +0200
|
||||||
|
Subject: [PATCH] multipath-tools: make EMC/Invista config work with alua and
|
||||||
|
multibus
|
||||||
|
|
||||||
|
Optimal Path Management (OPM) was introduced with VPLEX 5.5 to improve VPLEX
|
||||||
|
performance. OPM uses the ALUA mechanism to spread the I/O load across VPLEX directors
|
||||||
|
while gaining cache locality, pag #187:
|
||||||
|
https://www.delltechnologies.com/en-us/collaterals/unauth/technical-guides-support-information/products/storage-2/docu5128.pdf
|
||||||
|
|
||||||
|
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>
|
||||||
|
---
|
||||||
|
libmultipath/hwtable.c | 3 ++-
|
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c
|
||||||
|
index 7095aaf1..4e8b52ff 100644
|
||||||
|
--- a/libmultipath/hwtable.c
|
||||||
|
+++ b/libmultipath/hwtable.c
|
||||||
|
@@ -350,8 +350,9 @@ static struct hwentry default_hw[] = {
|
||||||
|
.vendor = "EMC",
|
||||||
|
.product = "Invista",
|
||||||
|
.bl_product = "LUNZ",
|
||||||
|
- .pgpolicy = MULTIBUS,
|
||||||
|
+ .pgpolicy = GROUP_BY_PRIO,
|
||||||
|
.no_path_retry = 5,
|
||||||
|
+ .pgfailback = -FAILBACK_IMMEDIATE,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/* XtremIO */
|
@ -0,0 +1,35 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xose Vazquez Perez <xose.vazquez@gmail.com>
|
||||||
|
Date: Tue, 28 Sep 2021 22:15:56 +0200
|
||||||
|
Subject: [PATCH] multipath-tools: make "COMPELNT/Compellent Vol" config work
|
||||||
|
with alua and multibus
|
||||||
|
|
||||||
|
ALUA is needed by SAS arrays, pag#124:
|
||||||
|
https://downloads.dell.com/manuals/all-products/esuprt_solutions_int/esuprt_solutions_int_solutions_resources/general-solution-resources_white-papers2_en-us.pdf
|
||||||
|
|
||||||
|
Cc: Sean McGinnis <sean_mcginnis@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>
|
||||||
|
---
|
||||||
|
libmultipath/hwtable.c | 3 ++-
|
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c
|
||||||
|
index 4e8b52ff..7fc5bc04 100644
|
||||||
|
--- a/libmultipath/hwtable.c
|
||||||
|
+++ b/libmultipath/hwtable.c
|
||||||
|
@@ -368,7 +368,8 @@ static struct hwentry default_hw[] = {
|
||||||
|
*/
|
||||||
|
.vendor = "COMPELNT",
|
||||||
|
.product = "Compellent Vol",
|
||||||
|
- .pgpolicy = MULTIBUS,
|
||||||
|
+ .pgpolicy = GROUP_BY_PRIO,
|
||||||
|
+ .pgfailback = -FAILBACK_IMMEDIATE,
|
||||||
|
.no_path_retry = NO_PATH_RETRY_QUEUE,
|
||||||
|
},
|
||||||
|
{
|
@ -1,51 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
|
||||||
Date: Thu, 25 Mar 2021 13:05:10 -0500
|
|
||||||
Subject: [PATCH] RH: make parse_vpd_pg83 match scsi_id output
|
|
||||||
|
|
||||||
Red Hat sets ID_SERIAL based on the result of scsi_id, instead of using
|
|
||||||
the result of sg_inq and 55-scsi-sg3_id.rules. Make parse_vpd_pg83 match
|
|
||||||
that.
|
|
||||||
|
|
||||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
|
||||||
---
|
|
||||||
libmultipath/discovery.c | 18 ++----------------
|
|
||||||
1 file changed, 2 insertions(+), 16 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
|
|
||||||
index ec99a7aa..2704270e 100644
|
|
||||||
--- a/libmultipath/discovery.c
|
|
||||||
+++ b/libmultipath/discovery.c
|
|
||||||
@@ -1135,12 +1135,9 @@ parse_vpd_pg83(const unsigned char *in, size_t in_len,
|
|
||||||
naa_prio = 7;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
- /* IEEE Extended: Prio 6 */
|
|
||||||
- naa_prio = 6;
|
|
||||||
- break;
|
|
||||||
case 3:
|
|
||||||
- /* IEEE Locally assigned: Prio 1 */
|
|
||||||
- naa_prio = 1;
|
|
||||||
+ /* IEEE Extended or Locally assigned: Prio 6 */
|
|
||||||
+ naa_prio = 6;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/* Default: no priority */
|
|
||||||
@@ -1159,17 +1156,6 @@ parse_vpd_pg83(const unsigned char *in, size_t in_len,
|
|
||||||
vpd = d;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
- case 0x8:
|
|
||||||
- /* SCSI Name: Prio 3 */
|
|
||||||
- if (memcmp(d + 4, "eui.", 4) &&
|
|
||||||
- memcmp(d + 4, "naa.", 4) &&
|
|
||||||
- memcmp(d + 4, "iqn.", 4))
|
|
||||||
- break;
|
|
||||||
- if (prio < 3) {
|
|
||||||
- prio = 3;
|
|
||||||
- vpd = d;
|
|
||||||
- }
|
|
||||||
- break;
|
|
||||||
case 0x1:
|
|
||||||
/* T-10 Vendor ID: Prio 2 */
|
|
||||||
if (prio < 2) {
|
|
@ -0,0 +1,35 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xose Vazquez Perez <xose.vazquez@gmail.com>
|
||||||
|
Date: Tue, 28 Sep 2021 22:39:17 +0200
|
||||||
|
Subject: [PATCH] multipath-tools: remove Compellent maintainer
|
||||||
|
|
||||||
|
e-mail was bounced: 550 5.1.1 User Unknown
|
||||||
|
|
||||||
|
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>
|
||||||
|
---
|
||||||
|
libmultipath/hwtable.c | 6 +-----
|
||||||
|
1 file changed, 1 insertion(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c
|
||||||
|
index 7fc5bc04..763982cd 100644
|
||||||
|
--- a/libmultipath/hwtable.c
|
||||||
|
+++ b/libmultipath/hwtable.c
|
||||||
|
@@ -361,11 +361,7 @@ static struct hwentry default_hw[] = {
|
||||||
|
.pgpolicy = MULTIBUS,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
- /*
|
||||||
|
- * SC Series, formerly Compellent
|
||||||
|
- *
|
||||||
|
- * Maintainer: Sean McGinnis <sean_mcginnis@dell.com>
|
||||||
|
- */
|
||||||
|
+ /* SC Series, formerly Compellent */
|
||||||
|
.vendor = "COMPELNT",
|
||||||
|
.product = "Compellent Vol",
|
||||||
|
.pgpolicy = GROUP_BY_PRIO,
|
@ -0,0 +1,35 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Martin Wilck <mwilck@suse.com>
|
||||||
|
Date: Wed, 20 Oct 2021 20:44:54 +0200
|
||||||
|
Subject: [PATCH] Revert "multipath-tools: make EMC/Invista config work with
|
||||||
|
alua and multibus"
|
||||||
|
|
||||||
|
This reverts commit 309ff281aaa07e862540d3d645a8263f3e9baaed.
|
||||||
|
|
||||||
|
Mail from <Wayne.Berthiaume@dell.com>, 20210930:
|
||||||
|
|
||||||
|
"OPM is no longer supported in the Dell VPLEX product. If we at Dell had
|
||||||
|
wished to change the default device stanzas for any of our products they
|
||||||
|
would have been done when the product and/or feature is released.
|
||||||
|
Please remove this patch as well. It is not needed."
|
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
---
|
||||||
|
libmultipath/hwtable.c | 3 +--
|
||||||
|
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c
|
||||||
|
index 763982cd..211087ad 100644
|
||||||
|
--- a/libmultipath/hwtable.c
|
||||||
|
+++ b/libmultipath/hwtable.c
|
||||||
|
@@ -350,9 +350,8 @@ static struct hwentry default_hw[] = {
|
||||||
|
.vendor = "EMC",
|
||||||
|
.product = "Invista",
|
||||||
|
.bl_product = "LUNZ",
|
||||||
|
- .pgpolicy = GROUP_BY_PRIO,
|
||||||
|
+ .pgpolicy = MULTIBUS,
|
||||||
|
.no_path_retry = 5,
|
||||||
|
- .pgfailback = -FAILBACK_IMMEDIATE,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/* XtremIO */
|
@ -1,69 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
|
||||||
Date: Tue, 11 May 2021 11:15:47 -0500
|
|
||||||
Subject: [PATCH] multipathd: don't fail to remove path once the map is removed
|
|
||||||
|
|
||||||
In ev_remove_path(), if update_mpp_paths() fails, we delete the entire
|
|
||||||
map. However, since update_mpp_paths() happens before we call
|
|
||||||
set_path_removed(), pp->initialized isn't set to INIT_REMOVED, so
|
|
||||||
remove_map_and_stop_waiter() doesn't remove the path when in removes the
|
|
||||||
map. But with the map removed, there's nothing to keep us from removing
|
|
||||||
the path.
|
|
||||||
|
|
||||||
Call set_path_removed() before update_mpp_paths() to avoid the odd case
|
|
||||||
of ev_remove_path() removing the map but not the path.
|
|
||||||
|
|
||||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
|
||||||
---
|
|
||||||
libmultipath/structs_vec.c | 4 ++--
|
|
||||||
multipathd/main.c | 13 ++++++++-----
|
|
||||||
2 files changed, 10 insertions(+), 7 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/libmultipath/structs_vec.c b/libmultipath/structs_vec.c
|
|
||||||
index d242c06b..75390198 100644
|
|
||||||
--- a/libmultipath/structs_vec.c
|
|
||||||
+++ b/libmultipath/structs_vec.c
|
|
||||||
@@ -45,8 +45,8 @@ int update_mpp_paths(struct multipath *mpp, vector pathvec)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Avoid adding removed paths to the map again
|
|
||||||
- * when we reload it. Such paths may exist if
|
|
||||||
- * domap fails in ev_remove_path().
|
|
||||||
+ * when we reload it. Such paths may exist in
|
|
||||||
+ * ev_remove_paths() or if it returns failure.
|
|
||||||
*/
|
|
||||||
pp1 = find_path_by_devt(pathvec, pp->dev_t);
|
|
||||||
if (pp1 && pp->initialized != INIT_REMOVED &&
|
|
||||||
diff --git a/multipathd/main.c b/multipathd/main.c
|
|
||||||
index 102946bf..449ce384 100644
|
|
||||||
--- a/multipathd/main.c
|
|
||||||
+++ b/multipathd/main.c
|
|
||||||
@@ -1199,6 +1199,13 @@ ev_remove_path (struct path *pp, struct vectors * vecs, int need_do_map)
|
|
||||||
* avoid referring to the map of an orphaned path
|
|
||||||
*/
|
|
||||||
if ((mpp = pp->mpp)) {
|
|
||||||
+ /*
|
|
||||||
+ * Mark the path as removed. In case of success, we
|
|
||||||
+ * will delete it for good. Otherwise, it will be deleted
|
|
||||||
+ * later, unless all attempts to reload this map fail.
|
|
||||||
+ */
|
|
||||||
+ set_path_removed(pp);
|
|
||||||
+
|
|
||||||
/*
|
|
||||||
* transform the mp->pg vector of vectors of paths
|
|
||||||
* into a mp->params string to feed the device-mapper
|
|
||||||
@@ -1210,13 +1217,9 @@ ev_remove_path (struct path *pp, struct vectors * vecs, int need_do_map)
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- * Mark the path as removed. In case of success, we
|
|
||||||
- * will delete it for good. Otherwise, it will be deleted
|
|
||||||
- * later, unless all attempts to reload this map fail.
|
|
||||||
- * Note: we have to explicitly remove pp from mpp->paths,
|
|
||||||
+ * we have to explicitly remove pp from mpp->paths,
|
|
||||||
* update_mpp_paths() doesn't do that.
|
|
||||||
*/
|
|
||||||
- set_path_removed(pp);
|
|
||||||
i = find_slot(mpp->paths, pp);
|
|
||||||
if (i != -1)
|
|
||||||
vector_del_slot(mpp->paths, i);
|
|
@ -0,0 +1,38 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Martin Wilck <mwilck@suse.com>
|
||||||
|
Date: Wed, 20 Oct 2021 20:46:09 +0200
|
||||||
|
Subject: [PATCH] Revert "multipath-tools: make EMC/SYMMETRIX config work with
|
||||||
|
alua and multibus"
|
||||||
|
|
||||||
|
This reverts commit 831af0dbfa171cd39d968ba6174669f11a278be9.
|
||||||
|
|
||||||
|
Mail from "berthiaume, wayne" <Wayne.Berthiaume@dell.com>, 210930:
|
||||||
|
|
||||||
|
"As a representative of Dell I request this patch be withdrawn. If we had
|
||||||
|
wanted the default stanza changed we would have already implemented it.
|
||||||
|
Also for your information we only advertise the entire enterprise storage
|
||||||
|
product line (DMX, VMAX, VMAX AFA, PowerMax) as SYMMETRIX in the VPD page.
|
||||||
|
The ALUA capability is only used for mobility devices in an SRDF/Metro
|
||||||
|
configuration and the current device stanza still works well in all of our
|
||||||
|
testing."
|
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
---
|
||||||
|
libmultipath/hwtable.c | 3 +--
|
||||||
|
1 file changed, 1 insertion(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c
|
||||||
|
index 211087ad..a8ba28e3 100644
|
||||||
|
--- a/libmultipath/hwtable.c
|
||||||
|
+++ b/libmultipath/hwtable.c
|
||||||
|
@@ -329,9 +329,8 @@ static struct hwentry default_hw[] = {
|
||||||
|
/* Symmetrix / DMX / VMAX / PowerMax */
|
||||||
|
.vendor = "EMC",
|
||||||
|
.product = "SYMMETRIX",
|
||||||
|
- .pgpolicy = GROUP_BY_PRIO,
|
||||||
|
+ .pgpolicy = MULTIBUS,
|
||||||
|
.no_path_retry = 6,
|
||||||
|
- .pgfailback = -FAILBACK_IMMEDIATE,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/* DGC CLARiiON CX/AX / VNX and Unity */
|
@ -1,26 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
|
||||||
Date: Tue, 11 May 2021 11:55:14 -0500
|
|
||||||
Subject: [PATCH] multipathd: remove duplicate orphan_paths in flush_map
|
|
||||||
|
|
||||||
remove_map_and_stop_waiter() already calls orphan_paths() so flush_map()
|
|
||||||
doesn't need to call orphan_paths() before calling
|
|
||||||
remove_map_and_stop_waiter().
|
|
||||||
|
|
||||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
|
||||||
---
|
|
||||||
multipathd/main.c | 1 -
|
|
||||||
1 file changed, 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/multipathd/main.c b/multipathd/main.c
|
|
||||||
index 449ce384..6090434c 100644
|
|
||||||
--- a/multipathd/main.c
|
|
||||||
+++ b/multipathd/main.c
|
|
||||||
@@ -660,7 +660,6 @@ flush_map(struct multipath * mpp, struct vectors * vecs, int nopaths)
|
|
||||||
else
|
|
||||||
condlog(2, "%s: map flushed", mpp->alias);
|
|
||||||
|
|
||||||
- orphan_paths(vecs->pathvec, mpp, "map flushed");
|
|
||||||
remove_map_and_stop_waiter(mpp, vecs);
|
|
||||||
|
|
||||||
return 0;
|
|
@ -15,7 +15,7 @@ Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
|||||||
3 files changed, 4 insertions(+), 4 deletions(-)
|
3 files changed, 4 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
diff --git a/Makefile.inc b/Makefile.inc
|
diff --git a/Makefile.inc b/Makefile.inc
|
||||||
index f1e23131..c593fd3b 100644
|
index d0ec9b44..2a75dc9c 100644
|
||||||
--- a/Makefile.inc
|
--- a/Makefile.inc
|
||||||
+++ b/Makefile.inc
|
+++ b/Makefile.inc
|
||||||
@@ -55,7 +55,7 @@ endif
|
@@ -55,7 +55,7 @@ endif
|
@ -1,225 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
|
||||||
Date: Tue, 11 May 2021 13:58:57 -0500
|
|
||||||
Subject: [PATCH] multipathd: fix ev_remove_path return code handling
|
|
||||||
|
|
||||||
When ev_remove_path() returned success, callers assumed that the path
|
|
||||||
(and possibly the map) had been removed. When ev_remove_path() returned
|
|
||||||
failure, callers assumed that the path had not been removed. However,
|
|
||||||
the path could be removed on both success or failure. This could cause
|
|
||||||
callers to dereference the path after it was removed.
|
|
||||||
|
|
||||||
To deal with this, make ev_remove_path() return a different symbolic
|
|
||||||
value for each outcome, and make the callers react appropriately for
|
|
||||||
the different values. Found by coverity.
|
|
||||||
|
|
||||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
|
||||||
---
|
|
||||||
multipathd/cli_handlers.c | 24 +++++++++++++++++++++--
|
|
||||||
multipathd/main.c | 41 ++++++++++++++++++++-------------------
|
|
||||||
multipathd/main.h | 14 +++++++++++++
|
|
||||||
3 files changed, 57 insertions(+), 22 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/multipathd/cli_handlers.c b/multipathd/cli_handlers.c
|
|
||||||
index 1de6ad8e..6765fcf0 100644
|
|
||||||
--- a/multipathd/cli_handlers.c
|
|
||||||
+++ b/multipathd/cli_handlers.c
|
|
||||||
@@ -752,7 +752,8 @@ cli_add_path (void * v, char ** reply, int * len, void * data)
|
|
||||||
/* Have the checker reinstate this path asap */
|
|
||||||
pp->tick = 1;
|
|
||||||
return 0;
|
|
||||||
- } else if (!ev_remove_path(pp, vecs, true))
|
|
||||||
+ } else if (ev_remove_path(pp, vecs, true) &
|
|
||||||
+ REMOVE_PATH_SUCCESS)
|
|
||||||
/* Path removed in ev_remove_path() */
|
|
||||||
pp = NULL;
|
|
||||||
else {
|
|
||||||
@@ -813,6 +814,7 @@ cli_del_path (void * v, char ** reply, int * len, void * data)
|
|
||||||
struct vectors * vecs = (struct vectors *)data;
|
|
||||||
char * param = get_keyparam(v, PATH);
|
|
||||||
struct path *pp;
|
|
||||||
+ int ret;
|
|
||||||
|
|
||||||
param = convert_dev(param, 1);
|
|
||||||
condlog(2, "%s: remove path (operator)", param);
|
|
||||||
@@ -821,7 +823,25 @@ cli_del_path (void * v, char ** reply, int * len, void * data)
|
|
||||||
condlog(0, "%s: path already removed", param);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
- return ev_remove_path(pp, vecs, 1);
|
|
||||||
+ ret = ev_remove_path(pp, vecs, 1);
|
|
||||||
+ if (ret == REMOVE_PATH_DELAY) {
|
|
||||||
+ *reply = strdup("delayed\n");
|
|
||||||
+ if (*reply)
|
|
||||||
+ *len = strlen(*reply) + 1;
|
|
||||||
+ else {
|
|
||||||
+ *len = 0;
|
|
||||||
+ ret = REMOVE_PATH_FAILURE;
|
|
||||||
+ }
|
|
||||||
+ } else if (ret == REMOVE_PATH_MAP_ERROR) {
|
|
||||||
+ *reply = strdup("map reload error. removed\n");
|
|
||||||
+ if (*reply)
|
|
||||||
+ *len = strlen(*reply) + 1;
|
|
||||||
+ else {
|
|
||||||
+ *len = 0;
|
|
||||||
+ ret = REMOVE_PATH_FAILURE;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ return (ret == REMOVE_PATH_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
diff --git a/multipathd/main.c b/multipathd/main.c
|
|
||||||
index 6090434c..8e2beddd 100644
|
|
||||||
--- a/multipathd/main.c
|
|
||||||
+++ b/multipathd/main.c
|
|
||||||
@@ -838,7 +838,7 @@ handle_path_wwid_change(struct path *pp, struct vectors *vecs)
|
|
||||||
return;
|
|
||||||
|
|
||||||
udd = udev_device_ref(pp->udev);
|
|
||||||
- if (ev_remove_path(pp, vecs, 1) != 0 && pp->mpp) {
|
|
||||||
+ if (!(ev_remove_path(pp, vecs, 1) & REMOVE_PATH_SUCCESS) && pp->mpp) {
|
|
||||||
pp->dmstate = PSTATE_FAILED;
|
|
||||||
dm_fail_path(pp->mpp->alias, pp->dev_t);
|
|
||||||
}
|
|
||||||
@@ -948,8 +948,8 @@ uev_add_path (struct uevent *uev, struct vectors * vecs, int need_do_map)
|
|
||||||
* Make another attempt to remove the path
|
|
||||||
*/
|
|
||||||
pp->mpp = prev_mpp;
|
|
||||||
- ret = ev_remove_path(pp, vecs, true);
|
|
||||||
- if (ret != 0) {
|
|
||||||
+ if (!(ev_remove_path(pp, vecs, true) &
|
|
||||||
+ REMOVE_PATH_SUCCESS)) {
|
|
||||||
/*
|
|
||||||
* Failure in ev_remove_path will keep
|
|
||||||
* path in pathvec in INIT_REMOVED state
|
|
||||||
@@ -960,6 +960,7 @@ uev_add_path (struct uevent *uev, struct vectors * vecs, int need_do_map)
|
|
||||||
dm_fail_path(pp->mpp->alias, pp->dev_t);
|
|
||||||
condlog(1, "%s: failed to re-add path still mapped in %s",
|
|
||||||
pp->dev, pp->mpp->alias);
|
|
||||||
+ ret = 1;
|
|
||||||
} else if (r == PATHINFO_OK)
|
|
||||||
/*
|
|
||||||
* Path successfully freed, move on to
|
|
||||||
@@ -1167,7 +1168,6 @@ static int
|
|
||||||
uev_remove_path (struct uevent *uev, struct vectors * vecs, int need_do_map)
|
|
||||||
{
|
|
||||||
struct path *pp;
|
|
||||||
- int ret;
|
|
||||||
|
|
||||||
condlog(3, "%s: remove path (uevent)", uev->kernel);
|
|
||||||
delete_foreign(uev->udev);
|
|
||||||
@@ -1177,21 +1177,18 @@ uev_remove_path (struct uevent *uev, struct vectors * vecs, int need_do_map)
|
|
||||||
pthread_testcancel();
|
|
||||||
pp = find_path_by_dev(vecs->pathvec, uev->kernel);
|
|
||||||
if (pp)
|
|
||||||
- ret = ev_remove_path(pp, vecs, need_do_map);
|
|
||||||
+ ev_remove_path(pp, vecs, need_do_map);
|
|
||||||
lock_cleanup_pop(vecs->lock);
|
|
||||||
- if (!pp) {
|
|
||||||
- /* Not an error; path might have been purged earlier */
|
|
||||||
+ if (!pp) /* Not an error; path might have been purged earlier */
|
|
||||||
condlog(0, "%s: path already removed", uev->kernel);
|
|
||||||
- return 0;
|
|
||||||
- }
|
|
||||||
- return ret;
|
|
||||||
+ return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
ev_remove_path (struct path *pp, struct vectors * vecs, int need_do_map)
|
|
||||||
{
|
|
||||||
struct multipath * mpp;
|
|
||||||
- int i, retval = 0;
|
|
||||||
+ int i, retval = REMOVE_PATH_SUCCESS;
|
|
||||||
char params[PARAMS_SIZE] = {0};
|
|
||||||
|
|
||||||
/*
|
|
||||||
@@ -1245,7 +1242,6 @@ ev_remove_path (struct path *pp, struct vectors * vecs, int need_do_map)
|
|
||||||
condlog(2, "%s: removed map after"
|
|
||||||
" removing all paths",
|
|
||||||
alias);
|
|
||||||
- retval = 0;
|
|
||||||
/* flush_map() has freed the path */
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
@@ -1262,11 +1258,14 @@ ev_remove_path (struct path *pp, struct vectors * vecs, int need_do_map)
|
|
||||||
|
|
||||||
if (mpp->wait_for_udev) {
|
|
||||||
mpp->wait_for_udev = 2;
|
|
||||||
+ retval = REMOVE_PATH_DELAY;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (!need_do_map)
|
|
||||||
+ if (!need_do_map) {
|
|
||||||
+ retval = REMOVE_PATH_DELAY;
|
|
||||||
goto out;
|
|
||||||
+ }
|
|
||||||
/*
|
|
||||||
* reload the map
|
|
||||||
*/
|
|
||||||
@@ -1275,7 +1274,7 @@ ev_remove_path (struct path *pp, struct vectors * vecs, int need_do_map)
|
|
||||||
condlog(0, "%s: failed in domap for "
|
|
||||||
"removal of path %s",
|
|
||||||
mpp->alias, pp->dev);
|
|
||||||
- retval = 1;
|
|
||||||
+ retval = REMOVE_PATH_FAILURE;
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* update our state from kernel
|
|
||||||
@@ -1283,12 +1282,12 @@ ev_remove_path (struct path *pp, struct vectors * vecs, int need_do_map)
|
|
||||||
char devt[BLK_DEV_SIZE];
|
|
||||||
|
|
||||||
strlcpy(devt, pp->dev_t, sizeof(devt));
|
|
||||||
+
|
|
||||||
+ /* setup_multipath will free the path
|
|
||||||
+ * regardless of whether it succeeds or
|
|
||||||
+ * fails */
|
|
||||||
if (setup_multipath(vecs, mpp))
|
|
||||||
- return 1;
|
|
||||||
- /*
|
|
||||||
- * Successful map reload without this path:
|
|
||||||
- * sync_map_state() will free it.
|
|
||||||
- */
|
|
||||||
+ return REMOVE_PATH_MAP_ERROR;
|
|
||||||
sync_map_state(mpp);
|
|
||||||
|
|
||||||
condlog(2, "%s: path removed from map %s",
|
|
||||||
@@ -1304,8 +1303,10 @@ out:
|
|
||||||
return retval;
|
|
||||||
|
|
||||||
fail:
|
|
||||||
+ condlog(0, "%s: error removing path. removing map %s", pp->dev,
|
|
||||||
+ mpp->alias);
|
|
||||||
remove_map_and_stop_waiter(mpp, vecs);
|
|
||||||
- return 1;
|
|
||||||
+ return REMOVE_PATH_MAP_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
diff --git a/multipathd/main.h b/multipathd/main.h
|
|
||||||
index ddd953f9..bc1f938f 100644
|
|
||||||
--- a/multipathd/main.h
|
|
||||||
+++ b/multipathd/main.h
|
|
||||||
@@ -13,6 +13,20 @@ enum daemon_status {
|
|
||||||
DAEMON_STATUS_SIZE,
|
|
||||||
};
|
|
||||||
|
|
||||||
+enum remove_path_result {
|
|
||||||
+ REMOVE_PATH_FAILURE = 0x0, /* path could not be removed. It is still
|
|
||||||
+ * part of the kernel map, but its state
|
|
||||||
+ * is set to INIT_REMOVED, and it will be
|
|
||||||
+ * removed at the next possible occassion */
|
|
||||||
+ REMOVE_PATH_SUCCESS = 0x1, /* path was removed */
|
|
||||||
+ REMOVE_PATH_DELAY = 0x2, /* path is set to be removed later. it
|
|
||||||
+ * currently still exists and is part of the
|
|
||||||
+ * kernel map */
|
|
||||||
+ REMOVE_PATH_MAP_ERROR = 0x5, /* map was removed because of error. value
|
|
||||||
+ * includes REMOVE_PATH_SUCCESS bit
|
|
||||||
+ * because the path was also removed */
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
struct prout_param_descriptor;
|
|
||||||
struct prin_resp;
|
|
||||||
|
|
@ -19,10 +19,10 @@ Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
|||||||
3 files changed, 10 insertions(+), 14 deletions(-)
|
3 files changed, 10 insertions(+), 14 deletions(-)
|
||||||
|
|
||||||
diff --git a/libmultipath/blacklist.c b/libmultipath/blacklist.c
|
diff --git a/libmultipath/blacklist.c b/libmultipath/blacklist.c
|
||||||
index 6c6a5979..785f5ee9 100644
|
index 4e315c97..1e463ef6 100644
|
||||||
--- a/libmultipath/blacklist.c
|
--- a/libmultipath/blacklist.c
|
||||||
+++ b/libmultipath/blacklist.c
|
+++ b/libmultipath/blacklist.c
|
||||||
@@ -201,9 +201,6 @@ setup_default_blist (struct config * conf)
|
@@ -202,9 +202,6 @@ setup_default_blist (struct config * conf)
|
||||||
if (store_ble(conf->blist_devnode, "!^(sd[a-z]|dasd[a-z]|nvme[0-9])", ORIGIN_DEFAULT))
|
if (store_ble(conf->blist_devnode, "!^(sd[a-z]|dasd[a-z]|nvme[0-9])", ORIGIN_DEFAULT))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
@ -32,7 +32,7 @@ index 6c6a5979..785f5ee9 100644
|
|||||||
vector_foreach_slot (conf->hwtable, hwe, i) {
|
vector_foreach_slot (conf->hwtable, hwe, i) {
|
||||||
if (hwe->bl_product) {
|
if (hwe->bl_product) {
|
||||||
if (find_blacklist_device(conf->blist_device,
|
if (find_blacklist_device(conf->blist_device,
|
||||||
@@ -407,7 +404,8 @@ filter_property(const struct config *conf, struct udev_device *udev,
|
@@ -410,7 +407,8 @@ filter_property(const struct config *conf, struct udev_device *udev,
|
||||||
*uid_attribute != '\0';
|
*uid_attribute != '\0';
|
||||||
bool uid_attr_seen = false;
|
bool uid_attr_seen = false;
|
||||||
|
|
||||||
@ -43,10 +43,10 @@ index 6c6a5979..785f5ee9 100644
|
|||||||
udev_device_get_properties_list_entry(udev)) {
|
udev_device_get_properties_list_entry(udev)) {
|
||||||
|
|
||||||
diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5
|
diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5
|
||||||
index 064e4826..0d2bce09 100644
|
index c74129bd..dd9f4dc7 100644
|
||||||
--- a/multipath/multipath.conf.5
|
--- a/multipath/multipath.conf.5
|
||||||
+++ b/multipath/multipath.conf.5
|
+++ b/multipath/multipath.conf.5
|
||||||
@@ -1347,9 +1347,14 @@ keywords. Both are regular expressions. For a full description of these keywords
|
@@ -1351,9 +1351,14 @@ keywords. Both are regular expressions. For a full description of these keywords
|
||||||
Regular expression for an udev property. All
|
Regular expression for an udev property. All
|
||||||
devices that have matching udev properties will be excluded/included.
|
devices that have matching udev properties will be excluded/included.
|
||||||
The handling of the \fIproperty\fR keyword is special,
|
The handling of the \fIproperty\fR keyword is special,
|
||||||
@ -62,7 +62,7 @@ index 064e4826..0d2bce09 100644
|
|||||||
.
|
.
|
||||||
.RS
|
.RS
|
||||||
.PP
|
.PP
|
||||||
@@ -1360,10 +1365,6 @@ Blacklisting by missing properties is only applied to devices which do have the
|
@@ -1364,10 +1369,6 @@ Blacklisting by missing properties is only applied to devices which do have the
|
||||||
property specified by \fIuid_attribute\fR (e.g. \fIID_SERIAL\fR)
|
property specified by \fIuid_attribute\fR (e.g. \fIID_SERIAL\fR)
|
||||||
set. Previously, it was applied to every device, possibly causing devices to be
|
set. Previously, it was applied to every device, possibly causing devices to be
|
||||||
blacklisted because of temporary I/O error conditions.
|
blacklisted because of temporary I/O error conditions.
|
@ -1,46 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
|
||||||
Date: Tue, 11 May 2021 15:25:21 -0500
|
|
||||||
Subject: [PATCH] multipath: free vectors in configure
|
|
||||||
|
|
||||||
configure() can retry multiple times, each time reallocing a maps and
|
|
||||||
paths vector, and leaking the previous ones. Fix this by always freeing
|
|
||||||
the vectors before configure() exits. Found by coverity.
|
|
||||||
|
|
||||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
|
||||||
---
|
|
||||||
multipath/main.c | 7 ++++++-
|
|
||||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/multipath/main.c b/multipath/main.c
|
|
||||||
index f618550d..9fe53dcd 100644
|
|
||||||
--- a/multipath/main.c
|
|
||||||
+++ b/multipath/main.c
|
|
||||||
@@ -512,7 +512,6 @@ configure (struct config *conf, enum mpath_cmds cmd,
|
|
||||||
*/
|
|
||||||
curmp = vector_alloc();
|
|
||||||
pathvec = vector_alloc();
|
|
||||||
- atexit(cleanup_vecs);
|
|
||||||
|
|
||||||
if (!curmp || !pathvec) {
|
|
||||||
condlog(0, "can not allocate memory");
|
|
||||||
@@ -624,6 +623,11 @@ out:
|
|
||||||
if (refwwid)
|
|
||||||
FREE(refwwid);
|
|
||||||
|
|
||||||
+ free_multipathvec(curmp, KEEP_PATHS);
|
|
||||||
+ vecs.mpvec = NULL;
|
|
||||||
+ free_pathvec(pathvec, FREE_PATHS);
|
|
||||||
+ vecs.pathvec = NULL;
|
|
||||||
+
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -869,6 +873,7 @@ main (int argc, char *argv[])
|
|
||||||
conf = get_multipath_config();
|
|
||||||
conf->retrigger_tries = 0;
|
|
||||||
conf->force_sync = 1;
|
|
||||||
+ atexit(cleanup_vecs);
|
|
||||||
while ((arg = getopt(argc, argv, ":aAdDcChl::eFfM:v:p:b:BrR:itTquUwW")) != EOF ) {
|
|
||||||
switch(arg) {
|
|
||||||
case 1: printf("optarg : %s\n",optarg);
|
|
@ -17,7 +17,8 @@ Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
|||||||
multipath/multipath.rules | 1 +
|
multipath/multipath.rules | 1 +
|
||||||
multipathd/multipathd.8 | 2 ++
|
multipathd/multipathd.8 | 2 ++
|
||||||
multipathd/multipathd.service | 1 +
|
multipathd/multipathd.service | 1 +
|
||||||
5 files changed, 18 insertions(+)
|
multipathd/multipathd.socket | 1 +
|
||||||
|
6 files changed, 19 insertions(+)
|
||||||
|
|
||||||
diff --git a/libmultipath/config.c b/libmultipath/config.c
|
diff --git a/libmultipath/config.c b/libmultipath/config.c
|
||||||
index 30046a17..5f35c3d3 100644
|
index 30046a17..5f35c3d3 100644
|
||||||
@ -81,7 +82,7 @@ index 048a838d..8bd47a80 100644
|
|||||||
.
|
.
|
||||||
.\" ----------------------------------------------------------------------------
|
.\" ----------------------------------------------------------------------------
|
||||||
diff --git a/multipathd/multipathd.service b/multipathd/multipathd.service
|
diff --git a/multipathd/multipathd.service b/multipathd/multipathd.service
|
||||||
index 7d547fa7..af592057 100644
|
index 0b2ac814..6d57c7e8 100644
|
||||||
--- a/multipathd/multipathd.service
|
--- a/multipathd/multipathd.service
|
||||||
+++ b/multipathd/multipathd.service
|
+++ b/multipathd/multipathd.service
|
||||||
@@ -4,6 +4,7 @@ Wants=systemd-udev-trigger.service systemd-udev-settle.service
|
@@ -4,6 +4,7 @@ Wants=systemd-udev-trigger.service systemd-udev-settle.service
|
||||||
@ -92,3 +93,15 @@ index 7d547fa7..af592057 100644
|
|||||||
DefaultDependencies=no
|
DefaultDependencies=no
|
||||||
Conflicts=shutdown.target
|
Conflicts=shutdown.target
|
||||||
ConditionKernelCommandLine=!nompath
|
ConditionKernelCommandLine=!nompath
|
||||||
|
diff --git a/multipathd/multipathd.socket b/multipathd/multipathd.socket
|
||||||
|
index c777e5e3..3c20a2ff 100644
|
||||||
|
--- a/multipathd/multipathd.socket
|
||||||
|
+++ b/multipathd/multipathd.socket
|
||||||
|
@@ -1,6 +1,7 @@
|
||||||
|
[Unit]
|
||||||
|
Description=multipathd control socket
|
||||||
|
DefaultDependencies=no
|
||||||
|
+ConditionPathExists=/etc/multipath.conf
|
||||||
|
ConditionKernelCommandLine=!nompath
|
||||||
|
ConditionKernelCommandLine=!multipath=off
|
||||||
|
ConditionVirtualization=!container
|
@ -1,27 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
|
||||||
Date: Tue, 11 May 2021 16:03:13 -0500
|
|
||||||
Subject: [PATCH] kpartx: Don't leak memory when getblock returns NULL
|
|
||||||
|
|
||||||
If a new block was allocated, but couldn't be filled, getblock will
|
|
||||||
discard it. When it does so, it needs to free the block to avoid leaking
|
|
||||||
memory. Found by coverity.
|
|
||||||
|
|
||||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
|
||||||
---
|
|
||||||
kpartx/kpartx.c | 2 ++
|
|
||||||
1 file changed, 2 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/kpartx/kpartx.c b/kpartx/kpartx.c
|
|
||||||
index 8ff116b8..7bc64543 100644
|
|
||||||
--- a/kpartx/kpartx.c
|
|
||||||
+++ b/kpartx/kpartx.c
|
|
||||||
@@ -766,6 +766,8 @@ getblock (int fd, unsigned int blknr) {
|
|
||||||
if (read(fd, bp->block, secsz) != secsz) {
|
|
||||||
fprintf(stderr, "read error, sector %d\n", secnr);
|
|
||||||
blockhead = bp->next;
|
|
||||||
+ free(bp->block);
|
|
||||||
+ free(bp);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
@ -1,27 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
|
||||||
Date: Fri, 14 May 2021 13:45:28 -0500
|
|
||||||
Subject: [PATCH] multipathd: don't rescan_path on wwid change in
|
|
||||||
uev_update_path
|
|
||||||
|
|
||||||
If get_uid() is returning a different wwid in uev_update_path(), then
|
|
||||||
the uid_attribute must have already gotten updated, which was the
|
|
||||||
purpose behind calling rescan_path() in the first place.
|
|
||||||
|
|
||||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
|
||||||
---
|
|
||||||
multipathd/main.c | 1 -
|
|
||||||
1 file changed, 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/multipathd/main.c b/multipathd/main.c
|
|
||||||
index 8e2beddd..2750f5e9 100644
|
|
||||||
--- a/multipathd/main.c
|
|
||||||
+++ b/multipathd/main.c
|
|
||||||
@@ -1359,7 +1359,6 @@ uev_update_path (struct uevent *uev, struct vectors * vecs)
|
|
||||||
condlog(0, "%s: path wwid changed from '%s' to '%s'",
|
|
||||||
uev->kernel, wwid, pp->wwid);
|
|
||||||
ev_remove_path(pp, vecs, 1);
|
|
||||||
- rescan_path(uev->udev);
|
|
||||||
needs_reinit = 1;
|
|
||||||
goto out;
|
|
||||||
} else {
|
|
@ -1,204 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
|
||||||
Date: Fri, 9 Jul 2021 14:30:10 -0500
|
|
||||||
Subject: [PATCH] RH: mpathconf: correctly handle spaces after option names
|
|
||||||
|
|
||||||
mpathconf was either accepting any number of spaces, including zero,
|
|
||||||
after option names, or it was only accepting one space. It should
|
|
||||||
accept one or more spaces. Also, fix enable_foreign handling. It was
|
|
||||||
still working like it did in RHEL8, where the default was to enable
|
|
||||||
all foreign devices.
|
|
||||||
|
|
||||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
|
||||||
---
|
|
||||||
multipath/mpathconf | 62 +++++++++++++++++++++++++--------------------
|
|
||||||
1 file changed, 34 insertions(+), 28 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/multipath/mpathconf b/multipath/mpathconf
|
|
||||||
index 2f4f3eaf..039b3e47 100644
|
|
||||||
--- a/multipath/mpathconf
|
|
||||||
+++ b/multipath/mpathconf
|
|
||||||
@@ -240,7 +240,7 @@ function validate_args
|
|
||||||
echo "--enable_foreign must be either 'y' or 'n'"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
- if [ -z "$ENABLE" -a -z "$FIND" -a -z "$FRIENDLY" -a -z "$PROPERTY" ]; then
|
|
||||||
+ if [ -z "$ENABLE" -a -z "$FIND" -a -z "$FRIENDLY" -a -z "$PROPERTY" -a -z "$FOREIGN" ]; then
|
|
||||||
SHOW_STATUS=1
|
|
||||||
fi
|
|
||||||
if [ -n "$MODULE" ] && [ "$MODULE" != "y" -a "$MODULE" != "n" ]; then
|
|
||||||
@@ -315,46 +315,50 @@ if [ "$MULTIPATHD" = "y" ]; then
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$HAVE_BLACKLIST" = "1" ]; then
|
|
||||||
- if sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*devnode \"\.\?\*\"" ; then
|
|
||||||
+ if sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*devnode[[:space:]][[:space:]]*\"\.\?\*\"" ; then
|
|
||||||
HAVE_DISABLE=1
|
|
||||||
- elif sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*#[[:space:]]*devnode \"\.\?\*\"" ; then
|
|
||||||
+ elif sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*#[[:space:]]*devnode[[:space:]][[:space:]]*\"\.\?\*\"" ; then
|
|
||||||
HAVE_DISABLE=0
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$HAVE_BLACKLIST" = "1" ]; then
|
|
||||||
- if sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*wwid \"\.\?\*\"" ; then
|
|
||||||
+ if sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*wwid[[:space:]][[:space:]]*\"\.\?\*\"" ; then
|
|
||||||
HAVE_WWID_DISABLE=1
|
|
||||||
- elif sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*#[[:space:]]*wwid \"\.\?\*\"" ; then
|
|
||||||
+ elif sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*#[[:space:]]*wwid[[:space:]][[:space:]]*\"\.\?\*\"" ; then
|
|
||||||
HAVE_WWID_DISABLE=0
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$HAVE_DEFAULTS" = "1" ]; then
|
|
||||||
- HAVE_FIND=`sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | sed -n 's/^[[:blank:]]*find_multipaths[[:blank:]]*\([^[:blank:]]*\).*$/\1/p' | sed -n 1p`
|
|
||||||
+ HAVE_FIND=`sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | sed -n 's/^[[:blank:]]*find_multipaths[[:blank:]][[:blank:]]*\([^[:blank:]]*\).*$/\1/p' | sed -n 1p`
|
|
||||||
if [ "$HAVE_FIND" = "1" ]; then
|
|
||||||
HAVE_FIND="yes"
|
|
||||||
elif [ "$HAVE_FIND" = "0" ]; then
|
|
||||||
HAVE_FIND="no"
|
|
||||||
fi
|
|
||||||
- if sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*user_friendly_names[[:space:]]*\(yes\|1\)" ; then
|
|
||||||
+ if sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*user_friendly_names[[:space:]][[:space:]]*\(yes\|1\)" ; then
|
|
||||||
HAVE_FRIENDLY=1
|
|
||||||
- elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*user_friendly_names[[:space:]]*\(no\|0\)" ; then
|
|
||||||
+ elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*user_friendly_names[[:space:]][[:space:]]*\(no\|0\)" ; then
|
|
||||||
HAVE_FRIENDLY=0
|
|
||||||
fi
|
|
||||||
if sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*#[[:space:]]*enable_foreign" ; then
|
|
||||||
HAVE_FOREIGN=0
|
|
||||||
- elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*enable_foreign[[:space:]]*\"\^\$\"" ; then
|
|
||||||
+ elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*enable_foreign[[:space:]][[:space:]]*\"\.\*\"" ; then
|
|
||||||
HAVE_FOREIGN=1
|
|
||||||
- elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*enable_foreign" ; then
|
|
||||||
+ elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*enable_foreign[[:space:]][[:space:]]*\"\^\$\"" ; then
|
|
||||||
+ HAVE_FOREIGN=2
|
|
||||||
+ elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*enable_foreign[[:space:]][[:space:]]*\"NONE\"" ; then
|
|
||||||
HAVE_FOREIGN=2
|
|
||||||
+ elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*enable_foreign" ; then
|
|
||||||
+ HAVE_FOREIGN=3
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$HAVE_EXCEPTIONS" = "1" ]; then
|
|
||||||
- if sed -n '/^blacklist_exceptions[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*property[[:space:]]*\"(SCSI_IDENT_|ID_WWN)\"" ; then
|
|
||||||
+ if sed -n '/^blacklist_exceptions[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*property[[:space:]][[:space:]]*\"(SCSI_IDENT_|ID_WWN)\"" ; then
|
|
||||||
HAVE_PROPERTY=1
|
|
||||||
- elif sed -n '/^blacklist_exceptions[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*#[[:space:]]*property[[:space:]]*\"(SCSI_IDENT_|ID_WWN)\"" ; then
|
|
||||||
+ elif sed -n '/^blacklist_exceptions[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*#[[:space:]]*property[[:space:]][[:space:]]*\"(SCSI_IDENT_|ID_WWN)\"" ; then
|
|
||||||
HAVE_PROPERTY=0
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
@@ -381,8 +385,10 @@ if [ -n "$SHOW_STATUS" ]; then
|
|
||||||
echo "default property blacklist is enabled"
|
|
||||||
fi
|
|
||||||
if [ -z "$HAVE_FOREIGN" -o "$HAVE_FOREIGN" = 0 ]; then
|
|
||||||
- echo "enable_foreign is not set (all foreign multipath devices will be shown)"
|
|
||||||
+ echo "enable_foreign is not set (no foreign multipath devices will be shown)"
|
|
||||||
elif [ "$HAVE_FOREIGN" = 1 ]; then
|
|
||||||
+ echo "enable_foreign is set (all foreign multipath devices will be shown)"
|
|
||||||
+ elif [ "$HAVE_FOREIGN" = 2 ]; then
|
|
||||||
echo "enable_foreign is set (no foreign multipath devices will be shown)"
|
|
||||||
else
|
|
||||||
echo "enable_foreign is set (foreign multipath devices may not be shown)"
|
|
||||||
@@ -427,14 +433,14 @@ fi
|
|
||||||
|
|
||||||
if [ "$ENABLE" = 2 ]; then
|
|
||||||
if [ "$HAVE_DISABLE" = 1 ]; then
|
|
||||||
- sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*devnode \"\.\?\*\"/# devnode ".*"/' $TMPFILE
|
|
||||||
+ sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*devnode[[:space:]][[:space:]]*\"\.\?\*\"/# devnode ".*"/' $TMPFILE
|
|
||||||
fi
|
|
||||||
if [ -z "$HAVE_WWID_DISABLE" ]; then
|
|
||||||
sed -i '/^blacklist[[:space:]]*{/ a\
|
|
||||||
wwid ".*"
|
|
||||||
' $TMPFILE
|
|
||||||
elif [ "$HAVE_WWID_DISABLE" = 0 ]; then
|
|
||||||
- sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*#[[:space:]]*wwid \"\.\?\*\"/ wwid ".*"/' $TMPFILE
|
|
||||||
+ sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*#[[:space:]]*wwid[[:space:]][[:space:]]*\"\.\?\*\"/ wwid ".*"/' $TMPFILE
|
|
||||||
fi
|
|
||||||
if [ "$HAVE_EXCEPTIONS" = 1 ]; then
|
|
||||||
sed -i '/^blacklist_exceptions[[:space:]]*{/,/^}/ {/^[[:space:]]*wwid/ d}' $TMPFILE
|
|
||||||
@@ -448,7 +454,7 @@ _EOF_
|
|
||||||
add_blacklist_exceptions
|
|
||||||
elif [ "$ENABLE" = 1 ]; then
|
|
||||||
if [ "$HAVE_DISABLE" = 1 ]; then
|
|
||||||
- sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*devnode \"\.\?\*\"/# devnode ".*"/' $TMPFILE
|
|
||||||
+ sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*devnode[[:space:]][[:space:]]*\"\.\?\*\"/# devnode ".*"/' $TMPFILE
|
|
||||||
fi
|
|
||||||
elif [ "$ENABLE" = 0 ]; then
|
|
||||||
if [ -z "$HAVE_DISABLE" ]; then
|
|
||||||
@@ -456,7 +462,7 @@ elif [ "$ENABLE" = 0 ]; then
|
|
||||||
devnode ".*"
|
|
||||||
' $TMPFILE
|
|
||||||
elif [ "$HAVE_DISABLE" = 0 ]; then
|
|
||||||
- sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*#[[:space:]]*devnode \"\.\?\*\"/ devnode ".*"/' $TMPFILE
|
|
||||||
+ sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*#[[:space:]]*devnode[[:space:]][[:space:]]*\"\.\?\*\"/ devnode ".*"/' $TMPFILE
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
@@ -467,14 +473,14 @@ if [ -n "$FIND" ]; then
|
|
||||||
' $TMPFILE
|
|
||||||
CHANGED_CONFIG=1
|
|
||||||
elif [ "$FIND" != "$HAVE_FIND" ]; then
|
|
||||||
- sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:blank:]]*find_multipaths[[:blank:]]*[^[:blank:]]*/ find_multipaths '"$FIND"'/' $TMPFILE
|
|
||||||
+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:blank:]]*find_multipaths[[:blank:]][[:blank:]]*[^[:blank:]]*/ find_multipaths '"$FIND"'/' $TMPFILE
|
|
||||||
CHANGED_CONFIG=1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$FRIENDLY" = "n" ]; then
|
|
||||||
if [ "$HAVE_FRIENDLY" = 1 ]; then
|
|
||||||
- sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*user_friendly_names[[:space:]]*\(yes\|1\)/ user_friendly_names no/' $TMPFILE
|
|
||||||
+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*user_friendly_names[[:space:]][[:space:]]*\(yes\|1\)/ user_friendly_names no/' $TMPFILE
|
|
||||||
CHANGED_CONFIG=1
|
|
||||||
fi
|
|
||||||
elif [ "$FRIENDLY" = "y" ]; then
|
|
||||||
@@ -484,14 +490,14 @@ elif [ "$FRIENDLY" = "y" ]; then
|
|
||||||
' $TMPFILE
|
|
||||||
CHANGED_CONFIG=1
|
|
||||||
elif [ "$HAVE_FRIENDLY" = 0 ]; then
|
|
||||||
- sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*user_friendly_names[[:space:]]*\(no\|0\)/ user_friendly_names yes/' $TMPFILE
|
|
||||||
+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*user_friendly_names[[:space:]][[:space:]]*\(no\|0\)/ user_friendly_names yes/' $TMPFILE
|
|
||||||
CHANGED_CONFIG=1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "$PROPERTY" = "n" ]; then
|
|
||||||
if [ "$HAVE_PROPERTY" = 1 ]; then
|
|
||||||
- sed -i '/^blacklist_exceptions[[:space:]]*{/,/^}/ s/^[[:space:]]*property[[:space:]]*\"(SCSI_IDENT_|ID_WWN)\"/# property \"(SCSI_IDENT_|ID_WWN)\"/' $TMPFILE
|
|
||||||
+ sed -i '/^blacklist_exceptions[[:space:]]*{/,/^}/ s/^[[:space:]]*property[[:space:]][[:space:]]*\"(SCSI_IDENT_|ID_WWN)\"/# property \"(SCSI_IDENT_|ID_WWN)\"/' $TMPFILE
|
|
||||||
CHANGED_CONFIG=1
|
|
||||||
fi
|
|
||||||
elif [ "$PROPERTY" = "y" ]; then
|
|
||||||
@@ -501,24 +507,24 @@ elif [ "$PROPERTY" = "y" ]; then
|
|
||||||
' $TMPFILE
|
|
||||||
CHANGED_CONFIG=1
|
|
||||||
elif [ "$HAVE_PROPERTY" = 0 ]; then
|
|
||||||
- sed -i '/^blacklist_exceptions[[:space:]]*{/,/^}/ s/^[[:space:]]*#[[:space:]]*property[[:space:]]*\"(SCSI_IDENT_|ID_WWN)\"/ property \"(SCSI_IDENT_|ID_WWN)\"/' $TMPFILE
|
|
||||||
+ sed -i '/^blacklist_exceptions[[:space:]]*{/,/^}/ s/^[[:space:]]*#[[:space:]]*property[[:space:]][[:space:]]*\"(SCSI_IDENT_|ID_WWN)\"/ property \"(SCSI_IDENT_|ID_WWN)\"/' $TMPFILE
|
|
||||||
CHANGED_CONFIG=1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
-if [ "$FOREIGN" = "y" ]; then
|
|
||||||
- if [ "$HAVE_FOREIGN" = 1 -o "$HAVE_FOREIGN" = 2 ]; then
|
|
||||||
+if [ "$FOREIGN" = "n" ]; then
|
|
||||||
+ if [ "$HAVE_FOREIGN" = 1 -o "$HAVE_FOREIGN" = 3 ]; then
|
|
||||||
sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*enable_foreign/# enable_foreign/' $TMPFILE
|
|
||||||
CHANGED_CONFIG=1
|
|
||||||
fi
|
|
||||||
-elif [ "$FOREIGN" = "n" ]; then
|
|
||||||
+elif [ "$FOREIGN" = "y" ]; then
|
|
||||||
if [ -z "$HAVE_FOREIGN" ]; then
|
|
||||||
sed -i '/^defaults[[:space:]]*{/ a\
|
|
||||||
- enable_foreign "^$"
|
|
||||||
+ enable_foreign ".*"
|
|
||||||
' $TMPFILE
|
|
||||||
CHANGED_CONFIG=1
|
|
||||||
- elif [ "$HAVE_FOREIGN" = 0 -o "$HAVE_FOREIGN" = 2 ]; then
|
|
||||||
- sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*#\?[[:space:]]*enable_foreign.*$/ enable_foreign "^$"/' $TMPFILE
|
|
||||||
+ elif [ "$HAVE_FOREIGN" = 0 -o "$HAVE_FOREIGN" = 2 -o "$HAVE_FOREIGN" = 3 ]; then
|
|
||||||
+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*#\?[[:space:]]*enable_foreign.*$/ enable_foreign ".*"/' $TMPFILE
|
|
||||||
CHANGED_CONFIG=1
|
|
||||||
fi
|
|
||||||
fi
|
|
@ -9,23 +9,24 @@ still being generic.
|
|||||||
|
|
||||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
---
|
---
|
||||||
Makefile.inc | 24 ++++++++++++++++++------
|
Makefile.inc | 26 +++++++++++++++++++-------
|
||||||
1 file changed, 18 insertions(+), 6 deletions(-)
|
1 file changed, 19 insertions(+), 7 deletions(-)
|
||||||
|
|
||||||
diff --git a/Makefile.inc b/Makefile.inc
|
diff --git a/Makefile.inc b/Makefile.inc
|
||||||
index c593fd3b..87fb39f2 100644
|
index 2a75dc9c..5ac660de 100644
|
||||||
--- a/Makefile.inc
|
--- a/Makefile.inc
|
||||||
+++ b/Makefile.inc
|
+++ b/Makefile.inc
|
||||||
@@ -92,15 +92,27 @@ TEST_CC_OPTION = $(shell \
|
@@ -92,23 +92,35 @@ TEST_CC_OPTION = $(shell \
|
||||||
echo "$(2)"; \
|
echo "$(2)"; \
|
||||||
fi)
|
fi)
|
||||||
|
|
||||||
-STACKPROT := $(call TEST_CC_OPTION,-fstack-protector-strong,-fstack-protector)
|
-STACKPROT := $(call TEST_CC_OPTION,-fstack-protector-strong,-fstack-protector)
|
||||||
ERROR_DISCARDED_QUALIFIERS := $(call TEST_CC_OPTION,-Werror=discarded-qualifiers,)
|
ERROR_DISCARDED_QUALIFIERS := $(call TEST_CC_OPTION,-Werror=discarded-qualifiers,)
|
||||||
WNOCLOBBERED := $(call TEST_CC_OPTION,-Wno-clobbered -Wno-error=clobbered,)
|
WNOCLOBBERED := $(call TEST_CC_OPTION,-Wno-clobbered -Wno-error=clobbered,)
|
||||||
|
WFORMATOVERFLOW := $(call TEST_CC_OPTION,-Wformat-overflow=2,)
|
||||||
|
|
||||||
-OPTFLAGS := -O2 -g $(STACKPROT) --param=ssp-buffer-size=4
|
-OPTFLAGS := -O2 -g $(STACKPROT) --param=ssp-buffer-size=4
|
||||||
-WARNFLAGS := -Werror -Wall -Wextra -Wformat=2 -Werror=implicit-int \
|
-WARNFLAGS := -Werror -Wall -Wextra -Wformat=2 $(WFORMATOVERFLOW) -Werror=implicit-int \
|
||||||
+ifndef RPM_OPT_FLAGS
|
+ifndef RPM_OPT_FLAGS
|
||||||
+ STACKPROT := $(call TEST_CC_OPTION,-fstack-protector-strong,-fstack-protector)
|
+ STACKPROT := $(call TEST_CC_OPTION,-fstack-protector-strong,-fstack-protector)
|
||||||
+ OPTFLAGS := -O2 -g -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions \
|
+ OPTFLAGS := -O2 -g -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions \
|
||||||
@ -40,7 +41,7 @@ index c593fd3b..87fb39f2 100644
|
|||||||
+else
|
+else
|
||||||
+ OPTFLAGS := $(RPM_OPT_FLAGS) --param=ssp-buffer-size=4
|
+ OPTFLAGS := $(RPM_OPT_FLAGS) --param=ssp-buffer-size=4
|
||||||
+endif
|
+endif
|
||||||
+WARNFLAGS := -Werror -Wextra -Wformat=2 -Werror=implicit-int \
|
+WARNFLAGS := -Werror -Wextra -Wformat=2 $(WFORMATOVERFLOW) -Werror=implicit-int \
|
||||||
-Werror=implicit-function-declaration -Werror=format-security \
|
-Werror=implicit-function-declaration -Werror=format-security \
|
||||||
- $(WNOCLOBBERED) -Werror=cast-qual $(ERROR_DISCARDED_QUALIFIERS)
|
- $(WNOCLOBBERED) -Werror=cast-qual $(ERROR_DISCARDED_QUALIFIERS)
|
||||||
-CPPFLAGS := -Wp,-D_FORTIFY_SOURCE=2
|
-CPPFLAGS := -Wp,-D_FORTIFY_SOURCE=2
|
||||||
@ -49,7 +50,15 @@ index c593fd3b..87fb39f2 100644
|
|||||||
CFLAGS := --std=gnu99 $(CFLAGS) $(OPTFLAGS) $(WARNFLAGS) -pipe \
|
CFLAGS := --std=gnu99 $(CFLAGS) $(OPTFLAGS) $(WARNFLAGS) -pipe \
|
||||||
-DBIN_DIR=\"$(bindir)\" -DLIB_STRING=\"${LIB}\" -DRUN_DIR=\"${RUN}\" \
|
-DBIN_DIR=\"$(bindir)\" -DLIB_STRING=\"${LIB}\" -DRUN_DIR=\"${RUN}\" \
|
||||||
-MMD -MP
|
-MMD -MP
|
||||||
@@ -138,4 +150,4 @@ check_file = $(shell \
|
BIN_CFLAGS = -fPIE -DPIE
|
||||||
|
LIB_CFLAGS = -fPIC
|
||||||
|
SHARED_FLAGS = -shared
|
||||||
|
-LDFLAGS := $(LDFLAGS) -Wl,-z,relro -Wl,-z,now -Wl,-z,defs
|
||||||
|
+LDFLAGS := $(LDFLAGS) $(RPM_LD_FLAGS) -Wl,-z,relro -Wl,-z,now -Wl,-z,defs
|
||||||
|
BIN_LDFLAGS = -pie
|
||||||
|
|
||||||
|
# Check whether a function with name $1 has been declared in header file $2.
|
||||||
|
@@ -139,4 +151,4 @@ check_file = $(shell \
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
@echo building $@ because of $?
|
@echo building $@ because of $?
|
@ -14,9 +14,9 @@ Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
|||||||
---
|
---
|
||||||
libmultipath/config.c | 2 +
|
libmultipath/config.c | 2 +
|
||||||
multipath/Makefile | 5 +
|
multipath/Makefile | 5 +
|
||||||
multipath/mpathconf | 555 ++++++++++++++++++++++++++++++++++++++++++
|
multipath/mpathconf | 556 ++++++++++++++++++++++++++++++++++++++++++
|
||||||
multipath/mpathconf.8 | 135 ++++++++++
|
multipath/mpathconf.8 | 135 ++++++++++
|
||||||
4 files changed, 697 insertions(+)
|
4 files changed, 698 insertions(+)
|
||||||
create mode 100644 multipath/mpathconf
|
create mode 100644 multipath/mpathconf
|
||||||
create mode 100644 multipath/mpathconf.8
|
create mode 100644 multipath/mpathconf.8
|
||||||
|
|
||||||
@ -69,10 +69,10 @@ index b9bbb3cf..e720c7f6 100644
|
|||||||
$(RM) core *.o $(EXEC) *.gz
|
$(RM) core *.o $(EXEC) *.gz
|
||||||
diff --git a/multipath/mpathconf b/multipath/mpathconf
|
diff --git a/multipath/mpathconf b/multipath/mpathconf
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 00000000..2f4f3eaf
|
index 00000000..c00d2555
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/multipath/mpathconf
|
+++ b/multipath/mpathconf
|
||||||
@@ -0,0 +1,555 @@
|
@@ -0,0 +1,556 @@
|
||||||
+#!/bin/bash
|
+#!/bin/bash
|
||||||
+#
|
+#
|
||||||
+# Copyright (C) 2010 Red Hat, Inc. All rights reserved.
|
+# Copyright (C) 2010 Red Hat, Inc. All rights reserved.
|
||||||
@ -107,11 +107,6 @@ index 00000000..2f4f3eaf
|
|||||||
+defaults {
|
+defaults {
|
||||||
+ user_friendly_names yes
|
+ user_friendly_names yes
|
||||||
+ find_multipaths yes
|
+ find_multipaths yes
|
||||||
+ enable_foreign \"^$\"
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+blacklist_exceptions {
|
|
||||||
+ property \"(SCSI_IDENT_|ID_WWN)\"
|
|
||||||
+}"
|
+}"
|
||||||
+
|
+
|
||||||
+CONFIGFILE="/etc/multipath.conf"
|
+CONFIGFILE="/etc/multipath.conf"
|
||||||
@ -130,7 +125,7 @@ index 00000000..2f4f3eaf
|
|||||||
+ echo "Only allow certain wwids (instead of enable): --allow <WWID>"
|
+ echo "Only allow certain wwids (instead of enable): --allow <WWID>"
|
||||||
+ echo "Set user_friendly_names (Default y): --user_friendly_names <y|n>"
|
+ echo "Set user_friendly_names (Default y): --user_friendly_names <y|n>"
|
||||||
+ echo "Set find_multipaths (Default y): --find_multipaths <yes|no|strict|greedy|smart>"
|
+ echo "Set find_multipaths (Default y): --find_multipaths <yes|no|strict|greedy|smart>"
|
||||||
+ echo "Set default property blacklist (Default y): --property_blacklist <y|n>"
|
+ echo "Set default property blacklist (Default n): --property_blacklist <y|n>"
|
||||||
+ echo "Set enable_foreign to show foreign devices (Default n): --enable_foreign <y|n>"
|
+ echo "Set enable_foreign to show foreign devices (Default n): --enable_foreign <y|n>"
|
||||||
+ echo "Load the dm-multipath modules on enable (Default y): --with_module <y|n>"
|
+ echo "Load the dm-multipath modules on enable (Default y): --with_module <y|n>"
|
||||||
+ echo "start/stop/reload multipathd (Default n): --with_multipathd <y|n>"
|
+ echo "start/stop/reload multipathd (Default n): --with_multipathd <y|n>"
|
||||||
@ -315,7 +310,7 @@ index 00000000..2f4f3eaf
|
|||||||
+ echo "--enable_foreign must be either 'y' or 'n'"
|
+ echo "--enable_foreign must be either 'y' or 'n'"
|
||||||
+ exit 1
|
+ exit 1
|
||||||
+ fi
|
+ fi
|
||||||
+ if [ -z "$ENABLE" -a -z "$FIND" -a -z "$FRIENDLY" -a -z "$PROPERTY" ]; then
|
+ if [ -z "$ENABLE" -a -z "$FIND" -a -z "$FRIENDLY" -a -z "$PROPERTY" -a -z "$FOREIGN" ]; then
|
||||||
+ SHOW_STATUS=1
|
+ SHOW_STATUS=1
|
||||||
+ fi
|
+ fi
|
||||||
+ if [ -n "$MODULE" ] && [ "$MODULE" != "y" -a "$MODULE" != "n" ]; then
|
+ if [ -n "$MODULE" ] && [ "$MODULE" != "y" -a "$MODULE" != "n" ]; then
|
||||||
@ -390,46 +385,50 @@ index 00000000..2f4f3eaf
|
|||||||
+fi
|
+fi
|
||||||
+
|
+
|
||||||
+if [ "$HAVE_BLACKLIST" = "1" ]; then
|
+if [ "$HAVE_BLACKLIST" = "1" ]; then
|
||||||
+ if sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*devnode \"\.\?\*\"" ; then
|
+ if sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*devnode[[:space:]][[:space:]]*\"\.\?\*\"" ; then
|
||||||
+ HAVE_DISABLE=1
|
+ HAVE_DISABLE=1
|
||||||
+ elif sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*#[[:space:]]*devnode \"\.\?\*\"" ; then
|
+ elif sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*#[[:space:]]*devnode[[:space:]][[:space:]]*\"\.\?\*\"" ; then
|
||||||
+ HAVE_DISABLE=0
|
+ HAVE_DISABLE=0
|
||||||
+ fi
|
+ fi
|
||||||
+fi
|
+fi
|
||||||
+
|
+
|
||||||
+if [ "$HAVE_BLACKLIST" = "1" ]; then
|
+if [ "$HAVE_BLACKLIST" = "1" ]; then
|
||||||
+ if sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*wwid \"\.\?\*\"" ; then
|
+ if sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*wwid[[:space:]][[:space:]]*\"\.\?\*\"" ; then
|
||||||
+ HAVE_WWID_DISABLE=1
|
+ HAVE_WWID_DISABLE=1
|
||||||
+ elif sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*#[[:space:]]*wwid \"\.\?\*\"" ; then
|
+ elif sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*#[[:space:]]*wwid[[:space:]][[:space:]]*\"\.\?\*\"" ; then
|
||||||
+ HAVE_WWID_DISABLE=0
|
+ HAVE_WWID_DISABLE=0
|
||||||
+ fi
|
+ fi
|
||||||
+fi
|
+fi
|
||||||
+
|
+
|
||||||
+if [ "$HAVE_DEFAULTS" = "1" ]; then
|
+if [ "$HAVE_DEFAULTS" = "1" ]; then
|
||||||
+ HAVE_FIND=`sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | sed -n 's/^[[:blank:]]*find_multipaths[[:blank:]]*\([^[:blank:]]*\).*$/\1/p' | sed -n 1p`
|
+ HAVE_FIND=`sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | sed -n 's/^[[:blank:]]*find_multipaths[[:blank:]][[:blank:]]*\([^[:blank:]]*\).*$/\1/p' | sed -n 1p`
|
||||||
+ if [ "$HAVE_FIND" = "1" ]; then
|
+ if [ "$HAVE_FIND" = "1" ]; then
|
||||||
+ HAVE_FIND="yes"
|
+ HAVE_FIND="yes"
|
||||||
+ elif [ "$HAVE_FIND" = "0" ]; then
|
+ elif [ "$HAVE_FIND" = "0" ]; then
|
||||||
+ HAVE_FIND="no"
|
+ HAVE_FIND="no"
|
||||||
+ fi
|
+ fi
|
||||||
+ if sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*user_friendly_names[[:space:]]*\(yes\|1\)" ; then
|
+ if sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*user_friendly_names[[:space:]][[:space:]]*\(yes\|1\)" ; then
|
||||||
+ HAVE_FRIENDLY=1
|
+ HAVE_FRIENDLY=1
|
||||||
+ elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*user_friendly_names[[:space:]]*\(no\|0\)" ; then
|
+ elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*user_friendly_names[[:space:]][[:space:]]*\(no\|0\)" ; then
|
||||||
+ HAVE_FRIENDLY=0
|
+ HAVE_FRIENDLY=0
|
||||||
+ fi
|
+ fi
|
||||||
+ if sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*#[[:space:]]*enable_foreign" ; then
|
+ if sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*#[[:space:]]*enable_foreign" ; then
|
||||||
+ HAVE_FOREIGN=0
|
+ HAVE_FOREIGN=0
|
||||||
+ elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*enable_foreign[[:space:]]*\"\^\$\"" ; then
|
+ elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*enable_foreign[[:space:]][[:space:]]*\"\.\*\"" ; then
|
||||||
+ HAVE_FOREIGN=1
|
+ HAVE_FOREIGN=1
|
||||||
+ elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*enable_foreign" ; then
|
+ elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*enable_foreign[[:space:]][[:space:]]*\"\^\$\"" ; then
|
||||||
+ HAVE_FOREIGN=2
|
+ HAVE_FOREIGN=2
|
||||||
|
+ elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*enable_foreign[[:space:]][[:space:]]*\"NONE\"" ; then
|
||||||
|
+ HAVE_FOREIGN=2
|
||||||
|
+ elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*enable_foreign" ; then
|
||||||
|
+ HAVE_FOREIGN=3
|
||||||
+ fi
|
+ fi
|
||||||
+fi
|
+fi
|
||||||
+
|
+
|
||||||
+if [ "$HAVE_EXCEPTIONS" = "1" ]; then
|
+if [ "$HAVE_EXCEPTIONS" = "1" ]; then
|
||||||
+ if sed -n '/^blacklist_exceptions[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*property[[:space:]]*\"(SCSI_IDENT_|ID_WWN)\"" ; then
|
+ if sed -n '/^blacklist_exceptions[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*property[[:space:]][[:space:]]*\"(SCSI_IDENT_|ID_WWN)\"" ; then
|
||||||
+ HAVE_PROPERTY=1
|
+ HAVE_PROPERTY=1
|
||||||
+ elif sed -n '/^blacklist_exceptions[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*#[[:space:]]*property[[:space:]]*\"(SCSI_IDENT_|ID_WWN)\"" ; then
|
+ elif sed -n '/^blacklist_exceptions[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*#[[:space:]]*property[[:space:]][[:space:]]*\"(SCSI_IDENT_|ID_WWN)\"" ; then
|
||||||
+ HAVE_PROPERTY=0
|
+ HAVE_PROPERTY=0
|
||||||
+ fi
|
+ fi
|
||||||
+fi
|
+fi
|
||||||
@ -456,8 +455,10 @@ index 00000000..2f4f3eaf
|
|||||||
+ echo "default property blacklist is enabled"
|
+ echo "default property blacklist is enabled"
|
||||||
+ fi
|
+ fi
|
||||||
+ if [ -z "$HAVE_FOREIGN" -o "$HAVE_FOREIGN" = 0 ]; then
|
+ if [ -z "$HAVE_FOREIGN" -o "$HAVE_FOREIGN" = 0 ]; then
|
||||||
+ echo "enable_foreign is not set (all foreign multipath devices will be shown)"
|
+ echo "enable_foreign is not set (no foreign multipath devices will be shown)"
|
||||||
+ elif [ "$HAVE_FOREIGN" = 1 ]; then
|
+ elif [ "$HAVE_FOREIGN" = 1 ]; then
|
||||||
|
+ echo "enable_foreign is set (all foreign multipath devices will be shown)"
|
||||||
|
+ elif [ "$HAVE_FOREIGN" = 2 ]; then
|
||||||
+ echo "enable_foreign is set (no foreign multipath devices will be shown)"
|
+ echo "enable_foreign is set (no foreign multipath devices will be shown)"
|
||||||
+ else
|
+ else
|
||||||
+ echo "enable_foreign is set (foreign multipath devices may not be shown)"
|
+ echo "enable_foreign is set (foreign multipath devices may not be shown)"
|
||||||
@ -502,14 +503,14 @@ index 00000000..2f4f3eaf
|
|||||||
+
|
+
|
||||||
+if [ "$ENABLE" = 2 ]; then
|
+if [ "$ENABLE" = 2 ]; then
|
||||||
+ if [ "$HAVE_DISABLE" = 1 ]; then
|
+ if [ "$HAVE_DISABLE" = 1 ]; then
|
||||||
+ sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*devnode \"\.\?\*\"/# devnode ".*"/' $TMPFILE
|
+ sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*devnode[[:space:]][[:space:]]*\"\.\?\*\"/# devnode ".*"/' $TMPFILE
|
||||||
+ fi
|
+ fi
|
||||||
+ if [ -z "$HAVE_WWID_DISABLE" ]; then
|
+ if [ -z "$HAVE_WWID_DISABLE" ]; then
|
||||||
+ sed -i '/^blacklist[[:space:]]*{/ a\
|
+ sed -i '/^blacklist[[:space:]]*{/ a\
|
||||||
+ wwid ".*"
|
+ wwid ".*"
|
||||||
+' $TMPFILE
|
+' $TMPFILE
|
||||||
+ elif [ "$HAVE_WWID_DISABLE" = 0 ]; then
|
+ elif [ "$HAVE_WWID_DISABLE" = 0 ]; then
|
||||||
+ sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*#[[:space:]]*wwid \"\.\?\*\"/ wwid ".*"/' $TMPFILE
|
+ sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*#[[:space:]]*wwid[[:space:]][[:space:]]*\"\.\?\*\"/ wwid ".*"/' $TMPFILE
|
||||||
+ fi
|
+ fi
|
||||||
+ if [ "$HAVE_EXCEPTIONS" = 1 ]; then
|
+ if [ "$HAVE_EXCEPTIONS" = 1 ]; then
|
||||||
+ sed -i '/^blacklist_exceptions[[:space:]]*{/,/^}/ {/^[[:space:]]*wwid/ d}' $TMPFILE
|
+ sed -i '/^blacklist_exceptions[[:space:]]*{/,/^}/ {/^[[:space:]]*wwid/ d}' $TMPFILE
|
||||||
@ -523,7 +524,7 @@ index 00000000..2f4f3eaf
|
|||||||
+ add_blacklist_exceptions
|
+ add_blacklist_exceptions
|
||||||
+elif [ "$ENABLE" = 1 ]; then
|
+elif [ "$ENABLE" = 1 ]; then
|
||||||
+ if [ "$HAVE_DISABLE" = 1 ]; then
|
+ if [ "$HAVE_DISABLE" = 1 ]; then
|
||||||
+ sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*devnode \"\.\?\*\"/# devnode ".*"/' $TMPFILE
|
+ sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*devnode[[:space:]][[:space:]]*\"\.\?\*\"/# devnode ".*"/' $TMPFILE
|
||||||
+ fi
|
+ fi
|
||||||
+elif [ "$ENABLE" = 0 ]; then
|
+elif [ "$ENABLE" = 0 ]; then
|
||||||
+ if [ -z "$HAVE_DISABLE" ]; then
|
+ if [ -z "$HAVE_DISABLE" ]; then
|
||||||
@ -531,7 +532,7 @@ index 00000000..2f4f3eaf
|
|||||||
+ devnode ".*"
|
+ devnode ".*"
|
||||||
+' $TMPFILE
|
+' $TMPFILE
|
||||||
+ elif [ "$HAVE_DISABLE" = 0 ]; then
|
+ elif [ "$HAVE_DISABLE" = 0 ]; then
|
||||||
+ sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*#[[:space:]]*devnode \"\.\?\*\"/ devnode ".*"/' $TMPFILE
|
+ sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*#[[:space:]]*devnode[[:space:]][[:space:]]*\"\.\?\*\"/ devnode ".*"/' $TMPFILE
|
||||||
+ fi
|
+ fi
|
||||||
+fi
|
+fi
|
||||||
+
|
+
|
||||||
@ -542,14 +543,14 @@ index 00000000..2f4f3eaf
|
|||||||
+' $TMPFILE
|
+' $TMPFILE
|
||||||
+ CHANGED_CONFIG=1
|
+ CHANGED_CONFIG=1
|
||||||
+ elif [ "$FIND" != "$HAVE_FIND" ]; then
|
+ elif [ "$FIND" != "$HAVE_FIND" ]; then
|
||||||
+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:blank:]]*find_multipaths[[:blank:]]*[^[:blank:]]*/ find_multipaths '"$FIND"'/' $TMPFILE
|
+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:blank:]]*find_multipaths[[:blank:]][[:blank:]]*[^[:blank:]]*/ find_multipaths '"$FIND"'/' $TMPFILE
|
||||||
+ CHANGED_CONFIG=1
|
+ CHANGED_CONFIG=1
|
||||||
+ fi
|
+ fi
|
||||||
+fi
|
+fi
|
||||||
+
|
+
|
||||||
+if [ "$FRIENDLY" = "n" ]; then
|
+if [ "$FRIENDLY" = "n" ]; then
|
||||||
+ if [ "$HAVE_FRIENDLY" = 1 ]; then
|
+ if [ "$HAVE_FRIENDLY" = 1 ]; then
|
||||||
+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*user_friendly_names[[:space:]]*\(yes\|1\)/ user_friendly_names no/' $TMPFILE
|
+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*user_friendly_names[[:space:]][[:space:]]*\(yes\|1\)/ user_friendly_names no/' $TMPFILE
|
||||||
+ CHANGED_CONFIG=1
|
+ CHANGED_CONFIG=1
|
||||||
+ fi
|
+ fi
|
||||||
+elif [ "$FRIENDLY" = "y" ]; then
|
+elif [ "$FRIENDLY" = "y" ]; then
|
||||||
@ -559,14 +560,14 @@ index 00000000..2f4f3eaf
|
|||||||
+' $TMPFILE
|
+' $TMPFILE
|
||||||
+ CHANGED_CONFIG=1
|
+ CHANGED_CONFIG=1
|
||||||
+ elif [ "$HAVE_FRIENDLY" = 0 ]; then
|
+ elif [ "$HAVE_FRIENDLY" = 0 ]; then
|
||||||
+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*user_friendly_names[[:space:]]*\(no\|0\)/ user_friendly_names yes/' $TMPFILE
|
+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*user_friendly_names[[:space:]][[:space:]]*\(no\|0\)/ user_friendly_names yes/' $TMPFILE
|
||||||
+ CHANGED_CONFIG=1
|
+ CHANGED_CONFIG=1
|
||||||
+ fi
|
+ fi
|
||||||
+fi
|
+fi
|
||||||
+
|
+
|
||||||
+if [ "$PROPERTY" = "n" ]; then
|
+if [ "$PROPERTY" = "n" ]; then
|
||||||
+ if [ "$HAVE_PROPERTY" = 1 ]; then
|
+ if [ "$HAVE_PROPERTY" = 1 ]; then
|
||||||
+ sed -i '/^blacklist_exceptions[[:space:]]*{/,/^}/ s/^[[:space:]]*property[[:space:]]*\"(SCSI_IDENT_|ID_WWN)\"/# property \"(SCSI_IDENT_|ID_WWN)\"/' $TMPFILE
|
+ sed -i '/^blacklist_exceptions[[:space:]]*{/,/^}/ s/^[[:space:]]*property[[:space:]][[:space:]]*\"(SCSI_IDENT_|ID_WWN)\"/# property \"(SCSI_IDENT_|ID_WWN)\"/' $TMPFILE
|
||||||
+ CHANGED_CONFIG=1
|
+ CHANGED_CONFIG=1
|
||||||
+ fi
|
+ fi
|
||||||
+elif [ "$PROPERTY" = "y" ]; then
|
+elif [ "$PROPERTY" = "y" ]; then
|
||||||
@ -576,24 +577,24 @@ index 00000000..2f4f3eaf
|
|||||||
+' $TMPFILE
|
+' $TMPFILE
|
||||||
+ CHANGED_CONFIG=1
|
+ CHANGED_CONFIG=1
|
||||||
+ elif [ "$HAVE_PROPERTY" = 0 ]; then
|
+ elif [ "$HAVE_PROPERTY" = 0 ]; then
|
||||||
+ sed -i '/^blacklist_exceptions[[:space:]]*{/,/^}/ s/^[[:space:]]*#[[:space:]]*property[[:space:]]*\"(SCSI_IDENT_|ID_WWN)\"/ property \"(SCSI_IDENT_|ID_WWN)\"/' $TMPFILE
|
+ sed -i '/^blacklist_exceptions[[:space:]]*{/,/^}/ s/^[[:space:]]*#[[:space:]]*property[[:space:]][[:space:]]*\"(SCSI_IDENT_|ID_WWN)\"/ property \"(SCSI_IDENT_|ID_WWN)\"/' $TMPFILE
|
||||||
+ CHANGED_CONFIG=1
|
+ CHANGED_CONFIG=1
|
||||||
+ fi
|
+ fi
|
||||||
+fi
|
+fi
|
||||||
+
|
+
|
||||||
+if [ "$FOREIGN" = "y" ]; then
|
+if [ "$FOREIGN" = "n" ]; then
|
||||||
+ if [ "$HAVE_FOREIGN" = 1 -o "$HAVE_FOREIGN" = 2 ]; then
|
+ if [ "$HAVE_FOREIGN" = 1 -o "$HAVE_FOREIGN" = 3 ]; then
|
||||||
+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*enable_foreign/# enable_foreign/' $TMPFILE
|
+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*enable_foreign/# enable_foreign/' $TMPFILE
|
||||||
+ CHANGED_CONFIG=1
|
+ CHANGED_CONFIG=1
|
||||||
+ fi
|
+ fi
|
||||||
+elif [ "$FOREIGN" = "n" ]; then
|
+elif [ "$FOREIGN" = "y" ]; then
|
||||||
+ if [ -z "$HAVE_FOREIGN" ]; then
|
+ if [ -z "$HAVE_FOREIGN" ]; then
|
||||||
+ sed -i '/^defaults[[:space:]]*{/ a\
|
+ sed -i '/^defaults[[:space:]]*{/ a\
|
||||||
+ enable_foreign "^$"
|
+ enable_foreign ".*"
|
||||||
+' $TMPFILE
|
+' $TMPFILE
|
||||||
+ CHANGED_CONFIG=1
|
+ CHANGED_CONFIG=1
|
||||||
+ elif [ "$HAVE_FOREIGN" = 0 -o "$HAVE_FOREIGN" = 2 ]; then
|
+ elif [ "$HAVE_FOREIGN" = 0 -o "$HAVE_FOREIGN" = 2 -o "$HAVE_FOREIGN" = 3 ]; then
|
||||||
+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*#\?[[:space:]]*enable_foreign.*$/ enable_foreign "^$"/' $TMPFILE
|
+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*#\?[[:space:]]*enable_foreign.*$/ enable_foreign ".*"/' $TMPFILE
|
||||||
+ CHANGED_CONFIG=1
|
+ CHANGED_CONFIG=1
|
||||||
+ fi
|
+ fi
|
||||||
+fi
|
+fi
|
||||||
@ -630,7 +631,7 @@ index 00000000..2f4f3eaf
|
|||||||
+fi
|
+fi
|
||||||
diff --git a/multipath/mpathconf.8 b/multipath/mpathconf.8
|
diff --git a/multipath/mpathconf.8 b/multipath/mpathconf.8
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 00000000..83515eb4
|
index 00000000..a14d831e
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/multipath/mpathconf.8
|
+++ b/multipath/mpathconf.8
|
||||||
@@ -0,0 +1,135 @@
|
@@ -0,0 +1,135 @@
|
||||||
@ -730,11 +731,11 @@ index 00000000..83515eb4
|
|||||||
+present. This command can be used along with any other command.
|
+present. This command can be used along with any other command.
|
||||||
+.TP
|
+.TP
|
||||||
+.B --enable_foreign\fP { \fBy\fP | \fBn\fP }
|
+.B --enable_foreign\fP { \fBy\fP | \fBn\fP }
|
||||||
+If set to \fBn\fP, this adds the line
|
+If set to \fBy\fP, this adds the line
|
||||||
+.B enable_foreign "^$"
|
+.B enable_foreign ".*"
|
||||||
+to the
|
+to the
|
||||||
+.B /etc/multipath.conf
|
+.B /etc/multipath.conf
|
||||||
+defaults section. if set to \fBy\fP, this removes the line, if present. This
|
+defaults section. if set to \fBn\fP, this removes the line, if present. This
|
||||||
+command can be used along with any other command.
|
+command can be used along with any other command.
|
||||||
+.TP
|
+.TP
|
||||||
+.B --outfile \fB<filename>\fP
|
+.B --outfile \fB<filename>\fP
|
@ -1,23 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
|
||||||
Date: Thu, 15 Jul 2021 14:46:49 -0500
|
|
||||||
Subject: [PATCH] multipath.conf: fix typo in ghost_delay description
|
|
||||||
|
|
||||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
|
||||||
---
|
|
||||||
multipath/multipath.conf.5 | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5
|
|
||||||
index 0d2bce09..689d09aa 100644
|
|
||||||
--- a/multipath/multipath.conf.5
|
|
||||||
+++ b/multipath/multipath.conf.5
|
|
||||||
@@ -1251,7 +1251,7 @@ The default is: in \fB/sys/block/<dev>/queue/max_sectors_kb\fR
|
|
||||||
Sets the number of seconds that multipath will wait after creating a device
|
|
||||||
with only ghost paths before marking it ready for use in systemd. This gives
|
|
||||||
the active paths time to appear before the multipath runs the hardware handler
|
|
||||||
-to switch the ghost paths to active ones. Setting this to \fI0\fR or \fIon\fR
|
|
||||||
+to switch the ghost paths to active ones. Setting this to \fI0\fR or \fIno\fR
|
|
||||||
makes multipath immediately mark a device with only ghost paths as ready.
|
|
||||||
.RS
|
|
||||||
.TP
|
|
@ -20,7 +20,7 @@ Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
|||||||
3 files changed, 59 insertions(+), 3 deletions(-)
|
3 files changed, 59 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
diff --git a/multipath/main.c b/multipath/main.c
|
diff --git a/multipath/main.c b/multipath/main.c
|
||||||
index ef89c7cf..f618550d 100644
|
index 65ece830..748e7902 100644
|
||||||
--- a/multipath/main.c
|
--- a/multipath/main.c
|
||||||
+++ b/multipath/main.c
|
+++ b/multipath/main.c
|
||||||
@@ -122,7 +122,7 @@ usage (char * progname)
|
@@ -122,7 +122,7 @@ usage (char * progname)
|
||||||
@ -92,16 +92,16 @@ index ef89c7cf..f618550d 100644
|
|||||||
static int
|
static int
|
||||||
configure (struct config *conf, enum mpath_cmds cmd,
|
configure (struct config *conf, enum mpath_cmds cmd,
|
||||||
enum devtypes dev_type, char *devpath)
|
enum devtypes dev_type, char *devpath)
|
||||||
@@ -823,7 +869,7 @@ main (int argc, char *argv[])
|
@@ -838,7 +884,7 @@ main (int argc, char *argv[])
|
||||||
conf = get_multipath_config();
|
|
||||||
conf->retrigger_tries = 0;
|
conf->retrigger_tries = 0;
|
||||||
conf->force_sync = 1;
|
conf->force_sync = 1;
|
||||||
|
atexit(cleanup_vecs);
|
||||||
- while ((arg = getopt(argc, argv, ":adDcChl::eFfM:v:p:b:BrR:itTquUwW")) != EOF ) {
|
- while ((arg = getopt(argc, argv, ":adDcChl::eFfM:v:p:b:BrR:itTquUwW")) != EOF ) {
|
||||||
+ while ((arg = getopt(argc, argv, ":aAdDcChl::eFfM:v:p:b:BrR:itTquUwW")) != EOF ) {
|
+ while ((arg = getopt(argc, argv, ":aAdDcChl::eFfM:v:p:b:BrR:itTquUwW")) != EOF ) {
|
||||||
switch(arg) {
|
switch(arg) {
|
||||||
case 1: printf("optarg : %s\n",optarg);
|
case 1: printf("optarg : %s\n",optarg);
|
||||||
break;
|
break;
|
||||||
@@ -900,6 +946,10 @@ main (int argc, char *argv[])
|
@@ -915,6 +961,10 @@ main (int argc, char *argv[])
|
||||||
case 'T':
|
case 'T':
|
||||||
cmd = CMD_DUMP_CONFIG;
|
cmd = CMD_DUMP_CONFIG;
|
||||||
break;
|
break;
|
||||||
@ -113,7 +113,7 @@ index ef89c7cf..f618550d 100644
|
|||||||
usage(argv[0]);
|
usage(argv[0]);
|
||||||
exit(RTVL_OK);
|
exit(RTVL_OK);
|
||||||
diff --git a/multipath/multipath.8 b/multipath/multipath.8
|
diff --git a/multipath/multipath.8 b/multipath/multipath.8
|
||||||
index 5b29a5d9..0478f4e7 100644
|
index 17df59f5..5ca75359 100644
|
||||||
--- a/multipath/multipath.8
|
--- a/multipath/multipath.8
|
||||||
+++ b/multipath/multipath.8
|
+++ b/multipath/multipath.8
|
||||||
@@ -63,7 +63,7 @@ multipath \- Device mapper target autoconfig.
|
@@ -63,7 +63,7 @@ multipath \- Device mapper target autoconfig.
|
||||||
@ -138,10 +138,10 @@ index 5b29a5d9..0478f4e7 100644
|
|||||||
Remove the WWID for the specified device from the WWIDs file.
|
Remove the WWID for the specified device from the WWIDs file.
|
||||||
.
|
.
|
||||||
diff --git a/multipathd/multipathd.service b/multipathd/multipathd.service
|
diff --git a/multipathd/multipathd.service b/multipathd/multipathd.service
|
||||||
index af592057..bc8fa07a 100644
|
index 6d57c7e8..dfc1e962 100644
|
||||||
--- a/multipathd/multipathd.service
|
--- a/multipathd/multipathd.service
|
||||||
+++ b/multipathd/multipathd.service
|
+++ b/multipathd/multipathd.service
|
||||||
@@ -15,6 +15,7 @@ Type=notify
|
@@ -16,6 +16,7 @@ Type=notify
|
||||||
NotifyAccess=main
|
NotifyAccess=main
|
||||||
LimitCORE=infinity
|
LimitCORE=infinity
|
||||||
ExecStartPre=-/sbin/modprobe -a scsi_dh_alua scsi_dh_emc scsi_dh_rdac dm-multipath
|
ExecStartPre=-/sbin/modprobe -a scsi_dh_alua scsi_dh_emc scsi_dh_rdac dm-multipath
|
@ -1,41 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
|
||||||
Date: Thu, 15 Jul 2021 17:09:05 -0500
|
|
||||||
Subject: [PATCH] mpathpersist: fail commands when no usable paths exist
|
|
||||||
|
|
||||||
"mpathpersist -oCK <reservation_key> <device>" will return success if it
|
|
||||||
is run on devices with no usable paths, but nothing is actually done.
|
|
||||||
The -L command will fail, but it should give up sooner, and with a more
|
|
||||||
helpful error message.
|
|
||||||
|
|
||||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
|
||||||
---
|
|
||||||
libmpathpersist/mpath_persist.c | 8 +++++++-
|
|
||||||
1 file changed, 7 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/libmpathpersist/mpath_persist.c b/libmpathpersist/mpath_persist.c
|
|
||||||
index 190e9707..26710e79 100644
|
|
||||||
--- a/libmpathpersist/mpath_persist.c
|
|
||||||
+++ b/libmpathpersist/mpath_persist.c
|
|
||||||
@@ -604,7 +604,8 @@ int mpath_prout_common(struct multipath *mpp,int rq_servact, int rq_scope,
|
|
||||||
return ret ;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
- return MPATH_PR_SUCCESS;
|
|
||||||
+ condlog (0, "%s: no path available", mpp->wwid);
|
|
||||||
+ return MPATH_PR_DMMP_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
int send_prout_activepath(char * dev, int rq_servact, int rq_scope,
|
|
||||||
@@ -663,6 +664,11 @@ int mpath_prout_rel(struct multipath *mpp,int rq_servact, int rq_scope,
|
|
||||||
|
|
||||||
active_pathcount = count_active_paths(mpp);
|
|
||||||
|
|
||||||
+ if (active_pathcount == 0) {
|
|
||||||
+ condlog (0, "%s: no path available", mpp->wwid);
|
|
||||||
+ return MPATH_PR_DMMP_ERROR;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
struct threadinfo thread[active_pathcount];
|
|
||||||
memset(thread, 0, sizeof(thread));
|
|
||||||
for (i = 0; i < active_pathcount; i++){
|
|
@ -1,119 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
|
||||||
Date: Fri, 16 Jul 2021 12:39:17 -0500
|
|
||||||
Subject: [PATCH] multipath: print warning if multipathd is not running.
|
|
||||||
|
|
||||||
If multipath notices that multipath devices exist or were created, and
|
|
||||||
multipathd is not running, it now prints a warning message, so users are
|
|
||||||
notified of the issue.
|
|
||||||
|
|
||||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
|
||||||
---
|
|
||||||
libmultipath/configure.c | 13 +++++++++++--
|
|
||||||
libmultipath/configure.h | 1 +
|
|
||||||
libmultipath/libmultipath.version | 5 +++++
|
|
||||||
multipath/main.c | 5 +++++
|
|
||||||
4 files changed, 22 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/libmultipath/configure.c b/libmultipath/configure.c
|
|
||||||
index 6ca1f4bb..9da85ce6 100644
|
|
||||||
--- a/libmultipath/configure.c
|
|
||||||
+++ b/libmultipath/configure.c
|
|
||||||
@@ -1083,7 +1083,8 @@ deadmap (struct multipath * mpp)
|
|
||||||
return 1; /* dead */
|
|
||||||
}
|
|
||||||
|
|
||||||
-int check_daemon(void)
|
|
||||||
+extern int
|
|
||||||
+check_daemon(void)
|
|
||||||
{
|
|
||||||
int fd;
|
|
||||||
char *reply;
|
|
||||||
@@ -1138,6 +1139,8 @@ int coalesce_paths (struct vectors *vecs, vector mpvec, char *refwwid,
|
|
||||||
struct config *conf;
|
|
||||||
int allow_queueing;
|
|
||||||
struct bitfield *size_mismatch_seen;
|
|
||||||
+ bool map_processed = false;
|
|
||||||
+ bool no_daemon = false;
|
|
||||||
|
|
||||||
/* ignore refwwid if it's empty */
|
|
||||||
if (refwwid && !strlen(refwwid))
|
|
||||||
@@ -1288,7 +1291,9 @@ int coalesce_paths (struct vectors *vecs, vector mpvec, char *refwwid,
|
|
||||||
conf = get_multipath_config();
|
|
||||||
allow_queueing = conf->allow_queueing;
|
|
||||||
put_multipath_config(conf);
|
|
||||||
- if (!is_daemon && !allow_queueing && !check_daemon()) {
|
|
||||||
+ if (!is_daemon && !allow_queueing &&
|
|
||||||
+ (no_daemon || !check_daemon())) {
|
|
||||||
+ no_daemon = true;
|
|
||||||
if (mpp->no_path_retry != NO_PATH_RETRY_UNDEF &&
|
|
||||||
mpp->no_path_retry != NO_PATH_RETRY_FAIL)
|
|
||||||
condlog(3, "%s: multipathd not running, unset "
|
|
||||||
@@ -1311,6 +1316,7 @@ int coalesce_paths (struct vectors *vecs, vector mpvec, char *refwwid,
|
|
||||||
else
|
|
||||||
remove_map(mpp, vecs->pathvec, vecs->mpvec,
|
|
||||||
KEEP_VEC);
|
|
||||||
+ map_processed = true;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Flush maps with only dead paths (ie not in sysfs)
|
|
||||||
@@ -1336,6 +1342,9 @@ int coalesce_paths (struct vectors *vecs, vector mpvec, char *refwwid,
|
|
||||||
condlog(2, "%s: remove (dead)", alias);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+ if (map_processed && !is_daemon && (no_daemon || !check_daemon()))
|
|
||||||
+ condlog(2, "multipath devices exist, but multipathd service is not running");
|
|
||||||
+
|
|
||||||
ret = CP_OK;
|
|
||||||
out:
|
|
||||||
free(size_mismatch_seen);
|
|
||||||
diff --git a/libmultipath/configure.h b/libmultipath/configure.h
|
|
||||||
index 70cf77a3..741066b3 100644
|
|
||||||
--- a/libmultipath/configure.h
|
|
||||||
+++ b/libmultipath/configure.h
|
|
||||||
@@ -60,3 +60,4 @@ struct udev_device *get_udev_device(const char *dev, enum devtypes dev_type);
|
|
||||||
void trigger_paths_udev_change(struct multipath *mpp, bool is_mpath);
|
|
||||||
void trigger_partitions_udev_change(struct udev_device *dev, const char *action,
|
|
||||||
int len);
|
|
||||||
+int check_daemon(void);
|
|
||||||
diff --git a/libmultipath/libmultipath.version b/libmultipath/libmultipath.version
|
|
||||||
index 0cff3111..d8be5fd2 100644
|
|
||||||
--- a/libmultipath/libmultipath.version
|
|
||||||
+++ b/libmultipath/libmultipath.version
|
|
||||||
@@ -274,3 +274,8 @@ global:
|
|
||||||
local:
|
|
||||||
*;
|
|
||||||
};
|
|
||||||
+
|
|
||||||
+LIBMULTIPATH_5.1.0 {
|
|
||||||
+global:
|
|
||||||
+ check_daemon;
|
|
||||||
+} LIBMULTIPATH_5.0.0;
|
|
||||||
diff --git a/multipath/main.c b/multipath/main.c
|
|
||||||
index 9fe53dcd..85e4481d 100644
|
|
||||||
--- a/multipath/main.c
|
|
||||||
+++ b/multipath/main.c
|
|
||||||
@@ -182,6 +182,7 @@ get_dm_mpvec (enum mpath_cmds cmd, vector curmp, vector pathvec, char * refwwid)
|
|
||||||
int i;
|
|
||||||
struct multipath * mpp;
|
|
||||||
int flags = (cmd == CMD_LIST_SHORT ? DI_NOIO : DI_ALL);
|
|
||||||
+ bool maps_present = false;
|
|
||||||
|
|
||||||
if (dm_get_maps(curmp))
|
|
||||||
return 1;
|
|
||||||
@@ -214,11 +215,15 @@ get_dm_mpvec (enum mpath_cmds cmd, vector curmp, vector pathvec, char * refwwid)
|
|
||||||
|
|
||||||
if (cmd == CMD_CREATE)
|
|
||||||
reinstate_paths(mpp);
|
|
||||||
+
|
|
||||||
+ maps_present = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cmd == CMD_LIST_SHORT || cmd == CMD_LIST_LONG)
|
|
||||||
print_foreign_topology(libmp_verbosity);
|
|
||||||
|
|
||||||
+ if (maps_present && !check_daemon())
|
|
||||||
+ condlog(2, "multipath devices exist, but multipathd service is not running");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
@ -1,31 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
|
||||||
Date: Thu, 29 Jul 2021 13:16:57 -0500
|
|
||||||
Subject: [PATCH] libmultipath: deal with dynamic PTHREAD_STACK_MIN
|
|
||||||
|
|
||||||
Starting in glibc-2.34 (commit 5d98a7da), PTHREAD_STACK_MIN is defined
|
|
||||||
as sysconf(_SC_THREAD_STACK_MIN) if _GNU_SOURCE is defined. sysconf()
|
|
||||||
returns a long and can, at least in theory, return -1. This change
|
|
||||||
causes compilation to fail in setup_thread_attr() due to a comparision
|
|
||||||
with different signedness, since stacksize is a size_t.
|
|
||||||
|
|
||||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
|
||||||
---
|
|
||||||
libmultipath/util.c | 4 ++--
|
|
||||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/libmultipath/util.c b/libmultipath/util.c
|
|
||||||
index 0e37f3ff..17f8fcc6 100644
|
|
||||||
--- a/libmultipath/util.c
|
|
||||||
+++ b/libmultipath/util.c
|
|
||||||
@@ -223,8 +223,8 @@ setup_thread_attr(pthread_attr_t *attr, size_t stacksize, int detached)
|
|
||||||
|
|
||||||
ret = pthread_attr_init(attr);
|
|
||||||
assert(ret == 0);
|
|
||||||
- if (stacksize < PTHREAD_STACK_MIN)
|
|
||||||
- stacksize = PTHREAD_STACK_MIN;
|
|
||||||
+ if (PTHREAD_STACK_MIN > 0 && stacksize < (size_t)PTHREAD_STACK_MIN)
|
|
||||||
+ stacksize = (size_t)PTHREAD_STACK_MIN;
|
|
||||||
ret = pthread_attr_setstacksize(attr, stacksize);
|
|
||||||
assert(ret == 0);
|
|
||||||
if (detached) {
|
|
102
SOURCES/0022-RH-make-parse_vpd_pg83-match-scsi_id-output.patch
Normal file
102
SOURCES/0022-RH-make-parse_vpd_pg83-match-scsi_id-output.patch
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
Date: Thu, 25 Mar 2021 13:05:10 -0500
|
||||||
|
Subject: [PATCH] RH: make parse_vpd_pg83 match scsi_id output
|
||||||
|
|
||||||
|
Red Hat sets ID_SERIAL based on the result of scsi_id, instead of using
|
||||||
|
the result of sg_inq and 55-scsi-sg3_id.rules. Make parse_vpd_pg83 match
|
||||||
|
that.
|
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
---
|
||||||
|
libmultipath/discovery.c | 18 ++----------------
|
||||||
|
tests/vpd.c | 6 ++++++
|
||||||
|
2 files changed, 8 insertions(+), 16 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
|
||||||
|
index f25fe9e3..6fb81c28 100644
|
||||||
|
--- a/libmultipath/discovery.c
|
||||||
|
+++ b/libmultipath/discovery.c
|
||||||
|
@@ -1136,12 +1136,9 @@ parse_vpd_pg83(const unsigned char *in, size_t in_len,
|
||||||
|
naa_prio = 7;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
- /* IEEE Extended: Prio 6 */
|
||||||
|
- naa_prio = 6;
|
||||||
|
- break;
|
||||||
|
case 3:
|
||||||
|
- /* IEEE Locally assigned: Prio 1 */
|
||||||
|
- naa_prio = 1;
|
||||||
|
+ /* IEEE Extended or Locally assigned: Prio 6 */
|
||||||
|
+ naa_prio = 6;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* Default: no priority */
|
||||||
|
@@ -1160,17 +1157,6 @@ parse_vpd_pg83(const unsigned char *in, size_t in_len,
|
||||||
|
vpd = d;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
- case 0x8:
|
||||||
|
- /* SCSI Name: Prio 3 */
|
||||||
|
- if (memcmp(d + 4, "eui.", 4) &&
|
||||||
|
- memcmp(d + 4, "naa.", 4) &&
|
||||||
|
- memcmp(d + 4, "iqn.", 4))
|
||||||
|
- break;
|
||||||
|
- if (prio < 3) {
|
||||||
|
- prio = 3;
|
||||||
|
- vpd = d;
|
||||||
|
- }
|
||||||
|
- break;
|
||||||
|
case 0x1:
|
||||||
|
/* T-10 Vendor ID: Prio 2 */
|
||||||
|
if (prio < 2) {
|
||||||
|
diff --git a/tests/vpd.c b/tests/vpd.c
|
||||||
|
index 8e730d37..7bf7990f 100644
|
||||||
|
--- a/tests/vpd.c
|
||||||
|
+++ b/tests/vpd.c
|
||||||
|
@@ -230,11 +230,13 @@ static const char * const str_prefix[] = {
|
||||||
|
[STR_IQN] = "iqn.",
|
||||||
|
};
|
||||||
|
|
||||||
|
+#if 0
|
||||||
|
static const char byte0[] = {
|
||||||
|
[STR_EUI] = '2',
|
||||||
|
[STR_NAA] = '3',
|
||||||
|
[STR_IQN] = '8',
|
||||||
|
};
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* create_scsi_string_desc() - create a SCSI name string descriptor.
|
||||||
|
@@ -659,6 +661,7 @@ make_test_vpd_naa(2, 18);
|
||||||
|
make_test_vpd_naa(2, 17);
|
||||||
|
make_test_vpd_naa(2, 16);
|
||||||
|
|
||||||
|
+#if 0
|
||||||
|
/* SCSI Name string: EUI64, WWID size: 17 */
|
||||||
|
make_test_vpd_str(0, 20, 18)
|
||||||
|
make_test_vpd_str(0, 20, 17)
|
||||||
|
@@ -694,6 +697,7 @@ make_test_vpd_str(18, 20, 18)
|
||||||
|
make_test_vpd_str(18, 20, 17)
|
||||||
|
make_test_vpd_str(18, 20, 16)
|
||||||
|
make_test_vpd_str(18, 20, 15)
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
static int test_vpd(void)
|
||||||
|
{
|
||||||
|
@@ -767,6 +771,7 @@ static int test_vpd(void)
|
||||||
|
cmocka_unit_test(test_vpd_naa_2_18),
|
||||||
|
cmocka_unit_test(test_vpd_naa_2_17),
|
||||||
|
cmocka_unit_test(test_vpd_naa_2_16),
|
||||||
|
+/*
|
||||||
|
cmocka_unit_test(test_vpd_str_0_20_18),
|
||||||
|
cmocka_unit_test(test_vpd_str_0_20_17),
|
||||||
|
cmocka_unit_test(test_vpd_str_0_20_16),
|
||||||
|
@@ -791,6 +796,7 @@ static int test_vpd(void)
|
||||||
|
cmocka_unit_test(test_vpd_str_18_20_17),
|
||||||
|
cmocka_unit_test(test_vpd_str_18_20_16),
|
||||||
|
cmocka_unit_test(test_vpd_str_18_20_15),
|
||||||
|
+*/
|
||||||
|
};
|
||||||
|
return cmocka_run_group_tests(tests, setup, teardown);
|
||||||
|
}
|
@ -1,82 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Martin Wilck <mwilck@suse.com>
|
|
||||||
Date: Mon, 17 May 2021 22:37:34 +0200
|
|
||||||
Subject: [PATCH] multipathd: cli_handlers: cleanup setting reply length
|
|
||||||
|
|
||||||
Create a macro for setting the reply length for string literals
|
|
||||||
correctly, and use it where necessary.
|
|
||||||
|
|
||||||
In cli_del_path(), don't change the function's return code
|
|
||||||
if just the buffer allocation for the reply failed.
|
|
||||||
|
|
||||||
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
|
|
||||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
|
||||||
---
|
|
||||||
multipathd/cli_handlers.c | 33 ++++++++++++---------------------
|
|
||||||
1 file changed, 12 insertions(+), 21 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/multipathd/cli_handlers.c b/multipathd/cli_handlers.c
|
|
||||||
index 6765fcf0..96064944 100644
|
|
||||||
--- a/multipathd/cli_handlers.c
|
|
||||||
+++ b/multipathd/cli_handlers.c
|
|
||||||
@@ -32,6 +32,12 @@
|
|
||||||
#include "foreign.h"
|
|
||||||
#include "cli_handlers.h"
|
|
||||||
|
|
||||||
+#define SET_REPLY_AND_LEN(__rep, __len, string_literal) \
|
|
||||||
+ do { \
|
|
||||||
+ *(__rep) = strdup(string_literal); \
|
|
||||||
+ *(__len) = *(__rep) ? sizeof(string_literal) : 0; \
|
|
||||||
+ } while (0)
|
|
||||||
+
|
|
||||||
int
|
|
||||||
show_paths (char ** r, int * len, struct vectors * vecs, char * style,
|
|
||||||
int pretty)
|
|
||||||
@@ -802,8 +808,7 @@ cli_add_path (void * v, char ** reply, int * len, void * data)
|
|
||||||
}
|
|
||||||
return ev_add_path(pp, vecs, 1);
|
|
||||||
blacklisted:
|
|
||||||
- *reply = strdup("blacklisted\n");
|
|
||||||
- *len = strlen(*reply) + 1;
|
|
||||||
+ SET_REPLY_AND_LEN(reply, len, "blacklisted\n");
|
|
||||||
condlog(2, "%s: path blacklisted", param);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -824,23 +829,10 @@ cli_del_path (void * v, char ** reply, int * len, void * data)
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
ret = ev_remove_path(pp, vecs, 1);
|
|
||||||
- if (ret == REMOVE_PATH_DELAY) {
|
|
||||||
- *reply = strdup("delayed\n");
|
|
||||||
- if (*reply)
|
|
||||||
- *len = strlen(*reply) + 1;
|
|
||||||
- else {
|
|
||||||
- *len = 0;
|
|
||||||
- ret = REMOVE_PATH_FAILURE;
|
|
||||||
- }
|
|
||||||
- } else if (ret == REMOVE_PATH_MAP_ERROR) {
|
|
||||||
- *reply = strdup("map reload error. removed\n");
|
|
||||||
- if (*reply)
|
|
||||||
- *len = strlen(*reply) + 1;
|
|
||||||
- else {
|
|
||||||
- *len = 0;
|
|
||||||
- ret = REMOVE_PATH_FAILURE;
|
|
||||||
- }
|
|
||||||
- }
|
|
||||||
+ if (ret == REMOVE_PATH_DELAY)
|
|
||||||
+ SET_REPLY_AND_LEN(reply, len, "delayed\n");
|
|
||||||
+ else if (ret == REMOVE_PATH_MAP_ERROR)
|
|
||||||
+ SET_REPLY_AND_LEN(reply, len, "map reload error. removed\n");
|
|
||||||
return (ret == REMOVE_PATH_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -865,8 +857,7 @@ cli_add_map (void * v, char ** reply, int * len, void * data)
|
|
||||||
invalid = 1;
|
|
||||||
pthread_cleanup_pop(1);
|
|
||||||
if (invalid) {
|
|
||||||
- *reply = strdup("blacklisted\n");
|
|
||||||
- *len = strlen(*reply) + 1;
|
|
||||||
+ SET_REPLY_AND_LEN(reply, len, "blacklisted\n");
|
|
||||||
condlog(2, "%s: map blacklisted", param);
|
|
||||||
return 1;
|
|
||||||
}
|
|
@ -0,0 +1,69 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
Date: Thu, 23 Sep 2021 14:16:51 -0500
|
||||||
|
Subject: [PATCH] libmultipath: add section name to invalid keyword output
|
||||||
|
|
||||||
|
If users forget the closing brace for a section in multipath.conf,
|
||||||
|
multipath has no way to detect that. When it sees the keyword at the
|
||||||
|
start of the next section, it will complain that there is an invalid
|
||||||
|
keyword, because that keyword doesn't belong in previous section (which
|
||||||
|
was never ended with a closing brace). This can confuse users. To make
|
||||||
|
this easier to understand, when multipath prints an invalid keyword
|
||||||
|
message, it now also prints the current section name, which can give
|
||||||
|
users a hint that they didn't end the previous section.
|
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
---
|
||||||
|
libmultipath/parser.c | 20 +++++++++++++-------
|
||||||
|
1 file changed, 13 insertions(+), 7 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/libmultipath/parser.c b/libmultipath/parser.c
|
||||||
|
index 8ca91bf2..611054f7 100644
|
||||||
|
--- a/libmultipath/parser.c
|
||||||
|
+++ b/libmultipath/parser.c
|
||||||
|
@@ -504,7 +504,7 @@ validate_config_strvec(vector strvec, const char *file)
|
||||||
|
|
||||||
|
static int
|
||||||
|
process_stream(struct config *conf, FILE *stream, vector keywords,
|
||||||
|
- const char *file)
|
||||||
|
+ const char *section, const char *file)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int r = 0, t;
|
||||||
|
@@ -568,16 +568,22 @@ process_stream(struct config *conf, FILE *stream, vector keywords,
|
||||||
|
if (keyword->sub) {
|
||||||
|
kw_level++;
|
||||||
|
r += process_stream(conf, stream,
|
||||||
|
- keyword->sub, file);
|
||||||
|
+ keyword->sub,
|
||||||
|
+ keyword->string,
|
||||||
|
+ file);
|
||||||
|
kw_level--;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- if (i >= VECTOR_SIZE(keywords))
|
||||||
|
- condlog(1, "%s line %d, invalid keyword: %s",
|
||||||
|
- file, line_nr, str);
|
||||||
|
-
|
||||||
|
+ if (i >= VECTOR_SIZE(keywords)) {
|
||||||
|
+ if (section)
|
||||||
|
+ condlog(1, "%s line %d, invalid keyword in the %s section: %s",
|
||||||
|
+ file, line_nr, section, str);
|
||||||
|
+ else
|
||||||
|
+ condlog(1, "%s line %d, invalid keyword: %s",
|
||||||
|
+ file, line_nr, str);
|
||||||
|
+ }
|
||||||
|
free_strvec(strvec);
|
||||||
|
}
|
||||||
|
if (kw_level == 1)
|
||||||
|
@@ -608,7 +614,7 @@ process_file(struct config *conf, const char *file)
|
||||||
|
|
||||||
|
/* Stream handling */
|
||||||
|
line_nr = 0;
|
||||||
|
- r = process_stream(conf, stream, conf->keywords, file);
|
||||||
|
+ r = process_stream(conf, stream, conf->keywords, NULL, file);
|
||||||
|
fclose(stream);
|
||||||
|
//free_keywords(keywords);
|
||||||
|
|
@ -0,0 +1,84 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
Date: Thu, 23 Sep 2021 21:39:36 -0500
|
||||||
|
Subject: [PATCH] libmultipath: use typedef for keyword handler function
|
||||||
|
|
||||||
|
Don't keep writing out the function type.
|
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
---
|
||||||
|
libmultipath/parser.c | 6 +++---
|
||||||
|
libmultipath/parser.h | 15 ++++++---------
|
||||||
|
2 files changed, 9 insertions(+), 12 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/libmultipath/parser.c b/libmultipath/parser.c
|
||||||
|
index 611054f7..ebe1cbd9 100644
|
||||||
|
--- a/libmultipath/parser.c
|
||||||
|
+++ b/libmultipath/parser.c
|
||||||
|
@@ -33,7 +33,7 @@ static int line_nr;
|
||||||
|
|
||||||
|
int
|
||||||
|
keyword_alloc(vector keywords, char *string,
|
||||||
|
- int (*handler) (struct config *, vector),
|
||||||
|
+ handler_fn *handler,
|
||||||
|
print_fn *print,
|
||||||
|
int unique)
|
||||||
|
{
|
||||||
|
@@ -72,7 +72,7 @@ install_sublevel_end(void)
|
||||||
|
|
||||||
|
int
|
||||||
|
_install_keyword(vector keywords, char *string,
|
||||||
|
- int (*handler) (struct config *, vector),
|
||||||
|
+ handler_fn *handler,
|
||||||
|
print_fn *print,
|
||||||
|
int unique)
|
||||||
|
{
|
||||||
|
@@ -558,7 +558,7 @@ process_stream(struct config *conf, FILE *stream, vector keywords,
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
if (keyword->handler) {
|
||||||
|
- t = (*keyword->handler) (conf, strvec);
|
||||||
|
+ t = keyword->handler(conf, strvec);
|
||||||
|
r += t;
|
||||||
|
if (t)
|
||||||
|
condlog(1, "multipath.conf +%d, parsing failed: %s",
|
||||||
|
diff --git a/libmultipath/parser.h b/libmultipath/parser.h
|
||||||
|
index b43d46f8..3452bde1 100644
|
||||||
|
--- a/libmultipath/parser.h
|
||||||
|
+++ b/libmultipath/parser.h
|
||||||
|
@@ -43,10 +43,11 @@ struct strbuf;
|
||||||
|
|
||||||
|
/* keyword definition */
|
||||||
|
typedef int print_fn(struct config *, struct strbuf *, const void *);
|
||||||
|
+typedef int handler_fn(struct config *, vector);
|
||||||
|
|
||||||
|
struct keyword {
|
||||||
|
char *string;
|
||||||
|
- int (*handler) (struct config *, vector);
|
||||||
|
+ handler_fn *handler;
|
||||||
|
print_fn *print;
|
||||||
|
vector sub;
|
||||||
|
int unique;
|
||||||
|
@@ -62,18 +63,14 @@ struct keyword {
|
||||||
|
for (i = 0; i < (k)->sub->allocated && ((p) = (k)->sub->slot[i]); i++)
|
||||||
|
|
||||||
|
/* Prototypes */
|
||||||
|
-extern int keyword_alloc(vector keywords, char *string,
|
||||||
|
- int (*handler) (struct config *, vector),
|
||||||
|
- print_fn *print,
|
||||||
|
- int unique);
|
||||||
|
+extern int keyword_alloc(vector keywords, char *string, handler_fn *handler,
|
||||||
|
+ print_fn *print, int unique);
|
||||||
|
#define install_keyword_root(str, h) keyword_alloc(keywords, str, h, NULL, 1)
|
||||||
|
extern void install_sublevel(void);
|
||||||
|
extern void install_sublevel_end(void);
|
||||||
|
|
||||||
|
-extern int _install_keyword(vector keywords, char *string,
|
||||||
|
- int (*handler) (struct config *, vector),
|
||||||
|
- print_fn *print,
|
||||||
|
- int unique);
|
||||||
|
+extern int _install_keyword(vector keywords, char *string, handler_fn *handler,
|
||||||
|
+ print_fn *print, int unique);
|
||||||
|
#define install_keyword(str, vec, pri) _install_keyword(keywords, str, vec, pri, 1)
|
||||||
|
#define install_keyword_multi(str, vec, pri) _install_keyword(keywords, str, vec, pri, 0)
|
||||||
|
extern void dump_keywords(vector keydump, int level);
|
@ -0,0 +1,27 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
Date: Fri, 24 Sep 2021 13:13:31 -0500
|
||||||
|
Subject: [PATCH] libmultipath: print the correct file when parsing fails
|
||||||
|
|
||||||
|
Don't assume that parsing failed on multipath.conf
|
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
---
|
||||||
|
libmultipath/parser.c | 4 ++--
|
||||||
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/libmultipath/parser.c b/libmultipath/parser.c
|
||||||
|
index ebe1cbd9..d5595fb0 100644
|
||||||
|
--- a/libmultipath/parser.c
|
||||||
|
+++ b/libmultipath/parser.c
|
||||||
|
@@ -561,8 +561,8 @@ process_stream(struct config *conf, FILE *stream, vector keywords,
|
||||||
|
t = keyword->handler(conf, strvec);
|
||||||
|
r += t;
|
||||||
|
if (t)
|
||||||
|
- condlog(1, "multipath.conf +%d, parsing failed: %s",
|
||||||
|
- line_nr, buf);
|
||||||
|
+ condlog(1, "%s line %d, parsing failed: %s",
|
||||||
|
+ file, line_nr, buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (keyword->sub) {
|
@ -0,0 +1,527 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
Date: Fri, 24 Sep 2021 17:59:12 -0500
|
||||||
|
Subject: [PATCH] libmultipath: pass file and line number to keyword handlers
|
||||||
|
|
||||||
|
This will make it possible for the keyword handlers to print more useful
|
||||||
|
warning messages. It will be used by future patches.
|
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
---
|
||||||
|
libmultipath/dict.c | 143 +++++++++++++++++++++++++-----------------
|
||||||
|
libmultipath/parser.c | 3 +-
|
||||||
|
libmultipath/parser.h | 2 +-
|
||||||
|
3 files changed, 90 insertions(+), 58 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/libmultipath/dict.c b/libmultipath/dict.c
|
||||||
|
index 7a727389..eb2c44c0 100644
|
||||||
|
--- a/libmultipath/dict.c
|
||||||
|
+++ b/libmultipath/dict.c
|
||||||
|
@@ -29,7 +29,7 @@
|
||||||
|
#include "strbuf.h"
|
||||||
|
|
||||||
|
static int
|
||||||
|
-set_int(vector strvec, void *ptr)
|
||||||
|
+set_int(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
int *int_ptr = (int *)ptr;
|
||||||
|
char *buff, *eptr;
|
||||||
|
@@ -58,7 +58,7 @@ set_int(vector strvec, void *ptr)
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
-set_uint(vector strvec, void *ptr)
|
||||||
|
+set_uint(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
unsigned int *uint_ptr = (unsigned int *)ptr;
|
||||||
|
char *buff, *eptr, *p;
|
||||||
|
@@ -90,7 +90,7 @@ set_uint(vector strvec, void *ptr)
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
-set_str(vector strvec, void *ptr)
|
||||||
|
+set_str(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
char **str_ptr = (char **)ptr;
|
||||||
|
|
||||||
|
@@ -105,7 +105,7 @@ set_str(vector strvec, void *ptr)
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
-set_yes_no(vector strvec, void *ptr)
|
||||||
|
+set_yes_no(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
char * buff;
|
||||||
|
int *int_ptr = (int *)ptr;
|
||||||
|
@@ -124,7 +124,7 @@ set_yes_no(vector strvec, void *ptr)
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
-set_yes_no_undef(vector strvec, void *ptr)
|
||||||
|
+set_yes_no_undef(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
char * buff;
|
||||||
|
int *int_ptr = (int *)ptr;
|
||||||
|
@@ -187,9 +187,10 @@ static int print_yes_no_undef(struct strbuf *buff, long v)
|
||||||
|
|
||||||
|
#define declare_def_handler(option, function) \
|
||||||
|
static int \
|
||||||
|
-def_ ## option ## _handler (struct config *conf, vector strvec) \
|
||||||
|
+def_ ## option ## _handler (struct config *conf, vector strvec, \
|
||||||
|
+ const char *file, int line_nr) \
|
||||||
|
{ \
|
||||||
|
- return function (strvec, &conf->option); \
|
||||||
|
+ return function (strvec, &conf->option, file, line_nr); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define declare_def_snprint(option, function) \
|
||||||
|
@@ -224,12 +225,13 @@ snprint_def_ ## option (struct config *conf, struct strbuf *buff, \
|
||||||
|
|
||||||
|
#define declare_hw_handler(option, function) \
|
||||||
|
static int \
|
||||||
|
-hw_ ## option ## _handler (struct config *conf, vector strvec) \
|
||||||
|
+hw_ ## option ## _handler (struct config *conf, vector strvec, \
|
||||||
|
+ const char *file, int line_nr) \
|
||||||
|
{ \
|
||||||
|
struct hwentry * hwe = VECTOR_LAST_SLOT(conf->hwtable); \
|
||||||
|
if (!hwe) \
|
||||||
|
return 1; \
|
||||||
|
- return function (strvec, &hwe->option); \
|
||||||
|
+ return function (strvec, &hwe->option, file, line_nr); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define declare_hw_snprint(option, function) \
|
||||||
|
@@ -243,11 +245,12 @@ snprint_hw_ ## option (struct config *conf, struct strbuf *buff, \
|
||||||
|
|
||||||
|
#define declare_ovr_handler(option, function) \
|
||||||
|
static int \
|
||||||
|
-ovr_ ## option ## _handler (struct config *conf, vector strvec) \
|
||||||
|
+ovr_ ## option ## _handler (struct config *conf, vector strvec, \
|
||||||
|
+ const char *file, int line_nr) \
|
||||||
|
{ \
|
||||||
|
if (!conf->overrides) \
|
||||||
|
return 1; \
|
||||||
|
- return function (strvec, &conf->overrides->option); \
|
||||||
|
+ return function (strvec, &conf->overrides->option, file, line_nr); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define declare_ovr_snprint(option, function) \
|
||||||
|
@@ -260,12 +263,13 @@ snprint_ovr_ ## option (struct config *conf, struct strbuf *buff, \
|
||||||
|
|
||||||
|
#define declare_mp_handler(option, function) \
|
||||||
|
static int \
|
||||||
|
-mp_ ## option ## _handler (struct config *conf, vector strvec) \
|
||||||
|
+mp_ ## option ## _handler (struct config *conf, vector strvec, \
|
||||||
|
+ const char *file, int line_nr) \
|
||||||
|
{ \
|
||||||
|
struct mpentry * mpe = VECTOR_LAST_SLOT(conf->mptable); \
|
||||||
|
if (!mpe) \
|
||||||
|
return 1; \
|
||||||
|
- return function (strvec, &mpe->option); \
|
||||||
|
+ return function (strvec, &mpe->option, file, line_nr); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define declare_mp_snprint(option, function) \
|
||||||
|
@@ -277,9 +281,10 @@ snprint_mp_ ## option (struct config *conf, struct strbuf *buff, \
|
||||||
|
return function(buff, mpe->option); \
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int checkint_handler(struct config *conf, vector strvec)
|
||||||
|
+static int checkint_handler(struct config *conf, vector strvec,
|
||||||
|
+ const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
- int rc = set_uint(strvec, &conf->checkint);
|
||||||
|
+ int rc = set_uint(strvec, &conf->checkint, file, line_nr);
|
||||||
|
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
@@ -302,9 +307,10 @@ declare_def_snprint(reassign_maps, print_yes_no)
|
||||||
|
declare_def_handler(multipath_dir, set_str)
|
||||||
|
declare_def_snprint(multipath_dir, print_str)
|
||||||
|
|
||||||
|
-static int def_partition_delim_handler(struct config *conf, vector strvec)
|
||||||
|
+static int def_partition_delim_handler(struct config *conf, vector strvec,
|
||||||
|
+ const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
- int rc = set_str(strvec, &conf->partition_delim);
|
||||||
|
+ int rc = set_str(strvec, &conf->partition_delim, file, line_nr);
|
||||||
|
|
||||||
|
if (rc != 0)
|
||||||
|
return rc;
|
||||||
|
@@ -334,13 +340,13 @@ static const char * const find_multipaths_optvals[] = {
|
||||||
|
};
|
||||||
|
|
||||||
|
static int
|
||||||
|
-def_find_multipaths_handler(struct config *conf, vector strvec)
|
||||||
|
+def_find_multipaths_handler(struct config *conf, vector strvec,
|
||||||
|
+ const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
char *buff;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
- if (set_yes_no_undef(strvec, &conf->find_multipaths) == 0 &&
|
||||||
|
- conf->find_multipaths != FIND_MULTIPATHS_UNDEF)
|
||||||
|
+ if (set_yes_no_undef(strvec, &conf->find_multipaths, file, line_nr) == 0 && conf->find_multipaths != FIND_MULTIPATHS_UNDEF)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
buff = set_value(strvec);
|
||||||
|
@@ -396,7 +402,8 @@ static int snprint_uid_attrs(struct config *conf, struct strbuf *buff,
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int uid_attrs_handler(struct config *conf, vector strvec)
|
||||||
|
+static int uid_attrs_handler(struct config *conf, vector strvec,
|
||||||
|
+ const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
char *val;
|
||||||
|
|
||||||
|
@@ -597,7 +604,8 @@ declare_hw_handler(skip_kpartx, set_yes_no_undef)
|
||||||
|
declare_hw_snprint(skip_kpartx, print_yes_no_undef)
|
||||||
|
declare_mp_handler(skip_kpartx, set_yes_no_undef)
|
||||||
|
declare_mp_snprint(skip_kpartx, print_yes_no_undef)
|
||||||
|
-static int def_disable_changed_wwids_handler(struct config *conf, vector strvec)
|
||||||
|
+static int def_disable_changed_wwids_handler(struct config *conf, vector strvec,
|
||||||
|
+ const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@@ -629,20 +637,23 @@ declare_def_snprint_defstr(enable_foreign, print_str,
|
||||||
|
DEFAULT_ENABLE_FOREIGN)
|
||||||
|
|
||||||
|
static int
|
||||||
|
-def_config_dir_handler(struct config *conf, vector strvec)
|
||||||
|
+def_config_dir_handler(struct config *conf, vector strvec, const char *file,
|
||||||
|
+ int line_nr)
|
||||||
|
{
|
||||||
|
/* this is only valid in the main config file */
|
||||||
|
if (conf->processed_main_config)
|
||||||
|
return 0;
|
||||||
|
- return set_str(strvec, &conf->config_dir);
|
||||||
|
+ return set_str(strvec, &conf->config_dir, file, line_nr);
|
||||||
|
}
|
||||||
|
declare_def_snprint(config_dir, print_str)
|
||||||
|
|
||||||
|
#define declare_def_attr_handler(option, function) \
|
||||||
|
static int \
|
||||||
|
-def_ ## option ## _handler (struct config *conf, vector strvec) \
|
||||||
|
+def_ ## option ## _handler (struct config *conf, vector strvec, \
|
||||||
|
+ const char *file, int line_nr) \
|
||||||
|
{ \
|
||||||
|
- return function (strvec, &conf->option, &conf->attribute_flags);\
|
||||||
|
+ return function (strvec, &conf->option, &conf->attribute_flags, \
|
||||||
|
+ file, line_nr); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define declare_def_attr_snprint(option, function) \
|
||||||
|
@@ -655,12 +666,14 @@ snprint_def_ ## option (struct config *conf, struct strbuf *buff, \
|
||||||
|
|
||||||
|
#define declare_mp_attr_handler(option, function) \
|
||||||
|
static int \
|
||||||
|
-mp_ ## option ## _handler (struct config *conf, vector strvec) \
|
||||||
|
+mp_ ## option ## _handler (struct config *conf, vector strvec, \
|
||||||
|
+ const char *file, int line_nr) \
|
||||||
|
{ \
|
||||||
|
struct mpentry * mpe = VECTOR_LAST_SLOT(conf->mptable); \
|
||||||
|
if (!mpe) \
|
||||||
|
return 1; \
|
||||||
|
- return function (strvec, &mpe->option, &mpe->attribute_flags); \
|
||||||
|
+ return function (strvec, &mpe->option, &mpe->attribute_flags, \
|
||||||
|
+ file, line_nr); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define declare_mp_attr_snprint(option, function) \
|
||||||
|
@@ -673,7 +686,7 @@ snprint_mp_ ## option (struct config *conf, struct strbuf *buff, \
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
-set_mode(vector strvec, void *ptr, int *flags)
|
||||||
|
+set_mode(vector strvec, void *ptr, int *flags, const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
mode_t mode;
|
||||||
|
mode_t *mode_ptr = (mode_t *)ptr;
|
||||||
|
@@ -694,7 +707,7 @@ set_mode(vector strvec, void *ptr, int *flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
-set_uid(vector strvec, void *ptr, int *flags)
|
||||||
|
+set_uid(vector strvec, void *ptr, int *flags, const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
uid_t uid;
|
||||||
|
uid_t *uid_ptr = (uid_t *)ptr;
|
||||||
|
@@ -719,7 +732,7 @@ set_uid(vector strvec, void *ptr, int *flags)
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
-set_gid(vector strvec, void *ptr, int *flags)
|
||||||
|
+set_gid(vector strvec, void *ptr, int *flags, const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
gid_t gid;
|
||||||
|
gid_t *gid_ptr = (gid_t *)ptr;
|
||||||
|
@@ -786,7 +799,7 @@ declare_mp_attr_handler(gid, set_gid)
|
||||||
|
declare_mp_attr_snprint(gid, print_gid)
|
||||||
|
|
||||||
|
static int
|
||||||
|
-set_undef_off_zero(vector strvec, void *ptr)
|
||||||
|
+set_undef_off_zero(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
char * buff;
|
||||||
|
int *int_ptr = (int *)ptr;
|
||||||
|
@@ -827,7 +840,7 @@ declare_hw_handler(fast_io_fail, set_undef_off_zero)
|
||||||
|
declare_hw_snprint(fast_io_fail, print_undef_off_zero)
|
||||||
|
|
||||||
|
static int
|
||||||
|
-set_dev_loss(vector strvec, void *ptr)
|
||||||
|
+set_dev_loss(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
char * buff;
|
||||||
|
unsigned int *uint_ptr = (unsigned int *)ptr;
|
||||||
|
@@ -870,7 +883,7 @@ declare_hw_handler(eh_deadline, set_undef_off_zero)
|
||||||
|
declare_hw_snprint(eh_deadline, print_undef_off_zero)
|
||||||
|
|
||||||
|
static int
|
||||||
|
-set_pgpolicy(vector strvec, void *ptr)
|
||||||
|
+set_pgpolicy(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
char * buff;
|
||||||
|
int *int_ptr = (int *)ptr;
|
||||||
|
@@ -936,7 +949,8 @@ get_sys_max_fds(int *max_fds)
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
-max_fds_handler(struct config *conf, vector strvec)
|
||||||
|
+max_fds_handler(struct config *conf, vector strvec, const char *file,
|
||||||
|
+ int line_nr)
|
||||||
|
{
|
||||||
|
char * buff;
|
||||||
|
int r = 0, max_fds;
|
||||||
|
@@ -981,7 +995,7 @@ snprint_max_fds (struct config *conf, struct strbuf *buff, const void *data)
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
-set_rr_weight(vector strvec, void *ptr)
|
||||||
|
+set_rr_weight(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
int *int_ptr = (int *)ptr;
|
||||||
|
char * buff;
|
||||||
|
@@ -1025,7 +1039,7 @@ declare_mp_handler(rr_weight, set_rr_weight)
|
||||||
|
declare_mp_snprint(rr_weight, print_rr_weight)
|
||||||
|
|
||||||
|
static int
|
||||||
|
-set_pgfailback(vector strvec, void *ptr)
|
||||||
|
+set_pgfailback(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
int *int_ptr = (int *)ptr;
|
||||||
|
char * buff;
|
||||||
|
@@ -1075,7 +1089,7 @@ declare_mp_handler(pgfailback, set_pgfailback)
|
||||||
|
declare_mp_snprint(pgfailback, print_pgfailback)
|
||||||
|
|
||||||
|
static int
|
||||||
|
-no_path_retry_helper(vector strvec, void *ptr)
|
||||||
|
+no_path_retry_helper(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
int *int_ptr = (int *)ptr;
|
||||||
|
char * buff;
|
||||||
|
@@ -1120,7 +1134,8 @@ declare_mp_handler(no_path_retry, no_path_retry_helper)
|
||||||
|
declare_mp_snprint(no_path_retry, print_no_path_retry)
|
||||||
|
|
||||||
|
static int
|
||||||
|
-def_log_checker_err_handler(struct config *conf, vector strvec)
|
||||||
|
+def_log_checker_err_handler(struct config *conf, vector strvec,
|
||||||
|
+ const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
char * buff;
|
||||||
|
|
||||||
|
@@ -1193,7 +1208,8 @@ print_reservation_key(struct strbuf *buff,
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
-def_reservation_key_handler(struct config *conf, vector strvec)
|
||||||
|
+def_reservation_key_handler(struct config *conf, vector strvec,
|
||||||
|
+ const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
return set_reservation_key(strvec, &conf->reservation_key,
|
||||||
|
&conf->sa_flags,
|
||||||
|
@@ -1209,7 +1225,8 @@ snprint_def_reservation_key (struct config *conf, struct strbuf *buff,
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
-mp_reservation_key_handler(struct config *conf, vector strvec)
|
||||||
|
+mp_reservation_key_handler(struct config *conf, vector strvec, const char *file,
|
||||||
|
+ int line_nr)
|
||||||
|
{
|
||||||
|
struct mpentry * mpe = VECTOR_LAST_SLOT(conf->mptable);
|
||||||
|
if (!mpe)
|
||||||
|
@@ -1229,7 +1246,7 @@ snprint_mp_reservation_key (struct config *conf, struct strbuf *buff,
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
-set_off_int_undef(vector strvec, void *ptr)
|
||||||
|
+set_off_int_undef(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
int *int_ptr = (int *)ptr;
|
||||||
|
char * buff;
|
||||||
|
@@ -1370,7 +1387,8 @@ declare_hw_snprint(recheck_wwid, print_yes_no_undef)
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
-def_uxsock_timeout_handler(struct config *conf, vector strvec)
|
||||||
|
+def_uxsock_timeout_handler(struct config *conf, vector strvec, const char *file,
|
||||||
|
+ int line_nr)
|
||||||
|
{
|
||||||
|
unsigned int uxsock_timeout;
|
||||||
|
char *buff;
|
||||||
|
@@ -1390,7 +1408,8 @@ def_uxsock_timeout_handler(struct config *conf, vector strvec)
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
-hw_vpd_vendor_handler(struct config *conf, vector strvec)
|
||||||
|
+hw_vpd_vendor_handler(struct config *conf, vector strvec, const char *file,
|
||||||
|
+ int line_nr)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
char *buff;
|
||||||
|
@@ -1430,7 +1449,8 @@ snprint_hw_vpd_vendor(struct config *conf, struct strbuf *buff,
|
||||||
|
* blacklist block handlers
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
-blacklist_handler(struct config *conf, vector strvec)
|
||||||
|
+blacklist_handler(struct config *conf, vector strvec, const char*file,
|
||||||
|
+ int line_nr)
|
||||||
|
{
|
||||||
|
if (!conf->blist_devnode)
|
||||||
|
conf->blist_devnode = vector_alloc();
|
||||||
|
@@ -1452,7 +1472,8 @@ blacklist_handler(struct config *conf, vector strvec)
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
-blacklist_exceptions_handler(struct config *conf, vector strvec)
|
||||||
|
+blacklist_exceptions_handler(struct config *conf, vector strvec,
|
||||||
|
+ const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
if (!conf->elist_devnode)
|
||||||
|
conf->elist_devnode = vector_alloc();
|
||||||
|
@@ -1475,7 +1496,8 @@ blacklist_exceptions_handler(struct config *conf, vector strvec)
|
||||||
|
|
||||||
|
#define declare_ble_handler(option) \
|
||||||
|
static int \
|
||||||
|
-ble_ ## option ## _handler (struct config *conf, vector strvec) \
|
||||||
|
+ble_ ## option ## _handler (struct config *conf, vector strvec, \
|
||||||
|
+ const char *file, int line_nr) \
|
||||||
|
{ \
|
||||||
|
char *buff; \
|
||||||
|
int rc; \
|
||||||
|
@@ -1494,7 +1516,8 @@ ble_ ## option ## _handler (struct config *conf, vector strvec) \
|
||||||
|
|
||||||
|
#define declare_ble_device_handler(name, option, vend, prod) \
|
||||||
|
static int \
|
||||||
|
-ble_ ## option ## _ ## name ## _handler (struct config *conf, vector strvec) \
|
||||||
|
+ble_ ## option ## _ ## name ## _handler (struct config *conf, vector strvec, \
|
||||||
|
+ const char *file, int line_nr) \
|
||||||
|
{ \
|
||||||
|
char * buff; \
|
||||||
|
int rc; \
|
||||||
|
@@ -1536,13 +1559,15 @@ snprint_ble_simple (struct config *conf, struct strbuf *buff, const void *data)
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
-ble_device_handler(struct config *conf, vector strvec)
|
||||||
|
+ble_device_handler(struct config *conf, vector strvec, const char *file,
|
||||||
|
+ int line_nr)
|
||||||
|
{
|
||||||
|
return alloc_ble_device(conf->blist_device);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
-ble_except_device_handler(struct config *conf, vector strvec)
|
||||||
|
+ble_except_device_handler(struct config *conf, vector strvec, const char *file,
|
||||||
|
+ int line_nr)
|
||||||
|
{
|
||||||
|
return alloc_ble_device(conf->elist_device);
|
||||||
|
}
|
||||||
|
@@ -1574,7 +1599,8 @@ static int snprint_bled_product(struct config *conf, struct strbuf *buff,
|
||||||
|
* devices block handlers
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
-devices_handler(struct config *conf, vector strvec)
|
||||||
|
+devices_handler(struct config *conf, vector strvec, const char *file,
|
||||||
|
+ int line_nr)
|
||||||
|
{
|
||||||
|
if (!conf->hwtable)
|
||||||
|
conf->hwtable = vector_alloc();
|
||||||
|
@@ -1586,7 +1612,8 @@ devices_handler(struct config *conf, vector strvec)
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
-device_handler(struct config *conf, vector strvec)
|
||||||
|
+device_handler(struct config *conf, vector strvec, const char *file,
|
||||||
|
+ int line_nr)
|
||||||
|
{
|
||||||
|
struct hwentry * hwe;
|
||||||
|
|
||||||
|
@@ -1623,7 +1650,8 @@ declare_hw_snprint(hwhandler, print_str)
|
||||||
|
* overrides handlers
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
-overrides_handler(struct config *conf, vector strvec)
|
||||||
|
+overrides_handler(struct config *conf, vector strvec, const char *file,
|
||||||
|
+ int line_nr)
|
||||||
|
{
|
||||||
|
if (!conf->overrides)
|
||||||
|
conf->overrides = alloc_hwe();
|
||||||
|
@@ -1640,7 +1668,8 @@ overrides_handler(struct config *conf, vector strvec)
|
||||||
|
* multipaths block handlers
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
-multipaths_handler(struct config *conf, vector strvec)
|
||||||
|
+multipaths_handler(struct config *conf, vector strvec, const char *file,
|
||||||
|
+ int line_nr)
|
||||||
|
{
|
||||||
|
if (!conf->mptable)
|
||||||
|
conf->mptable = vector_alloc();
|
||||||
|
@@ -1652,7 +1681,8 @@ multipaths_handler(struct config *conf, vector strvec)
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
-multipath_handler(struct config *conf, vector strvec)
|
||||||
|
+multipath_handler(struct config *conf, vector strvec, const char *file,
|
||||||
|
+ int line_nr)
|
||||||
|
{
|
||||||
|
struct mpentry * mpe;
|
||||||
|
|
||||||
|
@@ -1681,7 +1711,8 @@ declare_mp_snprint(alias, print_str)
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int
|
||||||
|
-deprecated_handler(struct config *conf, vector strvec)
|
||||||
|
+deprecated_handler(struct config *conf, vector strvec, const char *file,
|
||||||
|
+ int line_nr)
|
||||||
|
{
|
||||||
|
char * buff;
|
||||||
|
|
||||||
|
diff --git a/libmultipath/parser.c b/libmultipath/parser.c
|
||||||
|
index d5595fb0..68262d0e 100644
|
||||||
|
--- a/libmultipath/parser.c
|
||||||
|
+++ b/libmultipath/parser.c
|
||||||
|
@@ -558,7 +558,8 @@ process_stream(struct config *conf, FILE *stream, vector keywords,
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
if (keyword->handler) {
|
||||||
|
- t = keyword->handler(conf, strvec);
|
||||||
|
+ t = keyword->handler(conf, strvec, file,
|
||||||
|
+ line_nr);
|
||||||
|
r += t;
|
||||||
|
if (t)
|
||||||
|
condlog(1, "%s line %d, parsing failed: %s",
|
||||||
|
diff --git a/libmultipath/parser.h b/libmultipath/parser.h
|
||||||
|
index 3452bde1..11ea2278 100644
|
||||||
|
--- a/libmultipath/parser.h
|
||||||
|
+++ b/libmultipath/parser.h
|
||||||
|
@@ -43,7 +43,7 @@ struct strbuf;
|
||||||
|
|
||||||
|
/* keyword definition */
|
||||||
|
typedef int print_fn(struct config *, struct strbuf *, const void *);
|
||||||
|
-typedef int handler_fn(struct config *, vector);
|
||||||
|
+typedef int handler_fn(struct config *, vector, const char *file, int line_nr);
|
||||||
|
|
||||||
|
struct keyword {
|
||||||
|
char *string;
|
@ -0,0 +1,250 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
Date: Tue, 28 Sep 2021 15:59:19 -0500
|
||||||
|
Subject: [PATCH] libmultipath: make set_int take a range for valid values
|
||||||
|
|
||||||
|
If a value outside of the valid range is passed to set_int, it caps the
|
||||||
|
value at appropriate limit, and issues a warning.
|
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
---
|
||||||
|
libmultipath/dict.c | 121 +++++++++++++++++++++++++++-----------------
|
||||||
|
1 file changed, 75 insertions(+), 46 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/libmultipath/dict.c b/libmultipath/dict.c
|
||||||
|
index eb2c44c0..57b6a7b6 100644
|
||||||
|
--- a/libmultipath/dict.c
|
||||||
|
+++ b/libmultipath/dict.c
|
||||||
|
@@ -29,7 +29,8 @@
|
||||||
|
#include "strbuf.h"
|
||||||
|
|
||||||
|
static int
|
||||||
|
-set_int(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
+set_int(vector strvec, void *ptr, int min, int max, const char *file,
|
||||||
|
+ int line_nr)
|
||||||
|
{
|
||||||
|
int *int_ptr = (int *)ptr;
|
||||||
|
char *buff, *eptr;
|
||||||
|
@@ -44,11 +45,17 @@ set_int(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
if (eptr > buff)
|
||||||
|
while (isspace(*eptr))
|
||||||
|
eptr++;
|
||||||
|
- if (*buff == '\0' || *eptr != '\0' || res > INT_MAX || res < INT_MIN) {
|
||||||
|
- condlog(1, "%s: invalid value for %s: \"%s\"",
|
||||||
|
- __func__, (char*)VECTOR_SLOT(strvec, 0), buff);
|
||||||
|
+ if (*buff == '\0' || *eptr != '\0') {
|
||||||
|
+ condlog(1, "%s line %d, invalid value for %s: \"%s\"",
|
||||||
|
+ file, line_nr, (char*)VECTOR_SLOT(strvec, 0), buff);
|
||||||
|
rc = 1;
|
||||||
|
} else {
|
||||||
|
+ if (res > max || res < min) {
|
||||||
|
+ res = (res > max) ? max : min;
|
||||||
|
+ condlog(1, "%s line %d, value for %s too %s, capping at %ld",
|
||||||
|
+ file, line_nr, (char*)VECTOR_SLOT(strvec, 0),
|
||||||
|
+ (res == max)? "large" : "small", res);
|
||||||
|
+ }
|
||||||
|
rc = 0;
|
||||||
|
*int_ptr = res;
|
||||||
|
}
|
||||||
|
@@ -77,8 +84,8 @@ set_uint(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
while (isspace(*eptr))
|
||||||
|
eptr++;
|
||||||
|
if (*buff == '\0' || *eptr != '\0' || !isdigit(*p) || res > UINT_MAX) {
|
||||||
|
- condlog(1, "%s: invalid value for %s: \"%s\"",
|
||||||
|
- __func__, (char*)VECTOR_SLOT(strvec, 0), buff);
|
||||||
|
+ condlog(1, "%s line %d, invalid value for %s: \"%s\"",
|
||||||
|
+ file, line_nr, (char*)VECTOR_SLOT(strvec, 0), buff);
|
||||||
|
rc = 1;
|
||||||
|
} else {
|
||||||
|
rc = 0;
|
||||||
|
@@ -193,6 +200,14 @@ def_ ## option ## _handler (struct config *conf, vector strvec, \
|
||||||
|
return function (strvec, &conf->option, file, line_nr); \
|
||||||
|
}
|
||||||
|
|
||||||
|
+#define declare_def_range_handler(option, minval, maxval) \
|
||||||
|
+static int \
|
||||||
|
+def_ ## option ## _handler (struct config *conf, vector strvec, \
|
||||||
|
+ const char *file, int line_nr) \
|
||||||
|
+{ \
|
||||||
|
+ return set_int(strvec, &conf->option, minval, maxval, file, line_nr); \
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
#define declare_def_snprint(option, function) \
|
||||||
|
static int \
|
||||||
|
snprint_def_ ## option (struct config *conf, struct strbuf *buff, \
|
||||||
|
@@ -234,6 +249,18 @@ hw_ ## option ## _handler (struct config *conf, vector strvec, \
|
||||||
|
return function (strvec, &hwe->option, file, line_nr); \
|
||||||
|
}
|
||||||
|
|
||||||
|
+#define declare_hw_range_handler(option, minval, maxval) \
|
||||||
|
+static int \
|
||||||
|
+hw_ ## option ## _handler (struct config *conf, vector strvec, \
|
||||||
|
+ const char *file, int line_nr) \
|
||||||
|
+{ \
|
||||||
|
+ struct hwentry * hwe = VECTOR_LAST_SLOT(conf->hwtable); \
|
||||||
|
+ if (!hwe) \
|
||||||
|
+ return 1; \
|
||||||
|
+ return set_int(strvec, &hwe->option, minval, maxval, file, line_nr); \
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
#define declare_hw_snprint(option, function) \
|
||||||
|
static int \
|
||||||
|
snprint_hw_ ## option (struct config *conf, struct strbuf *buff, \
|
||||||
|
@@ -253,6 +280,17 @@ ovr_ ## option ## _handler (struct config *conf, vector strvec, \
|
||||||
|
return function (strvec, &conf->overrides->option, file, line_nr); \
|
||||||
|
}
|
||||||
|
|
||||||
|
+#define declare_ovr_range_handler(option, minval, maxval) \
|
||||||
|
+static int \
|
||||||
|
+ovr_ ## option ## _handler (struct config *conf, vector strvec, \
|
||||||
|
+ const char *file, int line_nr) \
|
||||||
|
+{ \
|
||||||
|
+ if (!conf->overrides) \
|
||||||
|
+ return 1; \
|
||||||
|
+ return set_int(strvec, &conf->overrides->option, minval, maxval, \
|
||||||
|
+ file, line_nr); \
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
#define declare_ovr_snprint(option, function) \
|
||||||
|
static int \
|
||||||
|
snprint_ovr_ ## option (struct config *conf, struct strbuf *buff, \
|
||||||
|
@@ -272,6 +310,17 @@ mp_ ## option ## _handler (struct config *conf, vector strvec, \
|
||||||
|
return function (strvec, &mpe->option, file, line_nr); \
|
||||||
|
}
|
||||||
|
|
||||||
|
+#define declare_mp_range_handler(option, minval, maxval) \
|
||||||
|
+static int \
|
||||||
|
+mp_ ## option ## _handler (struct config *conf, vector strvec, \
|
||||||
|
+ const char *file, int line_nr) \
|
||||||
|
+{ \
|
||||||
|
+ struct mpentry * mpe = VECTOR_LAST_SLOT(conf->mptable); \
|
||||||
|
+ if (!mpe) \
|
||||||
|
+ return 1; \
|
||||||
|
+ return set_int(strvec, &mpe->option, minval, maxval, file, line_nr); \
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
#define declare_mp_snprint(option, function) \
|
||||||
|
static int \
|
||||||
|
snprint_mp_ ## option (struct config *conf, struct strbuf *buff, \
|
||||||
|
@@ -298,7 +347,7 @@ declare_def_snprint(checkint, print_int)
|
||||||
|
declare_def_handler(max_checkint, set_uint)
|
||||||
|
declare_def_snprint(max_checkint, print_int)
|
||||||
|
|
||||||
|
-declare_def_handler(verbosity, set_int)
|
||||||
|
+declare_def_range_handler(verbosity, 0, MAX_VERBOSITY)
|
||||||
|
declare_def_snprint(verbosity, print_int)
|
||||||
|
|
||||||
|
declare_def_handler(reassign_maps, set_yes_no)
|
||||||
|
@@ -473,22 +522,22 @@ declare_ovr_snprint(checker_name, print_str)
|
||||||
|
declare_hw_handler(checker_name, set_str)
|
||||||
|
declare_hw_snprint(checker_name, print_str)
|
||||||
|
|
||||||
|
-declare_def_handler(minio, set_int)
|
||||||
|
+declare_def_range_handler(minio, 0, INT_MAX)
|
||||||
|
declare_def_snprint_defint(minio, print_int, DEFAULT_MINIO)
|
||||||
|
-declare_ovr_handler(minio, set_int)
|
||||||
|
+declare_ovr_range_handler(minio, 0, INT_MAX)
|
||||||
|
declare_ovr_snprint(minio, print_nonzero)
|
||||||
|
-declare_hw_handler(minio, set_int)
|
||||||
|
+declare_hw_range_handler(minio, 0, INT_MAX)
|
||||||
|
declare_hw_snprint(minio, print_nonzero)
|
||||||
|
-declare_mp_handler(minio, set_int)
|
||||||
|
+declare_mp_range_handler(minio, 0, INT_MAX)
|
||||||
|
declare_mp_snprint(minio, print_nonzero)
|
||||||
|
|
||||||
|
-declare_def_handler(minio_rq, set_int)
|
||||||
|
+declare_def_range_handler(minio_rq, 0, INT_MAX)
|
||||||
|
declare_def_snprint_defint(minio_rq, print_int, DEFAULT_MINIO_RQ)
|
||||||
|
-declare_ovr_handler(minio_rq, set_int)
|
||||||
|
+declare_ovr_range_handler(minio_rq, 0, INT_MAX)
|
||||||
|
declare_ovr_snprint(minio_rq, print_nonzero)
|
||||||
|
-declare_hw_handler(minio_rq, set_int)
|
||||||
|
+declare_hw_range_handler(minio_rq, 0, INT_MAX)
|
||||||
|
declare_hw_snprint(minio_rq, print_nonzero)
|
||||||
|
-declare_mp_handler(minio_rq, set_int)
|
||||||
|
+declare_mp_range_handler(minio_rq, 0, INT_MAX)
|
||||||
|
declare_mp_snprint(minio_rq, print_nonzero)
|
||||||
|
|
||||||
|
declare_def_handler(queue_without_daemon, set_yes_no)
|
||||||
|
@@ -512,7 +561,7 @@ snprint_def_queue_without_daemon(struct config *conf, struct strbuf *buff,
|
||||||
|
return append_strbuf_quoted(buff, qwd);
|
||||||
|
}
|
||||||
|
|
||||||
|
-declare_def_handler(checker_timeout, set_int)
|
||||||
|
+declare_def_range_handler(checker_timeout, 0, INT_MAX)
|
||||||
|
declare_def_snprint(checker_timeout, print_nonzero)
|
||||||
|
|
||||||
|
declare_def_handler(allow_usb_devices, set_yes_no)
|
||||||
|
@@ -583,13 +632,13 @@ declare_hw_snprint(deferred_remove, print_yes_no_undef)
|
||||||
|
declare_mp_handler(deferred_remove, set_yes_no_undef)
|
||||||
|
declare_mp_snprint(deferred_remove, print_yes_no_undef)
|
||||||
|
|
||||||
|
-declare_def_handler(retrigger_tries, set_int)
|
||||||
|
+declare_def_range_handler(retrigger_tries, 0, INT_MAX)
|
||||||
|
declare_def_snprint(retrigger_tries, print_int)
|
||||||
|
|
||||||
|
-declare_def_handler(retrigger_delay, set_int)
|
||||||
|
+declare_def_range_handler(retrigger_delay, 0, INT_MAX)
|
||||||
|
declare_def_snprint(retrigger_delay, print_int)
|
||||||
|
|
||||||
|
-declare_def_handler(uev_wait_timeout, set_int)
|
||||||
|
+declare_def_range_handler(uev_wait_timeout, 0, INT_MAX)
|
||||||
|
declare_def_snprint(uev_wait_timeout, print_int)
|
||||||
|
|
||||||
|
declare_def_handler(strict_timing, set_yes_no)
|
||||||
|
@@ -616,19 +665,19 @@ static int snprint_def_disable_changed_wwids(struct config *conf,
|
||||||
|
return print_ignored(buff);
|
||||||
|
}
|
||||||
|
|
||||||
|
-declare_def_handler(remove_retries, set_int)
|
||||||
|
+declare_def_range_handler(remove_retries, 0, INT_MAX)
|
||||||
|
declare_def_snprint(remove_retries, print_int)
|
||||||
|
|
||||||
|
-declare_def_handler(max_sectors_kb, set_int)
|
||||||
|
+declare_def_range_handler(max_sectors_kb, 0, INT_MAX)
|
||||||
|
declare_def_snprint(max_sectors_kb, print_nonzero)
|
||||||
|
-declare_ovr_handler(max_sectors_kb, set_int)
|
||||||
|
+declare_ovr_range_handler(max_sectors_kb, 0, INT_MAX)
|
||||||
|
declare_ovr_snprint(max_sectors_kb, print_nonzero)
|
||||||
|
-declare_hw_handler(max_sectors_kb, set_int)
|
||||||
|
+declare_hw_range_handler(max_sectors_kb, 0, INT_MAX)
|
||||||
|
declare_hw_snprint(max_sectors_kb, print_nonzero)
|
||||||
|
-declare_mp_handler(max_sectors_kb, set_int)
|
||||||
|
+declare_mp_range_handler(max_sectors_kb, 0, INT_MAX)
|
||||||
|
declare_mp_snprint(max_sectors_kb, print_nonzero)
|
||||||
|
|
||||||
|
-declare_def_handler(find_multipaths_timeout, set_int)
|
||||||
|
+declare_def_range_handler(find_multipaths_timeout, INT_MIN, INT_MAX)
|
||||||
|
declare_def_snprint_defint(find_multipaths_timeout, print_int,
|
||||||
|
DEFAULT_FIND_MULTIPATHS_TIMEOUT)
|
||||||
|
|
||||||
|
@@ -1385,27 +1434,7 @@ declare_ovr_snprint(recheck_wwid, print_yes_no_undef)
|
||||||
|
declare_hw_handler(recheck_wwid, set_yes_no_undef)
|
||||||
|
declare_hw_snprint(recheck_wwid, print_yes_no_undef)
|
||||||
|
|
||||||
|
-
|
||||||
|
-static int
|
||||||
|
-def_uxsock_timeout_handler(struct config *conf, vector strvec, const char *file,
|
||||||
|
- int line_nr)
|
||||||
|
-{
|
||||||
|
- unsigned int uxsock_timeout;
|
||||||
|
- char *buff;
|
||||||
|
-
|
||||||
|
- buff = set_value(strvec);
|
||||||
|
- if (!buff)
|
||||||
|
- return 1;
|
||||||
|
-
|
||||||
|
- if (sscanf(buff, "%u", &uxsock_timeout) == 1 &&
|
||||||
|
- uxsock_timeout > DEFAULT_REPLY_TIMEOUT)
|
||||||
|
- conf->uxsock_timeout = uxsock_timeout;
|
||||||
|
- else
|
||||||
|
- conf->uxsock_timeout = DEFAULT_REPLY_TIMEOUT;
|
||||||
|
-
|
||||||
|
- free(buff);
|
||||||
|
- return 0;
|
||||||
|
-}
|
||||||
|
+declare_def_range_handler(uxsock_timeout, DEFAULT_REPLY_TIMEOUT, INT_MAX)
|
||||||
|
|
||||||
|
static int
|
||||||
|
hw_vpd_vendor_handler(struct config *conf, vector strvec, const char *file,
|
170
SOURCES/0028-libmultipath-improve-checks-for-set_str.patch
Normal file
170
SOURCES/0028-libmultipath-improve-checks-for-set_str.patch
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
Date: Wed, 29 Sep 2021 12:56:04 -0500
|
||||||
|
Subject: [PATCH] libmultipath: improve checks for set_str
|
||||||
|
|
||||||
|
multipath always requires absolute pathnames, so make sure all file and
|
||||||
|
directory names start with a slash. Also check that the directories
|
||||||
|
exist. Finally, some strings, like the alias, will be used in paths.
|
||||||
|
These must not contain the slash character '/', since it is a forbidden
|
||||||
|
character in file/directory names. This patch adds seperate handlers for
|
||||||
|
these three cases. If a config line is invalid, these handlers retain
|
||||||
|
the existing config string, if any.
|
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
---
|
||||||
|
libmultipath/dict.c | 88 +++++++++++++++++++++++++++++++++++++++------
|
||||||
|
1 file changed, 78 insertions(+), 10 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/libmultipath/dict.c b/libmultipath/dict.c
|
||||||
|
index 57b6a7b6..149d3348 100644
|
||||||
|
--- a/libmultipath/dict.c
|
||||||
|
+++ b/libmultipath/dict.c
|
||||||
|
@@ -5,6 +5,8 @@
|
||||||
|
* Copyright (c) 2005 Kiyoshi Ueda, NEC
|
||||||
|
*/
|
||||||
|
#include <sys/types.h>
|
||||||
|
+#include <sys/stat.h>
|
||||||
|
+#include <unistd.h>
|
||||||
|
#include <pwd.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "checkers.h"
|
||||||
|
@@ -111,6 +113,72 @@ set_str(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int
|
||||||
|
+set_dir(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
+{
|
||||||
|
+ char **str_ptr = (char **)ptr;
|
||||||
|
+ char *old_str = *str_ptr;
|
||||||
|
+ struct stat sb;
|
||||||
|
+
|
||||||
|
+ *str_ptr = set_value(strvec);
|
||||||
|
+ if (!*str_ptr) {
|
||||||
|
+ free(old_str);
|
||||||
|
+ return 1;
|
||||||
|
+ }
|
||||||
|
+ if ((*str_ptr)[0] != '/'){
|
||||||
|
+ condlog(1, "%s line %d, %s is not an absolute directory path. Ignoring", file, line_nr, *str_ptr);
|
||||||
|
+ *str_ptr = old_str;
|
||||||
|
+ } else {
|
||||||
|
+ if (stat(*str_ptr, &sb) == 0 && S_ISDIR(sb.st_mode))
|
||||||
|
+ free(old_str);
|
||||||
|
+ else {
|
||||||
|
+ condlog(1, "%s line %d, %s is not an existing directory. Ignoring", file, line_nr, *str_ptr);
|
||||||
|
+ *str_ptr = old_str;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+set_path(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
+{
|
||||||
|
+ char **str_ptr = (char **)ptr;
|
||||||
|
+ char *old_str = *str_ptr;
|
||||||
|
+
|
||||||
|
+ *str_ptr = set_value(strvec);
|
||||||
|
+ if (!*str_ptr) {
|
||||||
|
+ free(old_str);
|
||||||
|
+ return 1;
|
||||||
|
+ }
|
||||||
|
+ if ((*str_ptr)[0] != '/'){
|
||||||
|
+ condlog(1, "%s line %d, %s is not an absolute path. Ignoring",
|
||||||
|
+ file, line_nr, *str_ptr);
|
||||||
|
+ *str_ptr = old_str;
|
||||||
|
+ } else
|
||||||
|
+ free(old_str);
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+set_str_noslash(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
+{
|
||||||
|
+ char **str_ptr = (char **)ptr;
|
||||||
|
+ char *old_str = *str_ptr;
|
||||||
|
+
|
||||||
|
+ *str_ptr = set_value(strvec);
|
||||||
|
+ if (!*str_ptr) {
|
||||||
|
+ free(old_str);
|
||||||
|
+ return 1;
|
||||||
|
+ }
|
||||||
|
+ if (strchr(*str_ptr, '/')) {
|
||||||
|
+ condlog(1, "%s line %d, %s cannot contain a slash. Ignoring",
|
||||||
|
+ file, line_nr, *str_ptr);
|
||||||
|
+ *str_ptr = old_str;
|
||||||
|
+ } else
|
||||||
|
+ free(old_str);
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int
|
||||||
|
set_yes_no(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
@@ -353,13 +421,13 @@ declare_def_snprint(verbosity, print_int)
|
||||||
|
declare_def_handler(reassign_maps, set_yes_no)
|
||||||
|
declare_def_snprint(reassign_maps, print_yes_no)
|
||||||
|
|
||||||
|
-declare_def_handler(multipath_dir, set_str)
|
||||||
|
+declare_def_handler(multipath_dir, set_dir)
|
||||||
|
declare_def_snprint(multipath_dir, print_str)
|
||||||
|
|
||||||
|
static int def_partition_delim_handler(struct config *conf, vector strvec,
|
||||||
|
const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
- int rc = set_str(strvec, &conf->partition_delim, file, line_nr);
|
||||||
|
+ int rc = set_str_noslash(strvec, &conf->partition_delim, file, line_nr);
|
||||||
|
|
||||||
|
if (rc != 0)
|
||||||
|
return rc;
|
||||||
|
@@ -490,11 +558,11 @@ declare_hw_snprint(prio_name, print_str)
|
||||||
|
declare_mp_handler(prio_name, set_str)
|
||||||
|
declare_mp_snprint(prio_name, print_str)
|
||||||
|
|
||||||
|
-declare_def_handler(alias_prefix, set_str)
|
||||||
|
+declare_def_handler(alias_prefix, set_str_noslash)
|
||||||
|
declare_def_snprint_defstr(alias_prefix, print_str, DEFAULT_ALIAS_PREFIX)
|
||||||
|
-declare_ovr_handler(alias_prefix, set_str)
|
||||||
|
+declare_ovr_handler(alias_prefix, set_str_noslash)
|
||||||
|
declare_ovr_snprint(alias_prefix, print_str)
|
||||||
|
-declare_hw_handler(alias_prefix, set_str)
|
||||||
|
+declare_hw_handler(alias_prefix, set_str_noslash)
|
||||||
|
declare_hw_snprint(alias_prefix, print_str)
|
||||||
|
|
||||||
|
declare_def_handler(prio_args, set_str)
|
||||||
|
@@ -586,13 +654,13 @@ declare_hw_snprint(user_friendly_names, print_yes_no_undef)
|
||||||
|
declare_mp_handler(user_friendly_names, set_yes_no_undef)
|
||||||
|
declare_mp_snprint(user_friendly_names, print_yes_no_undef)
|
||||||
|
|
||||||
|
-declare_def_handler(bindings_file, set_str)
|
||||||
|
+declare_def_handler(bindings_file, set_path)
|
||||||
|
declare_def_snprint(bindings_file, print_str)
|
||||||
|
|
||||||
|
-declare_def_handler(wwids_file, set_str)
|
||||||
|
+declare_def_handler(wwids_file, set_path)
|
||||||
|
declare_def_snprint(wwids_file, print_str)
|
||||||
|
|
||||||
|
-declare_def_handler(prkeys_file, set_str)
|
||||||
|
+declare_def_handler(prkeys_file, set_path)
|
||||||
|
declare_def_snprint(prkeys_file, print_str)
|
||||||
|
|
||||||
|
declare_def_handler(retain_hwhandler, set_yes_no_undef)
|
||||||
|
@@ -692,7 +760,7 @@ def_config_dir_handler(struct config *conf, vector strvec, const char *file,
|
||||||
|
/* this is only valid in the main config file */
|
||||||
|
if (conf->processed_main_config)
|
||||||
|
return 0;
|
||||||
|
- return set_str(strvec, &conf->config_dir, file, line_nr);
|
||||||
|
+ return set_path(strvec, &conf->config_dir, file, line_nr);
|
||||||
|
}
|
||||||
|
declare_def_snprint(config_dir, print_str)
|
||||||
|
|
||||||
|
@@ -1732,7 +1800,7 @@ multipath_handler(struct config *conf, vector strvec, const char *file,
|
||||||
|
declare_mp_handler(wwid, set_str)
|
||||||
|
declare_mp_snprint(wwid, print_str)
|
||||||
|
|
||||||
|
-declare_mp_handler(alias, set_str)
|
||||||
|
+declare_mp_handler(alias, set_str_noslash)
|
||||||
|
declare_mp_snprint(alias, print_str)
|
||||||
|
|
||||||
|
/*
|
@ -0,0 +1,114 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
Date: Wed, 10 Nov 2021 18:34:08 -0600
|
||||||
|
Subject: [PATCH] libmultipath: deprecate file and directory config options
|
||||||
|
|
||||||
|
Having multipath able to select pathnames for the files and directories
|
||||||
|
it needs causes unnecessary maintainer headaches. Mark these as
|
||||||
|
deprecated, but still support them for now.
|
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
---
|
||||||
|
libmultipath/dict.c | 19 +++++++++++++++----
|
||||||
|
multipath/multipath.conf.5 | 5 +++++
|
||||||
|
2 files changed, 20 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/libmultipath/dict.c b/libmultipath/dict.c
|
||||||
|
index 149d3348..d14be340 100644
|
||||||
|
--- a/libmultipath/dict.c
|
||||||
|
+++ b/libmultipath/dict.c
|
||||||
|
@@ -268,6 +268,15 @@ def_ ## option ## _handler (struct config *conf, vector strvec, \
|
||||||
|
return function (strvec, &conf->option, file, line_nr); \
|
||||||
|
}
|
||||||
|
|
||||||
|
+#define declare_def_warn_handler(option, function) \
|
||||||
|
+static int \
|
||||||
|
+def_ ## option ## _handler (struct config *conf, vector strvec, \
|
||||||
|
+ const char *file, int line_nr) \
|
||||||
|
+{ \
|
||||||
|
+ condlog(2, "%s line %d, \"" #option "\" is deprecated and will be disabled in a future release", file, line_nr); \
|
||||||
|
+ return function (strvec, &conf->option, file, line_nr); \
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
#define declare_def_range_handler(option, minval, maxval) \
|
||||||
|
static int \
|
||||||
|
def_ ## option ## _handler (struct config *conf, vector strvec, \
|
||||||
|
@@ -421,7 +430,7 @@ declare_def_snprint(verbosity, print_int)
|
||||||
|
declare_def_handler(reassign_maps, set_yes_no)
|
||||||
|
declare_def_snprint(reassign_maps, print_yes_no)
|
||||||
|
|
||||||
|
-declare_def_handler(multipath_dir, set_dir)
|
||||||
|
+declare_def_warn_handler(multipath_dir, set_dir)
|
||||||
|
declare_def_snprint(multipath_dir, print_str)
|
||||||
|
|
||||||
|
static int def_partition_delim_handler(struct config *conf, vector strvec,
|
||||||
|
@@ -654,13 +663,13 @@ declare_hw_snprint(user_friendly_names, print_yes_no_undef)
|
||||||
|
declare_mp_handler(user_friendly_names, set_yes_no_undef)
|
||||||
|
declare_mp_snprint(user_friendly_names, print_yes_no_undef)
|
||||||
|
|
||||||
|
-declare_def_handler(bindings_file, set_path)
|
||||||
|
+declare_def_warn_handler(bindings_file, set_path)
|
||||||
|
declare_def_snprint(bindings_file, print_str)
|
||||||
|
|
||||||
|
-declare_def_handler(wwids_file, set_path)
|
||||||
|
+declare_def_warn_handler(wwids_file, set_path)
|
||||||
|
declare_def_snprint(wwids_file, print_str)
|
||||||
|
|
||||||
|
-declare_def_handler(prkeys_file, set_path)
|
||||||
|
+declare_def_warn_handler(prkeys_file, set_path)
|
||||||
|
declare_def_snprint(prkeys_file, print_str)
|
||||||
|
|
||||||
|
declare_def_handler(retain_hwhandler, set_yes_no_undef)
|
||||||
|
@@ -760,6 +769,8 @@ def_config_dir_handler(struct config *conf, vector strvec, const char *file,
|
||||||
|
/* this is only valid in the main config file */
|
||||||
|
if (conf->processed_main_config)
|
||||||
|
return 0;
|
||||||
|
+ condlog(2, "%s line %d, \"config_dir\" is deprecated and will be disabled in a future release",
|
||||||
|
+ file, line_nr);
|
||||||
|
return set_path(strvec, &conf->config_dir, file, line_nr);
|
||||||
|
}
|
||||||
|
declare_def_snprint(config_dir, print_str)
|
||||||
|
diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5
|
||||||
|
index dd9f4dc7..7f85f766 100644
|
||||||
|
--- a/multipath/multipath.conf.5
|
||||||
|
+++ b/multipath/multipath.conf.5
|
||||||
|
@@ -178,6 +178,7 @@ The default is: \fBno\fR
|
||||||
|
.
|
||||||
|
.TP
|
||||||
|
.B multipath_dir
|
||||||
|
+This option is deprecated, and will be removed in a future release.
|
||||||
|
Directory where the dynamic shared objects are stored. Defined at compile time,
|
||||||
|
commonly \fI/lib64/multipath/\fR or \fI/lib/multipath/\fR.
|
||||||
|
.RS
|
||||||
|
@@ -742,6 +743,7 @@ The default is: \fB<unset>\fR
|
||||||
|
.
|
||||||
|
.TP
|
||||||
|
.B bindings_file
|
||||||
|
+This option is deprecated, and will be removed in a future release.
|
||||||
|
The full pathname of the binding file to be used when the user_friendly_names
|
||||||
|
option is set.
|
||||||
|
.RS
|
||||||
|
@@ -752,6 +754,7 @@ The default is: \fB/etc/multipath/bindings\fR
|
||||||
|
.
|
||||||
|
.TP
|
||||||
|
.B wwids_file
|
||||||
|
+This option is deprecated, and will be removed in a future release.
|
||||||
|
The full pathname of the WWIDs file, which is used by multipath to keep track
|
||||||
|
of the WWIDs for LUNs it has created multipath devices on in the past.
|
||||||
|
.RS
|
||||||
|
@@ -762,6 +765,7 @@ The default is: \fB/etc/multipath/wwids\fR
|
||||||
|
.
|
||||||
|
.TP
|
||||||
|
.B prkeys_file
|
||||||
|
+This option is deprecated, and will be removed in a future release.
|
||||||
|
The full pathname of the prkeys file, which is used by multipathd to keep
|
||||||
|
track of the persistent reservation key used for a specific WWID, when
|
||||||
|
\fIreservation_key\fR is set to \fBfile\fR.
|
||||||
|
@@ -933,6 +937,7 @@ The default is: \fB<unset>\fR
|
||||||
|
.
|
||||||
|
.TP
|
||||||
|
.B config_dir
|
||||||
|
+This option is deprecated, and will be removed in a future release.
|
||||||
|
If set to anything other than "", multipath will search this directory
|
||||||
|
alphabetically for file ending in ".conf" and it will read configuration
|
||||||
|
information from them, just as if it was in \fI/etc/multipath.conf\fR.
|
191
SOURCES/0030-libmultipath-split-set_int-to-enable-reuse.patch
Normal file
191
SOURCES/0030-libmultipath-split-set_int-to-enable-reuse.patch
Normal file
@ -0,0 +1,191 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
Date: Mon, 4 Oct 2021 15:27:36 -0500
|
||||||
|
Subject: [PATCH] libmultipath: split set_int to enable reuse
|
||||||
|
|
||||||
|
Split the code that does the actual value parsing out of set_int(), into
|
||||||
|
a helper function, do_set_int(), so that it can be used by other
|
||||||
|
handlers. These functions no longer set the config value at all, when
|
||||||
|
they have invalid input.
|
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
---
|
||||||
|
libmultipath/dict.c | 82 +++++++++++++++++++++++++--------------------
|
||||||
|
1 file changed, 46 insertions(+), 36 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/libmultipath/dict.c b/libmultipath/dict.c
|
||||||
|
index d14be340..68647061 100644
|
||||||
|
--- a/libmultipath/dict.c
|
||||||
|
+++ b/libmultipath/dict.c
|
||||||
|
@@ -31,17 +31,12 @@
|
||||||
|
#include "strbuf.h"
|
||||||
|
|
||||||
|
static int
|
||||||
|
-set_int(vector strvec, void *ptr, int min, int max, const char *file,
|
||||||
|
- int line_nr)
|
||||||
|
+do_set_int(vector strvec, void *ptr, int min, int max, const char *file,
|
||||||
|
+ int line_nr, char *buff)
|
||||||
|
{
|
||||||
|
int *int_ptr = (int *)ptr;
|
||||||
|
- char *buff, *eptr;
|
||||||
|
+ char *eptr;
|
||||||
|
long res;
|
||||||
|
- int rc;
|
||||||
|
-
|
||||||
|
- buff = set_value(strvec);
|
||||||
|
- if (!buff)
|
||||||
|
- return 1;
|
||||||
|
|
||||||
|
res = strtol(buff, &eptr, 10);
|
||||||
|
if (eptr > buff)
|
||||||
|
@@ -50,17 +45,30 @@ set_int(vector strvec, void *ptr, int min, int max, const char *file,
|
||||||
|
if (*buff == '\0' || *eptr != '\0') {
|
||||||
|
condlog(1, "%s line %d, invalid value for %s: \"%s\"",
|
||||||
|
file, line_nr, (char*)VECTOR_SLOT(strvec, 0), buff);
|
||||||
|
- rc = 1;
|
||||||
|
- } else {
|
||||||
|
- if (res > max || res < min) {
|
||||||
|
- res = (res > max) ? max : min;
|
||||||
|
- condlog(1, "%s line %d, value for %s too %s, capping at %ld",
|
||||||
|
+ return 1;
|
||||||
|
+ }
|
||||||
|
+ if (res > max || res < min) {
|
||||||
|
+ res = (res > max) ? max : min;
|
||||||
|
+ condlog(1, "%s line %d, value for %s too %s, capping at %ld",
|
||||||
|
file, line_nr, (char*)VECTOR_SLOT(strvec, 0),
|
||||||
|
- (res == max)? "large" : "small", res);
|
||||||
|
- }
|
||||||
|
- rc = 0;
|
||||||
|
- *int_ptr = res;
|
||||||
|
+ (res == max)? "large" : "small", res);
|
||||||
|
}
|
||||||
|
+ *int_ptr = res;
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+set_int(vector strvec, void *ptr, int min, int max, const char *file,
|
||||||
|
+ int line_nr)
|
||||||
|
+{
|
||||||
|
+ char *buff;
|
||||||
|
+ int rc;
|
||||||
|
+
|
||||||
|
+ buff = set_value(strvec);
|
||||||
|
+ if (!buff)
|
||||||
|
+ return 1;
|
||||||
|
+
|
||||||
|
+ rc = do_set_int(strvec, ptr, min, max, file, line_nr, buff);
|
||||||
|
|
||||||
|
FREE(buff);
|
||||||
|
return rc;
|
||||||
|
@@ -929,6 +937,7 @@ declare_mp_attr_snprint(gid, print_gid)
|
||||||
|
static int
|
||||||
|
set_undef_off_zero(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
+ int rc = 0;
|
||||||
|
char * buff;
|
||||||
|
int *int_ptr = (int *)ptr;
|
||||||
|
|
||||||
|
@@ -938,10 +947,10 @@ set_undef_off_zero(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
|
||||||
|
if (strcmp(buff, "off") == 0)
|
||||||
|
*int_ptr = UOZ_OFF;
|
||||||
|
- else if (sscanf(buff, "%d", int_ptr) != 1 ||
|
||||||
|
- *int_ptr < UOZ_ZERO)
|
||||||
|
- *int_ptr = UOZ_UNDEF;
|
||||||
|
- else if (*int_ptr == 0)
|
||||||
|
+ else
|
||||||
|
+ rc = do_set_int(strvec, int_ptr, 0, INT_MAX, file, line_nr,
|
||||||
|
+ buff);
|
||||||
|
+ if (rc == 0 && *int_ptr == 0)
|
||||||
|
*int_ptr = UOZ_ZERO;
|
||||||
|
|
||||||
|
FREE(buff);
|
||||||
|
@@ -1093,14 +1102,12 @@ max_fds_handler(struct config *conf, vector strvec, const char *file,
|
||||||
|
/* Assume safe limit */
|
||||||
|
max_fds = 4096;
|
||||||
|
}
|
||||||
|
- if (strlen(buff) == 3 &&
|
||||||
|
- !strcmp(buff, "max"))
|
||||||
|
- conf->max_fds = max_fds;
|
||||||
|
- else
|
||||||
|
- conf->max_fds = atoi(buff);
|
||||||
|
-
|
||||||
|
- if (conf->max_fds > max_fds)
|
||||||
|
+ if (!strcmp(buff, "max")) {
|
||||||
|
conf->max_fds = max_fds;
|
||||||
|
+ r = 0;
|
||||||
|
+ } else
|
||||||
|
+ r = do_set_int(strvec, &conf->max_fds, 0, max_fds, file,
|
||||||
|
+ line_nr, buff);
|
||||||
|
|
||||||
|
FREE(buff);
|
||||||
|
|
||||||
|
@@ -1169,6 +1176,7 @@ declare_mp_snprint(rr_weight, print_rr_weight)
|
||||||
|
static int
|
||||||
|
set_pgfailback(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
+ int rc = 0;
|
||||||
|
int *int_ptr = (int *)ptr;
|
||||||
|
char * buff;
|
||||||
|
|
||||||
|
@@ -1183,11 +1191,11 @@ set_pgfailback(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
else if (strlen(buff) == 10 && !strcmp(buff, "followover"))
|
||||||
|
*int_ptr = -FAILBACK_FOLLOWOVER;
|
||||||
|
else
|
||||||
|
- *int_ptr = atoi(buff);
|
||||||
|
+ rc = do_set_int(strvec, ptr, 0, INT_MAX, file, line_nr, buff);
|
||||||
|
|
||||||
|
FREE(buff);
|
||||||
|
|
||||||
|
- return 0;
|
||||||
|
+ return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
@@ -1219,6 +1227,7 @@ declare_mp_snprint(pgfailback, print_pgfailback)
|
||||||
|
static int
|
||||||
|
no_path_retry_helper(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
+ int rc = 0;
|
||||||
|
int *int_ptr = (int *)ptr;
|
||||||
|
char * buff;
|
||||||
|
|
||||||
|
@@ -1230,11 +1239,11 @@ no_path_retry_helper(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
*int_ptr = NO_PATH_RETRY_FAIL;
|
||||||
|
else if (!strcmp(buff, "queue"))
|
||||||
|
*int_ptr = NO_PATH_RETRY_QUEUE;
|
||||||
|
- else if ((*int_ptr = atoi(buff)) < 1)
|
||||||
|
- *int_ptr = NO_PATH_RETRY_UNDEF;
|
||||||
|
+ else
|
||||||
|
+ rc = do_set_int(strvec, ptr, 1, INT_MAX, file, line_nr, buff);
|
||||||
|
|
||||||
|
FREE(buff);
|
||||||
|
- return 0;
|
||||||
|
+ return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
@@ -1376,6 +1385,7 @@ snprint_mp_reservation_key (struct config *conf, struct strbuf *buff,
|
||||||
|
static int
|
||||||
|
set_off_int_undef(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
+ int rc =0;
|
||||||
|
int *int_ptr = (int *)ptr;
|
||||||
|
char * buff;
|
||||||
|
|
||||||
|
@@ -1385,11 +1395,11 @@ set_off_int_undef(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
|
||||||
|
if (!strcmp(buff, "no") || !strcmp(buff, "0"))
|
||||||
|
*int_ptr = NU_NO;
|
||||||
|
- else if ((*int_ptr = atoi(buff)) < 1)
|
||||||
|
- *int_ptr = NU_UNDEF;
|
||||||
|
+ else
|
||||||
|
+ rc = do_set_int(strvec, ptr, 1, INT_MAX, file, line_nr, buff);
|
||||||
|
|
||||||
|
FREE(buff);
|
||||||
|
- return 0;
|
||||||
|
+ return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
201
SOURCES/0031-libmultipath-cleanup-invalid-config-handling.patch
Normal file
201
SOURCES/0031-libmultipath-cleanup-invalid-config-handling.patch
Normal file
@ -0,0 +1,201 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
Date: Mon, 4 Oct 2021 16:52:55 -0500
|
||||||
|
Subject: [PATCH] libmultipath: cleanup invalid config handling
|
||||||
|
|
||||||
|
Add error reporting to the remaining config handlers. If the value is
|
||||||
|
invalid, do not change the existing config option's value. Also print
|
||||||
|
an error whenever 0 is returned for an invalid value. When the handler
|
||||||
|
returns 1, config processing already fails with an error message.
|
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
---
|
||||||
|
libmultipath/dict.c | 73 +++++++++++++++++++++++++++++++--------------
|
||||||
|
1 file changed, 51 insertions(+), 22 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/libmultipath/dict.c b/libmultipath/dict.c
|
||||||
|
index 68647061..c534d703 100644
|
||||||
|
--- a/libmultipath/dict.c
|
||||||
|
+++ b/libmultipath/dict.c
|
||||||
|
@@ -199,8 +199,11 @@ set_yes_no(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
|
||||||
|
if (strcmp(buff, "yes") == 0 || strcmp(buff, "1") == 0)
|
||||||
|
*int_ptr = YN_YES;
|
||||||
|
- else
|
||||||
|
+ else if (strcmp(buff, "no") == 0 || strcmp(buff, "0") == 0)
|
||||||
|
*int_ptr = YN_NO;
|
||||||
|
+ else
|
||||||
|
+ condlog(1, "%s line %d, invalid value for %s: \"%s\"",
|
||||||
|
+ file, line_nr, (char*)VECTOR_SLOT(strvec, 0), buff);
|
||||||
|
|
||||||
|
FREE(buff);
|
||||||
|
return 0;
|
||||||
|
@@ -221,7 +224,8 @@ set_yes_no_undef(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
else if (strcmp(buff, "yes") == 0 || strcmp(buff, "1") == 0)
|
||||||
|
*int_ptr = YNU_YES;
|
||||||
|
else
|
||||||
|
- *int_ptr = YNU_UNDEF;
|
||||||
|
+ condlog(1, "%s line %d, invalid value for %s: \"%s\"",
|
||||||
|
+ file, line_nr, (char*)VECTOR_SLOT(strvec, 0), buff);
|
||||||
|
|
||||||
|
FREE(buff);
|
||||||
|
return 0;
|
||||||
|
@@ -480,9 +484,6 @@ def_find_multipaths_handler(struct config *conf, vector strvec,
|
||||||
|
char *buff;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
- if (set_yes_no_undef(strvec, &conf->find_multipaths, file, line_nr) == 0 && conf->find_multipaths != FIND_MULTIPATHS_UNDEF)
|
||||||
|
- return 0;
|
||||||
|
-
|
||||||
|
buff = set_value(strvec);
|
||||||
|
if (!buff)
|
||||||
|
return 1;
|
||||||
|
@@ -495,9 +496,14 @@ def_find_multipaths_handler(struct config *conf, vector strvec,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (conf->find_multipaths == YNU_UNDEF) {
|
||||||
|
- condlog(0, "illegal value for find_multipaths: %s", buff);
|
||||||
|
- conf->find_multipaths = DEFAULT_FIND_MULTIPATHS;
|
||||||
|
+ if (i >= __FIND_MULTIPATHS_LAST) {
|
||||||
|
+ if (strcmp(buff, "no") == 0 || strcmp(buff, "0") == 0)
|
||||||
|
+ conf->find_multipaths = FIND_MULTIPATHS_OFF;
|
||||||
|
+ else if (strcmp(buff, "yes") == 0 || strcmp(buff, "1") == 0)
|
||||||
|
+ conf->find_multipaths = FIND_MULTIPATHS_ON;
|
||||||
|
+ else
|
||||||
|
+ condlog(1, "%s line %d, invalid value for find_multipaths: \"%s\"",
|
||||||
|
+ file, line_nr, buff);
|
||||||
|
}
|
||||||
|
|
||||||
|
FREE(buff);
|
||||||
|
@@ -546,8 +552,10 @@ static int uid_attrs_handler(struct config *conf, vector strvec,
|
||||||
|
if (!val)
|
||||||
|
return 1;
|
||||||
|
if (parse_uid_attrs(val, conf))
|
||||||
|
- condlog(1, "error parsing uid_attrs: \"%s\"", val);
|
||||||
|
- condlog(3, "parsed %d uid_attrs", VECTOR_SIZE(&conf->uid_attrs));
|
||||||
|
+ condlog(1, "%s line %d,error parsing uid_attrs: \"%s\"", file,
|
||||||
|
+ line_nr, val);
|
||||||
|
+ else
|
||||||
|
+ condlog(4, "parsed %d uid_attrs", VECTOR_SIZE(&conf->uid_attrs));
|
||||||
|
FREE(val);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@@ -775,8 +783,11 @@ def_config_dir_handler(struct config *conf, vector strvec, const char *file,
|
||||||
|
int line_nr)
|
||||||
|
{
|
||||||
|
/* this is only valid in the main config file */
|
||||||
|
- if (conf->processed_main_config)
|
||||||
|
+ if (conf->processed_main_config) {
|
||||||
|
+ condlog(1, "%s line %d, config_dir option only valid in /etc/multipath.conf",
|
||||||
|
+ file, line_nr);
|
||||||
|
return 0;
|
||||||
|
+ }
|
||||||
|
condlog(2, "%s line %d, \"config_dir\" is deprecated and will be disabled in a future release",
|
||||||
|
file, line_nr);
|
||||||
|
return set_path(strvec, &conf->config_dir, file, line_nr);
|
||||||
|
@@ -836,7 +847,9 @@ set_mode(vector strvec, void *ptr, int *flags, const char *file, int line_nr)
|
||||||
|
if (sscanf(buff, "%o", &mode) == 1 && mode <= 0777) {
|
||||||
|
*flags |= (1 << ATTR_MODE);
|
||||||
|
*mode_ptr = mode;
|
||||||
|
- }
|
||||||
|
+ } else
|
||||||
|
+ condlog(1, "%s line %d, invalid value for mode: \"%s\"",
|
||||||
|
+ file, line_nr, buff);
|
||||||
|
|
||||||
|
FREE(buff);
|
||||||
|
return 0;
|
||||||
|
@@ -861,7 +874,9 @@ set_uid(vector strvec, void *ptr, int *flags, const char *file, int line_nr)
|
||||||
|
else if (sscanf(buff, "%u", &uid) == 1){
|
||||||
|
*flags |= (1 << ATTR_UID);
|
||||||
|
*uid_ptr = uid;
|
||||||
|
- }
|
||||||
|
+ } else
|
||||||
|
+ condlog(1, "%s line %d, invalid value for uid: \"%s\"",
|
||||||
|
+ file, line_nr, buff);
|
||||||
|
|
||||||
|
FREE(buff);
|
||||||
|
return 0;
|
||||||
|
@@ -887,7 +902,9 @@ set_gid(vector strvec, void *ptr, int *flags, const char *file, int line_nr)
|
||||||
|
else if (sscanf(buff, "%u", &gid) == 1){
|
||||||
|
*flags |= (1 << ATTR_GID);
|
||||||
|
*gid_ptr = gid;
|
||||||
|
- }
|
||||||
|
+ } else
|
||||||
|
+ condlog(1, "%s line %d, invalid value for gid: \"%s\"",
|
||||||
|
+ file, line_nr, buff);
|
||||||
|
FREE(buff);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@@ -989,7 +1006,8 @@ set_dev_loss(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
if (!strcmp(buff, "infinity"))
|
||||||
|
*uint_ptr = MAX_DEV_LOSS_TMO;
|
||||||
|
else if (sscanf(buff, "%u", uint_ptr) != 1)
|
||||||
|
- *uint_ptr = DEV_LOSS_TMO_UNSET;
|
||||||
|
+ condlog(1, "%s line %d, invalid value for dev_loss_tmo: \"%s\"",
|
||||||
|
+ file, line_nr, buff);
|
||||||
|
|
||||||
|
FREE(buff);
|
||||||
|
return 0;
|
||||||
|
@@ -1023,13 +1041,19 @@ static int
|
||||||
|
set_pgpolicy(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
char * buff;
|
||||||
|
+ int policy;
|
||||||
|
int *int_ptr = (int *)ptr;
|
||||||
|
|
||||||
|
buff = set_value(strvec);
|
||||||
|
if (!buff)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
- *int_ptr = get_pgpolicy_id(buff);
|
||||||
|
+ policy = get_pgpolicy_id(buff);
|
||||||
|
+ if (policy != IOPOLICY_UNDEF)
|
||||||
|
+ *int_ptr = policy;
|
||||||
|
+ else
|
||||||
|
+ condlog(1, "%s line %d, invalid value for path_grouping_policy: \"%s\"",
|
||||||
|
+ file, line_nr, buff);
|
||||||
|
FREE(buff);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
@@ -1142,10 +1166,11 @@ set_rr_weight(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
|
||||||
|
if (!strcmp(buff, "priorities"))
|
||||||
|
*int_ptr = RR_WEIGHT_PRIO;
|
||||||
|
-
|
||||||
|
- if (!strcmp(buff, "uniform"))
|
||||||
|
+ else if (!strcmp(buff, "uniform"))
|
||||||
|
*int_ptr = RR_WEIGHT_NONE;
|
||||||
|
-
|
||||||
|
+ else
|
||||||
|
+ condlog(1, "%s line %d, invalid value for rr_weight: \"%s\"",
|
||||||
|
+ file, line_nr, buff);
|
||||||
|
FREE(buff);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
@@ -1281,10 +1306,13 @@ def_log_checker_err_handler(struct config *conf, vector strvec,
|
||||||
|
if (!buff)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
- if (strlen(buff) == 4 && !strcmp(buff, "once"))
|
||||||
|
+ if (!strcmp(buff, "once"))
|
||||||
|
conf->log_checker_err = LOG_CHKR_ERR_ONCE;
|
||||||
|
- else if (strlen(buff) == 6 && !strcmp(buff, "always"))
|
||||||
|
+ else if (!strcmp(buff, "always"))
|
||||||
|
conf->log_checker_err = LOG_CHKR_ERR_ALWAYS;
|
||||||
|
+ else
|
||||||
|
+ condlog(1, "%s line %d, invalid value for log_checker_err: \"%s\"",
|
||||||
|
+ file, line_nr, buff);
|
||||||
|
|
||||||
|
free(buff);
|
||||||
|
return 0;
|
||||||
|
@@ -1545,7 +1573,8 @@ hw_vpd_vendor_handler(struct config *conf, vector strvec, const char *file,
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- hwe->vpd_vendor_id = 0;
|
||||||
|
+ condlog(1, "%s line %d, invalid value for vpd_vendor: \"%s\"",
|
||||||
|
+ file, line_nr, buff);
|
||||||
|
out:
|
||||||
|
FREE(buff);
|
||||||
|
return 0;
|
@ -0,0 +1,218 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
Date: Thu, 11 Nov 2021 17:37:05 -0600
|
||||||
|
Subject: [PATCH] libmultipath: don't return error on invalid values
|
||||||
|
|
||||||
|
do_set_int and set_uint return 1 for invalid values. This can cause
|
||||||
|
multipath to fail completely, while reading the config. The config
|
||||||
|
handlers should only return a non-zero value if there is an internal
|
||||||
|
error, not if there is just an invalid value.
|
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
---
|
||||||
|
libmultipath/dict.c | 64 ++++++++++++++++++---------------------------
|
||||||
|
1 file changed, 25 insertions(+), 39 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/libmultipath/dict.c b/libmultipath/dict.c
|
||||||
|
index c534d703..1b75be47 100644
|
||||||
|
--- a/libmultipath/dict.c
|
||||||
|
+++ b/libmultipath/dict.c
|
||||||
|
@@ -30,7 +30,7 @@
|
||||||
|
#include "dict.h"
|
||||||
|
#include "strbuf.h"
|
||||||
|
|
||||||
|
-static int
|
||||||
|
+static void
|
||||||
|
do_set_int(vector strvec, void *ptr, int min, int max, const char *file,
|
||||||
|
int line_nr, char *buff)
|
||||||
|
{
|
||||||
|
@@ -45,7 +45,7 @@ do_set_int(vector strvec, void *ptr, int min, int max, const char *file,
|
||||||
|
if (*buff == '\0' || *eptr != '\0') {
|
||||||
|
condlog(1, "%s line %d, invalid value for %s: \"%s\"",
|
||||||
|
file, line_nr, (char*)VECTOR_SLOT(strvec, 0), buff);
|
||||||
|
- return 1;
|
||||||
|
+ return;
|
||||||
|
}
|
||||||
|
if (res > max || res < min) {
|
||||||
|
res = (res > max) ? max : min;
|
||||||
|
@@ -54,7 +54,7 @@ do_set_int(vector strvec, void *ptr, int min, int max, const char *file,
|
||||||
|
(res == max)? "large" : "small", res);
|
||||||
|
}
|
||||||
|
*int_ptr = res;
|
||||||
|
- return 0;
|
||||||
|
+ return;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
@@ -62,16 +62,15 @@ set_int(vector strvec, void *ptr, int min, int max, const char *file,
|
||||||
|
int line_nr)
|
||||||
|
{
|
||||||
|
char *buff;
|
||||||
|
- int rc;
|
||||||
|
|
||||||
|
buff = set_value(strvec);
|
||||||
|
if (!buff)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
- rc = do_set_int(strvec, ptr, min, max, file, line_nr, buff);
|
||||||
|
+ do_set_int(strvec, ptr, min, max, file, line_nr, buff);
|
||||||
|
|
||||||
|
FREE(buff);
|
||||||
|
- return rc;
|
||||||
|
+ return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
@@ -80,7 +79,6 @@ set_uint(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
unsigned int *uint_ptr = (unsigned int *)ptr;
|
||||||
|
char *buff, *eptr, *p;
|
||||||
|
unsigned long res;
|
||||||
|
- int rc;
|
||||||
|
|
||||||
|
buff = set_value(strvec);
|
||||||
|
if (!buff)
|
||||||
|
@@ -93,17 +91,14 @@ set_uint(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
if (eptr > buff)
|
||||||
|
while (isspace(*eptr))
|
||||||
|
eptr++;
|
||||||
|
- if (*buff == '\0' || *eptr != '\0' || !isdigit(*p) || res > UINT_MAX) {
|
||||||
|
+ if (*buff == '\0' || *eptr != '\0' || !isdigit(*p) || res > UINT_MAX)
|
||||||
|
condlog(1, "%s line %d, invalid value for %s: \"%s\"",
|
||||||
|
file, line_nr, (char*)VECTOR_SLOT(strvec, 0), buff);
|
||||||
|
- rc = 1;
|
||||||
|
- } else {
|
||||||
|
- rc = 0;
|
||||||
|
+ else
|
||||||
|
*uint_ptr = res;
|
||||||
|
- }
|
||||||
|
|
||||||
|
FREE(buff);
|
||||||
|
- return rc;
|
||||||
|
+ return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
@@ -954,7 +949,6 @@ declare_mp_attr_snprint(gid, print_gid)
|
||||||
|
static int
|
||||||
|
set_undef_off_zero(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
- int rc = 0;
|
||||||
|
char * buff;
|
||||||
|
int *int_ptr = (int *)ptr;
|
||||||
|
|
||||||
|
@@ -964,11 +958,10 @@ set_undef_off_zero(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
|
||||||
|
if (strcmp(buff, "off") == 0)
|
||||||
|
*int_ptr = UOZ_OFF;
|
||||||
|
- else
|
||||||
|
- rc = do_set_int(strvec, int_ptr, 0, INT_MAX, file, line_nr,
|
||||||
|
- buff);
|
||||||
|
- if (rc == 0 && *int_ptr == 0)
|
||||||
|
+ else if (strcmp(buff, "0") == 0)
|
||||||
|
*int_ptr = UOZ_ZERO;
|
||||||
|
+ else
|
||||||
|
+ do_set_int(strvec, int_ptr, 1, INT_MAX, file, line_nr, buff);
|
||||||
|
|
||||||
|
FREE(buff);
|
||||||
|
return 0;
|
||||||
|
@@ -1114,28 +1107,24 @@ max_fds_handler(struct config *conf, vector strvec, const char *file,
|
||||||
|
int line_nr)
|
||||||
|
{
|
||||||
|
char * buff;
|
||||||
|
- int r = 0, max_fds;
|
||||||
|
+ int max_fds;
|
||||||
|
|
||||||
|
buff = set_value(strvec);
|
||||||
|
|
||||||
|
if (!buff)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
- r = get_sys_max_fds(&max_fds);
|
||||||
|
- if (r) {
|
||||||
|
- /* Assume safe limit */
|
||||||
|
- max_fds = 4096;
|
||||||
|
- }
|
||||||
|
- if (!strcmp(buff, "max")) {
|
||||||
|
+ if (get_sys_max_fds(&max_fds) != 0)
|
||||||
|
+ max_fds = 4096; /* Assume safe limit */
|
||||||
|
+ if (!strcmp(buff, "max"))
|
||||||
|
conf->max_fds = max_fds;
|
||||||
|
- r = 0;
|
||||||
|
- } else
|
||||||
|
- r = do_set_int(strvec, &conf->max_fds, 0, max_fds, file,
|
||||||
|
- line_nr, buff);
|
||||||
|
+ else
|
||||||
|
+ do_set_int(strvec, &conf->max_fds, 0, max_fds, file, line_nr,
|
||||||
|
+ buff);
|
||||||
|
|
||||||
|
FREE(buff);
|
||||||
|
|
||||||
|
- return r;
|
||||||
|
+ return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
@@ -1201,7 +1190,6 @@ declare_mp_snprint(rr_weight, print_rr_weight)
|
||||||
|
static int
|
||||||
|
set_pgfailback(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
- int rc = 0;
|
||||||
|
int *int_ptr = (int *)ptr;
|
||||||
|
char * buff;
|
||||||
|
|
||||||
|
@@ -1216,11 +1204,11 @@ set_pgfailback(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
else if (strlen(buff) == 10 && !strcmp(buff, "followover"))
|
||||||
|
*int_ptr = -FAILBACK_FOLLOWOVER;
|
||||||
|
else
|
||||||
|
- rc = do_set_int(strvec, ptr, 0, INT_MAX, file, line_nr, buff);
|
||||||
|
+ do_set_int(strvec, ptr, 0, INT_MAX, file, line_nr, buff);
|
||||||
|
|
||||||
|
FREE(buff);
|
||||||
|
|
||||||
|
- return rc;
|
||||||
|
+ return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
@@ -1252,7 +1240,6 @@ declare_mp_snprint(pgfailback, print_pgfailback)
|
||||||
|
static int
|
||||||
|
no_path_retry_helper(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
- int rc = 0;
|
||||||
|
int *int_ptr = (int *)ptr;
|
||||||
|
char * buff;
|
||||||
|
|
||||||
|
@@ -1265,10 +1252,10 @@ no_path_retry_helper(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
else if (!strcmp(buff, "queue"))
|
||||||
|
*int_ptr = NO_PATH_RETRY_QUEUE;
|
||||||
|
else
|
||||||
|
- rc = do_set_int(strvec, ptr, 1, INT_MAX, file, line_nr, buff);
|
||||||
|
+ do_set_int(strvec, ptr, 1, INT_MAX, file, line_nr, buff);
|
||||||
|
|
||||||
|
FREE(buff);
|
||||||
|
- return rc;
|
||||||
|
+ return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
@@ -1413,7 +1400,6 @@ snprint_mp_reservation_key (struct config *conf, struct strbuf *buff,
|
||||||
|
static int
|
||||||
|
set_off_int_undef(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
{
|
||||||
|
- int rc =0;
|
||||||
|
int *int_ptr = (int *)ptr;
|
||||||
|
char * buff;
|
||||||
|
|
||||||
|
@@ -1424,10 +1410,10 @@ set_off_int_undef(vector strvec, void *ptr, const char *file, int line_nr)
|
||||||
|
if (!strcmp(buff, "no") || !strcmp(buff, "0"))
|
||||||
|
*int_ptr = NU_NO;
|
||||||
|
else
|
||||||
|
- rc = do_set_int(strvec, ptr, 1, INT_MAX, file, line_nr, buff);
|
||||||
|
+ do_set_int(strvec, ptr, 1, INT_MAX, file, line_nr, buff);
|
||||||
|
|
||||||
|
FREE(buff);
|
||||||
|
- return rc;
|
||||||
|
+ return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
@ -0,0 +1,129 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
Date: Mon, 15 Nov 2021 10:54:35 -0600
|
||||||
|
Subject: [PATCH] multipathd: avoid unnecessary path read-only reloads
|
||||||
|
|
||||||
|
A mulitpath device can only be reloaded read/write when all paths are
|
||||||
|
read/write. Also, whenever a read-only device is rescanned, the scsi
|
||||||
|
subsystem will first unconditionally issue a uevent with DISK_RO=0
|
||||||
|
before checking the read-only status, and if it the device is still
|
||||||
|
read-only, issuing another uevent with DISK_RO=1. These uevents cause
|
||||||
|
pointless reloads when read-only paths are rescanned. To avoid this,
|
||||||
|
check to see if all paths are read/write before changing a multipath
|
||||||
|
device from read-only to read/write.
|
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
---
|
||||||
|
libmultipath/libmultipath.version | 5 +++++
|
||||||
|
libmultipath/sysfs.c | 22 ++++++++++++++++++++++
|
||||||
|
libmultipath/sysfs.h | 1 +
|
||||||
|
multipathd/main.c | 31 ++++++++++++++++++++++++++++++-
|
||||||
|
4 files changed, 58 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/libmultipath/libmultipath.version b/libmultipath/libmultipath.version
|
||||||
|
index eb5b5b55..dd1b4122 100644
|
||||||
|
--- a/libmultipath/libmultipath.version
|
||||||
|
+++ b/libmultipath/libmultipath.version
|
||||||
|
@@ -287,3 +287,8 @@ global:
|
||||||
|
local:
|
||||||
|
*;
|
||||||
|
};
|
||||||
|
+
|
||||||
|
+LIBMULTIPATH_9.1.0 {
|
||||||
|
+global:
|
||||||
|
+ sysfs_get_ro;
|
||||||
|
+} LIBMULTIPATH_9.0.0;
|
||||||
|
diff --git a/libmultipath/sysfs.c b/libmultipath/sysfs.c
|
||||||
|
index 9ff145f2..24c12b6a 100644
|
||||||
|
--- a/libmultipath/sysfs.c
|
||||||
|
+++ b/libmultipath/sysfs.c
|
||||||
|
@@ -236,6 +236,28 @@ sysfs_get_size (struct path *pp, unsigned long long * size)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+int
|
||||||
|
+sysfs_get_ro (struct path *pp)
|
||||||
|
+{
|
||||||
|
+ int ro;
|
||||||
|
+ char buff[3]; /* Either "0\n\0" or "1\n\0" */
|
||||||
|
+
|
||||||
|
+ if (!pp->udev)
|
||||||
|
+ return -1;
|
||||||
|
+
|
||||||
|
+ if (sysfs_attr_get_value(pp->udev, "ro", buff, sizeof(buff)) <= 0) {
|
||||||
|
+ condlog(3, "%s: Cannot read ro attribute in sysfs", pp->dev);
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (sscanf(buff, "%d\n", &ro) != 1 || ro < 0 || ro > 1) {
|
||||||
|
+ condlog(3, "%s: Cannot parse ro attribute", pp->dev);
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return ro;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
int sysfs_check_holders(char * check_devt, char * new_devt)
|
||||||
|
{
|
||||||
|
unsigned int major, new_minor, table_minor;
|
||||||
|
diff --git a/libmultipath/sysfs.h b/libmultipath/sysfs.h
|
||||||
|
index 72b39ab2..c948c467 100644
|
||||||
|
--- a/libmultipath/sysfs.h
|
||||||
|
+++ b/libmultipath/sysfs.h
|
||||||
|
@@ -13,6 +13,7 @@ ssize_t sysfs_attr_get_value(struct udev_device *dev, const char *attr_name,
|
||||||
|
ssize_t sysfs_bin_attr_get_value(struct udev_device *dev, const char *attr_name,
|
||||||
|
unsigned char * value, size_t value_len);
|
||||||
|
int sysfs_get_size (struct path *pp, unsigned long long * size);
|
||||||
|
+int sysfs_get_ro(struct path *pp);
|
||||||
|
int sysfs_check_holders(char * check_devt, char * new_devt);
|
||||||
|
bool sysfs_is_multipathed(struct path *pp, bool set_wwid);
|
||||||
|
#endif
|
||||||
|
diff --git a/multipathd/main.c b/multipathd/main.c
|
||||||
|
index 1defeaf1..6145e512 100644
|
||||||
|
--- a/multipathd/main.c
|
||||||
|
+++ b/multipathd/main.c
|
||||||
|
@@ -1324,6 +1324,35 @@ fail:
|
||||||
|
return REMOVE_PATH_MAP_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static bool
|
||||||
|
+needs_ro_update(struct multipath *mpp, int ro)
|
||||||
|
+{
|
||||||
|
+ struct pathgroup * pgp;
|
||||||
|
+ struct path * pp;
|
||||||
|
+ unsigned int i, j;
|
||||||
|
+ struct dm_info *dmi = NULL;
|
||||||
|
+
|
||||||
|
+ if (!mpp || ro < 0)
|
||||||
|
+ return false;
|
||||||
|
+ dm_get_info(mpp->alias, &dmi);
|
||||||
|
+ if (!dmi) /* assume we do need to reload the device */
|
||||||
|
+ return true;
|
||||||
|
+ if (dmi->read_only == ro) {
|
||||||
|
+ free(dmi);
|
||||||
|
+ return false;
|
||||||
|
+ }
|
||||||
|
+ free(dmi);
|
||||||
|
+ if (ro == 1)
|
||||||
|
+ return true;
|
||||||
|
+ vector_foreach_slot (mpp->pg, pgp, i) {
|
||||||
|
+ vector_foreach_slot (pgp->paths, pp, j) {
|
||||||
|
+ if (sysfs_get_ro(pp) == 1)
|
||||||
|
+ return false;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ return true;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int
|
||||||
|
uev_update_path (struct uevent *uev, struct vectors * vecs)
|
||||||
|
{
|
||||||
|
@@ -1388,7 +1417,7 @@ uev_update_path (struct uevent *uev, struct vectors * vecs)
|
||||||
|
}
|
||||||
|
|
||||||
|
ro = uevent_get_disk_ro(uev);
|
||||||
|
- if (mpp && ro >= 0) {
|
||||||
|
+ if (needs_ro_update(mpp, ro)) {
|
||||||
|
condlog(2, "%s: update path write_protect to '%d' (uevent)", uev->kernel, ro);
|
||||||
|
|
||||||
|
if (mpp->wait_for_udev)
|
26
SOURCES/0034-multipath-fix-exit-status-of-multipath-T.patch
Normal file
26
SOURCES/0034-multipath-fix-exit-status-of-multipath-T.patch
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Martin Wilck <mwilck@suse.com>
|
||||||
|
Date: Fri, 22 Oct 2021 12:58:11 +0200
|
||||||
|
Subject: [PATCH] multipath: fix exit status of multipath -T
|
||||||
|
|
||||||
|
We must set the return value in configure().
|
||||||
|
|
||||||
|
Signed-off-by: Martin Wilck <mwilck@suse.com>
|
||||||
|
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
---
|
||||||
|
multipath/main.c | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
diff --git a/multipath/main.c b/multipath/main.c
|
||||||
|
index 748e7902..80fa68e5 100644
|
||||||
|
--- a/multipath/main.c
|
||||||
|
+++ b/multipath/main.c
|
||||||
|
@@ -606,6 +606,7 @@ configure (struct config *conf, enum mpath_cmds cmd,
|
||||||
|
|
||||||
|
dump_config(conf, hwes, curmp);
|
||||||
|
vector_free(hwes);
|
||||||
|
+ r = RTVL_OK;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
@ -1,37 +1,50 @@
|
|||||||
Name: device-mapper-multipath
|
Name: device-mapper-multipath
|
||||||
Version: 0.8.6
|
Version: 0.8.7
|
||||||
Release: 7%{?dist}
|
Release: 3%{?dist}
|
||||||
Summary: Tools to manage multipath devices using device-mapper
|
Summary: Tools to manage multipath devices using device-mapper
|
||||||
License: GPLv2
|
License: GPLv2
|
||||||
URL: http://christophe.varoqui.free.fr/
|
URL: http://christophe.varoqui.free.fr/
|
||||||
|
|
||||||
# The source for this package was pulled from upstream's git repo. Use the
|
# The source for this package was pulled from upstream's git repo. Use the
|
||||||
# following command to generate the tarball
|
# following command to generate the tarball
|
||||||
# curl -L https://github.com/opensvc/multipath-tools/archive/0.8.6.tar.gz -o multipath-tools-0.8.6.tgz
|
# curl -L https://github.com/opensvc/multipath-tools/archive/0.8.7.tar.gz -o multipath-tools-0.8.7.tgz
|
||||||
Source0: multipath-tools-0.8.6.tgz
|
Source0: multipath-tools-0.8.7.tgz
|
||||||
Source1: multipath.conf
|
Source1: multipath.conf
|
||||||
Patch0001: 0001-RH-fixup-udev-rules-for-redhat.patch
|
Patch0001: 0001-multipath-tools-add-info-about-IO-affinity-path-sele.patch
|
||||||
Patch0002: 0002-RH-Remove-the-property-blacklist-exception-builtin.patch
|
Patch0002: 0002-multipathd-fix-missing-persistent-reseravtion-for-ac.patch
|
||||||
Patch0003: 0003-RH-don-t-start-without-a-config-file.patch
|
Patch0003: 0003-multipath-tools-minor-fixes-to-multipath.conf.5-man-.patch
|
||||||
Patch0004: 0004-RH-Fix-nvme-function-missing-argument.patch
|
Patch0004: 0004-multipath-tools-make-IBM-XIV-config-work-with-alua-a.patch
|
||||||
Patch0005: 0005-RH-use-rpm-optflags-if-present.patch
|
Patch0005: 0005-multipathd.socket-add-missing-conditions-from-servic.patch
|
||||||
Patch0006: 0006-RH-add-mpathconf.patch
|
Patch0006: 0006-multipath-tools-make-IBM-2107900-DS8000-config-work-.patch
|
||||||
Patch0007: 0007-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch
|
Patch0007: 0007-multipath-tools-make-EMC-SYMMETRIX-config-work-with-.patch
|
||||||
Patch0008: 0008-RH-reset-default-find_mutipaths-value-to-off.patch
|
Patch0008: 0008-multipath-tools-make-EMC-Invista-config-work-with-al.patch
|
||||||
Patch0009: 0009-RH-attempt-to-get-ANA-info-via-sysfs-first.patch
|
Patch0009: 0009-multipath-tools-make-COMPELNT-Compellent-Vol-config-.patch
|
||||||
Patch0010: 0010-RH-make-parse_vpd_pg83-match-scsi_id-output.patch
|
Patch0010: 0010-multipath-tools-remove-Compellent-maintainer.patch
|
||||||
Patch0011: 0011-multipathd-don-t-fail-to-remove-path-once-the-map-is.patch
|
Patch0011: 0011-Revert-multipath-tools-make-EMC-Invista-config-work-.patch
|
||||||
Patch0012: 0012-multipathd-remove-duplicate-orphan_paths-in-flush_ma.patch
|
Patch0012: 0012-Revert-multipath-tools-make-EMC-SYMMETRIX-config-wor.patch
|
||||||
Patch0013: 0013-multipathd-fix-ev_remove_path-return-code-handling.patch
|
Patch0013: 0013-RH-fixup-udev-rules-for-redhat.patch
|
||||||
Patch0014: 0014-multipath-free-vectors-in-configure.patch
|
Patch0014: 0014-RH-Remove-the-property-blacklist-exception-builtin.patch
|
||||||
Patch0015: 0015-kpartx-Don-t-leak-memory-when-getblock-returns-NULL.patch
|
Patch0015: 0015-RH-don-t-start-without-a-config-file.patch
|
||||||
Patch0016: 0016-multipathd-don-t-rescan_path-on-wwid-change-in-uev_u.patch
|
Patch0016: 0016-RH-Fix-nvme-function-missing-argument.patch
|
||||||
Patch0017: 0017-RH-mpathconf-correctly-handle-spaces-after-option-na.patch
|
Patch0017: 0017-RH-use-rpm-optflags-if-present.patch
|
||||||
Patch0018: 0018-multipath.conf-fix-typo-in-ghost_delay-description.patch
|
Patch0018: 0018-RH-add-mpathconf.patch
|
||||||
Patch0019: 0019-mpathpersist-fail-commands-when-no-usable-paths-exis.patch
|
Patch0019: 0019-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch
|
||||||
Patch0020: 0020-multipath-print-warning-if-multipathd-is-not-running.patch
|
Patch0020: 0020-RH-reset-default-find_mutipaths-value-to-off.patch
|
||||||
Patch0021: 0021-libmultipath-deal-with-dynamic-PTHREAD_STACK_MIN.patch
|
Patch0021: 0021-RH-attempt-to-get-ANA-info-via-sysfs-first.patch
|
||||||
Patch0022: 0022-multipathd-cli_handlers-cleanup-setting-reply-length.patch
|
Patch0022: 0022-RH-make-parse_vpd_pg83-match-scsi_id-output.patch
|
||||||
|
Patch0023: 0023-libmultipath-add-section-name-to-invalid-keyword-out.patch
|
||||||
|
Patch0024: 0024-libmultipath-use-typedef-for-keyword-handler-functio.patch
|
||||||
|
Patch0025: 0025-libmultipath-print-the-correct-file-when-parsing-fai.patch
|
||||||
|
Patch0026: 0026-libmultipath-pass-file-and-line-number-to-keyword-ha.patch
|
||||||
|
Patch0027: 0027-libmultipath-make-set_int-take-a-range-for-valid-val.patch
|
||||||
|
Patch0028: 0028-libmultipath-improve-checks-for-set_str.patch
|
||||||
|
Patch0029: 0029-libmultipath-deprecate-file-and-directory-config-opt.patch
|
||||||
|
Patch0030: 0030-libmultipath-split-set_int-to-enable-reuse.patch
|
||||||
|
Patch0031: 0031-libmultipath-cleanup-invalid-config-handling.patch
|
||||||
|
Patch0032: 0032-libmultipath-don-t-return-error-on-invalid-values.patch
|
||||||
|
Patch0033: 0033-multipathd-avoid-unnecessary-path-read-only-reloads.patch
|
||||||
|
Patch0034: 0034-multipath-fix-exit-status-of-multipath-T.patch
|
||||||
|
|
||||||
|
|
||||||
# runtime
|
# runtime
|
||||||
Requires: %{name}-libs = %{version}-%{release}
|
Requires: %{name}-libs = %{version}-%{release}
|
||||||
@ -115,7 +128,7 @@ This package contains the files needed to develop applications that use
|
|||||||
device-mapper-multipath's libdmmp C API library
|
device-mapper-multipath's libdmmp C API library
|
||||||
|
|
||||||
%prep
|
%prep
|
||||||
%autosetup -n multipath-tools-0.8.6 -p1
|
%autosetup -n multipath-tools-0.8.7 -p1
|
||||||
cp %{SOURCE1} .
|
cp %{SOURCE1} .
|
||||||
|
|
||||||
%build
|
%build
|
||||||
@ -230,6 +243,46 @@ fi
|
|||||||
%{_pkgconfdir}/libdmmp.pc
|
%{_pkgconfdir}/libdmmp.pc
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Fri Nov 19 2021 Benjamin Marzinski <bmarzins@redhat.com> - 0.8.7-3
|
||||||
|
- Add 0024-libmultipath-use-typedef-for-keyword-handler-functio.patch
|
||||||
|
- Add 0025-libmultipath-print-the-correct-file-when-parsing-fai.patch
|
||||||
|
- Add 0026-libmultipath-pass-file-and-line-number-to-keyword-ha.patch
|
||||||
|
- Add 0027-libmultipath-make-set_int-take-a-range-for-valid-val.patch
|
||||||
|
- Add 0028-libmultipath-improve-checks-for-set_str.patch
|
||||||
|
- Add 0029-libmultipath-deprecate-file-and-directory-config-opt.patch
|
||||||
|
- Add 0030-libmultipath-split-set_int-to-enable-reuse.patch
|
||||||
|
- Add 0031-libmultipath-cleanup-invalid-config-handling.patch
|
||||||
|
- Add 0032-libmultipath-don-t-return-error-on-invalid-values.patch
|
||||||
|
* The above 9 patches fix bz #2017969
|
||||||
|
- Add 0033-multipathd-avoid-unnecessary-path-read-only-reloads.patch
|
||||||
|
* Fixes bz #2017979
|
||||||
|
- Add 0034-multipath-fix-exit-status-of-multipath-T.patch
|
||||||
|
- Resolves: bz #2017969, #2017979
|
||||||
|
|
||||||
|
* Mon Nov 08 2021 Benjamin Marzinski <bmarzins@redhat.com> - 0.8.7-2
|
||||||
|
- Modify 0017-RH-use-rpm-optflags-if-present.patch
|
||||||
|
* use RPM_LF_FLAGS
|
||||||
|
- Modify 0018-RH-add-mpathconf.patch
|
||||||
|
* update default config to match multipath changes
|
||||||
|
- Modify 0022-RH-make-parse_vpd_pg83-match-scsi_id-output.patch
|
||||||
|
* fix cmocka vpd tests
|
||||||
|
- Rename 0023-libmulitpath-add-section-name-to-invalid-keyword-out.patch to
|
||||||
|
0023-libmultipath-add-section-name-to-invalid-keyword-out.patch
|
||||||
|
- Resolves: bz#2017592
|
||||||
|
|
||||||
|
* Fri Oct 29 2021 Benjamin Marzinski <bmarzins@redhat.com> - 0.8.7-1
|
||||||
|
- Update Source to upstream version 0.8.7 plus upstream staged commits
|
||||||
|
* Previous patches 0011-0016 & 0018-0022 are included in the source tarball
|
||||||
|
* Fixes bz#2017592
|
||||||
|
- Rename files
|
||||||
|
* Previous patches 0001-0010 are now patches 0013-0022
|
||||||
|
- Modify 0018-RH-add-mpathconf.patch
|
||||||
|
* merged with previous patch 0017
|
||||||
|
- Add 0023-libmulitpath-add-section-name-to-invalid-keyword-out.patch
|
||||||
|
* Fixes bz#1984303
|
||||||
|
- Fix multipath_conf_syntax test to work with bz #1984303
|
||||||
|
- Resolves: bz #1984303, #2017592
|
||||||
|
|
||||||
* Mon Aug 09 2021 Mohan Boddu <mboddu@redhat.com> - 0.8.6-7
|
* Mon Aug 09 2021 Mohan Boddu <mboddu@redhat.com> - 0.8.6-7
|
||||||
- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
|
- Rebuilt for IMA sigs, glibc 2.34, aarch64 flags
|
||||||
Related: rhbz#1991688
|
Related: rhbz#1991688
|
||||||
|
Loading…
Reference in New Issue
Block a user