commit
bf7e87e93d
@ -0,0 +1 @@
|
||||
067d668de8e3a70b7c176bbf0c0616d5835bbe44 SOURCES/multipath-tools-0.8.7.tgz
|
@ -0,0 +1 @@
|
||||
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,
|
||||
},
|
||||
{
|
@ -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 */
|
@ -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 */
|
@ -0,0 +1,63 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Thu, 13 Apr 2017 07:22:23 -0500
|
||||
Subject: [PATCH] RH: fixup udev rules for redhat
|
||||
|
||||
The multipath rules need to run after scsi_id is run. This means moving
|
||||
them after 60-persistent-storage.rules for redhat. Redhat also uses a
|
||||
different naming scheme for partitions than SuSE.
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
Makefile.inc | 2 +-
|
||||
kpartx/kpartx.rules | 2 +-
|
||||
multipath/Makefile | 4 ++--
|
||||
3 files changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/Makefile.inc b/Makefile.inc
|
||||
index d0ec9b44..2a75dc9c 100644
|
||||
--- a/Makefile.inc
|
||||
+++ b/Makefile.inc
|
||||
@@ -55,7 +55,7 @@ endif
|
||||
prefix =
|
||||
exec_prefix = $(prefix)
|
||||
usr_prefix = $(prefix)
|
||||
-bindir = $(exec_prefix)/sbin
|
||||
+bindir = $(exec_prefix)/usr/sbin
|
||||
libudevdir = $(prefix)/$(SYSTEMDPATH)/udev
|
||||
udevrulesdir = $(libudevdir)/rules.d
|
||||
multipathdir = $(TOPDIR)/libmultipath
|
||||
diff --git a/kpartx/kpartx.rules b/kpartx/kpartx.rules
|
||||
index d7527d7d..0e0d70d5 100644
|
||||
--- a/kpartx/kpartx.rules
|
||||
+++ b/kpartx/kpartx.rules
|
||||
@@ -36,6 +36,6 @@ LABEL="mpath_kpartx_end"
|
||||
GOTO="kpartx_end"
|
||||
|
||||
LABEL="run_kpartx"
|
||||
-RUN+="/sbin/kpartx -un -p -part /dev/$name"
|
||||
+RUN+="/sbin/kpartx -un /dev/$name"
|
||||
|
||||
LABEL="kpartx_end"
|
||||
diff --git a/multipath/Makefile b/multipath/Makefile
|
||||
index 0828a8f7..b9bbb3cf 100644
|
||||
--- a/multipath/Makefile
|
||||
+++ b/multipath/Makefile
|
||||
@@ -24,7 +24,7 @@ install:
|
||||
$(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir)/
|
||||
$(INSTALL_PROGRAM) -d $(DESTDIR)$(udevrulesdir)
|
||||
$(INSTALL_PROGRAM) -m 644 11-dm-mpath.rules $(DESTDIR)$(udevrulesdir)
|
||||
- $(INSTALL_PROGRAM) -m 644 $(EXEC).rules $(DESTDIR)$(libudevdir)/rules.d/56-multipath.rules
|
||||
+ $(INSTALL_PROGRAM) -m 644 $(EXEC).rules $(DESTDIR)$(libudevdir)/rules.d/62-multipath.rules
|
||||
$(INSTALL_PROGRAM) -d $(DESTDIR)$(man8dir)
|
||||
$(INSTALL_PROGRAM) -m 644 $(EXEC).8.gz $(DESTDIR)$(man8dir)
|
||||
$(INSTALL_PROGRAM) -d $(DESTDIR)$(man5dir)
|
||||
@@ -33,7 +33,7 @@ install:
|
||||
uninstall:
|
||||
$(RM) $(DESTDIR)$(bindir)/$(EXEC)
|
||||
$(RM) $(DESTDIR)$(udevrulesdir)/11-dm-mpath.rules
|
||||
- $(RM) $(DESTDIR)$(libudevdir)/rules.d/56-multipath.rules
|
||||
+ $(RM) $(DESTDIR)$(libudevdir)/rules.d/62-multipath.rules
|
||||
$(RM) $(DESTDIR)$(man8dir)/$(EXEC).8.gz
|
||||
$(RM) $(DESTDIR)$(man5dir)/$(EXEC).conf.5.gz
|
||||
|
@ -0,0 +1,101 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Wed, 2 Jul 2014 12:49:53 -0500
|
||||
Subject: [PATCH] RH: Remove the property blacklist exception builtin
|
||||
|
||||
Multipath set the default property blacklist exceptions to
|
||||
(ID_SCSI_VPD|ID_WWN). This has the effect of blacklisting some internal
|
||||
devices. These devices may never have multiple paths, but it is nice
|
||||
to be able to set multipath up on them all the same. This patch simply
|
||||
removes the default, and makes it so that if no property
|
||||
blacklist_exception is given, then devices aren't failed for not matching
|
||||
it.
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/blacklist.c | 6 ++----
|
||||
multipath/multipath.conf.5 | 11 ++++++-----
|
||||
tests/blacklist.c | 7 ++-----
|
||||
3 files changed, 10 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/blacklist.c b/libmultipath/blacklist.c
|
||||
index 4e315c97..1e463ef6 100644
|
||||
--- a/libmultipath/blacklist.c
|
||||
+++ b/libmultipath/blacklist.c
|
||||
@@ -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))
|
||||
return 1;
|
||||
|
||||
- if (store_ble(conf->elist_property, "(SCSI_IDENT_|ID_WWN)", ORIGIN_DEFAULT))
|
||||
- return 1;
|
||||
-
|
||||
vector_foreach_slot (conf->hwtable, hwe, i) {
|
||||
if (hwe->bl_product) {
|
||||
if (find_blacklist_device(conf->blist_device,
|
||||
@@ -410,7 +407,8 @@ filter_property(const struct config *conf, struct udev_device *udev,
|
||||
*uid_attribute != '\0';
|
||||
bool uid_attr_seen = false;
|
||||
|
||||
- r = MATCH_PROPERTY_BLIST_MISSING;
|
||||
+ if (VECTOR_SIZE(conf->elist_property))
|
||||
+ r = MATCH_PROPERTY_BLIST_MISSING;
|
||||
udev_list_entry_foreach(list_entry,
|
||||
udev_device_get_properties_list_entry(udev)) {
|
||||
|
||||
diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5
|
||||
index c74129bd..dd9f4dc7 100644
|
||||
--- a/multipath/multipath.conf.5
|
||||
+++ b/multipath/multipath.conf.5
|
||||
@@ -1351,9 +1351,14 @@ keywords. Both are regular expressions. For a full description of these keywords
|
||||
Regular expression for an udev property. All
|
||||
devices that have matching udev properties will be excluded/included.
|
||||
The handling of the \fIproperty\fR keyword is special,
|
||||
-because devices \fBmust\fR have at least one whitelisted udev property;
|
||||
+because if a property blacklist_exception is set, devices \fBmust\fR have at
|
||||
+least one whitelisted udev property;
|
||||
otherwise they're treated as blacklisted, and the message
|
||||
"\fIblacklisted, udev property missing\fR" is displayed in the logs.
|
||||
+For example, setting the property blacklist_exception to
|
||||
+\fB(SCSI_IDENT_|ID_WWN)\fR, will cause well-behaved SCSI devices and devices
|
||||
+that provide a WWN (World Wide Number) to be included, and all others to be
|
||||
+excluded. This works to exclude most non-multipathable devices.
|
||||
.
|
||||
.RS
|
||||
.PP
|
||||
@@ -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)
|
||||
set. Previously, it was applied to every device, possibly causing devices to be
|
||||
blacklisted because of temporary I/O error conditions.
|
||||
-.PP
|
||||
-The default \fIblacklist exception\fR is: \fB(SCSI_IDENT_|ID_WWN)\fR, causing
|
||||
-well-behaved SCSI devices and devices that provide a WWN (World Wide Number)
|
||||
-to be included, and all others to be excluded.
|
||||
.RE
|
||||
.TP
|
||||
.B protocol
|
||||
diff --git a/tests/blacklist.c b/tests/blacklist.c
|
||||
index 882aa3a1..6a22b660 100644
|
||||
--- a/tests/blacklist.c
|
||||
+++ b/tests/blacklist.c
|
||||
@@ -375,9 +375,8 @@ static void test_property_missing(void **state)
|
||||
{
|
||||
static struct udev_device udev = { "sdb", { "ID_FOO", "ID_BAZ", "ID_BAR", "ID_SERIAL", NULL } };
|
||||
conf.blist_property = blist_property_wwn;
|
||||
- expect_condlog(3, "sdb: blacklisted, udev property missing\n");
|
||||
assert_int_equal(filter_property(&conf, &udev, 3, "ID_SERIAL"),
|
||||
- MATCH_PROPERTY_BLIST_MISSING);
|
||||
+ MATCH_NOTHING);
|
||||
assert_int_equal(filter_property(&conf, &udev, 3, "ID_BLAH"),
|
||||
MATCH_NOTHING);
|
||||
assert_int_equal(filter_property(&conf, &udev, 3, ""),
|
||||
@@ -469,9 +468,7 @@ static void test_filter_path_missing1(void **state)
|
||||
conf.blist_device = blist_device_foo_bar;
|
||||
conf.blist_protocol = blist_protocol_fcp;
|
||||
conf.blist_wwid = blist_wwid_xyzzy;
|
||||
- expect_condlog(3, "sdb: blacklisted, udev property missing\n");
|
||||
- assert_int_equal(filter_path(&conf, &miss1_pp),
|
||||
- MATCH_PROPERTY_BLIST_MISSING);
|
||||
+ assert_int_equal(filter_path(&conf, &miss1_pp), MATCH_NOTHING);
|
||||
}
|
||||
|
||||
/* This one matches the property whitelist, to test the other missing
|
@ -0,0 +1,107 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Wed, 15 Oct 2014 10:39:30 -0500
|
||||
Subject: [PATCH] RH: don't start without a config file
|
||||
|
||||
If /etc/multipath.conf doesn't exist, don't start multipathd and blacklist
|
||||
all devices when running multipath. A completely blank configuration file
|
||||
is almost never what users want. Also, people may have the multipath
|
||||
packages installed but don't want to use them. This patch provides a
|
||||
simple way to disable multipath. Simply removing or renaming
|
||||
/etc/multipath.conf will keep multipath from doing anything.
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/config.c | 13 +++++++++++++
|
||||
libmultipath/config.h | 1 +
|
||||
multipath/multipath.rules | 1 +
|
||||
multipathd/multipathd.8 | 2 ++
|
||||
multipathd/multipathd.service | 1 +
|
||||
multipathd/multipathd.socket | 1 +
|
||||
6 files changed, 19 insertions(+)
|
||||
|
||||
diff --git a/libmultipath/config.c b/libmultipath/config.c
|
||||
index 30046a17..5f35c3d3 100644
|
||||
--- a/libmultipath/config.c
|
||||
+++ b/libmultipath/config.c
|
||||
@@ -895,6 +895,19 @@ int _init_config (const char *file, struct config *conf)
|
||||
goto out;
|
||||
}
|
||||
factorize_hwtable(conf->hwtable, builtin_hwtable_size, file);
|
||||
+ } else {
|
||||
+ condlog(0, "/etc/multipath.conf does not exist, blacklisting all devices.");
|
||||
+ if (conf->blist_devnode == NULL) {
|
||||
+ conf->blist_devnode = vector_alloc();
|
||||
+ if (!conf->blist_devnode) {
|
||||
+ condlog(0, "cannot allocate blacklist\n");
|
||||
+ goto out;
|
||||
+ }
|
||||
+ }
|
||||
+ if (store_ble(conf->blist_devnode, ".*", ORIGIN_NO_CONFIG)) {
|
||||
+ condlog(0, "cannot store default no-config blacklist\n");
|
||||
+ goto out;
|
||||
+ }
|
||||
}
|
||||
|
||||
conf->processed_main_config = 1;
|
||||
diff --git a/libmultipath/config.h b/libmultipath/config.h
|
||||
index 933fe0d1..5f01c1fc 100644
|
||||
--- a/libmultipath/config.h
|
||||
+++ b/libmultipath/config.h
|
||||
@@ -9,6 +9,7 @@
|
||||
|
||||
#define ORIGIN_DEFAULT 0
|
||||
#define ORIGIN_CONFIG 1
|
||||
+#define ORIGIN_NO_CONFIG 2
|
||||
|
||||
enum devtypes {
|
||||
DEV_NONE,
|
||||
diff --git a/multipath/multipath.rules b/multipath/multipath.rules
|
||||
index 9df11a95..0486bf70 100644
|
||||
--- a/multipath/multipath.rules
|
||||
+++ b/multipath/multipath.rules
|
||||
@@ -9,6 +9,7 @@ IMPORT{cmdline}="nompath"
|
||||
ENV{nompath}=="?*", GOTO="end_mpath"
|
||||
IMPORT{cmdline}="multipath"
|
||||
ENV{multipath}=="off", GOTO="end_mpath"
|
||||
+TEST!="/etc/multipath.conf", GOTO="end_mpath"
|
||||
|
||||
ENV{DEVTYPE}!="partition", GOTO="test_dev"
|
||||
IMPORT{parent}="DM_MULTIPATH_DEVICE_PATH"
|
||||
diff --git a/multipathd/multipathd.8 b/multipathd/multipathd.8
|
||||
index 048a838d..8bd47a80 100644
|
||||
--- a/multipathd/multipathd.8
|
||||
+++ b/multipathd/multipathd.8
|
||||
@@ -39,6 +39,8 @@ map regains its maximum performance and redundancy.
|
||||
This daemon executes the external \fBmultipath\fR tool when events occur.
|
||||
In turn, the multipath tool signals the multipathd daemon when it is done with
|
||||
devmap reconfiguration, so that it can refresh its failed path list.
|
||||
+
|
||||
+In this Linux distribution, multipathd does not run unless a /etc/multipath.conf file exists.
|
||||
.
|
||||
.
|
||||
.\" ----------------------------------------------------------------------------
|
||||
diff --git a/multipathd/multipathd.service b/multipathd/multipathd.service
|
||||
index 0b2ac814..6d57c7e8 100644
|
||||
--- a/multipathd/multipathd.service
|
||||
+++ b/multipathd/multipathd.service
|
||||
@@ -4,6 +4,7 @@ Wants=systemd-udev-trigger.service systemd-udev-settle.service
|
||||
Before=iscsi.service iscsid.service lvm2-activation-early.service
|
||||
Before=local-fs-pre.target blk-availability.service shutdown.target
|
||||
After=multipathd.socket systemd-udev-trigger.service systemd-udev-settle.service
|
||||
+ConditionPathExists=/etc/multipath.conf
|
||||
DefaultDependencies=no
|
||||
Conflicts=shutdown.target
|
||||
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
|
@ -0,0 +1,26 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Fri, 25 Jan 2019 14:54:56 -0600
|
||||
Subject: [PATCH] RH: Fix nvme function missing argument
|
||||
|
||||
A future patch will change the compilation options to error when
|
||||
function declarations have unspecified arguments.
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/nvme/argconfig.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/libmultipath/nvme/argconfig.h b/libmultipath/nvme/argconfig.h
|
||||
index adb192b6..bfd10ef8 100644
|
||||
--- a/libmultipath/nvme/argconfig.h
|
||||
+++ b/libmultipath/nvme/argconfig.h
|
||||
@@ -76,7 +76,7 @@ struct argconfig_commandline_options {
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
-typedef void argconfig_help_func();
|
||||
+typedef void argconfig_help_func(void);
|
||||
void argconfig_append_usage(const char *str);
|
||||
void argconfig_print_help(const char *program_desc,
|
||||
const struct argconfig_commandline_options *options);
|
@ -0,0 +1,66 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Wed, 19 Apr 2017 06:10:01 -0500
|
||||
Subject: [PATCH] RH: use rpm optflags if present
|
||||
|
||||
Use the passed in optflags when compiling as an RPM, and keep the
|
||||
default flags as close as possible to the current fedora flags, while
|
||||
still being generic.
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
Makefile.inc | 26 +++++++++++++++++++-------
|
||||
1 file changed, 19 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/Makefile.inc b/Makefile.inc
|
||||
index 2a75dc9c..5ac660de 100644
|
||||
--- a/Makefile.inc
|
||||
+++ b/Makefile.inc
|
||||
@@ -92,23 +92,35 @@ TEST_CC_OPTION = $(shell \
|
||||
echo "$(2)"; \
|
||||
fi)
|
||||
|
||||
-STACKPROT := $(call TEST_CC_OPTION,-fstack-protector-strong,-fstack-protector)
|
||||
ERROR_DISCARDED_QUALIFIERS := $(call TEST_CC_OPTION,-Werror=discarded-qualifiers,)
|
||||
WNOCLOBBERED := $(call TEST_CC_OPTION,-Wno-clobbered -Wno-error=clobbered,)
|
||||
WFORMATOVERFLOW := $(call TEST_CC_OPTION,-Wformat-overflow=2,)
|
||||
|
||||
-OPTFLAGS := -O2 -g $(STACKPROT) --param=ssp-buffer-size=4
|
||||
-WARNFLAGS := -Werror -Wall -Wextra -Wformat=2 $(WFORMATOVERFLOW) -Werror=implicit-int \
|
||||
+ifndef RPM_OPT_FLAGS
|
||||
+ STACKPROT := $(call TEST_CC_OPTION,-fstack-protector-strong,-fstack-protector)
|
||||
+ OPTFLAGS := -O2 -g -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions \
|
||||
+ $(STACKPROT) -grecord-gcc-switches \
|
||||
+ -fasynchronous-unwind-tables --param=ssp-buffer-size=4
|
||||
+ ifeq ($(shell test -f /usr/lib/rpm/redhat/redhat-hardened-cc1 && echo 1),1)
|
||||
+ OPTFLAGS += -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1
|
||||
+ endif
|
||||
+ ifeq ($(shell test -f /usr/lib/rpm/redhat/redhat-annobin-cc1 && echo 1),1)
|
||||
+ OPTFLAGS += -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1
|
||||
+ endif
|
||||
+else
|
||||
+ OPTFLAGS := $(RPM_OPT_FLAGS) --param=ssp-buffer-size=4
|
||||
+endif
|
||||
+WARNFLAGS := -Werror -Wextra -Wformat=2 $(WFORMATOVERFLOW) -Werror=implicit-int \
|
||||
-Werror=implicit-function-declaration -Werror=format-security \
|
||||
- $(WNOCLOBBERED) -Werror=cast-qual $(ERROR_DISCARDED_QUALIFIERS)
|
||||
-CPPFLAGS := -Wp,-D_FORTIFY_SOURCE=2
|
||||
+ $(WNOCLOBBERED) -Werror=cast-qual $(ERROR_DISCARDED_QUALIFIERS) \
|
||||
+ -Wstrict-prototypes
|
||||
CFLAGS := --std=gnu99 $(CFLAGS) $(OPTFLAGS) $(WARNFLAGS) -pipe \
|
||||
-DBIN_DIR=\"$(bindir)\" -DLIB_STRING=\"${LIB}\" -DRUN_DIR=\"${RUN}\" \
|
||||
-MMD -MP
|
||||
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
|
||||
@echo building $@ because of $?
|
||||
- $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<
|
||||
+ $(CC) $(CFLAGS) -c -o $@ $<
|
@ -0,0 +1,772 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Thu, 16 Oct 2014 15:49:01 -0500
|
||||
Subject: [PATCH] RH: add mpathconf
|
||||
|
||||
mpathconf is a program (largely based on lvmcomf) to help users
|
||||
configure /etc/multipath.conf and enable or disable multipathing. It
|
||||
has a couple of built-in options that can be set directly from the
|
||||
command line. But, mostly it is used to get a multipath.conf file
|
||||
with the OS defaults, and to enable and disable multipathing via
|
||||
a single command.
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/config.c | 2 +
|
||||
multipath/Makefile | 5 +
|
||||
multipath/mpathconf | 556 ++++++++++++++++++++++++++++++++++++++++++
|
||||
multipath/mpathconf.8 | 135 ++++++++++
|
||||
4 files changed, 698 insertions(+)
|
||||
create mode 100644 multipath/mpathconf
|
||||
create mode 100644 multipath/mpathconf.8
|
||||
|
||||
diff --git a/libmultipath/config.c b/libmultipath/config.c
|
||||
index 5f35c3d3..cee3bbb7 100644
|
||||
--- a/libmultipath/config.c
|
||||
+++ b/libmultipath/config.c
|
||||
@@ -897,6 +897,8 @@ int _init_config (const char *file, struct config *conf)
|
||||
factorize_hwtable(conf->hwtable, builtin_hwtable_size, file);
|
||||
} else {
|
||||
condlog(0, "/etc/multipath.conf does not exist, blacklisting all devices.");
|
||||
+ condlog(0, "You can run \"/sbin/mpathconf --enable\" to create");
|
||||
+ condlog(0, "/etc/multipath.conf. See man mpathconf(8) for more details");
|
||||
if (conf->blist_devnode == NULL) {
|
||||
conf->blist_devnode = vector_alloc();
|
||||
if (!conf->blist_devnode) {
|
||||
diff --git a/multipath/Makefile b/multipath/Makefile
|
||||
index b9bbb3cf..e720c7f6 100644
|
||||
--- a/multipath/Makefile
|
||||
+++ b/multipath/Makefile
|
||||
@@ -18,10 +18,12 @@ $(EXEC): $(OBJS) $(multipathdir)/libmultipath.so $(mpathcmddir)/libmpathcmd.so
|
||||
$(CC) $(CFLAGS) $(OBJS) -o $(EXEC) $(LDFLAGS) $(LIBDEPS)
|
||||
$(GZIP) $(EXEC).8 > $(EXEC).8.gz
|
||||
$(GZIP) $(EXEC).conf.5 > $(EXEC).conf.5.gz
|
||||
+ $(GZIP) mpathconf.8 > mpathconf.8.gz
|
||||
|
||||
install:
|
||||
$(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir)
|
||||
$(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir)/
|
||||
+ $(INSTALL_PROGRAM) -m 755 mpathconf $(DESTDIR)$(bindir)/
|
||||
$(INSTALL_PROGRAM) -d $(DESTDIR)$(udevrulesdir)
|
||||
$(INSTALL_PROGRAM) -m 644 11-dm-mpath.rules $(DESTDIR)$(udevrulesdir)
|
||||
$(INSTALL_PROGRAM) -m 644 $(EXEC).rules $(DESTDIR)$(libudevdir)/rules.d/62-multipath.rules
|
||||
@@ -29,13 +31,16 @@ install:
|
||||
$(INSTALL_PROGRAM) -m 644 $(EXEC).8.gz $(DESTDIR)$(man8dir)
|
||||
$(INSTALL_PROGRAM) -d $(DESTDIR)$(man5dir)
|
||||
$(INSTALL_PROGRAM) -m 644 $(EXEC).conf.5.gz $(DESTDIR)$(man5dir)
|
||||
+ $(INSTALL_PROGRAM) -m 644 mpathconf.8.gz $(DESTDIR)$(man8dir)
|
||||
|
||||
uninstall:
|
||||
$(RM) $(DESTDIR)$(bindir)/$(EXEC)
|
||||
$(RM) $(DESTDIR)$(udevrulesdir)/11-dm-mpath.rules
|
||||
$(RM) $(DESTDIR)$(libudevdir)/rules.d/62-multipath.rules
|
||||
+ $(RM) $(DESTDIR)$(bindir)/mpathconf
|
||||
$(RM) $(DESTDIR)$(man8dir)/$(EXEC).8.gz
|
||||
$(RM) $(DESTDIR)$(man5dir)/$(EXEC).conf.5.gz
|
||||
+ $(RM) $(DESTDIR)$(man8dir)/mpathconf.8.gz
|
||||
|
||||
clean: dep_clean
|
||||
$(RM) core *.o $(EXEC) *.gz
|
||||
diff --git a/multipath/mpathconf b/multipath/mpathconf
|
||||
new file mode 100644
|
||||
index 00000000..c00d2555
|
||||
--- /dev/null
|
||||
+++ b/multipath/mpathconf
|
||||
@@ -0,0 +1,556 @@
|
||||
+#!/bin/bash
|
||||
+#
|
||||
+# Copyright (C) 2010 Red Hat, Inc. All rights reserved.
|
||||
+#
|
||||
+# This file is part of the device-mapper-multipath package.
|
||||
+#
|
||||
+# This copyrighted material is made available to anyone wishing to use,
|
||||
+# modify, copy, or redistribute it subject to the terms and conditions
|
||||
+# of the GNU General Public License v.2.
|
||||
+#
|
||||
+# You should have received a copy of the GNU General Public License
|
||||
+# along with this program; if not, write to the Free Software Foundation,
|
||||
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
+
|
||||
+#
|
||||
+# Simple editting of /etc/multipath.conf
|
||||
+# This program was largely ripped off from lvmconf
|
||||
+#
|
||||
+
|
||||
+unset ENABLE FIND FRIENDLY PROPERTY FOREIGN MODULE MULTIPATHD HAVE_DISABLE HAVE_WWID_DISABLE HAVE_FIND HAVE_BLACKLIST HAVE_EXCEPTIONS HAVE_DEFAULTS HAVE_FRIENDLY HAVE_PROPERTY HAVE_FOREIGN HAVE_MULTIPATHD HAVE_MODULE HAVE_OUTFILE SHOW_STATUS CHANGED_CONFIG WWID_LIST
|
||||
+
|
||||
+DEFAULT_CONFIG="# device-mapper-multipath configuration file
|
||||
+
|
||||
+# For a complete list of the default configuration values, run either:
|
||||
+# # multipath -t
|
||||
+# or
|
||||
+# # multipathd show config
|
||||
+
|
||||
+# For a list of configuration options with descriptions, see the
|
||||
+# multipath.conf man page.
|
||||
+
|
||||
+defaults {
|
||||
+ user_friendly_names yes
|
||||
+ find_multipaths yes
|
||||
+}"
|
||||
+
|
||||
+CONFIGFILE="/etc/multipath.conf"
|
||||
+OUTPUTFILE="/etc/multipath.conf"
|
||||
+MULTIPATHDIR="/etc/multipath"
|
||||
+TMPFILE="/etc/multipath/.multipath.conf.tmp"
|
||||
+WWIDS=0
|
||||
+
|
||||
+function usage
|
||||
+{
|
||||
+ echo "usage: $0 <command>"
|
||||
+ echo ""
|
||||
+ echo "Commands:"
|
||||
+ echo "Enable: --enable "
|
||||
+ echo "Disable: --disable"
|
||||
+ echo "Only allow certain wwids (instead of enable): --allow <WWID>"
|
||||
+ 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 default property blacklist (Default n): --property_blacklist <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 "start/stop/reload multipathd (Default n): --with_multipathd <y|n>"
|
||||
+ echo "select output file (Default /etc/multipath.conf): --outfile <FILE>"
|
||||
+ echo ""
|
||||
+}
|
||||
+
|
||||
+function add_wwid
|
||||
+{
|
||||
+ INDEX=0
|
||||
+ while [ "$INDEX" -lt "$WWIDS" ] ; do
|
||||
+ if [ "$1" = "${WWID_LIST[$INDEX]}" ] ; then
|
||||
+ return
|
||||
+ fi
|
||||
+ ((INDEX++))
|
||||
+ done
|
||||
+ WWID_LIST[$WWIDS]="$1"
|
||||
+ ((WWIDS++))
|
||||
+}
|
||||
+
|
||||
+function get_dm_deps
|
||||
+{
|
||||
+ shift 3
|
||||
+ while [ -n "$1" -a -n "$2" ]; do
|
||||
+ MAJOR=$(echo $1 | tr -d '(,')
|
||||
+ MINOR=$(echo $2 | tr -d ')')
|
||||
+ UUID=`dmsetup info -c --noheadings -o uuid -j $MAJOR -m $MINOR 2> /dev/null`
|
||||
+ if [ -n "$UUID" ] ; then
|
||||
+ set_dm_wwid $UUID
|
||||
+ fi
|
||||
+ shift 2
|
||||
+ done
|
||||
+}
|
||||
+
|
||||
+function set_dm_wwid
|
||||
+{
|
||||
+ if [[ "$1" =~ ^part[[:digit:]]+-mpath- ]] ; then
|
||||
+ add_wwid "${1##part*-mpath-}"
|
||||
+ elif [[ "$1" =~ ^mpath- ]] ; then
|
||||
+ add_wwid "${1##mpath-}"
|
||||
+ else
|
||||
+ get_dm_deps `dmsetup deps -u $1`
|
||||
+ fi
|
||||
+}
|
||||
+
|
||||
+function set_wwid
|
||||
+{
|
||||
+ UUID=""
|
||||
+ if [[ "$1" =~ ^[[:digit:]]+:[[:digit:]]+$ ]] ; then
|
||||
+ MAJOR=${1%%:*}
|
||||
+ MINOR=${1##*:}
|
||||
+ UUID=`dmsetup info -c --noheadings -o uuid -j $MAJOR -m $MINOR 2> /dev/null`
|
||||
+ else
|
||||
+ UUID=`dmsetup info -c --noheadings -o uuid $1 2> /dev/null`
|
||||
+ fi
|
||||
+ if [ -n "$UUID" ] ; then
|
||||
+ set_dm_wwid $UUID
|
||||
+ else
|
||||
+ add_wwid "$1"
|
||||
+ fi
|
||||
+}
|
||||
+
|
||||
+function parse_args
|
||||
+{
|
||||
+ while [ -n "$1" ]; do
|
||||
+ case $1 in
|
||||
+ --enable)
|
||||
+ ENABLE=1
|
||||
+ shift
|
||||
+ ;;
|
||||
+ --disable)
|
||||
+ ENABLE=0
|
||||
+ shift
|
||||
+ ;;
|
||||
+ --allow)
|
||||
+ ENABLE=2
|
||||
+ if [ -n "$2" ]; then
|
||||
+ set_wwid $2
|
||||
+ shift 2
|
||||
+ else
|
||||
+ usage
|
||||
+ exit 1
|
||||
+ fi
|
||||
+ ;;
|
||||
+ --user_friendly_names)
|
||||
+ if [ -n "$2" ]; then
|
||||
+ FRIENDLY=$2
|
||||
+ shift 2
|
||||
+ else
|
||||
+ usage
|
||||
+ exit 1
|
||||
+ fi
|
||||
+ ;;
|
||||
+ --find_multipaths)
|
||||
+ if [ -n "$2" ]; then
|
||||
+ FIND=$2
|
||||
+ shift 2
|
||||
+ else
|
||||
+ usage
|
||||
+ exit 1
|
||||
+ fi
|
||||
+ ;;
|
||||
+ --property_blacklist)
|
||||
+ if [ -n "$2" ]; then
|
||||
+ PROPERTY=$2
|
||||
+ shift 2
|
||||
+ else
|
||||
+ usage
|
||||
+ exit 1
|
||||
+ fi
|
||||
+ ;;
|
||||
+ --enable_foreign)
|
||||
+ if [ -n "$2" ]; then
|
||||
+ FOREIGN=$2
|
||||
+ shift 2
|
||||
+ else
|
||||
+ usage
|
||||
+ exit 1
|
||||
+ fi
|
||||
+ ;;
|
||||
+ --with_module)
|
||||
+ if [ -n "$2" ]; then
|
||||
+ MODULE=$2
|
||||
+ shift 2
|
||||
+ else
|
||||
+ usage
|
||||
+ exit 1
|
||||
+ fi
|
||||
+ ;;
|
||||
+ --with_multipathd)
|
||||
+ if [ -n "$2" ]; then
|
||||
+ MULTIPATHD=$2
|
||||
+ shift 2
|
||||
+ else
|
||||
+ usage
|
||||
+ exit 1
|
||||
+ fi
|
||||
+ ;;
|
||||
+ --outfile)
|
||||
+ if [ -n "$2" ]; then
|
||||
+ OUTPUTFILE=$2
|
||||
+ HAVE_OUTFILE=1
|
||||
+ shift 2
|
||||
+ else
|
||||
+ usage
|
||||
+ exit 1
|
||||
+ fi
|
||||
+ ;;
|
||||
+ *)
|
||||
+ usage
|
||||
+ exit
|
||||
+ esac
|
||||
+ done
|
||||
+}
|
||||
+
|
||||
+function validate_args
|
||||
+{
|
||||
+ if [ "$ENABLE" = "0" ] && [ -n "$FRIENDLY" -o -n "$FIND" -o -n "$PROPERTY" -o -n "$MODULE" ]; then
|
||||
+ echo "ignoring extra parameters on disable"
|
||||
+ FRIENDLY=""
|
||||
+ FIND=""
|
||||
+ PROPERTY=""
|
||||
+ MODULE=""
|
||||
+ fi
|
||||
+ if [ -n "$FRIENDLY" ] && [ "$FRIENDLY" != "y" -a "$FRIENDLY" != "n" ]; then
|
||||
+ echo "--user_friendly_names must be either 'y' or 'n'"
|
||||
+ exit 1
|
||||
+ fi
|
||||
+ if [ "$FIND" = "y" ]; then
|
||||
+ FIND="yes"
|
||||
+ elif [ "$FIND" = "n" ]; then
|
||||
+ FIND="no"
|
||||
+ elif [ -n "$FIND" ] && [ "$FIND" != "yes" -a "$FIND" != "no" -a "$FIND" != "strict" -a "$FIND" != "greedy" -a "$FIND" != "smart" ]; then
|
||||
+ echo "--find_multipaths must be one of 'yes' 'no' 'strict' 'greedy' or 'smart'"
|
||||
+ exit 1
|
||||
+ fi
|
||||
+ if [ -n "$PROPERTY" ] && [ "$PROPERTY" != "y" -a "$PROPERTY" != "n" ]; then
|
||||
+ echo "--property_blacklist must be either 'y' or 'n'"
|
||||
+ exit 1
|
||||
+ fi
|
||||
+ if [ -n "$FOREIGN" ] && [ "$FOREIGN" != "y" -a "$FOREIGN" != "n" ]; then
|
||||
+ echo "--enable_foreign must be either 'y' or 'n'"
|
||||
+ exit 1
|
||||
+ fi
|
||||
+ 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
|
||||
+ echo "--with_module must be either 'y' or 'n'"
|
||||
+ exit 1
|
||||
+ fi
|
||||
+ if [ -n "$MULTIPATHD" ] && [ "$MULTIPATHD" != "y" -a "$MULTIPATHD" != "n" ]; then
|
||||
+ echo "--with_multipathd must be either 'y' or 'n'"
|
||||
+ exit 1
|
||||
+ fi
|
||||
+ if [ "$ENABLE" = 2 -a -z "$HAVE_OUTFILE" ]; then
|
||||
+ echo "Because --allow makes changes that cannot be automatically reversed,"
|
||||
+ echo "you must set --outfile when you set --allow"
|
||||
+ exit 1
|
||||
+ fi
|
||||
+}
|
||||
+
|
||||
+function add_blacklist_exceptions
|
||||
+{
|
||||
+ INDEX=0
|
||||
+ while [ "$INDEX" -lt "$WWIDS" ] ; do
|
||||
+ sed -i '/^blacklist_exceptions[[:space:]]*{/ a\
|
||||
+ wwid '"\"${WWID_LIST[$INDEX]}\""'
|
||||
+' $TMPFILE
|
||||
+ ((INDEX++))
|
||||
+ done
|
||||
+}
|
||||
+
|
||||
+umask 0077
|
||||
+
|
||||
+parse_args "$@"
|
||||
+
|
||||
+validate_args
|
||||
+
|
||||
+if [ ! -d "$MULTIPATHDIR" ]; then
|
||||
+ echo "/etc/multipath/ does not exist. failing"
|
||||
+ exit 1
|
||||
+fi
|
||||
+
|
||||
+rm $TMPFILE 2> /dev/null
|
||||
+echo "$DEFAULT_CONFIG" > $TMPFILE
|
||||
+if [ -f "$CONFIGFILE" ]; then
|
||||
+ cp $CONFIGFILE $TMPFILE
|
||||
+fi
|
||||
+
|
||||
+if grep -q "^blacklist[[:space:]]*{" $TMPFILE ; then
|
||||
+ HAVE_BLACKLIST=1
|
||||
+fi
|
||||
+
|
||||
+if grep -q "^blacklist_exceptions[[:space:]]*{" $TMPFILE ; then
|
||||
+ HAVE_EXCEPTIONS=1
|
||||
+fi
|
||||
+
|
||||
+if grep -q "^defaults[[:space:]]*{" $TMPFILE ; then
|
||||
+ HAVE_DEFAULTS=1
|
||||
+fi
|
||||
+
|
||||
+if [ -z "$MODULE" -o "$MODULE" = "y" ]; then
|
||||
+ if lsmod | grep -q "dm_multipath" ; then
|
||||
+ HAVE_MODULE=1
|
||||
+ else
|
||||
+ HAVE_MODULE=0
|
||||
+ fi
|
||||
+fi
|
||||
+
|
||||
+if [ "$MULTIPATHD" = "y" ]; then
|
||||
+ if /bin/systemctl status multipathd.service > /dev/null 2>&1 ; then
|
||||
+ HAVE_MULTIPATHD=1
|
||||
+ else
|
||||
+ HAVE_MULTIPATHD=0
|
||||
+ fi
|
||||
+fi
|
||||
+
|
||||
+if [ "$HAVE_BLACKLIST" = "1" ]; 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[[:space:]][[:space:]]*\"\.\?\*\"" ; then
|
||||
+ HAVE_DISABLE=0
|
||||
+ fi
|
||||
+fi
|
||||
+
|
||||
+if [ "$HAVE_BLACKLIST" = "1" ]; 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[[: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:]]*\([^[: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:]][[:space:]]*\(yes\|1\)" ; then
|
||||
+ HAVE_FRIENDLY=1
|
||||
+ 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:]][[:space:]]*\"\.\*\"" ; then
|
||||
+ HAVE_FOREIGN=1
|
||||
+ 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:]][[:space:]]*\"(SCSI_IDENT_|ID_WWN)\"" ; then
|
||||
+ HAVE_PROPERTY=1
|
||||
+ 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
|
||||
+
|
||||
+if [ -n "$SHOW_STATUS" ]; then
|
||||
+ if [ -z "$HAVE_DISABLE" -o "$HAVE_DISABLE" = 0 ]; then
|
||||
+ echo "multipath is enabled"
|
||||
+ else
|
||||
+ echo "multipath is disabled"
|
||||
+ fi
|
||||
+ if [ -z "$HAVE_FIND" ]; then
|
||||
+ echo "find_multipaths is no"
|
||||
+ else
|
||||
+ echo "find_multipaths is $HAVE_FIND"
|
||||
+ fi
|
||||
+ if [ -z "$HAVE_FRIENDLY" -o "$HAVE_FRIENDLY" = 0 ]; then
|
||||
+ echo "user_friendly_names is disabled"
|
||||
+ else
|
||||
+ echo "user_friendly_names is enabled"
|
||||
+ fi
|
||||
+ if [ -z "$HAVE_PROPERTY" -o "$HAVE_PROPERTY" = 0 ]; then
|
||||
+ echo "default property blacklist is disabled"
|
||||
+ else
|
||||
+ echo "default property blacklist is enabled"
|
||||
+ fi
|
||||
+ if [ -z "$HAVE_FOREIGN" -o "$HAVE_FOREIGN" = 0 ]; then
|
||||
+ 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)"
|
||||
+ fi
|
||||
+ if [ -n "$HAVE_MODULE" ]; then
|
||||
+ if [ "$HAVE_MODULE" = 1 ]; then
|
||||
+ echo "dm_multipath module is loaded"
|
||||
+ else
|
||||
+ echo "dm_multipath module is not loaded"
|
||||
+ fi
|
||||
+ fi
|
||||
+ if [ -z "$HAVE_MULTIPATHD" ]; then
|
||||
+ if /bin/systemctl status multipathd.service > /dev/null 2>&1 ; then
|
||||
+ HAVE_MULTIPATHD=1
|
||||
+ else
|
||||
+ HAVE_MULTIPATHD=0
|
||||
+ fi
|
||||
+ fi
|
||||
+ if [ "$HAVE_MULTIPATHD" = 1 ]; then
|
||||
+ echo "multipathd is running"
|
||||
+ else
|
||||
+ echo "multipathd is not running"
|
||||
+ fi
|
||||
+ exit 0
|
||||
+fi
|
||||
+
|
||||
+if [ -z "$HAVE_BLACKLIST" ]; then
|
||||
+ cat >> $TMPFILE <<- _EOF_
|
||||
+
|
||||
+blacklist {
|
||||
+}
|
||||
+_EOF_
|
||||
+fi
|
||||
+
|
||||
+if [ -z "$HAVE_DEFAULTS" ]; then
|
||||
+ cat >> $TMPFILE <<- _EOF_
|
||||
+
|
||||
+defaults {
|
||||
+}
|
||||
+_EOF_
|
||||
+fi
|
||||
+
|
||||
+if [ "$ENABLE" = 2 ]; then
|
||||
+ if [ "$HAVE_DISABLE" = 1 ]; then
|
||||
+ 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[[:space:]][[:space:]]*\"\.\?\*\"/ wwid ".*"/' $TMPFILE
|
||||
+ fi
|
||||
+ if [ "$HAVE_EXCEPTIONS" = 1 ]; then
|
||||
+ sed -i '/^blacklist_exceptions[[:space:]]*{/,/^}/ {/^[[:space:]]*wwid/ d}' $TMPFILE
|
||||
+ else
|
||||
+ cat >> $TMPFILE <<- _EOF_
|
||||
+
|
||||
+blacklist_exceptions {
|
||||
+}
|
||||
+_EOF_
|
||||
+ fi
|
||||
+ add_blacklist_exceptions
|
||||
+elif [ "$ENABLE" = 1 ]; then
|
||||
+ if [ "$HAVE_DISABLE" = 1 ]; then
|
||||
+ sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*devnode[[:space:]][[:space:]]*\"\.\?\*\"/# devnode ".*"/' $TMPFILE
|
||||
+ fi
|
||||
+elif [ "$ENABLE" = 0 ]; then
|
||||
+ if [ -z "$HAVE_DISABLE" ]; then
|
||||
+ sed -i '/^blacklist[[:space:]]*{/ a\
|
||||
+ devnode ".*"
|
||||
+' $TMPFILE
|
||||
+ elif [ "$HAVE_DISABLE" = 0 ]; then
|
||||
+ sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*#[[:space:]]*devnode[[:space:]][[:space:]]*\"\.\?\*\"/ devnode ".*"/' $TMPFILE
|
||||
+ fi
|
||||
+fi
|
||||
+
|
||||
+if [ -n "$FIND" ]; then
|
||||
+ if [ -z "$HAVE_FIND" ]; then
|
||||
+ sed -i '/^defaults[[:space:]]*{/ a\
|
||||
+ find_multipaths '"$FIND"'
|
||||
+' $TMPFILE
|
||||
+ CHANGED_CONFIG=1
|
||||
+ elif [ "$FIND" != "$HAVE_FIND" ]; then
|
||||
+ 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:]][[:space:]]*\(yes\|1\)/ user_friendly_names no/' $TMPFILE
|
||||
+ CHANGED_CONFIG=1
|
||||
+ fi
|
||||
+elif [ "$FRIENDLY" = "y" ]; then
|
||||
+ if [ -z "$HAVE_FRIENDLY" ]; then
|
||||
+ sed -i '/^defaults[[:space:]]*{/ a\
|
||||
+ user_friendly_names yes
|
||||
+' $TMPFILE
|
||||
+ CHANGED_CONFIG=1
|
||||
+ elif [ "$HAVE_FRIENDLY" = 0 ]; then
|
||||
+ 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:]][[:space:]]*\"(SCSI_IDENT_|ID_WWN)\"/# property \"(SCSI_IDENT_|ID_WWN)\"/' $TMPFILE
|
||||
+ CHANGED_CONFIG=1
|
||||
+ fi
|
||||
+elif [ "$PROPERTY" = "y" ]; then
|
||||
+ if [ -z "$HAVE_PROPERTY" ]; then
|
||||
+ sed -i '/^blacklist_exceptions[[:space:]]*{/ a\
|
||||
+ property "(SCSI_IDENT_|ID_WWN)"
|
||||
+' $TMPFILE
|
||||
+ CHANGED_CONFIG=1
|
||||
+ elif [ "$HAVE_PROPERTY" = 0 ]; then
|
||||
+ 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" = "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" = "y" ]; then
|
||||
+ if [ -z "$HAVE_FOREIGN" ]; then
|
||||
+ sed -i '/^defaults[[:space:]]*{/ a\
|
||||
+ enable_foreign ".*"
|
||||
+' $TMPFILE
|
||||
+ CHANGED_CONFIG=1
|
||||
+ 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
|
||||
+
|
||||
+if [ -f "$OUTPUTFILE" ]; then
|
||||
+ cp $OUTPUTFILE $OUTPUTFILE.old
|
||||
+ if [ $? != 0 ]; then
|
||||
+ echo "failed to backup old config file, $OUTPUTFILE not updated"
|
||||
+ exit 1
|
||||
+ fi
|
||||
+fi
|
||||
+
|
||||
+cp $TMPFILE $OUTPUTFILE
|
||||
+if [ $? != 0 ]; then
|
||||
+ echo "failed to copy new config file into place, check $OUTPUTFILE is still OK"
|
||||
+ exit 1
|
||||
+fi
|
||||
+
|
||||
+rm -f $TMPFILE
|
||||
+
|
||||
+if [ "$ENABLE" = 1 ]; then
|
||||
+ if [ "$HAVE_MODULE" = 0 ]; then
|
||||
+ modprobe dm_multipath
|
||||
+ fi
|
||||
+ if [ "$HAVE_MULTIPATHD" = 0 ]; then
|
||||
+ systemctl start multipathd.service
|
||||
+ fi
|
||||
+elif [ "$ENABLE" = 0 ]; then
|
||||
+ if [ "$HAVE_MULTIPATHD" = 1 ]; then
|
||||
+ systemctl stop multipathd.service
|
||||
+ fi
|
||||
+elif [ -n "$CHANGED_CONFIG" -a "$HAVE_MULTIPATHD" = 1 ]; then
|
||||
+ systemctl reload multipathd.service
|
||||
+fi
|
||||
diff --git a/multipath/mpathconf.8 b/multipath/mpathconf.8
|
||||
new file mode 100644
|
||||
index 00000000..a14d831e
|
||||
--- /dev/null
|
||||
+++ b/multipath/mpathconf.8
|
||||
@@ -0,0 +1,135 @@
|
||||
+.TH MPATHCONF 8 "June 2010" "" "Linux Administrator's Manual"
|
||||
+.SH NAME
|
||||
+mpathconf - A tool for configuring device-mapper-multipath
|
||||
+.SH SYNOPSIS
|
||||
+.B mpathconf
|
||||
+.RB [\| commands \|]
|
||||
+.RB [\| options \|]
|
||||
+.SH DESCRIPTION
|
||||
+.B mpathconf
|
||||
+is a utility that creates or modifies
|
||||
+.B /etc/multipath.conf.
|
||||
+It can enable or disable multipathing and configure some common options.
|
||||
+.B mpathconf
|
||||
+can also load the
|
||||
+.B dm_multipath
|
||||
+module, start and stop the
|
||||
+.B multipathd
|
||||
+daemon, and configure the
|
||||
+.B multipathd
|
||||
+service to start automatically or not. If
|
||||
+.B mpathconf
|
||||
+is called with no commands, it will display the current configuration, but
|
||||
+will not create of modify
|
||||
+.B /etc/multipath.conf
|
||||
+
|
||||
+The default options for mpathconf are
|
||||
+.B --with_module
|
||||
+The
|
||||
+.B --with_multipathd
|
||||
+option is not set by default. Enabling multipathing will load the
|
||||
+.B dm_multipath
|
||||
+module but it will not immediately start it. This is so
|
||||
+that users can manually edit their config file if necessary, before starting
|
||||
+.B multipathd.
|
||||
+
|
||||
+If
|
||||
+.B /etc/multipath.conf
|
||||
+already exists, mpathconf will edit it. If it does not exist, mpathconf will
|
||||
+create a default file with
|
||||
+.B user_friendly_names
|
||||
+set and
|
||||
+.B find_multipaths
|
||||
+set to \fByes\fP. To disable these, use the
|
||||
+.B --user_friendly_names n
|
||||
+and
|
||||
+.B --find_multipaths n
|
||||
+options
|
||||
+.SH COMMANDS
|
||||
+.TP
|
||||
+.B --enable
|
||||
+Removes any line that blacklists all device nodes from the
|
||||
+.B /etc/multipath.conf
|
||||
+blacklist section. Also, creates
|
||||
+.B /etc/multipath.conf
|
||||
+if it doesn't exist.
|
||||
+.TP
|
||||
+.B --disable
|
||||
+Adds a line that blacklists all device nodes to the
|
||||
+.B /etc/multipath.conf
|
||||
+blacklist section. If no blacklist section exists, it will create one.
|
||||
+.TP
|
||||
+.B --allow \fB<device>\fP
|
||||
+Modifies the \fB/etc/multipath/conf\fP blacklist to blacklist all
|
||||
+wwids and the blacklist_exceptions to whitelist \fB<device>\fP. \fB<device>\fP
|
||||
+can be in the form of MAJOR:MINOR, a wwid, or the name of a device-mapper
|
||||
+device, either a multipath device, or any device on stacked on top of one or
|
||||
+more multipath devices. This command can be used multiple times to allow
|
||||
+multiple devices. \fBNOTE:\fP This action will create a configuration file that
|
||||
+mpathconf will not be able to revert back to its previous state. Because
|
||||
+of this, \fB--outfile\fP is required when using \fB--allow\fP.
|
||||
+.TP
|
||||
+.B --user_friendly_names \fP { \fBy\fP | \fBn\fP }
|
||||
+If set to \fBy\fP, this adds the line
|
||||
+.B user_friendly_names yes
|
||||
+to the
|
||||
+.B /etc/multipath.conf
|
||||
+defaults section. If set to \fBn\fP, this removes the line, if present. This
|
||||
+command can be used along with any other command.
|
||||
+.TP
|
||||
+.B --find_multipaths\fP { \fByes\fP | \fBno\fP | \fBstrict\fP | \fBgreedy\fP | \fBsmart\fP }
|
||||
+If set to \fB<value>\fP, this adds the line
|
||||
+.B find_multipaths <value>
|
||||
+to the
|
||||
+.B /etc/multipath.conf
|
||||
+defaults section. This command can be used along with any other command.
|
||||
+\fBy\fP and \fBn\fP can be used instead of \fByes\fP and \fBno\fP.
|
||||
+.TP
|
||||
+.B --property_blacklist \fP { \fBy\fP | \fBn\fP }
|
||||
+If set to \fBy\fP, this adds the line
|
||||
+.B property "(SCSI_IDENT_|ID_WWN)"
|
||||
+to the
|
||||
+.B /etc/multipath.conf
|
||||
+blacklist_exceptions section. If set to \fBn\fP, this removes the line, if
|
||||
+present. This command can be used along with any other command.
|
||||
+.TP
|
||||
+.B --enable_foreign\fP { \fBy\fP | \fBn\fP }
|
||||
+If set to \fBy\fP, this adds the line
|
||||
+.B enable_foreign ".*"
|
||||
+to the
|
||||
+.B /etc/multipath.conf
|
||||
+defaults section. if set to \fBn\fP, this removes the line, if present. This
|
||||
+command can be used along with any other command.
|
||||
+.TP
|
||||
+.B --outfile \fB<filename>\fP
|
||||
+Write the resulting multipath configuration to \fB<filename>\fP instead of
|
||||
+\fB/etc/multipath.conf\fP.
|
||||
+.SH OPTIONS
|
||||
+.TP
|
||||
+.B --with_module\fP { \fBy\fP | \fBn\fP }
|
||||
+If set to \fBy\fP, this runs
|
||||
+.B modprobe dm_multipath
|
||||
+to install the multipath modules. This option only works with the
|
||||
+.B --enable
|
||||
+command. This option is set to \fBy\fP by default.
|
||||
+.TP
|
||||
+.B --with_multipathd { \fBy\fP | \fBn\fP }
|
||||
+If set to \fBy\fP, this runs
|
||||
+.B service multipathd start
|
||||
+to start the multipathd daemon on \fB--enable\fP,
|
||||
+.B service multipathd stop
|
||||
+to stop the multipathd daemon on \fB--disable\fP, and
|
||||
+.B service multipathd reload
|
||||
+to reconfigure multipathd on \fB--user_frindly_names\fP and
|
||||
+\fB--find_multipaths\fP.
|
||||
+This option is set to \fBn\fP by default.
|
||||
+.SH FILES
|
||||
+.BR /etc/multipath.conf
|
||||
+.SH "SEE ALSO"
|
||||
+.BR multipath.conf (5),
|
||||
+.BR modprobe (8),
|
||||
+.BR multipath (8),
|
||||
+.BR multipathd (8),
|
||||
+.BR service (8),
|
||||
+.SH AUTHOR
|
||||
+Benjamin Marzinski <bmarzins@redhat.com>
|
@ -0,0 +1,151 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Fri, 17 Oct 2014 11:20:34 -0500
|
||||
Subject: [PATCH] RH: add wwids from kernel cmdline mpath.wwids with -A
|
||||
|
||||
This patch adds another option to multipath, "-A", which reads
|
||||
/proc/cmdline for mpath.wwid=<WWID> options, and adds any wwids it finds
|
||||
to /etc/multipath/wwids. While this isn't usually important during
|
||||
normal operation, since these wwids should already be added, it can be
|
||||
helpful during installation, to make sure that multipath can claim
|
||||
devices as its own, before LVM or something else makes use of them. The
|
||||
patch also execs "/sbin/multipath -A" before running multipathd in
|
||||
multipathd.service
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
multipath/main.c | 54 +++++++++++++++++++++++++++++++++--
|
||||
multipath/multipath.8 | 7 ++++-
|
||||
multipathd/multipathd.service | 1 +
|
||||
3 files changed, 59 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/multipath/main.c b/multipath/main.c
|
||||
index 65ece830..748e7902 100644
|
||||
--- a/multipath/main.c
|
||||
+++ b/multipath/main.c
|
||||
@@ -122,7 +122,7 @@ usage (char * progname)
|
||||
fprintf (stderr, " %s [-v level] [-R retries] -F\n", progname);
|
||||
fprintf (stderr, " %s [-v level] [-l|-ll] [device]\n", progname);
|
||||
fprintf (stderr, " %s [-v level] [-a|-w] device\n", progname);
|
||||
- fprintf (stderr, " %s [-v level] -W\n", progname);
|
||||
+ fprintf (stderr, " %s [-v level] [-A|-W]\n", progname);
|
||||
fprintf (stderr, " %s [-v level] [-i] [-c|-C] device\n", progname);
|
||||
fprintf (stderr, " %s [-v level] [-i] [-u|-U]\n", progname);
|
||||
fprintf (stderr, " %s [-h|-t|-T]\n", progname);
|
||||
@@ -136,6 +136,8 @@ usage (char * progname)
|
||||
" -f flush a multipath device map\n"
|
||||
" -F flush all multipath device maps\n"
|
||||
" -a add a device wwid to the wwids file\n"
|
||||
+ " -A add devices from kernel command line mpath.wwids\n"
|
||||
+ " parameters to wwids file\n"
|
||||
" -c check if a device should be a path in a multipath device\n"
|
||||
" -C check if a multipath device has usable paths\n"
|
||||
" -q allow queue_if_no_path when multipathd is not running\n"
|
||||
@@ -450,6 +452,50 @@ static void cleanup_vecs(void)
|
||||
free_pathvec(vecs.pathvec, FREE_PATHS);
|
||||
}
|
||||
|
||||
+static int remember_cmdline_wwid(void)
|
||||
+{
|
||||
+ FILE *f = NULL;
|
||||
+ char buf[LINE_MAX], *next, *ptr;
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ f = fopen("/proc/cmdline", "re");
|
||||
+ if (!f) {
|
||||
+ condlog(0, "can't open /proc/cmdline : %s", strerror(errno));
|
||||
+ return -1;
|
||||
+ }
|
||||
+
|
||||
+ if (!fgets(buf, sizeof(buf), f)) {
|
||||
+ if (ferror(f))
|
||||
+ condlog(0, "read of /proc/cmdline failed : %s",
|
||||
+ strerror(errno));
|
||||
+ else
|
||||
+ condlog(0, "couldn't read /proc/cmdline");
|
||||
+ fclose(f);
|
||||
+ return -1;
|
||||
+ }
|
||||
+ fclose(f);
|
||||
+ next = buf;
|
||||
+ while((ptr = strstr(next, "mpath.wwid="))) {
|
||||
+ ptr += 11;
|
||||
+ next = strpbrk(ptr, " \t\n");
|
||||
+ if (next) {
|
||||
+ *next = '\0';
|
||||
+ next++;
|
||||
+ }
|
||||
+ if (strlen(ptr)) {
|
||||
+ if (remember_wwid(ptr) != 0)
|
||||
+ ret = -1;
|
||||
+ }
|
||||
+ else {
|
||||
+ condlog(0, "empty mpath.wwid kernel command line option");
|
||||
+ ret = -1;
|
||||
+ }
|
||||
+ if (!next)
|
||||
+ break;
|
||||
+ }
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
static int
|
||||
configure (struct config *conf, enum mpath_cmds cmd,
|
||||
enum devtypes dev_type, char *devpath)
|
||||
@@ -838,7 +884,7 @@ main (int argc, char *argv[])
|
||||
conf->retrigger_tries = 0;
|
||||
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, ":aAdDcChl::eFfM:v:p:b:BrR:itTquUwW")) != EOF ) {
|
||||
switch(arg) {
|
||||
case 1: printf("optarg : %s\n",optarg);
|
||||
break;
|
||||
@@ -915,6 +961,10 @@ main (int argc, char *argv[])
|
||||
case 'T':
|
||||
cmd = CMD_DUMP_CONFIG;
|
||||
break;
|
||||
+ case 'A':
|
||||
+ if (remember_cmdline_wwid() != 0)
|
||||
+ exit(RTVL_FAIL);
|
||||
+ exit(RTVL_OK);
|
||||
case 'h':
|
||||
usage(argv[0]);
|
||||
exit(RTVL_OK);
|
||||
diff --git a/multipath/multipath.8 b/multipath/multipath.8
|
||||
index 17df59f5..5ca75359 100644
|
||||
--- a/multipath/multipath.8
|
||||
+++ b/multipath/multipath.8
|
||||
@@ -63,7 +63,7 @@ multipath \- Device mapper target autoconfig.
|
||||
.B multipath
|
||||
.RB [\| \-v\ \c
|
||||
.IR level \|]
|
||||
-.B -W
|
||||
+.RB [\| \-A | \-W \|]
|
||||
.
|
||||
.LP
|
||||
.B multipath
|
||||
@@ -145,6 +145,11 @@ device mapper, path checkers ...).
|
||||
Add the WWID for the specified device to the WWIDs file.
|
||||
.
|
||||
.TP
|
||||
+.B \-A
|
||||
+Add the WWIDs from any kernel command line \fImpath.wwid\fR parameters to the
|
||||
+WWIDs file.
|
||||
+.
|
||||
+.TP
|
||||
.B \-w
|
||||
Remove the WWID for the specified device from the WWIDs file.
|
||||
.
|
||||
diff --git a/multipathd/multipathd.service b/multipathd/multipathd.service
|
||||
index 6d57c7e8..dfc1e962 100644
|
||||
--- a/multipathd/multipathd.service
|
||||
+++ b/multipathd/multipathd.service
|
||||
@@ -16,6 +16,7 @@ Type=notify
|
||||
NotifyAccess=main
|
||||
LimitCORE=infinity
|
||||
ExecStartPre=-/sbin/modprobe -a scsi_dh_alua scsi_dh_emc scsi_dh_rdac dm-multipath
|
||||
+ExecStartPre=-/sbin/multipath -A
|
||||
ExecStart=/sbin/multipathd -d -s
|
||||
ExecReload=/sbin/multipathd reconfigure
|
||||
TasksMax=infinity
|
@ -0,0 +1,26 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Thu, 7 Jun 2018 17:43:52 -0500
|
||||
Subject: [PATCH] RH: reset default find_mutipaths value to off
|
||||
|
||||
Upstream has changed to default find_multipaths to "strict". For now
|
||||
Redhat will retain the previous default of "off".
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/defaults.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/libmultipath/defaults.h b/libmultipath/defaults.h
|
||||
index c27946c7..e0dd32ad 100644
|
||||
--- a/libmultipath/defaults.h
|
||||
+++ b/libmultipath/defaults.h
|
||||
@@ -23,7 +23,7 @@
|
||||
#define DEFAULT_NO_PATH_RETRY NO_PATH_RETRY_UNDEF
|
||||
#define DEFAULT_VERBOSITY 2
|
||||
#define DEFAULT_REASSIGN_MAPS 0
|
||||
-#define DEFAULT_FIND_MULTIPATHS FIND_MULTIPATHS_STRICT
|
||||
+#define DEFAULT_FIND_MULTIPATHS FIND_MULTIPATHS_OFF
|
||||
#define DEFAULT_FAST_IO_FAIL 5
|
||||
#define DEFAULT_DEV_LOSS_TMO 600
|
||||
#define DEFAULT_RETAIN_HWHANDLER RETAIN_HWHANDLER_ON
|
@ -0,0 +1,84 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Thu, 11 Apr 2019 13:25:42 -0500
|
||||
Subject: [PATCH] RH: attempt to get ANA info via sysfs first
|
||||
|
||||
When the ANA prioritizer is run, first see if the "ana_state" sysfs file
|
||||
exists, and if it does, try to read the state from there. If that fails,
|
||||
fallback to using an ioctl.
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/prioritizers/ana.c | 31 +++++++++++++++++++++++++++++--
|
||||
1 file changed, 29 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/prioritizers/ana.c b/libmultipath/prioritizers/ana.c
|
||||
index b5c7873d..e139360c 100644
|
||||
--- a/libmultipath/prioritizers/ana.c
|
||||
+++ b/libmultipath/prioritizers/ana.c
|
||||
@@ -24,6 +24,7 @@
|
||||
#include "prio.h"
|
||||
#include "util.h"
|
||||
#include "structs.h"
|
||||
+#include "sysfs.h"
|
||||
|
||||
enum {
|
||||
ANA_ERR_GETCTRL_FAILED = 1,
|
||||
@@ -36,6 +37,7 @@ enum {
|
||||
ANA_ERR_GETNS_FAILED,
|
||||
ANA_ERR_NO_MEMORY,
|
||||
ANA_ERR_NO_INFORMATION,
|
||||
+ ANA_ERR_INVALID_STATE,
|
||||
};
|
||||
|
||||
static const char *ana_errmsg[] = {
|
||||
@@ -49,6 +51,7 @@ static const char *ana_errmsg[] = {
|
||||
[ANA_ERR_GETNS_FAILED] = "couldn't get namespace info",
|
||||
[ANA_ERR_NO_MEMORY] = "out of memory",
|
||||
[ANA_ERR_NO_INFORMATION] = "invalid fd",
|
||||
+ [ANA_ERR_INVALID_STATE] = "invalid state",
|
||||
};
|
||||
|
||||
static const char *anas_string[] = {
|
||||
@@ -107,6 +110,27 @@ static int get_ana_state(__u32 nsid, __u32 anagrpid, void *ana_log,
|
||||
return -ANA_ERR_GETANAS_NOTFOUND;
|
||||
}
|
||||
|
||||
+static int get_ana_info_sysfs(struct path *pp)
|
||||
+{
|
||||
+ char state[32];
|
||||
+
|
||||
+ if (!pp->udev || sysfs_attr_get_value(pp->udev, "ana_state", state,
|
||||
+ sizeof(state)) <= 0)
|
||||
+ return -ANA_ERR_NO_INFORMATION;
|
||||
+
|
||||
+ if (strcmp(state, "optimized") == 0)
|
||||
+ return NVME_ANA_OPTIMIZED;
|
||||
+ if (strcmp(state, "non-optimized") == 0)
|
||||
+ return NVME_ANA_NONOPTIMIZED;
|
||||
+ if (strcmp(state, "inaccessible") == 0)
|
||||
+ return NVME_ANA_INACCESSIBLE;
|
||||
+ if (strcmp(state, "persistent-loss") == 0)
|
||||
+ return NVME_ANA_PERSISTENT_LOSS;
|
||||
+ if (strcmp(state, "change") == 0)
|
||||
+ return NVME_ANA_CHANGE;
|
||||
+ return -ANA_ERR_INVALID_STATE;
|
||||
+}
|
||||
+
|
||||
static int get_ana_info(struct path * pp)
|
||||
{
|
||||
int rc;
|
||||
@@ -210,8 +234,11 @@ int getprio(struct path *pp, __attribute__((unused)) char *args,
|
||||
|
||||
if (pp->fd < 0)
|
||||
rc = -ANA_ERR_NO_INFORMATION;
|
||||
- else
|
||||
- rc = get_ana_info(pp);
|
||||
+ else {
|
||||
+ rc = get_ana_info_sysfs(pp);
|
||||
+ if (rc < 0)
|
||||
+ rc = get_ana_info(pp);
|
||||
+ }
|
||||
|
||||
switch (rc) {
|
||||
case NVME_ANA_OPTIMIZED:
|
@ -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);
|
||||
}
|
@ -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,
|
@ -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.
|
@ -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
|
@ -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)
|
@ -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;
|
||||
}
|
||||
|
@ -0,0 +1,34 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Mon, 13 Dec 2021 14:26:30 -0600
|
||||
Subject: [PATCH] RH: mpathconf: fix setting property_blacklist
|
||||
|
||||
If there was no blacklist_exceptions section, setting property_blacklist
|
||||
didn't work correctly. Fix it.
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
multipath/mpathconf | 10 +++++++++-
|
||||
1 file changed, 9 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/multipath/mpathconf b/multipath/mpathconf
|
||||
index c00d2555..0de6b121 100644
|
||||
--- a/multipath/mpathconf
|
||||
+++ b/multipath/mpathconf
|
||||
@@ -496,7 +496,15 @@ if [ "$PROPERTY" = "n" ]; then
|
||||
CHANGED_CONFIG=1
|
||||
fi
|
||||
elif [ "$PROPERTY" = "y" ]; then
|
||||
- if [ -z "$HAVE_PROPERTY" ]; then
|
||||
+ if [ -z "$HAVE_PROPERTY" -a -z "$HAVE_EXCEPTIONS" ]; then
|
||||
+ cat >> $TMPFILE << _EOF_
|
||||
+
|
||||
+blacklist_exceptions {
|
||||
+ property "(SCSI_IDENT_|ID_WWN)"
|
||||
+}
|
||||
+_EOF_
|
||||
+ CHANGED_CONFIG=1
|
||||
+ elif [ -z "$HAVE_PROPERTY" ]; then
|
||||
sed -i '/^blacklist_exceptions[[:space:]]*{/ a\
|
||||
property "(SCSI_IDENT_|ID_WWN)"
|
||||
' $TMPFILE
|
@ -0,0 +1,45 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Wed, 12 Jan 2022 12:26:12 -0600
|
||||
Subject: [PATCH] libmultipath: fix disassemble status for
|
||||
historical-service-time PS
|
||||
|
||||
The historical-service-time path selector prints out 2 path group status
|
||||
arguments. This is the only path selector that uses the group status
|
||||
arguments. All the others only have path status arguments.
|
||||
disassemble_status() was expecting the number of group status arguments
|
||||
to always be zero, causing it to fail at disassembling the status of
|
||||
devices that use historical-service-time path selector. Now multipath
|
||||
actually checks the number of group arguments, and skips them.
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/dmparser.c | 14 ++++++++++++--
|
||||
1 file changed, 12 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/dmparser.c b/libmultipath/dmparser.c
|
||||
index 4ba7f339..bc311421 100644
|
||||
--- a/libmultipath/dmparser.c
|
||||
+++ b/libmultipath/dmparser.c
|
||||
@@ -437,9 +437,19 @@ int disassemble_status(const char *params, struct multipath *mpp)
|
||||
FREE(word);
|
||||
|
||||
/*
|
||||
- * PG Status (discarded, would be '0' anyway)
|
||||
+ * Path Selector Group Arguments
|
||||
*/
|
||||
- p += get_word(p, NULL);
|
||||
+ p += get_word(p, &word);
|
||||
+
|
||||
+ if (!word)
|
||||
+ return 1;
|
||||
+
|
||||
+ num_pg_args = atoi(word);
|
||||
+ free(word);
|
||||
+
|
||||
+ /* Ignore ps group arguments */
|
||||
+ for (j = 0; j < num_pg_args; j++)
|
||||
+ p += get_word(p, NULL);
|
||||
|
||||
p += get_word(p, &word);
|
||||
|
@ -0,0 +1,133 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Mon, 17 Jan 2022 14:45:38 -0600
|
||||
Subject: [PATCH] libmultipath: make helper function to trigger path uevents
|
||||
|
||||
Pull the code that checks if a path needs to trigger a uevent, and
|
||||
triggers, out of trigger_paths_udev_change() and into a new function,
|
||||
trigger_path_udev_change(). This function will be used separately by
|
||||
a future patch. No functional changes.
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/configure.c | 79 +++++++++++++++++++++-------------------
|
||||
libmultipath/configure.h | 1 +
|
||||
2 files changed, 43 insertions(+), 37 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/configure.c b/libmultipath/configure.c
|
||||
index 7edb355b..043e4232 100644
|
||||
--- a/libmultipath/configure.c
|
||||
+++ b/libmultipath/configure.c
|
||||
@@ -565,11 +565,8 @@ unref:
|
||||
}
|
||||
|
||||
void
|
||||
-trigger_paths_udev_change(struct multipath *mpp, bool is_mpath)
|
||||
+trigger_path_udev_change(struct path *pp, bool is_mpath)
|
||||
{
|
||||
- struct pathgroup *pgp;
|
||||
- struct path *pp;
|
||||
- int i, j;
|
||||
/*
|
||||
* If a path changes from multipath to non-multipath, we must
|
||||
* synthesize an artificial "add" event, otherwise the LVM2 rules
|
||||
@@ -577,6 +574,45 @@ trigger_paths_udev_change(struct multipath *mpp, bool is_mpath)
|
||||
* irritate ourselves with an "add", so use "change".
|
||||
*/
|
||||
const char *action = is_mpath ? "change" : "add";
|
||||
+ const char *env;
|
||||
+
|
||||
+ if (!pp->udev)
|
||||
+ return;
|
||||
+ /*
|
||||
+ * Paths that are already classified as multipath
|
||||
+ * members don't need another uevent.
|
||||
+ */
|
||||
+ env = udev_device_get_property_value(
|
||||
+ pp->udev, "DM_MULTIPATH_DEVICE_PATH");
|
||||
+
|
||||
+ if (is_mpath && env != NULL && !strcmp(env, "1")) {
|
||||
+ /*
|
||||
+ * If FIND_MULTIPATHS_WAIT_UNTIL is not "0",
|
||||
+ * path is in "maybe" state and timer is running
|
||||
+ * Send uevent now (see multipath.rules).
|
||||
+ */
|
||||
+ env = udev_device_get_property_value(
|
||||
+ pp->udev, "FIND_MULTIPATHS_WAIT_UNTIL");
|
||||
+ if (env == NULL || !strcmp(env, "0"))
|
||||
+ return;
|
||||
+ } else if (!is_mpath &&
|
||||
+ (env == NULL || !strcmp(env, "0")))
|
||||
+ return;
|
||||
+
|
||||
+ condlog(3, "triggering %s uevent for %s (is %smultipath member)",
|
||||
+ action, pp->dev, is_mpath ? "" : "no ");
|
||||
+ sysfs_attr_set_value(pp->udev, "uevent",
|
||||
+ action, strlen(action));
|
||||
+ trigger_partitions_udev_change(pp->udev, action,
|
||||
+ strlen(action));
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+trigger_paths_udev_change(struct multipath *mpp, bool is_mpath)
|
||||
+{
|
||||
+ struct pathgroup *pgp;
|
||||
+ struct path *pp;
|
||||
+ int i, j;
|
||||
|
||||
if (!mpp || !mpp->pg)
|
||||
return;
|
||||
@@ -584,39 +620,8 @@ trigger_paths_udev_change(struct multipath *mpp, bool is_mpath)
|
||||
vector_foreach_slot (mpp->pg, pgp, i) {
|
||||
if (!pgp->paths)
|
||||
continue;
|
||||
- vector_foreach_slot(pgp->paths, pp, j) {
|
||||
- const char *env;
|
||||
-
|
||||
- if (!pp->udev)
|
||||
- continue;
|
||||
- /*
|
||||
- * Paths that are already classified as multipath
|
||||
- * members don't need another uevent.
|
||||
- */
|
||||
- env = udev_device_get_property_value(
|
||||
- pp->udev, "DM_MULTIPATH_DEVICE_PATH");
|
||||
-
|
||||
- if (is_mpath && env != NULL && !strcmp(env, "1")) {
|
||||
- /*
|
||||
- * If FIND_MULTIPATHS_WAIT_UNTIL is not "0",
|
||||
- * path is in "maybe" state and timer is running
|
||||
- * Send uevent now (see multipath.rules).
|
||||
- */
|
||||
- env = udev_device_get_property_value(
|
||||
- pp->udev, "FIND_MULTIPATHS_WAIT_UNTIL");
|
||||
- if (env == NULL || !strcmp(env, "0"))
|
||||
- continue;
|
||||
- } else if (!is_mpath &&
|
||||
- (env == NULL || !strcmp(env, "0")))
|
||||
- continue;
|
||||
-
|
||||
- condlog(3, "triggering %s uevent for %s (is %smultipath member)",
|
||||
- action, pp->dev, is_mpath ? "" : "no ");
|
||||
- sysfs_attr_set_value(pp->udev, "uevent",
|
||||
- action, strlen(action));
|
||||
- trigger_partitions_udev_change(pp->udev, action,
|
||||
- strlen(action));
|
||||
- }
|
||||
+ vector_foreach_slot(pgp->paths, pp, j)
|
||||
+ trigger_path_udev_change(pp, is_mpath);
|
||||
}
|
||||
|
||||
mpp->needs_paths_uevent = 0;
|
||||
diff --git a/libmultipath/configure.h b/libmultipath/configure.h
|
||||
index efe18b7d..2bf73e65 100644
|
||||
--- a/libmultipath/configure.h
|
||||
+++ b/libmultipath/configure.h
|
||||
@@ -56,6 +56,7 @@ int coalesce_paths (struct vectors *vecs, vector curmp, char * refwwid, int forc
|
||||
int get_refwwid (enum mpath_cmds cmd, const char *dev, enum devtypes dev_type,
|
||||
vector pathvec, char **wwid);
|
||||
struct udev_device *get_udev_device(const char *dev, enum devtypes dev_type);
|
||||
+void trigger_path_udev_change(struct path *pp, bool is_mpath);
|
||||
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);
|
@ -0,0 +1,54 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Mon, 17 Jan 2022 16:46:18 -0600
|
||||
Subject: [PATCH] multipathd: trigger udev change on path addition
|
||||
|
||||
When a multipath device is created for the first time, there is a window
|
||||
where some path devices way be added to the multipath device, but never
|
||||
claimed in udev. This can allow other device owners, like lvm, to think
|
||||
they can use the device.
|
||||
|
||||
When a multipath device is first created, all the existing paths that
|
||||
are not claimed by multipath have a uevent triggered so that they can
|
||||
get claimed. After that, multipath assumes all future paths added to the
|
||||
multipath device will have been claimed by multipath, since the device's
|
||||
WWID is now in the wwids file. This doesn't work for any paths that
|
||||
have already been processed by the multipath.rules udev rules before
|
||||
the multipath device was created.
|
||||
|
||||
To close this window, when path device is added, and a matching
|
||||
multipath device already exists, multipathd now checks if the device is
|
||||
claimed by multipath, and if not, triggers a uevent to claim it.
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/libmultipath.version | 5 +++++
|
||||
multipathd/main.c | 2 ++
|
||||
2 files changed, 7 insertions(+)
|
||||
|
||||
diff --git a/libmultipath/libmultipath.version b/libmultipath/libmultipath.version
|
||||
index dd1b4122..0d89e9e1 100644
|
||||
--- a/libmultipath/libmultipath.version
|
||||
+++ b/libmultipath/libmultipath.version
|
||||
@@ -292,3 +292,8 @@ LIBMULTIPATH_9.1.0 {
|
||||
global:
|
||||
sysfs_get_ro;
|
||||
} LIBMULTIPATH_9.0.0;
|
||||
+
|
||||
+LIBMULTIPATH_9.1.1 {
|
||||
+global:
|
||||
+ trigger_path_udev_change;
|
||||
+} LIBMULTIPATH_9.1.0;
|
||||
diff --git a/multipathd/main.c b/multipathd/main.c
|
||||
index 6145e512..5def5301 100644
|
||||
--- a/multipathd/main.c
|
||||
+++ b/multipathd/main.c
|
||||
@@ -1062,6 +1062,8 @@ ev_add_path (struct path * pp, struct vectors * vecs, int need_do_map)
|
||||
free_path(pp);
|
||||
return 1;
|
||||
}
|
||||
+ if (mpp)
|
||||
+ trigger_path_udev_change(pp, true);
|
||||
if (mpp && mpp->wait_for_udev &&
|
||||
(pathcount(mpp, PATH_UP) > 0 ||
|
||||
(pathcount(mpp, PATH_GHOST) > 0 &&
|
@ -0,0 +1,149 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Wed, 2 Feb 2022 17:00:21 -0600
|
||||
Subject: [PATCH] RH: add support to mpathconf for setting arbitrary default
|
||||
options
|
||||
|
||||
mpathconf now supports --option <name>:[<value>] for setting, changing,
|
||||
or removing options from the defaults section of multipath.conf.
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
multipath/mpathconf | 58 ++++++++++++++++++++++++++++++++++++++++---
|
||||
multipath/mpathconf.8 | 7 ++++++
|
||||
2 files changed, 62 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/multipath/mpathconf b/multipath/mpathconf
|
||||
index 0de6b121..6e33fb99 100644
|
||||
--- a/multipath/mpathconf
|
||||
+++ b/multipath/mpathconf
|
||||
@@ -17,7 +17,7 @@
|
||||
# This program was largely ripped off from lvmconf
|
||||
#
|
||||
|
||||
-unset ENABLE FIND FRIENDLY PROPERTY FOREIGN MODULE MULTIPATHD HAVE_DISABLE HAVE_WWID_DISABLE HAVE_FIND HAVE_BLACKLIST HAVE_EXCEPTIONS HAVE_DEFAULTS HAVE_FRIENDLY HAVE_PROPERTY HAVE_FOREIGN HAVE_MULTIPATHD HAVE_MODULE HAVE_OUTFILE SHOW_STATUS CHANGED_CONFIG WWID_LIST
|
||||
+unset ENABLE FIND FRIENDLY PROPERTY FOREIGN MODULE MULTIPATHD HAVE_DISABLE HAVE_WWID_DISABLE HAVE_FIND HAVE_BLACKLIST HAVE_EXCEPTIONS HAVE_DEFAULTS HAVE_FRIENDLY HAVE_PROPERTY HAVE_FOREIGN HAVE_MULTIPATHD HAVE_MODULE HAVE_OUTFILE SHOW_STATUS CHANGED_CONFIG WWID_LIST HAVE_OPTION OPTION_NAME OPTION_VALUE
|
||||
|
||||
DEFAULT_CONFIG="# device-mapper-multipath configuration file
|
||||
|
||||
@@ -52,6 +52,7 @@ function usage
|
||||
echo "Set find_multipaths (Default y): --find_multipaths <yes|no|strict|greedy|smart>"
|
||||
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 "Add/Change/Remove option in defaults section: --option <option_name>:<value>"
|
||||
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 "select output file (Default /etc/multipath.conf): --outfile <FILE>"
|
||||
@@ -162,6 +163,20 @@ function parse_args
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
+ --option)
|
||||
+ if [ -n "$2" ]; then
|
||||
+ OPTION_NAME=$(echo $2 | cut -s -f1 -d:)
|
||||
+ OPTION_VALUE=$(echo $2 | cut -s -f2 -d:)
|
||||
+ if [ -z "$OPTION_NAME" ]; then
|
||||
+ usage
|
||||
+ exit 1
|
||||
+ fi
|
||||
+ shift 2
|
||||
+ else
|
||||
+ usage
|
||||
+ exit 1
|
||||
+ fi
|
||||
+ ;;
|
||||
--enable_foreign)
|
||||
if [ -n "$2" ]; then
|
||||
FOREIGN=$2
|
||||
@@ -208,12 +223,15 @@ function parse_args
|
||||
|
||||
function validate_args
|
||||
{
|
||||
- if [ "$ENABLE" = "0" ] && [ -n "$FRIENDLY" -o -n "$FIND" -o -n "$PROPERTY" -o -n "$MODULE" ]; then
|
||||
+ if [ "$ENABLE" = "0" ] && [ -n "$FRIENDLY" -o -n "$FIND" -o -n "$PROPERTY" -o -n "$MODULE" -o -n "$FOREIGN" -o -n "$OPTION_NAME" ]; then
|
||||
echo "ignoring extra parameters on disable"
|
||||
FRIENDLY=""
|
||||
FIND=""
|
||||
PROPERTY=""
|
||||
MODULE=""
|
||||
+ FOREIGN=""
|
||||
+ OPTION_NAME=""
|
||||
+ OPTION_VALUE=""
|
||||
fi
|
||||
if [ -n "$FRIENDLY" ] && [ "$FRIENDLY" != "y" -a "$FRIENDLY" != "n" ]; then
|
||||
echo "--user_friendly_names must be either 'y' or 'n'"
|
||||
@@ -235,7 +253,19 @@ 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" -a -z "$FOREIGN" ]; then
|
||||
+ if [ -n "$OPTION_NAME" ]; then
|
||||
+ if [[ $OPTION_NAME =~ [[:space:]]|#|\"|!|\{|\} ]]; then
|
||||
+ echo "--option name \"$OPTION_NAME\" is invalid"
|
||||
+ exit 1
|
||||
+ elif [[ $OPTION_VALUE =~ \"|#|!|\{|\} ]]; then
|
||||
+ echo "--option value \"$OPTION_VALUE\" is invalid"
|
||||
+ exit 1
|
||||
+ fi
|
||||
+ if [[ $OPTION_VALUE =~ [[:space:]] ]]; then
|
||||
+ OPTION_VALUE=\"$OPTION_VALUE\"
|
||||
+ fi
|
||||
+ fi
|
||||
+ if [ -z "$ENABLE" -a -z "$FIND" -a -z "$FRIENDLY" -a -z "$PROPERTY" -a -z "$FOREIGN" -a -z "$OPTION_NAME" ]; then
|
||||
SHOW_STATUS=1
|
||||
fi
|
||||
if [ -n "$MODULE" ] && [ "$MODULE" != "y" -a "$MODULE" != "n" ]; then
|
||||
@@ -348,6 +378,13 @@ if [ "$HAVE_DEFAULTS" = "1" ]; then
|
||||
elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*enable_foreign" ; then
|
||||
HAVE_FOREIGN=3
|
||||
fi
|
||||
+ if [ -n "$OPTION_NAME" ]; then
|
||||
+ if sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q '^[[:space:]]*'"$OPTION_NAME"'[[:space:]][[:space:]]*'"$OPTION_VALUE" ; then
|
||||
+ HAVE_OPTION=1
|
||||
+ elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q '^[[:space:]]*'"$OPTION_NAME"'\([[:space:]].*\)\?$' ; then
|
||||
+ HAVE_OPTION=0
|
||||
+ fi
|
||||
+ fi
|
||||
fi
|
||||
|
||||
if [ "$HAVE_EXCEPTIONS" = "1" ]; then
|
||||
@@ -532,6 +569,21 @@ elif [ "$FOREIGN" = "y" ]; then
|
||||
fi
|
||||
fi
|
||||
|
||||
+if [ -n "$OPTION_NAME" -a -n "$OPTION_VALUE" ]; then
|
||||
+ if [ -z "$HAVE_OPTION" ]; then
|
||||
+ sed -i '/^defaults[[:space:]]*{/ a\
|
||||
+ '"$OPTION_NAME"' '"$OPTION_VALUE"'
|
||||
+' $TMPFILE
|
||||
+ CHANGED_CONFIG=1
|
||||
+ elif [ "$HAVE_OPTION" = 0 ]; then
|
||||
+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*'"$OPTION_NAME"'\([[:space:]].*\)\?$/ '"$OPTION_NAME"' '"$OPTION_VALUE"'/' $TMPFILE
|
||||
+ CHANGED_CONFIG=1
|
||||
+ fi
|
||||
+elif [ -n "$OPTION_NAME" -a -n "$HAVE_OPTION" ]; then
|
||||
+ sed -i '/^defaults[[:space:]]*{/,/^}/{/^[[:space:]]*'"$OPTION_NAME"'\([[:space:]].*\)\?$/d}' $TMPFILE
|
||||
+ CHANGED_CONFIG=1
|
||||
+fi
|
||||
+
|
||||
if [ -f "$OUTPUTFILE" ]; then
|
||||
cp $OUTPUTFILE $OUTPUTFILE.old
|
||||
if [ $? != 0 ]; then
|
||||
diff --git a/multipath/mpathconf.8 b/multipath/mpathconf.8
|
||||
index a14d831e..496383b7 100644
|
||||
--- a/multipath/mpathconf.8
|
||||
+++ b/multipath/mpathconf.8
|
||||
@@ -101,6 +101,13 @@ to the
|
||||
defaults section. if set to \fBn\fP, this removes the line, if present. This
|
||||
command can be used along with any other command.
|
||||
.TP
|
||||
+.B --option \fB<option_name>:[<value>]\fP
|
||||
+Sets the defaults section option \fB<option_name>\fP to \fB<value>\fP. If the
|
||||
+option was not previously set in the defaults section, it is added. If it was
|
||||
+set, its value is changed to \fB<value>\fP. If \fB<value>\fP is left blank,
|
||||
+then the option is removed from the defaults section, if was set there. This
|
||||
+command can be used along with any other command.
|
||||
+.TP
|
||||
.B --outfile \fB<filename>\fP
|
||||
Write the resulting multipath configuration to \fB<filename>\fP instead of
|
||||
\fB/etc/multipath.conf\fP.
|
@ -0,0 +1,154 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Thu, 3 Feb 2022 13:26:18 -0600
|
||||
Subject: [PATCH] RH: add support to mpathconf for setting recheck_wwid
|
||||
|
||||
mpathconf now supports --recheck_wwid <y|n> for setthing the
|
||||
recheck_wwid option
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
multipath/mpathconf | 48 ++++++++++++++++++++++++++++++++++++++++---
|
||||
multipath/mpathconf.8 | 9 ++++++++
|
||||
2 files changed, 54 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/multipath/mpathconf b/multipath/mpathconf
|
||||
index 6e33fb99..319664b1 100644
|
||||
--- a/multipath/mpathconf
|
||||
+++ b/multipath/mpathconf
|
||||
@@ -17,7 +17,7 @@
|
||||
# This program was largely ripped off from lvmconf
|
||||
#
|
||||
|
||||
-unset ENABLE FIND FRIENDLY PROPERTY FOREIGN MODULE MULTIPATHD HAVE_DISABLE HAVE_WWID_DISABLE HAVE_FIND HAVE_BLACKLIST HAVE_EXCEPTIONS HAVE_DEFAULTS HAVE_FRIENDLY HAVE_PROPERTY HAVE_FOREIGN HAVE_MULTIPATHD HAVE_MODULE HAVE_OUTFILE SHOW_STATUS CHANGED_CONFIG WWID_LIST HAVE_OPTION OPTION_NAME OPTION_VALUE
|
||||
+unset ENABLE FIND FRIENDLY PROPERTY FOREIGN MODULE MULTIPATHD HAVE_DISABLE HAVE_WWID_DISABLE HAVE_FIND HAVE_BLACKLIST HAVE_EXCEPTIONS HAVE_DEFAULTS HAVE_FRIENDLY HAVE_PROPERTY HAVE_FOREIGN HAVE_MULTIPATHD HAVE_MODULE HAVE_OUTFILE SHOW_STATUS CHANGED_CONFIG WWID_LIST HAVE_OPTION OPTION_NAME OPTION_VALUE HAVE_RECHECK_WWID RECHECK_WWID
|
||||
|
||||
DEFAULT_CONFIG="# device-mapper-multipath configuration file
|
||||
|
||||
@@ -52,6 +52,7 @@ function usage
|
||||
echo "Set find_multipaths (Default y): --find_multipaths <yes|no|strict|greedy|smart>"
|
||||
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 recheck_wwid (Defaut n): --recheck_wwid <y|n>"
|
||||
echo "Add/Change/Remove option in defaults section: --option <option_name>:<value>"
|
||||
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>"
|
||||
@@ -145,6 +146,15 @@ function parse_args
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
+ --recheck_wwid)
|
||||
+ if [ -n "$2" ]; then
|
||||
+ RECHECK_WWID=$2
|
||||
+ shift 2
|
||||
+ else
|
||||
+ usage
|
||||
+ exit 1
|
||||
+ fi
|
||||
+ ;;
|
||||
--find_multipaths)
|
||||
if [ -n "$2" ]; then
|
||||
FIND=$2
|
||||
@@ -223,7 +233,7 @@ function parse_args
|
||||
|
||||
function validate_args
|
||||
{
|
||||
- if [ "$ENABLE" = "0" ] && [ -n "$FRIENDLY" -o -n "$FIND" -o -n "$PROPERTY" -o -n "$MODULE" -o -n "$FOREIGN" -o -n "$OPTION_NAME" ]; then
|
||||
+ if [ "$ENABLE" = "0" ] && [ -n "$FRIENDLY" -o -n "$FIND" -o -n "$PROPERTY" -o -n "$MODULE" -o -n "$FOREIGN" -o -n "$OPTION_NAME" -o -n "$RECHECK_WWID" ]; then
|
||||
echo "ignoring extra parameters on disable"
|
||||
FRIENDLY=""
|
||||
FIND=""
|
||||
@@ -232,11 +242,16 @@ function validate_args
|
||||
FOREIGN=""
|
||||
OPTION_NAME=""
|
||||
OPTION_VALUE=""
|
||||
+ RECHECK_WWID=""
|
||||
fi
|
||||
if [ -n "$FRIENDLY" ] && [ "$FRIENDLY" != "y" -a "$FRIENDLY" != "n" ]; then
|
||||
echo "--user_friendly_names must be either 'y' or 'n'"
|
||||
exit 1
|
||||
fi
|
||||
+ if [ -n "$RECHECK_WWID" ] && [ "$RECHECK_WWID" != "y" -a "$RECHECK_WWID" != "n" ]; then
|
||||
+ echo "--recheck_wwid must be either 'y' or 'n'"
|
||||
+ exit 1
|
||||
+ fi
|
||||
if [ "$FIND" = "y" ]; then
|
||||
FIND="yes"
|
||||
elif [ "$FIND" = "n" ]; then
|
||||
@@ -265,7 +280,7 @@ function validate_args
|
||||
OPTION_VALUE=\"$OPTION_VALUE\"
|
||||
fi
|
||||
fi
|
||||
- if [ -z "$ENABLE" -a -z "$FIND" -a -z "$FRIENDLY" -a -z "$PROPERTY" -a -z "$FOREIGN" -a -z "$OPTION_NAME" ]; then
|
||||
+ if [ -z "$ENABLE" -a -z "$FIND" -a -z "$FRIENDLY" -a -z "$PROPERTY" -a -z "$FOREIGN" -a -z "$OPTION_NAME" -a -z "$RECHECK_WWID" ]; then
|
||||
SHOW_STATUS=1
|
||||
fi
|
||||
if [ -n "$MODULE" ] && [ "$MODULE" != "y" -a "$MODULE" != "n" ]; then
|
||||
@@ -367,6 +382,11 @@ if [ "$HAVE_DEFAULTS" = "1" ]; 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:]]*recheck_wwid[[:space:]][[:space:]]*\(yes\|1\)" ; then
|
||||
+ HAVE_RECHECK_WWID=1
|
||||
+ elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*recheck_wwid[[:space:]][[:space:]]*\(no\|0\)" ; then
|
||||
+ HAVE_RECHECK_WWID=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:]][[:space:]]*\"\.\*\"" ; then
|
||||
@@ -411,6 +431,11 @@ if [ -n "$SHOW_STATUS" ]; then
|
||||
else
|
||||
echo "user_friendly_names is enabled"
|
||||
fi
|
||||
+ if [ -z "$HAVE_RECHECK_WWID" -o "$HAVE_RECHECK_WWID" = 0 ]; then
|
||||
+ echo "recheck_wwid is disabled"
|
||||
+ else
|
||||
+ echo "recheck_wwid is enabled"
|
||||
+ fi
|
||||
if [ -z "$HAVE_PROPERTY" -o "$HAVE_PROPERTY" = 0 ]; then
|
||||
echo "default property blacklist is disabled"
|
||||
else
|
||||
@@ -527,6 +552,23 @@ elif [ "$FRIENDLY" = "y" ]; then
|
||||
fi
|
||||
fi
|
||||
|
||||
+if [ "$RECHECK_WWID" = "n" ]; then
|
||||
+ if [ "$HAVE_RECHECK_WWID" = 1 ]; then
|
||||
+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*recheck_wwid[[:space:]][[:space:]]*\(yes\|1\)/ recheck_wwid no/' $TMPFILE
|
||||
+ CHANGED_CONFIG=1
|
||||
+ fi
|
||||
+elif [ "$RECHECK_WWID" = "y" ]; then
|
||||
+ if [ -z "$HAVE_RECHECK_WWID" ]; then
|
||||
+ sed -i '/^defaults[[:space:]]*{/ a\
|
||||
+ recheck_wwid yes
|
||||
+' $TMPFILE
|
||||
+ CHANGED_CONFIG=1
|
||||
+ elif [ "$HAVE_RECHECK_WWID" = 0 ]; then
|
||||
+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*recheck_wwid[[:space:]][[:space:]]*\(no\|0\)/ recheck_wwid 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:]][[:space:]]*\"(SCSI_IDENT_|ID_WWN)\"/# property \"(SCSI_IDENT_|ID_WWN)\"/' $TMPFILE
|
||||
diff --git a/multipath/mpathconf.8 b/multipath/mpathconf.8
|
||||
index 496383b7..9c2fb835 100644
|
||||
--- a/multipath/mpathconf.8
|
||||
+++ b/multipath/mpathconf.8
|
||||
@@ -77,6 +77,15 @@ to the
|
||||
defaults section. If set to \fBn\fP, this removes the line, if present. This
|
||||
command can be used along with any other command.
|
||||
.TP
|
||||
+.B --recheck_wwid \fP { \fBy\fP | \fBn\fP }
|
||||
+If set to \fBy\fP, this adds the line
|
||||
+.B recheck_wwid yes
|
||||
+to the
|
||||
+.B /etc/multipath.conf
|
||||
+defaults section, or sets an existing line to \fByes\fP. If set to \fBn\fP, this
|
||||
+sets an existing \fBrecheck_wwid\fP line to \fBno\fP. This command can be used
|
||||
+along with any other command.
|
||||
+.TP
|
||||
.B --find_multipaths\fP { \fByes\fP | \fBno\fP | \fBstrict\fP | \fBgreedy\fP | \fBsmart\fP }
|
||||
If set to \fB<value>\fP, this adds the line
|
||||
.B find_multipaths <value>
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,73 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Fri, 11 Feb 2022 17:23:39 -0600
|
||||
Subject: [PATCH] multipathd: disallow changing to/from fpin marginal paths on
|
||||
reconfig
|
||||
|
||||
Setting marginal_pathgroups to fpin causes two new threads to be created
|
||||
when multipathd starts. Turning it on after multipathd starts up won't
|
||||
cause the theads to start, and turing it off won't keep the threads from
|
||||
working. So disallow changing marginal_pathgroups to/from "fpin" on
|
||||
reconfigure.
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
multipath/multipath.conf.5 | 13 ++++++++-----
|
||||
multipathd/main.c | 9 +++++++++
|
||||
2 files changed, 17 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5
|
||||
index 5ed2cd3c..58ad5c9c 100644
|
||||
--- a/multipath/multipath.conf.5
|
||||
+++ b/multipath/multipath.conf.5
|
||||
@@ -1102,15 +1102,18 @@ have been tried first. This prevents the possibility of IO errors occuring
|
||||
while marginal paths are still usable. After the path has been monitored
|
||||
for the configured time, and is declared healthy, it will be returned to its
|
||||
normal pathgroup.
|
||||
-However if this option is set to \fIfpin\fR multipathd will receive fpin
|
||||
+If this option is set to \fIfpin\fR, multipathd will receive fpin
|
||||
notifications, set path states to "marginal" accordingly, and regroup paths
|
||||
-as described for "marginal_pathgroups yes". This option can't be used in combination
|
||||
-with other options for "Shaky path detection" (see below).If it is set to fpin,
|
||||
-marginal_path_xyz and san_path_err_xyz parameters are implicitly set to 0.
|
||||
+as described for \fIon\fR. This option can't be used in combination
|
||||
+with other options for "Shaky path detection" (see below). \fBNote:\fR If this
|
||||
+is set to \fIfpin\fR, the \fImarginal_path_*\fR and \fIsan_path_err_*\fR
|
||||
+options are implicitly set to \fIno\fP. Also, this option cannot be switched
|
||||
+either to or from \fIfpin\fR on a multipathd reconfigure. multipathd must be
|
||||
+restarted for the change to take effect.
|
||||
See "Shaky paths detection" below for more information.
|
||||
.RS
|
||||
.TP
|
||||
-The default is: \fBno\fR
|
||||
+The default is: \fBoff\fR
|
||||
.RE
|
||||
.
|
||||
.
|
||||
diff --git a/multipathd/main.c b/multipathd/main.c
|
||||
index 53be9b95..45b9572f 100644
|
||||
--- a/multipathd/main.c
|
||||
+++ b/multipathd/main.c
|
||||
@@ -2792,6 +2792,7 @@ int
|
||||
reconfigure (struct vectors * vecs)
|
||||
{
|
||||
struct config * old, *conf;
|
||||
+ int old_marginal_pathgroups;
|
||||
|
||||
conf = load_config(DEFAULT_CONFIGFILE);
|
||||
if (!conf)
|
||||
@@ -2819,6 +2820,14 @@ reconfigure (struct vectors * vecs)
|
||||
uxsock_timeout = conf->uxsock_timeout;
|
||||
|
||||
old = rcu_dereference(multipath_conf);
|
||||
+ old_marginal_pathgroups = old->marginal_pathgroups;
|
||||
+ if ((old_marginal_pathgroups == MARGINAL_PATHGROUP_FPIN) !=
|
||||
+ (conf->marginal_pathgroups == MARGINAL_PATHGROUP_FPIN)) {
|
||||
+ condlog(1, "multipathd must be restarted to turn %s fpin marginal paths",
|
||||
+ (old_marginal_pathgroups == MARGINAL_PATHGROUP_FPIN)?
|
||||
+ "off" : "on");
|
||||
+ conf->marginal_pathgroups = old_marginal_pathgroups;
|
||||
+ }
|
||||
conf->sequence_nr = old->sequence_nr + 1;
|
||||
rcu_assign_pointer(multipath_conf, conf);
|
||||
call_rcu(&old->rcu, rcu_free_config);
|
@ -0,0 +1,33 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Wed, 16 Feb 2022 00:12:29 -0600
|
||||
Subject: [PATCH] libmultipath: fix printing native nvme multipath topology.
|
||||
|
||||
Since commit 2f05df4 ("libmultipath: use strbuf in print.c"), when
|
||||
multipath prints the topology of native nvme devices, instead of
|
||||
printing the multipath device information, it prints "w [G]:d s". This
|
||||
is because nvme_style() switched from calling snprintf(), which supports
|
||||
format specifiers, to append_strbuf_str(), which doesn't, while still
|
||||
keeping the same string, "%%w [%%G]:%%d %%s". Remove the extra percent
|
||||
signs, since they don't need to be escaped in append_strbuf_str().
|
||||
|
||||
Fixes: 2f05df4 ("libmultipath: use strbuf in print.c")
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
---
|
||||
libmultipath/foreign/nvme.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/libmultipath/foreign/nvme.c b/libmultipath/foreign/nvme.c
|
||||
index d40c0869..23355ca5 100644
|
||||
--- a/libmultipath/foreign/nvme.c
|
||||
+++ b/libmultipath/foreign/nvme.c
|
||||
@@ -335,7 +335,7 @@ static int snprint_nvme_pg(const struct gen_pathgroup *gmp,
|
||||
static int nvme_style(__attribute__((unused)) const struct gen_multipath* gm,
|
||||
struct strbuf *buf, __attribute__((unused)) int verbosity)
|
||||
{
|
||||
- return append_strbuf_str(buf, "%%w [%%G]:%%d %%s");
|
||||
+ return append_strbuf_str(buf, "%w [%G]:%d %s");
|
||||
}
|
||||
|
||||
static const struct gen_multipath_ops nvme_map_ops = {
|
@ -0,0 +1,86 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Tue, 29 Mar 2022 22:22:10 -0500
|
||||
Subject: [PATCH] multipathd: Don't keep starting TUR threads, if they always
|
||||
hang.
|
||||
|
||||
If tur thead hangs, multipathd was simply creating a new thread, and
|
||||
assuming that the old thread would get cleaned up eventually. I have
|
||||
seen a case recently where there were 26000 multipathd threads on a
|
||||
system, all stuck trying to send TUR commands to path devices. The root
|
||||
cause of the issue was a scsi kernel issue, but it shows that the way
|
||||
multipathd currently deals with stuck threads could use some refinement.
|
||||
|
||||
Now, when one tur thread hangs, multipathd will act as it did before.
|
||||
If a second one in a row hangs, multipathd will instead wait for it to
|
||||
complete before starting another thread. Once the thread completes, the
|
||||
count is reset.
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com
|
||||
---
|
||||
libmultipath/checkers/tur.c | 23 +++++++++++++++++++++--
|
||||
1 file changed, 21 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/checkers/tur.c b/libmultipath/checkers/tur.c
|
||||
index a4b4a213..d82f7dbc 100644
|
||||
--- a/libmultipath/checkers/tur.c
|
||||
+++ b/libmultipath/checkers/tur.c
|
||||
@@ -27,6 +27,7 @@
|
||||
|
||||
#define TUR_CMD_LEN 6
|
||||
#define HEAVY_CHECK_COUNT 10
|
||||
+#define MAX_NR_TIMEOUTS 1
|
||||
|
||||
enum {
|
||||
MSG_TUR_RUNNING = CHECKER_FIRST_MSGID,
|
||||
@@ -55,6 +56,7 @@ struct tur_checker_context {
|
||||
int holders; /* uatomic access only */
|
||||
int msgid;
|
||||
struct checker_context ctx;
|
||||
+ unsigned int nr_timeouts;
|
||||
};
|
||||
|
||||
int libcheck_init (struct checker * c)
|
||||
@@ -359,8 +361,23 @@ int libcheck_check(struct checker * c)
|
||||
}
|
||||
} else {
|
||||
if (uatomic_read(&ct->holders) > 1) {
|
||||
+ /* The thread has been cancelled but hasn't quit. */
|
||||
+ if (ct->nr_timeouts == MAX_NR_TIMEOUTS) {
|
||||
+ condlog(2, "%d:%d : waiting for stalled tur thread to finish",
|
||||
+ major(ct->devt), minor(ct->devt));
|
||||
+ ct->nr_timeouts++;
|
||||
+ }
|
||||
/*
|
||||
- * The thread has been cancelled but hasn't quit.
|
||||
+ * Don't start new threads until the last once has
|
||||
+ * finished.
|
||||
+ */
|
||||
+ if (ct->nr_timeouts > MAX_NR_TIMEOUTS) {
|
||||
+ c->msgid = MSG_TUR_TIMEOUT;
|
||||
+ return PATH_TIMEOUT;
|
||||
+ }
|
||||
+ ct->nr_timeouts++;
|
||||
+ /*
|
||||
+ * Start a new thread while the old one is stalled.
|
||||
* We have to prevent it from interfering with the new
|
||||
* thread. We create a new context and leave the old
|
||||
* one with the stale thread, hoping it will clean up
|
||||
@@ -376,13 +393,15 @@ int libcheck_check(struct checker * c)
|
||||
*/
|
||||
if (libcheck_init(c) != 0)
|
||||
return PATH_UNCHECKED;
|
||||
+ ((struct tur_checker_context *)c->context)->nr_timeouts = ct->nr_timeouts;
|
||||
|
||||
if (!uatomic_sub_return(&ct->holders, 1))
|
||||
/* It did terminate, eventually */
|
||||
cleanup_context(ct);
|
||||
|
||||
ct = c->context;
|
||||
- }
|
||||
+ } else
|
||||
+ ct->nr_timeouts = 0;
|
||||
/* Start new TUR checker */
|
||||
pthread_mutex_lock(&ct->lock);
|
||||
tur_status = ct->state = PATH_PENDING;
|
@ -0,0 +1,78 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Uday Shankar <ushankar@purestorage.com>
|
||||
Date: Wed, 9 Mar 2022 13:03:26 -0700
|
||||
Subject: [PATCH] multipath-tools: update mpp->force_readonly in ev_add_path
|
||||
|
||||
When NVMe disks are added to the system, no uevent containing the
|
||||
DISK_RO property is generated. As a result, dm-* nodes backed by
|
||||
readonly NVMe disks will not have their RO state set properly. The
|
||||
result looks like this:
|
||||
|
||||
$ multipath -l
|
||||
eui.00c92c091fd6564424a9376600011bd1 dm-3 NVME,Pure Storage FlashArray
|
||||
size=1.0T features='0' hwhandler='0' wp=rw
|
||||
|-+- policy='service-time 0' prio=0 status=active
|
||||
| `- 0:2:2:72657 nvme0n2 259:4 active undef running
|
||||
`-+- policy='service-time 0' prio=0 status=enabled
|
||||
`- 1:0:2:72657 nvme1n2 259:1 active undef running
|
||||
$ cat /sys/block/dm-3/ro
|
||||
0
|
||||
$ cat /sys/block/nvme*n2/ro
|
||||
1
|
||||
1
|
||||
|
||||
This is not a problem for SCSI disks, since the kernel will emit change
|
||||
uevents containing the DISK_RO property when the disk is added to the
|
||||
system. See the following thread for my initial attempt to fix this
|
||||
issue at the kernel level:
|
||||
https://lore.kernel.org/linux-block/Yib8GqCA5e3SQYty@infradead.org/T/#t
|
||||
|
||||
Fix the issue by picking up the path ro state from sysfs in ev_add_path,
|
||||
setting the mpp->force_readonly accordingly, and changing
|
||||
dm_addmap_create to be aware of mpp->force_readonly.
|
||||
|
||||
Signed-off-by: Uday Shankar <ushankar@purestorage.com>
|
||||
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/devmapper.c | 2 +-
|
||||
multipathd/main.c | 6 ++++++
|
||||
2 files changed, 7 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/libmultipath/devmapper.c b/libmultipath/devmapper.c
|
||||
index c05dc201..1ff75c81 100644
|
||||
--- a/libmultipath/devmapper.c
|
||||
+++ b/libmultipath/devmapper.c
|
||||
@@ -542,7 +542,7 @@ int dm_addmap_create (struct multipath *mpp, char * params)
|
||||
int ro;
|
||||
uint16_t udev_flags = build_udev_flags(mpp, 0);
|
||||
|
||||
- for (ro = 0; ro <= 1; ro++) {
|
||||
+ for (ro = mpp->force_readonly ? 1 : 0; ro <= 1; ro++) {
|
||||
int err;
|
||||
|
||||
if (dm_addmap(DM_DEVICE_CREATE, TGT_MPATH, mpp, params, ro,
|
||||
diff --git a/multipathd/main.c b/multipathd/main.c
|
||||
index 45b9572f..ed2515e5 100644
|
||||
--- a/multipathd/main.c
|
||||
+++ b/multipathd/main.c
|
||||
@@ -1048,6 +1048,7 @@ ev_add_path (struct path * pp, struct vectors * vecs, int need_do_map)
|
||||
int retries = 3;
|
||||
int start_waiter = 0;
|
||||
int ret;
|
||||
+ int ro;
|
||||
|
||||
/*
|
||||
* need path UID to go any further
|
||||
@@ -1112,6 +1113,11 @@ rescan:
|
||||
/* persistent reservation check*/
|
||||
mpath_pr_event_handle(pp);
|
||||
|
||||
+ /* ro check - if new path is ro, force map to be ro as well */
|
||||
+ ro = sysfs_get_ro(pp);
|
||||
+ if (ro == 1)
|
||||
+ mpp->force_readonly = 1;
|
||||
+
|
||||
if (!need_do_map)
|
||||
return 0;
|
||||
|
@ -0,0 +1,35 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Wed, 30 Mar 2022 15:14:56 -0500
|
||||
Subject: [PATCH] multipath: return failure on an invalid remove command
|
||||
|
||||
When "multipath -f" is run on a device that doesn't exist or isn't a
|
||||
multipath device, the command will not remove any device, but it will
|
||||
still return success. Multiple functions rely on _dm_flush_map()
|
||||
returning success when called with name that doesn't match any
|
||||
multipath device. So before calling _dm_flush_map(), call dm_is_mpath(),
|
||||
to check if the device exists and is a multipath device, and return
|
||||
failure if it's not.
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com
|
||||
---
|
||||
multipath/main.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/multipath/main.c b/multipath/main.c
|
||||
index 80fa68e5..41d01c7e 100644
|
||||
--- a/multipath/main.c
|
||||
+++ b/multipath/main.c
|
||||
@@ -1111,6 +1111,11 @@ main (int argc, char *argv[])
|
||||
if (retries < 0)
|
||||
retries = conf->remove_retries;
|
||||
if (cmd == CMD_FLUSH_ONE) {
|
||||
+ if (dm_is_mpath(dev) != 1) {
|
||||
+ condlog(0, "%s is not a multipath device", dev);
|
||||
+ r = RTVL_FAIL;
|
||||
+ goto out;
|
||||
+ }
|
||||
r = dm_suspend_and_flush_map(dev, retries) ?
|
||||
RTVL_FAIL : RTVL_OK;
|
||||
goto out;
|
@ -0,0 +1,67 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Wed, 13 Apr 2022 23:27:35 -0500
|
||||
Subject: [PATCH] libmultipath: steal the src string pointer in merge_str()
|
||||
|
||||
Instead of allocating a copy when the original string is going to be
|
||||
freed right after the merge, just steal the pointer. Also, merge_mpe()
|
||||
can't get called with NULL arguments.
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
---
|
||||
libmultipath/config.c | 16 +++++-----------
|
||||
1 file changed, 5 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/config.c b/libmultipath/config.c
|
||||
index cee3bbb7..005d6b54 100644
|
||||
--- a/libmultipath/config.c
|
||||
+++ b/libmultipath/config.c
|
||||
@@ -388,9 +388,9 @@ set_param_str(const char * str)
|
||||
}
|
||||
|
||||
#define merge_str(s) \
|
||||
- if (!dst->s && src->s) { \
|
||||
- if (!(dst->s = set_param_str(src->s))) \
|
||||
- return 1; \
|
||||
+ if (!dst->s && src->s && strlen(src->s)) { \
|
||||
+ dst->s = src->s; \
|
||||
+ src->s = NULL; \
|
||||
}
|
||||
|
||||
#define merge_num(s) \
|
||||
@@ -398,7 +398,7 @@ set_param_str(const char * str)
|
||||
dst->s = src->s
|
||||
|
||||
|
||||
-static int
|
||||
+static void
|
||||
merge_hwe (struct hwentry * dst, struct hwentry * src)
|
||||
{
|
||||
char id[SCSI_VENDOR_SIZE+PATH_PRODUCT_SIZE];
|
||||
@@ -450,15 +450,11 @@ merge_hwe (struct hwentry * dst, struct hwentry * src)
|
||||
reconcile_features_with_options(id, &dst->features,
|
||||
&dst->no_path_retry,
|
||||
&dst->retain_hwhandler);
|
||||
- return 0;
|
||||
}
|
||||
|
||||
-static int
|
||||
+static void
|
||||
merge_mpe(struct mpentry *dst, struct mpentry *src)
|
||||
{
|
||||
- if (!dst || !src)
|
||||
- return 1;
|
||||
-
|
||||
merge_str(alias);
|
||||
merge_str(uid_attribute);
|
||||
merge_str(getuid);
|
||||
@@ -500,8 +496,6 @@ merge_mpe(struct mpentry *dst, struct mpentry *src)
|
||||
merge_num(uid);
|
||||
merge_num(gid);
|
||||
merge_num(mode);
|
||||
-
|
||||
- return 0;
|
||||
}
|
||||
|
||||
void merge_mptable(vector mptable)
|
@ -0,0 +1,74 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Wilck <mwilck@suse.com>
|
||||
Date: Thu, 17 Feb 2022 17:22:32 +0100
|
||||
Subject: [PATCH] libmultipath: enable linear ordering of bus/proto tuple
|
||||
|
||||
We categorized protocols by bus/proto_id, while we only differentiate
|
||||
protocol IDs for SCSI. Allow transforming this into a linear sequence
|
||||
of bus/protocol IDs by having non-SCSI first, and follwing up with
|
||||
the different SCSI protocols.
|
||||
|
||||
Signed-off-by: Martin Wilck <mwilck@suse.com>
|
||||
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/structs.c | 10 ++++++++++
|
||||
libmultipath/structs.h | 13 +++++++++++--
|
||||
2 files changed, 21 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/structs.c b/libmultipath/structs.c
|
||||
index 6e5a1038..2b7cde0c 100644
|
||||
--- a/libmultipath/structs.c
|
||||
+++ b/libmultipath/structs.c
|
||||
@@ -758,3 +758,13 @@ out:
|
||||
|
||||
return 0;
|
||||
}
|
||||
+
|
||||
+unsigned int bus_protocol_id(const struct path *pp) {
|
||||
+ if (!pp || pp->bus < 0 || pp->bus > SYSFS_BUS_SCSI)
|
||||
+ return SYSFS_BUS_UNDEF;
|
||||
+ if (pp->bus != SYSFS_BUS_SCSI)
|
||||
+ return pp->bus;
|
||||
+ if ((int)pp->sg_id.proto_id < 0 || pp->sg_id.proto_id > SCSI_PROTOCOL_UNSPEC)
|
||||
+ return SYSFS_BUS_UNDEF;
|
||||
+ return SYSFS_BUS_SCSI + pp->sg_id.proto_id;
|
||||
+}
|
||||
diff --git a/libmultipath/structs.h b/libmultipath/structs.h
|
||||
index 1188363e..45294f11 100644
|
||||
--- a/libmultipath/structs.h
|
||||
+++ b/libmultipath/structs.h
|
||||
@@ -56,12 +56,13 @@ enum failback_mode {
|
||||
FAILBACK_FOLLOWOVER
|
||||
};
|
||||
|
||||
+/* SYSFS_BUS_SCSI should be last, see bus_protocol_id() */
|
||||
enum sysfs_buses {
|
||||
SYSFS_BUS_UNDEF,
|
||||
- SYSFS_BUS_SCSI,
|
||||
SYSFS_BUS_CCW,
|
||||
SYSFS_BUS_CCISS,
|
||||
SYSFS_BUS_NVME,
|
||||
+ SYSFS_BUS_SCSI,
|
||||
};
|
||||
|
||||
enum pathstates {
|
||||
@@ -180,9 +181,17 @@ enum scsi_protocol {
|
||||
SCSI_PROTOCOL_ADT = 7, /* Media Changers */
|
||||
SCSI_PROTOCOL_ATA = 8,
|
||||
SCSI_PROTOCOL_USB = 9, /* USB Attached SCSI (UAS), and others */
|
||||
- SCSI_PROTOCOL_UNSPEC = 0xf, /* No specific protocol */
|
||||
+ SCSI_PROTOCOL_UNSPEC = 0xa, /* No specific protocol */
|
||||
};
|
||||
|
||||
+/*
|
||||
+ * Linear ordering of bus/protocol
|
||||
+ * This assumes that SYSFS_BUS_SCSI is last in enum sysfs_buses
|
||||
+ * SCSI is the only bus type for which we distinguish protocols.
|
||||
+ */
|
||||
+#define LAST_BUS_PROTOCOL_ID (SYSFS_BUS_SCSI + SCSI_PROTOCOL_UNSPEC)
|
||||
+unsigned int bus_protocol_id(const struct path *pp);
|
||||
+
|
||||
#define SCSI_INVALID_LUN ~0ULL
|
||||
|
||||
enum no_undef_states {
|
@ -0,0 +1,84 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Wilck <mwilck@suse.com>
|
||||
Date: Thu, 17 Feb 2022 17:24:25 +0100
|
||||
Subject: [PATCH] libmultipath: use bus_protocol_id() in
|
||||
snprint_path_protocol()
|
||||
|
||||
Simplify bus_protocol_id() by using the linear ordering.
|
||||
|
||||
Signed-off-by: Martin Wilck <mwilck@suse.com>
|
||||
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/print.c | 58 ++++++++++++++++----------------------------
|
||||
1 file changed, 21 insertions(+), 37 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/print.c b/libmultipath/print.c
|
||||
index 2fb9f4ef..8f1b18db 100644
|
||||
--- a/libmultipath/print.c
|
||||
+++ b/libmultipath/print.c
|
||||
@@ -696,43 +696,27 @@ snprint_path_failures(struct strbuf *buff, const struct path * pp)
|
||||
int
|
||||
snprint_path_protocol(struct strbuf *buff, const struct path * pp)
|
||||
{
|
||||
- switch (pp->bus) {
|
||||
- case SYSFS_BUS_SCSI:
|
||||
- switch (pp->sg_id.proto_id) {
|
||||
- case SCSI_PROTOCOL_FCP:
|
||||
- return append_strbuf_str(buff, "scsi:fcp");
|
||||
- case SCSI_PROTOCOL_SPI:
|
||||
- return append_strbuf_str(buff, "scsi:spi");
|
||||
- case SCSI_PROTOCOL_SSA:
|
||||
- return append_strbuf_str(buff, "scsi:ssa");
|
||||
- case SCSI_PROTOCOL_SBP:
|
||||
- return append_strbuf_str(buff, "scsi:sbp");
|
||||
- case SCSI_PROTOCOL_SRP:
|
||||
- return append_strbuf_str(buff, "scsi:srp");
|
||||
- case SCSI_PROTOCOL_ISCSI:
|
||||
- return append_strbuf_str(buff, "scsi:iscsi");
|
||||
- case SCSI_PROTOCOL_SAS:
|
||||
- return append_strbuf_str(buff, "scsi:sas");
|
||||
- case SCSI_PROTOCOL_ADT:
|
||||
- return append_strbuf_str(buff, "scsi:adt");
|
||||
- case SCSI_PROTOCOL_ATA:
|
||||
- return append_strbuf_str(buff, "scsi:ata");
|
||||
- case SCSI_PROTOCOL_USB:
|
||||
- return append_strbuf_str(buff, "scsi:usb");
|
||||
- case SCSI_PROTOCOL_UNSPEC:
|
||||
- default:
|
||||
- return append_strbuf_str(buff, "scsi:unspec");
|
||||
- }
|
||||
- case SYSFS_BUS_CCW:
|
||||
- return append_strbuf_str(buff, "ccw");
|
||||
- case SYSFS_BUS_CCISS:
|
||||
- return append_strbuf_str(buff, "cciss");
|
||||
- case SYSFS_BUS_NVME:
|
||||
- return append_strbuf_str(buff, "nvme");
|
||||
- case SYSFS_BUS_UNDEF:
|
||||
- default:
|
||||
- return append_strbuf_str(buff, "undef");
|
||||
- }
|
||||
+ static const char * const protocol_name[LAST_BUS_PROTOCOL_ID + 1] = {
|
||||
+ [SYSFS_BUS_UNDEF] = "undef",
|
||||
+ [SYSFS_BUS_CCW] = "ccw",
|
||||
+ [SYSFS_BUS_CCISS] = "cciss",
|
||||
+ [SYSFS_BUS_NVME] = "nvme",
|
||||
+ [SYSFS_BUS_SCSI + SCSI_PROTOCOL_FCP] = "scsi:fcp",
|
||||
+ [SYSFS_BUS_SCSI + SCSI_PROTOCOL_SPI] = "scsi:spi",
|
||||
+ [SYSFS_BUS_SCSI + SCSI_PROTOCOL_SSA] = "scsi:ssa",
|
||||
+ [SYSFS_BUS_SCSI + SCSI_PROTOCOL_SBP] = "scsi:sbp",
|
||||
+ [SYSFS_BUS_SCSI + SCSI_PROTOCOL_SRP] = "scsi:srp",
|
||||
+ [SYSFS_BUS_SCSI + SCSI_PROTOCOL_ISCSI] = "scsi:iscsi",
|
||||
+ [SYSFS_BUS_SCSI + SCSI_PROTOCOL_SAS] = "scsi:sas",
|
||||
+ [SYSFS_BUS_SCSI + SCSI_PROTOCOL_ADT] = "scsi:adt",
|
||||
+ [SYSFS_BUS_SCSI + SCSI_PROTOCOL_ATA] = "scsi:ata",
|
||||
+ [SYSFS_BUS_SCSI + SCSI_PROTOCOL_USB] = "scsi:usb",
|
||||
+ [SYSFS_BUS_SCSI + SCSI_PROTOCOL_UNSPEC] = "scsi:unspec",
|
||||
+ };
|
||||
+ const char *pn = protocol_name[bus_protocol_id(pp)];
|
||||
+
|
||||
+ assert(pn != NULL);
|
||||
+ return append_strbuf_str(buff, pn);
|
||||
}
|
||||
|
||||
int
|
@ -0,0 +1,85 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Wed, 13 Apr 2022 23:27:36 -0500
|
||||
Subject: [PATCH] libmultipath: make protocol_name global
|
||||
|
||||
Future patches will make use of this, so move it out of
|
||||
snprint_path_protocol()
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
---
|
||||
libmultipath/print.c | 17 -----------------
|
||||
libmultipath/structs.c | 18 ++++++++++++++++++
|
||||
libmultipath/structs.h | 1 +
|
||||
3 files changed, 19 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/print.c b/libmultipath/print.c
|
||||
index 8f1b18db..0dbd34e4 100644
|
||||
--- a/libmultipath/print.c
|
||||
+++ b/libmultipath/print.c
|
||||
@@ -696,23 +696,6 @@ snprint_path_failures(struct strbuf *buff, const struct path * pp)
|
||||
int
|
||||
snprint_path_protocol(struct strbuf *buff, const struct path * pp)
|
||||
{
|
||||
- static const char * const protocol_name[LAST_BUS_PROTOCOL_ID + 1] = {
|
||||
- [SYSFS_BUS_UNDEF] = "undef",
|
||||
- [SYSFS_BUS_CCW] = "ccw",
|
||||
- [SYSFS_BUS_CCISS] = "cciss",
|
||||
- [SYSFS_BUS_NVME] = "nvme",
|
||||
- [SYSFS_BUS_SCSI + SCSI_PROTOCOL_FCP] = "scsi:fcp",
|
||||
- [SYSFS_BUS_SCSI + SCSI_PROTOCOL_SPI] = "scsi:spi",
|
||||
- [SYSFS_BUS_SCSI + SCSI_PROTOCOL_SSA] = "scsi:ssa",
|
||||
- [SYSFS_BUS_SCSI + SCSI_PROTOCOL_SBP] = "scsi:sbp",
|
||||
- [SYSFS_BUS_SCSI + SCSI_PROTOCOL_SRP] = "scsi:srp",
|
||||
- [SYSFS_BUS_SCSI + SCSI_PROTOCOL_ISCSI] = "scsi:iscsi",
|
||||
- [SYSFS_BUS_SCSI + SCSI_PROTOCOL_SAS] = "scsi:sas",
|
||||
- [SYSFS_BUS_SCSI + SCSI_PROTOCOL_ADT] = "scsi:adt",
|
||||
- [SYSFS_BUS_SCSI + SCSI_PROTOCOL_ATA] = "scsi:ata",
|
||||
- [SYSFS_BUS_SCSI + SCSI_PROTOCOL_USB] = "scsi:usb",
|
||||
- [SYSFS_BUS_SCSI + SCSI_PROTOCOL_UNSPEC] = "scsi:unspec",
|
||||
- };
|
||||
const char *pn = protocol_name[bus_protocol_id(pp)];
|
||||
|
||||
assert(pn != NULL);
|
||||
diff --git a/libmultipath/structs.c b/libmultipath/structs.c
|
||||
index 2b7cde0c..d20e1eea 100644
|
||||
--- a/libmultipath/structs.c
|
||||
+++ b/libmultipath/structs.c
|
||||
@@ -20,6 +20,24 @@
|
||||
#include "prioritizers/alua_spc3.h"
|
||||
#include "dm-generic.h"
|
||||
|
||||
+const char * const protocol_name[LAST_BUS_PROTOCOL_ID + 1] = {
|
||||
+ [SYSFS_BUS_UNDEF] = "undef",
|
||||
+ [SYSFS_BUS_CCW] = "ccw",
|
||||
+ [SYSFS_BUS_CCISS] = "cciss",
|
||||
+ [SYSFS_BUS_NVME] = "nvme",
|
||||
+ [SYSFS_BUS_SCSI + SCSI_PROTOCOL_FCP] = "scsi:fcp",
|
||||
+ [SYSFS_BUS_SCSI + SCSI_PROTOCOL_SPI] = "scsi:spi",
|
||||
+ [SYSFS_BUS_SCSI + SCSI_PROTOCOL_SSA] = "scsi:ssa",
|
||||
+ [SYSFS_BUS_SCSI + SCSI_PROTOCOL_SBP] = "scsi:sbp",
|
||||
+ [SYSFS_BUS_SCSI + SCSI_PROTOCOL_SRP] = "scsi:srp",
|
||||
+ [SYSFS_BUS_SCSI + SCSI_PROTOCOL_ISCSI] = "scsi:iscsi",
|
||||
+ [SYSFS_BUS_SCSI + SCSI_PROTOCOL_SAS] = "scsi:sas",
|
||||
+ [SYSFS_BUS_SCSI + SCSI_PROTOCOL_ADT] = "scsi:adt",
|
||||
+ [SYSFS_BUS_SCSI + SCSI_PROTOCOL_ATA] = "scsi:ata",
|
||||
+ [SYSFS_BUS_SCSI + SCSI_PROTOCOL_USB] = "scsi:usb",
|
||||
+ [SYSFS_BUS_SCSI + SCSI_PROTOCOL_UNSPEC] = "scsi:unspec",
|
||||
+};
|
||||
+
|
||||
struct adapter_group *
|
||||
alloc_adaptergroup(void)
|
||||
{
|
||||
diff --git a/libmultipath/structs.h b/libmultipath/structs.h
|
||||
index 45294f11..618ff4fb 100644
|
||||
--- a/libmultipath/structs.h
|
||||
+++ b/libmultipath/structs.h
|
||||
@@ -191,6 +191,7 @@ enum scsi_protocol {
|
||||
*/
|
||||
#define LAST_BUS_PROTOCOL_ID (SYSFS_BUS_SCSI + SCSI_PROTOCOL_UNSPEC)
|
||||
unsigned int bus_protocol_id(const struct path *pp);
|
||||
+extern const char * const protocol_name[];
|
||||
|
||||
#define SCSI_INVALID_LUN ~0ULL
|
||||
|
@ -0,0 +1,425 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Wed, 13 Apr 2022 23:27:37 -0500
|
||||
Subject: [PATCH] libmultipath: add a protocol subsection to multipath.conf
|
||||
|
||||
Some storage arrays can be accessed using multiple protocols at the same
|
||||
time. In these cases, users may want to set path attributes
|
||||
differently, depending on the protocol that the path is using. To allow
|
||||
this, add a protocol subsection to the overrides section in
|
||||
multipath.conf, which allows select path-specific options to be set.
|
||||
This commit simply adds the subsection, and handles merging matching
|
||||
entries. Future patches will make use of the section.
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
---
|
||||
libmultipath/config.c | 83 ++++++++++++++++++++++++++++++++++++
|
||||
libmultipath/config.h | 10 +++++
|
||||
libmultipath/dict.c | 99 +++++++++++++++++++++++++++++++++++++++++++
|
||||
libmultipath/print.c | 50 ++++++++++++++++++++++
|
||||
4 files changed, 242 insertions(+)
|
||||
|
||||
diff --git a/libmultipath/config.c b/libmultipath/config.c
|
||||
index 005d6b54..8b0e1f72 100644
|
||||
--- a/libmultipath/config.c
|
||||
+++ b/libmultipath/config.c
|
||||
@@ -238,6 +238,18 @@ const char *get_mpe_wwid(const struct _vector *mptable, const char *alias)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
+static void
|
||||
+free_pctable (vector pctable)
|
||||
+{
|
||||
+ int i;
|
||||
+ struct pcentry *pce;
|
||||
+
|
||||
+ vector_foreach_slot(pctable, pce, i)
|
||||
+ free(pce);
|
||||
+
|
||||
+ vector_free(pctable);
|
||||
+}
|
||||
+
|
||||
void
|
||||
free_hwe (struct hwentry * hwe)
|
||||
{
|
||||
@@ -283,6 +295,9 @@ free_hwe (struct hwentry * hwe)
|
||||
if (hwe->bl_product)
|
||||
FREE(hwe->bl_product);
|
||||
|
||||
+ if (hwe->pctable)
|
||||
+ free_pctable(hwe->pctable);
|
||||
+
|
||||
FREE(hwe);
|
||||
}
|
||||
|
||||
@@ -364,6 +379,15 @@ alloc_hwe (void)
|
||||
return hwe;
|
||||
}
|
||||
|
||||
+struct pcentry *
|
||||
+alloc_pce (void)
|
||||
+{
|
||||
+ struct pcentry *pce = (struct pcentry *)
|
||||
+ calloc(1, sizeof(struct pcentry));
|
||||
+ pce->type = -1;
|
||||
+ return pce;
|
||||
+}
|
||||
+
|
||||
static char *
|
||||
set_param_str(const char * str)
|
||||
{
|
||||
@@ -397,6 +421,13 @@ set_param_str(const char * str)
|
||||
if (!dst->s && src->s) \
|
||||
dst->s = src->s
|
||||
|
||||
+static void
|
||||
+merge_pce(struct pcentry *dst, struct pcentry *src)
|
||||
+{
|
||||
+ merge_num(fast_io_fail);
|
||||
+ merge_num(dev_loss);
|
||||
+ merge_num(eh_deadline);
|
||||
+}
|
||||
|
||||
static void
|
||||
merge_hwe (struct hwentry * dst, struct hwentry * src)
|
||||
@@ -603,6 +634,51 @@ out:
|
||||
return 1;
|
||||
}
|
||||
|
||||
+static void
|
||||
+validate_pctable(struct hwentry *ovr, int idx, const char *table_desc)
|
||||
+{
|
||||
+ struct pcentry *pce;
|
||||
+
|
||||
+ if (!ovr || !ovr->pctable)
|
||||
+ return;
|
||||
+
|
||||
+ vector_foreach_slot_after(ovr->pctable, pce, idx) {
|
||||
+ if (pce->type < 0) {
|
||||
+ condlog(0, "protocol section in %s missing type",
|
||||
+ table_desc);
|
||||
+ vector_del_slot(ovr->pctable, idx--);
|
||||
+ free(pce);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (VECTOR_SIZE(ovr->pctable) == 0) {
|
||||
+ vector_free(ovr->pctable);
|
||||
+ ovr->pctable = NULL;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+merge_pctable(struct hwentry *ovr)
|
||||
+{
|
||||
+ struct pcentry *pce1, *pce2;
|
||||
+ int i, j;
|
||||
+
|
||||
+ if (!ovr || !ovr->pctable)
|
||||
+ return;
|
||||
+
|
||||
+ vector_foreach_slot(ovr->pctable, pce1, i) {
|
||||
+ j = i + 1;
|
||||
+ vector_foreach_slot_after(ovr->pctable, pce2, j) {
|
||||
+ if (pce1->type != pce2->type)
|
||||
+ continue;
|
||||
+ merge_pce(pce2,pce1);
|
||||
+ vector_del_slot(ovr->pctable, i--);
|
||||
+ free(pce1);
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void
|
||||
factorize_hwtable (vector hw, int n, const char *table_desc)
|
||||
{
|
||||
@@ -751,6 +827,7 @@ process_config_dir(struct config *conf, char *dir)
|
||||
int i, n;
|
||||
char path[LINE_MAX];
|
||||
int old_hwtable_size;
|
||||
+ int old_pctable_size = 0;
|
||||
|
||||
if (dir[0] != '/') {
|
||||
condlog(1, "config_dir '%s' must be a fully qualified path",
|
||||
@@ -777,11 +854,15 @@ process_config_dir(struct config *conf, char *dir)
|
||||
continue;
|
||||
|
||||
old_hwtable_size = VECTOR_SIZE(conf->hwtable);
|
||||
+ old_pctable_size = conf->overrides ?
|
||||
+ VECTOR_SIZE(conf->overrides->pctable) : 0;
|
||||
snprintf(path, LINE_MAX, "%s/%s", dir, namelist[i]->d_name);
|
||||
path[LINE_MAX-1] = '\0';
|
||||
process_file(conf, path);
|
||||
factorize_hwtable(conf->hwtable, old_hwtable_size,
|
||||
namelist[i]->d_name);
|
||||
+ validate_pctable(conf->overrides, old_pctable_size,
|
||||
+ namelist[i]->d_name);
|
||||
}
|
||||
pthread_cleanup_pop(1);
|
||||
}
|
||||
@@ -889,6 +970,7 @@ int _init_config (const char *file, struct config *conf)
|
||||
goto out;
|
||||
}
|
||||
factorize_hwtable(conf->hwtable, builtin_hwtable_size, file);
|
||||
+ validate_pctable(conf->overrides, 0, file);
|
||||
} else {
|
||||
condlog(0, "/etc/multipath.conf does not exist, blacklisting all devices.");
|
||||
condlog(0, "You can run \"/sbin/mpathconf --enable\" to create");
|
||||
@@ -1004,6 +1086,7 @@ int _init_config (const char *file, struct config *conf)
|
||||
goto out;
|
||||
}
|
||||
|
||||
+ merge_pctable(conf->overrides);
|
||||
merge_mptable(conf->mptable);
|
||||
merge_blacklist(conf->blist_devnode);
|
||||
merge_blacklist(conf->blist_property);
|
||||
diff --git a/libmultipath/config.h b/libmultipath/config.h
|
||||
index 5f01c1fc..57992604 100644
|
||||
--- a/libmultipath/config.h
|
||||
+++ b/libmultipath/config.h
|
||||
@@ -41,6 +41,13 @@ enum force_reload_types {
|
||||
FORCE_RELOAD_WEAK,
|
||||
};
|
||||
|
||||
+struct pcentry {
|
||||
+ int type;
|
||||
+ int fast_io_fail;
|
||||
+ unsigned int dev_loss;
|
||||
+ int eh_deadline;
|
||||
+};
|
||||
+
|
||||
struct hwentry {
|
||||
char * vendor;
|
||||
char * product;
|
||||
@@ -86,6 +93,8 @@ struct hwentry {
|
||||
int vpd_vendor_id;
|
||||
int recheck_wwid;
|
||||
char * bl_product;
|
||||
+
|
||||
+ vector pctable;
|
||||
};
|
||||
|
||||
struct mpentry {
|
||||
@@ -286,6 +295,7 @@ const char *get_mpe_wwid (const struct _vector *mptable, const char *alias);
|
||||
|
||||
struct hwentry * alloc_hwe (void);
|
||||
struct mpentry * alloc_mpe (void);
|
||||
+struct pcentry * alloc_pce (void);
|
||||
|
||||
void free_hwe (struct hwentry * hwe);
|
||||
void free_hwtable (vector hwtable);
|
||||
diff --git a/libmultipath/dict.c b/libmultipath/dict.c
|
||||
index eb5a8083..46b9f225 100644
|
||||
--- a/libmultipath/dict.c
|
||||
+++ b/libmultipath/dict.c
|
||||
@@ -414,6 +414,29 @@ snprint_mp_ ## option (struct config *conf, struct strbuf *buff, \
|
||||
return function(buff, mpe->option); \
|
||||
}
|
||||
|
||||
+#define declare_pc_handler(option, function) \
|
||||
+static int \
|
||||
+pc_ ## option ## _handler (struct config *conf, vector strvec, \
|
||||
+ const char *file, int line_nr) \
|
||||
+{ \
|
||||
+ struct pcentry *pce; \
|
||||
+ if (!conf->overrides || !conf->overrides->pctable) \
|
||||
+ return 1; \
|
||||
+ pce = VECTOR_LAST_SLOT(conf->overrides->pctable); \
|
||||
+ if (!pce) \
|
||||
+ return 1; \
|
||||
+ return function (strvec, &pce->option, file, line_nr); \
|
||||
+}
|
||||
+
|
||||
+#define declare_pc_snprint(option, function) \
|
||||
+static int \
|
||||
+snprint_pc_ ## option (struct config *conf, struct strbuf *buff, \
|
||||
+ const void *data) \
|
||||
+{ \
|
||||
+ const struct pcentry *pce = (const struct pcentry *)data; \
|
||||
+ return function(buff, pce->option); \
|
||||
+}
|
||||
+
|
||||
static int checkint_handler(struct config *conf, vector strvec,
|
||||
const char *file, int line_nr)
|
||||
{
|
||||
@@ -1038,6 +1061,8 @@ declare_ovr_handler(fast_io_fail, set_undef_off_zero)
|
||||
declare_ovr_snprint(fast_io_fail, print_undef_off_zero)
|
||||
declare_hw_handler(fast_io_fail, set_undef_off_zero)
|
||||
declare_hw_snprint(fast_io_fail, print_undef_off_zero)
|
||||
+declare_pc_handler(fast_io_fail, set_undef_off_zero)
|
||||
+declare_pc_snprint(fast_io_fail, print_undef_off_zero)
|
||||
|
||||
static int
|
||||
set_dev_loss(vector strvec, void *ptr, const char *file, int line_nr)
|
||||
@@ -1075,6 +1100,8 @@ declare_ovr_handler(dev_loss, set_dev_loss)
|
||||
declare_ovr_snprint(dev_loss, print_dev_loss)
|
||||
declare_hw_handler(dev_loss, set_dev_loss)
|
||||
declare_hw_snprint(dev_loss, print_dev_loss)
|
||||
+declare_pc_handler(dev_loss, set_dev_loss)
|
||||
+declare_pc_snprint(dev_loss, print_dev_loss)
|
||||
|
||||
declare_def_handler(eh_deadline, set_undef_off_zero)
|
||||
declare_def_snprint(eh_deadline, print_undef_off_zero)
|
||||
@@ -1082,6 +1109,8 @@ declare_ovr_handler(eh_deadline, set_undef_off_zero)
|
||||
declare_ovr_snprint(eh_deadline, print_undef_off_zero)
|
||||
declare_hw_handler(eh_deadline, set_undef_off_zero)
|
||||
declare_hw_snprint(eh_deadline, print_undef_off_zero)
|
||||
+declare_pc_handler(eh_deadline, set_undef_off_zero)
|
||||
+declare_pc_snprint(eh_deadline, print_undef_off_zero)
|
||||
|
||||
static int
|
||||
set_pgpolicy(vector strvec, void *ptr, const char *file, int line_nr)
|
||||
@@ -1889,6 +1918,69 @@ declare_mp_snprint(wwid, print_str)
|
||||
declare_mp_handler(alias, set_str_noslash)
|
||||
declare_mp_snprint(alias, print_str)
|
||||
|
||||
+
|
||||
+static int
|
||||
+protocol_handler(struct config *conf, vector strvec, const char *file,
|
||||
+ int line_nr)
|
||||
+{
|
||||
+ struct pcentry *pce;
|
||||
+
|
||||
+ if (!conf->overrides)
|
||||
+ return 1;
|
||||
+
|
||||
+ if (!conf->overrides->pctable &&
|
||||
+ !(conf->overrides->pctable = vector_alloc()))
|
||||
+ return 1;
|
||||
+
|
||||
+ if (!(pce = alloc_pce()))
|
||||
+ return 1;
|
||||
+
|
||||
+ if (!vector_alloc_slot(conf->overrides->pctable)) {
|
||||
+ free(pce);
|
||||
+ return 1;
|
||||
+ }
|
||||
+ vector_set_slot(conf->overrides->pctable, pce);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+set_protocol_type(vector strvec, void *ptr, const char *file, int line_nr)
|
||||
+{
|
||||
+ int *int_ptr = (int *)ptr;
|
||||
+ char *buff;
|
||||
+ int i;
|
||||
+
|
||||
+ buff = set_value(strvec);
|
||||
+
|
||||
+ if (!buff)
|
||||
+ return 1;
|
||||
+
|
||||
+ for (i = 0; i <= LAST_BUS_PROTOCOL_ID; i++) {
|
||||
+ if (protocol_name[i] && !strcmp(buff, protocol_name[i])) {
|
||||
+ *int_ptr = i;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ if (i > LAST_BUS_PROTOCOL_ID)
|
||||
+ condlog(1, "%s line %d, invalid value for type: \"%s\"",
|
||||
+ file, line_nr, buff);
|
||||
+
|
||||
+ free(buff);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+print_protocol_type(struct strbuf *buff, int type)
|
||||
+{
|
||||
+ if (type < 0)
|
||||
+ return 0;
|
||||
+ return append_strbuf_quoted(buff, protocol_name[type]);
|
||||
+}
|
||||
+
|
||||
+declare_pc_handler(type, set_protocol_type)
|
||||
+declare_pc_snprint(type, print_protocol_type)
|
||||
+
|
||||
/*
|
||||
* deprecated handlers
|
||||
*/
|
||||
@@ -2130,6 +2222,13 @@ init_keywords(vector keywords)
|
||||
install_keyword("ghost_delay", &ovr_ghost_delay_handler, &snprint_ovr_ghost_delay);
|
||||
install_keyword("all_tg_pt", &ovr_all_tg_pt_handler, &snprint_ovr_all_tg_pt);
|
||||
install_keyword("recheck_wwid", &ovr_recheck_wwid_handler, &snprint_ovr_recheck_wwid);
|
||||
+ install_keyword_multi("protocol", &protocol_handler, NULL);
|
||||
+ install_sublevel();
|
||||
+ install_keyword("type", &pc_type_handler, &snprint_pc_type);
|
||||
+ install_keyword("fast_io_fail_tmo", &pc_fast_io_fail_handler, &snprint_pc_fast_io_fail);
|
||||
+ install_keyword("dev_loss_tmo", &pc_dev_loss_handler, &snprint_pc_dev_loss);
|
||||
+ install_keyword("eh_deadline", &pc_eh_deadline_handler, &snprint_pc_eh_deadline);
|
||||
+ install_sublevel_end();
|
||||
|
||||
install_keyword_root("multipaths", &multipaths_handler);
|
||||
install_keyword_multi("multipath", &multipath_handler, NULL);
|
||||
diff --git a/libmultipath/print.c b/libmultipath/print.c
|
||||
index 0dbd34e4..46e3d32e 100644
|
||||
--- a/libmultipath/print.c
|
||||
+++ b/libmultipath/print.c
|
||||
@@ -1318,6 +1318,52 @@ int snprint_multipath_topology_json (struct strbuf *buff,
|
||||
return get_strbuf_len(buff) - initial_len;
|
||||
}
|
||||
|
||||
+static int
|
||||
+snprint_pcentry (const struct config *conf, struct strbuf *buff,
|
||||
+ const struct pcentry *pce)
|
||||
+{
|
||||
+ int i, rc;
|
||||
+ struct keyword *kw;
|
||||
+ struct keyword * rootkw;
|
||||
+ size_t initial_len = get_strbuf_len(buff);
|
||||
+
|
||||
+ rootkw = find_keyword(conf->keywords, NULL, "overrides");
|
||||
+ assert(rootkw && rootkw->sub);
|
||||
+ rootkw = find_keyword(conf->keywords, rootkw->sub, "protocol");
|
||||
+ assert(rootkw);
|
||||
+
|
||||
+ if ((rc = append_strbuf_str(buff, "\tprotocol {\n")) < 0)
|
||||
+ return rc;
|
||||
+
|
||||
+ iterate_sub_keywords(rootkw, kw, i) {
|
||||
+ if ((rc = snprint_keyword(buff, "\t\t%k %v\n", kw, pce)) < 0)
|
||||
+ return rc;
|
||||
+ }
|
||||
+
|
||||
+ if ((rc = append_strbuf_str(buff, "\t}\n")) < 0)
|
||||
+ return rc;
|
||||
+ return get_strbuf_len(buff) - initial_len;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+snprint_pctable (const struct config *conf, struct strbuf *buff,
|
||||
+ const struct _vector *pctable)
|
||||
+{
|
||||
+ int i, rc;
|
||||
+ struct pcentry *pce;
|
||||
+ struct keyword * rootkw;
|
||||
+ size_t initial_len = get_strbuf_len(buff);
|
||||
+
|
||||
+ rootkw = find_keyword(conf->keywords, NULL, "overrides");
|
||||
+ assert(rootkw);
|
||||
+
|
||||
+ vector_foreach_slot(pctable, pce, i) {
|
||||
+ if ((rc = snprint_pcentry(conf, buff, pce)) < 0)
|
||||
+ return rc;
|
||||
+ }
|
||||
+ return get_strbuf_len(buff) - initial_len;
|
||||
+}
|
||||
+
|
||||
static int
|
||||
snprint_hwentry (const struct config *conf,
|
||||
struct strbuf *buff, const struct hwentry * hwe)
|
||||
@@ -1472,6 +1518,10 @@ static int snprint_overrides(const struct config *conf, struct strbuf *buff,
|
||||
if ((rc = snprint_keyword(buff, "\t%k %v\n", kw, NULL)) < 0)
|
||||
return rc;
|
||||
}
|
||||
+
|
||||
+ if (overrides->pctable &&
|
||||
+ (rc = snprint_pctable(conf, buff, overrides->pctable)) < 0)
|
||||
+ return rc;
|
||||
out:
|
||||
if ((rc = append_strbuf_str(buff, "}\n")) < 0)
|
||||
return rc;
|
@ -0,0 +1,497 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Wed, 13 Apr 2022 23:27:38 -0500
|
||||
Subject: [PATCH] libmultipath: Set the scsi timeout parameters by path
|
||||
|
||||
Instead of dev_loss, fast_io_fail, and eh_deadline belonging to the
|
||||
multipath structure, have them belong to the path structure. This means
|
||||
that they are selected per path, and that sysfs_set_scsi_tmo() doesn't
|
||||
assume that all paths of a multipath device will have the same value.
|
||||
Currently they will all be the same, but a future patch will make it
|
||||
possible for paths to have different values based on their protocol.
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
---
|
||||
libmultipath/configure.c | 5 +-
|
||||
libmultipath/discovery.c | 158 ++++++++++++++++++++-------------------
|
||||
libmultipath/discovery.h | 2 +-
|
||||
libmultipath/propsel.c | 42 +++++------
|
||||
libmultipath/propsel.h | 6 +-
|
||||
libmultipath/structs.c | 1 -
|
||||
libmultipath/structs.h | 6 +-
|
||||
7 files changed, 112 insertions(+), 108 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/configure.c b/libmultipath/configure.c
|
||||
index 043e4232..70049f47 100644
|
||||
--- a/libmultipath/configure.c
|
||||
+++ b/libmultipath/configure.c
|
||||
@@ -365,9 +365,6 @@ int setup_map(struct multipath *mpp, char **params, struct vectors *vecs)
|
||||
select_mode(conf, mpp);
|
||||
select_uid(conf, mpp);
|
||||
select_gid(conf, mpp);
|
||||
- select_fast_io_fail(conf, mpp);
|
||||
- select_dev_loss(conf, mpp);
|
||||
- select_eh_deadline(conf, mpp);
|
||||
select_reservation_key(conf, mpp);
|
||||
select_deferred_remove(conf, mpp);
|
||||
select_marginal_path_err_sample_time(conf, mpp);
|
||||
@@ -383,7 +380,7 @@ int setup_map(struct multipath *mpp, char **params, struct vectors *vecs)
|
||||
select_ghost_delay(conf, mpp);
|
||||
select_flush_on_last_del(conf, mpp);
|
||||
|
||||
- sysfs_set_scsi_tmo(mpp, conf->checkint);
|
||||
+ sysfs_set_scsi_tmo(conf, mpp);
|
||||
marginal_pathgroups = conf->marginal_pathgroups;
|
||||
pthread_cleanup_pop(1);
|
||||
|
||||
diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
|
||||
index 6fb81c28..bcda8b09 100644
|
||||
--- a/libmultipath/discovery.c
|
||||
+++ b/libmultipath/discovery.c
|
||||
@@ -596,13 +596,13 @@ sysfs_get_asymmetric_access_state(struct path *pp, char *buff, int buflen)
|
||||
}
|
||||
|
||||
static int
|
||||
-sysfs_set_eh_deadline(struct multipath *mpp, struct path *pp)
|
||||
+sysfs_set_eh_deadline(struct path *pp)
|
||||
{
|
||||
struct udev_device *hostdev;
|
||||
char host_name[HOST_NAME_LEN], value[16];
|
||||
int ret, len;
|
||||
|
||||
- if (mpp->eh_deadline == EH_DEADLINE_UNSET)
|
||||
+ if (pp->eh_deadline == EH_DEADLINE_UNSET)
|
||||
return 0;
|
||||
|
||||
sprintf(host_name, "host%d", pp->sg_id.host_no);
|
||||
@@ -611,12 +611,12 @@ sysfs_set_eh_deadline(struct multipath *mpp, struct path *pp)
|
||||
if (!hostdev)
|
||||
return 1;
|
||||
|
||||
- if (mpp->eh_deadline == EH_DEADLINE_OFF)
|
||||
+ if (pp->eh_deadline == EH_DEADLINE_OFF)
|
||||
len = sprintf(value, "off");
|
||||
- else if (mpp->eh_deadline == EH_DEADLINE_ZERO)
|
||||
+ else if (pp->eh_deadline == EH_DEADLINE_ZERO)
|
||||
len = sprintf(value, "0");
|
||||
else
|
||||
- len = sprintf(value, "%d", mpp->eh_deadline);
|
||||
+ len = sprintf(value, "%d", pp->eh_deadline);
|
||||
|
||||
ret = sysfs_attr_set_value(hostdev, "eh_deadline",
|
||||
value, len + 1);
|
||||
@@ -640,8 +640,8 @@ sysfs_set_rport_tmo(struct multipath *mpp, struct path *pp)
|
||||
unsigned int tmo;
|
||||
int ret;
|
||||
|
||||
- if (mpp->dev_loss == DEV_LOSS_TMO_UNSET &&
|
||||
- mpp->fast_io_fail == MP_FAST_IO_FAIL_UNSET)
|
||||
+ if (pp->dev_loss == DEV_LOSS_TMO_UNSET &&
|
||||
+ pp->fast_io_fail == MP_FAST_IO_FAIL_UNSET)
|
||||
return;
|
||||
|
||||
sprintf(rport_id, "rport-%d:%d-%d",
|
||||
@@ -683,14 +683,14 @@ sysfs_set_rport_tmo(struct multipath *mpp, struct path *pp)
|
||||
* then set fast_io_fail, and _then_ set dev_loss_tmo
|
||||
* to the correct value.
|
||||
*/
|
||||
- if (mpp->fast_io_fail != MP_FAST_IO_FAIL_UNSET &&
|
||||
- mpp->fast_io_fail != MP_FAST_IO_FAIL_ZERO &&
|
||||
- mpp->fast_io_fail != MP_FAST_IO_FAIL_OFF) {
|
||||
+ if (pp->fast_io_fail != MP_FAST_IO_FAIL_UNSET &&
|
||||
+ pp->fast_io_fail != MP_FAST_IO_FAIL_ZERO &&
|
||||
+ pp->fast_io_fail != MP_FAST_IO_FAIL_OFF) {
|
||||
/* Check if we need to temporarily increase dev_loss_tmo */
|
||||
- if ((unsigned int)mpp->fast_io_fail >= tmo) {
|
||||
+ if ((unsigned int)pp->fast_io_fail >= tmo) {
|
||||
/* Increase dev_loss_tmo temporarily */
|
||||
snprintf(value, sizeof(value), "%u",
|
||||
- (unsigned int)mpp->fast_io_fail + 1);
|
||||
+ (unsigned int)pp->fast_io_fail + 1);
|
||||
ret = sysfs_attr_set_value(rport_dev, "dev_loss_tmo",
|
||||
value, strlen(value));
|
||||
if (ret <= 0) {
|
||||
@@ -704,20 +704,20 @@ sysfs_set_rport_tmo(struct multipath *mpp, struct path *pp)
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
- } else if (mpp->dev_loss > DEFAULT_DEV_LOSS_TMO &&
|
||||
- mpp->no_path_retry != NO_PATH_RETRY_QUEUE) {
|
||||
+ } else if (pp->dev_loss > DEFAULT_DEV_LOSS_TMO &&
|
||||
+ mpp->no_path_retry != NO_PATH_RETRY_QUEUE) {
|
||||
condlog(2, "%s: limiting dev_loss_tmo to %d, since "
|
||||
"fast_io_fail is not set",
|
||||
rport_id, DEFAULT_DEV_LOSS_TMO);
|
||||
- mpp->dev_loss = DEFAULT_DEV_LOSS_TMO;
|
||||
+ pp->dev_loss = DEFAULT_DEV_LOSS_TMO;
|
||||
}
|
||||
- if (mpp->fast_io_fail != MP_FAST_IO_FAIL_UNSET) {
|
||||
- if (mpp->fast_io_fail == MP_FAST_IO_FAIL_OFF)
|
||||
+ if (pp->fast_io_fail != MP_FAST_IO_FAIL_UNSET) {
|
||||
+ if (pp->fast_io_fail == MP_FAST_IO_FAIL_OFF)
|
||||
sprintf(value, "off");
|
||||
- else if (mpp->fast_io_fail == MP_FAST_IO_FAIL_ZERO)
|
||||
+ else if (pp->fast_io_fail == MP_FAST_IO_FAIL_ZERO)
|
||||
sprintf(value, "0");
|
||||
else
|
||||
- snprintf(value, 16, "%u", mpp->fast_io_fail);
|
||||
+ snprintf(value, 16, "%u", pp->fast_io_fail);
|
||||
ret = sysfs_attr_set_value(rport_dev, "fast_io_fail_tmo",
|
||||
value, strlen(value));
|
||||
if (ret <= 0) {
|
||||
@@ -728,8 +728,8 @@ sysfs_set_rport_tmo(struct multipath *mpp, struct path *pp)
|
||||
rport_id, value, -ret);
|
||||
}
|
||||
}
|
||||
- if (mpp->dev_loss != DEV_LOSS_TMO_UNSET) {
|
||||
- snprintf(value, 16, "%u", mpp->dev_loss);
|
||||
+ if (pp->dev_loss != DEV_LOSS_TMO_UNSET) {
|
||||
+ snprintf(value, 16, "%u", pp->dev_loss);
|
||||
ret = sysfs_attr_set_value(rport_dev, "dev_loss_tmo",
|
||||
value, strlen(value));
|
||||
if (ret <= 0) {
|
||||
@@ -745,15 +745,15 @@ out:
|
||||
}
|
||||
|
||||
static void
|
||||
-sysfs_set_session_tmo(struct multipath *mpp, struct path *pp)
|
||||
+sysfs_set_session_tmo(struct path *pp)
|
||||
{
|
||||
struct udev_device *session_dev = NULL;
|
||||
char session_id[64];
|
||||
char value[11];
|
||||
|
||||
- if (mpp->dev_loss != DEV_LOSS_TMO_UNSET)
|
||||
+ if (pp->dev_loss != DEV_LOSS_TMO_UNSET)
|
||||
condlog(3, "%s: ignoring dev_loss_tmo on iSCSI", pp->dev);
|
||||
- if (mpp->fast_io_fail == MP_FAST_IO_FAIL_UNSET)
|
||||
+ if (pp->fast_io_fail == MP_FAST_IO_FAIL_UNSET)
|
||||
return;
|
||||
|
||||
sprintf(session_id, "session%d", pp->sg_id.transport_id);
|
||||
@@ -767,15 +767,15 @@ sysfs_set_session_tmo(struct multipath *mpp, struct path *pp)
|
||||
condlog(4, "target%d:%d:%d -> %s", pp->sg_id.host_no,
|
||||
pp->sg_id.channel, pp->sg_id.scsi_id, session_id);
|
||||
|
||||
- if (mpp->fast_io_fail != MP_FAST_IO_FAIL_UNSET) {
|
||||
- if (mpp->fast_io_fail == MP_FAST_IO_FAIL_OFF) {
|
||||
+ if (pp->fast_io_fail != MP_FAST_IO_FAIL_UNSET) {
|
||||
+ if (pp->fast_io_fail == MP_FAST_IO_FAIL_OFF) {
|
||||
condlog(3, "%s: can't switch off fast_io_fail_tmo "
|
||||
"on iSCSI", pp->dev);
|
||||
- } else if (mpp->fast_io_fail == MP_FAST_IO_FAIL_ZERO) {
|
||||
+ } else if (pp->fast_io_fail == MP_FAST_IO_FAIL_ZERO) {
|
||||
condlog(3, "%s: can't set fast_io_fail_tmo to '0'"
|
||||
"on iSCSI", pp->dev);
|
||||
} else {
|
||||
- snprintf(value, 11, "%u", mpp->fast_io_fail);
|
||||
+ snprintf(value, 11, "%u", pp->fast_io_fail);
|
||||
if (sysfs_attr_set_value(session_dev, "recovery_tmo",
|
||||
value, strlen(value)) <= 0) {
|
||||
condlog(3, "%s: Failed to set recovery_tmo, "
|
||||
@@ -788,14 +788,14 @@ sysfs_set_session_tmo(struct multipath *mpp, struct path *pp)
|
||||
}
|
||||
|
||||
static void
|
||||
-sysfs_set_nexus_loss_tmo(struct multipath *mpp, struct path *pp)
|
||||
+sysfs_set_nexus_loss_tmo(struct path *pp)
|
||||
{
|
||||
struct udev_device *parent, *sas_dev = NULL;
|
||||
const char *end_dev_id = NULL;
|
||||
char value[11];
|
||||
static const char ed_str[] = "end_device-";
|
||||
|
||||
- if (!pp->udev || mpp->dev_loss == DEV_LOSS_TMO_UNSET)
|
||||
+ if (!pp->udev || pp->dev_loss == DEV_LOSS_TMO_UNSET)
|
||||
return;
|
||||
|
||||
for (parent = udev_device_get_parent(pp->udev);
|
||||
@@ -822,8 +822,8 @@ sysfs_set_nexus_loss_tmo(struct multipath *mpp, struct path *pp)
|
||||
condlog(4, "target%d:%d:%d -> %s", pp->sg_id.host_no,
|
||||
pp->sg_id.channel, pp->sg_id.scsi_id, end_dev_id);
|
||||
|
||||
- if (mpp->dev_loss != DEV_LOSS_TMO_UNSET) {
|
||||
- snprintf(value, 11, "%u", mpp->dev_loss);
|
||||
+ if (pp->dev_loss != DEV_LOSS_TMO_UNSET) {
|
||||
+ snprintf(value, 11, "%u", pp->dev_loss);
|
||||
if (sysfs_attr_set_value(sas_dev, "I_T_nexus_loss_timeout",
|
||||
value, strlen(value)) <= 0)
|
||||
condlog(3, "%s: failed to update "
|
||||
@@ -835,47 +835,59 @@ sysfs_set_nexus_loss_tmo(struct multipath *mpp, struct path *pp)
|
||||
}
|
||||
|
||||
int
|
||||
-sysfs_set_scsi_tmo (struct multipath *mpp, unsigned int checkint)
|
||||
+sysfs_set_scsi_tmo (struct config *conf, struct multipath *mpp)
|
||||
{
|
||||
struct path *pp;
|
||||
int i;
|
||||
- unsigned int dev_loss_tmo = mpp->dev_loss;
|
||||
- struct path *err_path = NULL;
|
||||
+ unsigned int min_dev_loss = 0;
|
||||
+ bool warn_dev_loss = false;
|
||||
+ bool warn_fast_io_fail = false;
|
||||
|
||||
if (mpp->no_path_retry > 0) {
|
||||
uint64_t no_path_retry_tmo =
|
||||
- (uint64_t)mpp->no_path_retry * checkint;
|
||||
+ (uint64_t)mpp->no_path_retry * conf->checkint;
|
||||
|
||||
if (no_path_retry_tmo > MAX_DEV_LOSS_TMO)
|
||||
- no_path_retry_tmo = MAX_DEV_LOSS_TMO;
|
||||
- if (no_path_retry_tmo > dev_loss_tmo)
|
||||
- dev_loss_tmo = no_path_retry_tmo;
|
||||
- } else if (mpp->no_path_retry == NO_PATH_RETRY_QUEUE) {
|
||||
- dev_loss_tmo = MAX_DEV_LOSS_TMO;
|
||||
- }
|
||||
- if (mpp->dev_loss != DEV_LOSS_TMO_UNSET &&
|
||||
- mpp->dev_loss != dev_loss_tmo) {
|
||||
- condlog(2, "%s: Using dev_loss_tmo=%u instead of %u because of no_path_retry setting",
|
||||
- mpp->alias, dev_loss_tmo, mpp->dev_loss);
|
||||
- mpp->dev_loss = dev_loss_tmo;
|
||||
- }
|
||||
- if (mpp->dev_loss != DEV_LOSS_TMO_UNSET &&
|
||||
- mpp->fast_io_fail != MP_FAST_IO_FAIL_UNSET &&
|
||||
- (unsigned int)mpp->fast_io_fail >= mpp->dev_loss) {
|
||||
- condlog(3, "%s: turning off fast_io_fail (%d is not smaller than dev_loss_tmo)",
|
||||
- mpp->alias, mpp->fast_io_fail);
|
||||
- mpp->fast_io_fail = MP_FAST_IO_FAIL_OFF;
|
||||
- }
|
||||
- if (mpp->dev_loss == DEV_LOSS_TMO_UNSET &&
|
||||
- mpp->fast_io_fail == MP_FAST_IO_FAIL_UNSET &&
|
||||
- mpp->eh_deadline == EH_DEADLINE_UNSET)
|
||||
- return 0;
|
||||
+ min_dev_loss = MAX_DEV_LOSS_TMO;
|
||||
+ else
|
||||
+ min_dev_loss = no_path_retry_tmo;
|
||||
+ } else if (mpp->no_path_retry == NO_PATH_RETRY_QUEUE)
|
||||
+ min_dev_loss = MAX_DEV_LOSS_TMO;
|
||||
|
||||
vector_foreach_slot(mpp->paths, pp, i) {
|
||||
- if (pp->bus != SYSFS_BUS_SCSI) {
|
||||
- if (!err_path)
|
||||
- err_path = pp;
|
||||
+ select_fast_io_fail(conf, pp);
|
||||
+ select_dev_loss(conf, pp);
|
||||
+ select_eh_deadline(conf, pp);
|
||||
+
|
||||
+ if (pp->dev_loss == DEV_LOSS_TMO_UNSET &&
|
||||
+ pp->fast_io_fail == MP_FAST_IO_FAIL_UNSET &&
|
||||
+ pp->eh_deadline == EH_DEADLINE_UNSET)
|
||||
+ continue;
|
||||
+
|
||||
+ if (pp->bus != SYSFS_BUS_SCSI)
|
||||
+ continue;
|
||||
+
|
||||
+ sysfs_set_eh_deadline(pp);
|
||||
+
|
||||
+ if (pp->dev_loss == DEV_LOSS_TMO_UNSET &&
|
||||
+ pp->fast_io_fail == MP_FAST_IO_FAIL_UNSET)
|
||||
continue;
|
||||
+
|
||||
+ if (pp->sg_id.proto_id != SCSI_PROTOCOL_FCP &&
|
||||
+ pp->sg_id.proto_id != SCSI_PROTOCOL_ISCSI &&
|
||||
+ pp->sg_id.proto_id != SCSI_PROTOCOL_SAS)
|
||||
+ continue;
|
||||
+
|
||||
+ if (pp->dev_loss != DEV_LOSS_TMO_UNSET &&
|
||||
+ pp->dev_loss < min_dev_loss) {
|
||||
+ warn_dev_loss = true;
|
||||
+ pp->dev_loss = min_dev_loss;
|
||||
+ }
|
||||
+ if (pp->dev_loss != DEV_LOSS_TMO_UNSET &&
|
||||
+ pp->fast_io_fail > 0 &&
|
||||
+ (unsigned int)pp->fast_io_fail >= pp->dev_loss) {
|
||||
+ warn_fast_io_fail = true;
|
||||
+ pp->fast_io_fail = MP_FAST_IO_FAIL_OFF;
|
||||
}
|
||||
|
||||
switch (pp->sg_id.proto_id) {
|
||||
@@ -883,25 +895,21 @@ sysfs_set_scsi_tmo (struct multipath *mpp, unsigned int checkint)
|
||||
sysfs_set_rport_tmo(mpp, pp);
|
||||
break;
|
||||
case SCSI_PROTOCOL_ISCSI:
|
||||
- sysfs_set_session_tmo(mpp, pp);
|
||||
+ sysfs_set_session_tmo(pp);
|
||||
break;
|
||||
case SCSI_PROTOCOL_SAS:
|
||||
- sysfs_set_nexus_loss_tmo(mpp, pp);
|
||||
+ sysfs_set_nexus_loss_tmo(pp);
|
||||
break;
|
||||
default:
|
||||
- if (!err_path)
|
||||
- err_path = pp;
|
||||
+ break;
|
||||
}
|
||||
- sysfs_set_eh_deadline(mpp, pp);
|
||||
- }
|
||||
-
|
||||
- if (err_path) {
|
||||
- STRBUF_ON_STACK(proto_buf);
|
||||
-
|
||||
- snprint_path_protocol(&proto_buf, err_path);
|
||||
- condlog(2, "%s: setting dev_loss_tmo is unsupported for protocol %s",
|
||||
- mpp->alias, get_strbuf_str(&proto_buf));
|
||||
}
|
||||
+ if (warn_dev_loss)
|
||||
+ condlog(2, "%s: Raising dev_loss_tmo to %u because of no_path_retry setting",
|
||||
+ mpp->alias, min_dev_loss);
|
||||
+ if (warn_fast_io_fail)
|
||||
+ condlog(3, "%s: turning off fast_io_fail (not smaller than dev_loss_tmo)",
|
||||
+ mpp->alias);
|
||||
return 0;
|
||||
}
|
||||
|
||||
diff --git a/libmultipath/discovery.h b/libmultipath/discovery.h
|
||||
index a5446b4d..b6eea258 100644
|
||||
--- a/libmultipath/discovery.h
|
||||
+++ b/libmultipath/discovery.h
|
||||
@@ -42,7 +42,7 @@ int alloc_path_with_pathinfo (struct config *conf, struct udev_device *udevice,
|
||||
int store_pathinfo (vector pathvec, struct config *conf,
|
||||
struct udev_device *udevice, int flag,
|
||||
struct path **pp_ptr);
|
||||
-int sysfs_set_scsi_tmo (struct multipath *mpp, unsigned int checkint);
|
||||
+int sysfs_set_scsi_tmo (struct config *conf, struct multipath *mpp);
|
||||
int sysfs_get_timeout(const struct path *pp, unsigned int *timeout);
|
||||
int sysfs_get_host_pci_name(const struct path *pp, char *pci_name);
|
||||
int sysfs_get_iscsi_ip_address(const struct path *pp, char *ip_address);
|
||||
diff --git a/libmultipath/propsel.c b/libmultipath/propsel.c
|
||||
index 677ab9e1..f146fe64 100644
|
||||
--- a/libmultipath/propsel.c
|
||||
+++ b/libmultipath/propsel.c
|
||||
@@ -770,53 +770,53 @@ int select_minio(struct config *conf, struct multipath *mp)
|
||||
return select_minio_bio(conf, mp);
|
||||
}
|
||||
|
||||
-int select_fast_io_fail(struct config *conf, struct multipath *mp)
|
||||
+int select_fast_io_fail(struct config *conf, struct path *pp)
|
||||
{
|
||||
const char *origin;
|
||||
STRBUF_ON_STACK(buff);
|
||||
|
||||
- mp_set_ovr(fast_io_fail);
|
||||
- mp_set_hwe(fast_io_fail);
|
||||
- mp_set_conf(fast_io_fail);
|
||||
- mp_set_default(fast_io_fail, DEFAULT_FAST_IO_FAIL);
|
||||
+ pp_set_ovr(fast_io_fail);
|
||||
+ pp_set_hwe(fast_io_fail);
|
||||
+ pp_set_conf(fast_io_fail);
|
||||
+ pp_set_default(fast_io_fail, DEFAULT_FAST_IO_FAIL);
|
||||
out:
|
||||
- print_undef_off_zero(&buff, mp->fast_io_fail);
|
||||
- condlog(3, "%s: fast_io_fail_tmo = %s %s", mp->alias,
|
||||
+ print_undef_off_zero(&buff, pp->fast_io_fail);
|
||||
+ condlog(3, "%s: fast_io_fail_tmo = %s %s", pp->dev,
|
||||
get_strbuf_str(&buff), origin);
|
||||
return 0;
|
||||
}
|
||||
|
||||
-int select_dev_loss(struct config *conf, struct multipath *mp)
|
||||
+int select_dev_loss(struct config *conf, struct path *pp)
|
||||
{
|
||||
const char *origin;
|
||||
STRBUF_ON_STACK(buff);
|
||||
|
||||
- mp_set_ovr(dev_loss);
|
||||
- mp_set_hwe(dev_loss);
|
||||
- mp_set_conf(dev_loss);
|
||||
- mp->dev_loss = DEV_LOSS_TMO_UNSET;
|
||||
+ pp_set_ovr(dev_loss);
|
||||
+ pp_set_hwe(dev_loss);
|
||||
+ pp_set_conf(dev_loss);
|
||||
+ pp->dev_loss = DEV_LOSS_TMO_UNSET;
|
||||
return 0;
|
||||
out:
|
||||
- print_dev_loss(&buff, mp->dev_loss);
|
||||
- condlog(3, "%s: dev_loss_tmo = %s %s", mp->alias,
|
||||
+ print_dev_loss(&buff, pp->dev_loss);
|
||||
+ condlog(3, "%s: dev_loss_tmo = %s %s", pp->dev,
|
||||
get_strbuf_str(&buff), origin);
|
||||
return 0;
|
||||
}
|
||||
|
||||
-int select_eh_deadline(struct config *conf, struct multipath *mp)
|
||||
+int select_eh_deadline(struct config *conf, struct path *pp)
|
||||
{
|
||||
const char *origin;
|
||||
STRBUF_ON_STACK(buff);
|
||||
|
||||
- mp_set_ovr(eh_deadline);
|
||||
- mp_set_hwe(eh_deadline);
|
||||
- mp_set_conf(eh_deadline);
|
||||
- mp->eh_deadline = EH_DEADLINE_UNSET;
|
||||
+ pp_set_ovr(eh_deadline);
|
||||
+ pp_set_hwe(eh_deadline);
|
||||
+ pp_set_conf(eh_deadline);
|
||||
+ pp->eh_deadline = EH_DEADLINE_UNSET;
|
||||
/* not changing sysfs in default cause, so don't print anything */
|
||||
return 0;
|
||||
out:
|
||||
- print_undef_off_zero(&buff, mp->eh_deadline);
|
||||
- condlog(3, "%s: eh_deadline = %s %s", mp->alias,
|
||||
+ print_undef_off_zero(&buff, pp->eh_deadline);
|
||||
+ condlog(3, "%s: eh_deadline = %s %s", pp->dev,
|
||||
get_strbuf_str(&buff), origin);
|
||||
return 0;
|
||||
}
|
||||
diff --git a/libmultipath/propsel.h b/libmultipath/propsel.h
|
||||
index 72a7e33c..152ca44c 100644
|
||||
--- a/libmultipath/propsel.h
|
||||
+++ b/libmultipath/propsel.h
|
||||
@@ -16,9 +16,9 @@ int select_minio(struct config *conf, struct multipath *mp);
|
||||
int select_mode(struct config *conf, struct multipath *mp);
|
||||
int select_uid(struct config *conf, struct multipath *mp);
|
||||
int select_gid(struct config *conf, struct multipath *mp);
|
||||
-int select_fast_io_fail(struct config *conf, struct multipath *mp);
|
||||
-int select_dev_loss(struct config *conf, struct multipath *mp);
|
||||
-int select_eh_deadline(struct config *conf, struct multipath *mp);
|
||||
+int select_fast_io_fail(struct config *conf, struct path *pp);
|
||||
+int select_dev_loss(struct config *conf, struct path *pp);
|
||||
+int select_eh_deadline(struct config *conf, struct path *pp);
|
||||
int select_reservation_key(struct config *conf, struct multipath *mp);
|
||||
int select_retain_hwhandler (struct config *conf, struct multipath * mp);
|
||||
int select_detect_prio(struct config *conf, struct path * pp);
|
||||
diff --git a/libmultipath/structs.c b/libmultipath/structs.c
|
||||
index d20e1eea..acd4cbeb 100644
|
||||
--- a/libmultipath/structs.c
|
||||
+++ b/libmultipath/structs.c
|
||||
@@ -246,7 +246,6 @@ alloc_multipath (void)
|
||||
mpp->bestpg = 1;
|
||||
mpp->mpcontext = NULL;
|
||||
mpp->no_path_retry = NO_PATH_RETRY_UNDEF;
|
||||
- mpp->fast_io_fail = MP_FAST_IO_FAIL_UNSET;
|
||||
dm_multipath_to_gen(mpp)->ops = &dm_gen_multipath_ops;
|
||||
}
|
||||
return mpp;
|
||||
diff --git a/libmultipath/structs.h b/libmultipath/structs.h
|
||||
index 618ff4fb..8a07d470 100644
|
||||
--- a/libmultipath/structs.h
|
||||
+++ b/libmultipath/structs.h
|
||||
@@ -340,6 +340,9 @@ struct path {
|
||||
int marginal;
|
||||
int vpd_vendor_id;
|
||||
int recheck_wwid;
|
||||
+ int fast_io_fail;
|
||||
+ unsigned int dev_loss;
|
||||
+ int eh_deadline;
|
||||
/* configlet pointers */
|
||||
vector hwe;
|
||||
struct gen_path generic_path;
|
||||
@@ -367,7 +370,6 @@ struct multipath {
|
||||
int minio;
|
||||
int flush_on_last_del;
|
||||
int attribute_flags;
|
||||
- int fast_io_fail;
|
||||
int retain_hwhandler;
|
||||
int deferred_remove;
|
||||
bool in_recovery;
|
||||
@@ -385,8 +387,6 @@ struct multipath {
|
||||
int needs_paths_uevent;
|
||||
int ghost_delay;
|
||||
int ghost_delay_tick;
|
||||
- unsigned int dev_loss;
|
||||
- int eh_deadline;
|
||||
uid_t uid;
|
||||
gid_t gid;
|
||||
mode_t mode;
|
@ -0,0 +1,84 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Wed, 13 Apr 2022 23:27:39 -0500
|
||||
Subject: [PATCH] libmultipath: check the overrides pctable for path variables
|
||||
|
||||
Paths will now also check the pctable when checking for attribtes that
|
||||
exists in both the overrides section and the protocol subsection. Values
|
||||
in a matching pcentry will be used in preference to values in the
|
||||
overrides hwentry.
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
---
|
||||
libmultipath/propsel.c | 29 ++++++++++++++++++++++++++---
|
||||
1 file changed, 26 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/propsel.c b/libmultipath/propsel.c
|
||||
index f146fe64..2b47f5f8 100644
|
||||
--- a/libmultipath/propsel.c
|
||||
+++ b/libmultipath/propsel.c
|
||||
@@ -80,6 +80,8 @@ static const char conf_origin[] =
|
||||
"(setting: multipath.conf defaults/devices section)";
|
||||
static const char overrides_origin[] =
|
||||
"(setting: multipath.conf overrides section)";
|
||||
+static const char overrides_pce_origin[] =
|
||||
+ "(setting: multipath.conf overrides protocol section)";
|
||||
static const char cmdline_origin[] =
|
||||
"(setting: multipath command line [-p] flag)";
|
||||
static const char autodetect_origin[] =
|
||||
@@ -147,6 +149,27 @@ do { \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
+#define pp_set_ovr_pce(var) \
|
||||
+do { \
|
||||
+ struct pcentry *_pce; \
|
||||
+ int _i; \
|
||||
+ \
|
||||
+ if (conf->overrides) { \
|
||||
+ vector_foreach_slot(conf->overrides->pctable, _pce, _i) { \
|
||||
+ if (_pce->type == (int)bus_protocol_id(pp) && _pce->var) { \
|
||||
+ pp->var = _pce->var; \
|
||||
+ origin = overrides_pce_origin; \
|
||||
+ goto out; \
|
||||
+ } \
|
||||
+ } \
|
||||
+ if (conf->overrides->var) { \
|
||||
+ pp->var = conf->overrides->var; \
|
||||
+ origin = overrides_origin; \
|
||||
+ goto out; \
|
||||
+ } \
|
||||
+ } \
|
||||
+} while (0)
|
||||
+
|
||||
int select_mode(struct config *conf, struct multipath *mp)
|
||||
{
|
||||
const char *origin;
|
||||
@@ -775,7 +798,7 @@ int select_fast_io_fail(struct config *conf, struct path *pp)
|
||||
const char *origin;
|
||||
STRBUF_ON_STACK(buff);
|
||||
|
||||
- pp_set_ovr(fast_io_fail);
|
||||
+ pp_set_ovr_pce(fast_io_fail);
|
||||
pp_set_hwe(fast_io_fail);
|
||||
pp_set_conf(fast_io_fail);
|
||||
pp_set_default(fast_io_fail, DEFAULT_FAST_IO_FAIL);
|
||||
@@ -791,7 +814,7 @@ int select_dev_loss(struct config *conf, struct path *pp)
|
||||
const char *origin;
|
||||
STRBUF_ON_STACK(buff);
|
||||
|
||||
- pp_set_ovr(dev_loss);
|
||||
+ pp_set_ovr_pce(dev_loss);
|
||||
pp_set_hwe(dev_loss);
|
||||
pp_set_conf(dev_loss);
|
||||
pp->dev_loss = DEV_LOSS_TMO_UNSET;
|
||||
@@ -808,7 +831,7 @@ int select_eh_deadline(struct config *conf, struct path *pp)
|
||||
const char *origin;
|
||||
STRBUF_ON_STACK(buff);
|
||||
|
||||
- pp_set_ovr(eh_deadline);
|
||||
+ pp_set_ovr_pce(eh_deadline);
|
||||
pp_set_hwe(eh_deadline);
|
||||
pp_set_conf(eh_deadline);
|
||||
pp->eh_deadline = EH_DEADLINE_UNSET;
|
@ -0,0 +1,33 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Wed, 13 Apr 2022 23:27:40 -0500
|
||||
Subject: [PATCH] libmultipath: fix eh_deadline documentation
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
---
|
||||
multipath/multipath.conf.5 | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5
|
||||
index 58ad5c9c..47404545 100644
|
||||
--- a/multipath/multipath.conf.5
|
||||
+++ b/multipath/multipath.conf.5
|
||||
@@ -1637,6 +1637,8 @@ section:
|
||||
.TP
|
||||
.B dev_loss_tmo
|
||||
.TP
|
||||
+.B eh_deadline
|
||||
+.TP
|
||||
.B flush_on_last_del
|
||||
.TP
|
||||
.B user_friendly_names
|
||||
@@ -1723,6 +1725,8 @@ the values are taken from the \fIdevices\fR or \fIdefaults\fR sections:
|
||||
.TP
|
||||
.B dev_loss_tmo
|
||||
.TP
|
||||
+.B eh_deadline
|
||||
+.TP
|
||||
.B user_friendly_names
|
||||
.TP
|
||||
.B retain_attached_hw_handler
|
@ -0,0 +1,54 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Wed, 13 Apr 2022 23:27:41 -0500
|
||||
Subject: [PATCH] libmultipath: Add documentation for the protocol subsection
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
---
|
||||
multipath/multipath.conf.5 | 32 ++++++++++++++++++++++++++++++++
|
||||
1 file changed, 32 insertions(+)
|
||||
|
||||
diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5
|
||||
index 47404545..f7de5140 100644
|
||||
--- a/multipath/multipath.conf.5
|
||||
+++ b/multipath/multipath.conf.5
|
||||
@@ -1765,6 +1765,38 @@ the values are taken from the \fIdevices\fR or \fIdefaults\fR sections:
|
||||
.RE
|
||||
.PD
|
||||
.LP
|
||||
+The overrides section also recognizes the optional \fIprotocol\fR subsection,
|
||||
+and can contain multiple protocol subsections. Path devices are matched against
|
||||
+the protocol subsection using the mandatory \fItype\fR attribute. Attributes
|
||||
+in a matching protocol subsection take precedence over attributes in the rest
|
||||
+of the overrides section. If there are multiple matching protocol subsections,
|
||||
+later entries take precedence.
|
||||
+.TP
|
||||
+.B protocol subsection
|
||||
+The protocol subsection recognizes the following mandatory attribute:
|
||||
+.RS
|
||||
+.TP
|
||||
+.B type
|
||||
+The protocol string of the path device. The possible values are \fIscsi:fcp\fR,
|
||||
+\fIscsi:spi\fR, \fIscsi:ssa\fR, \fIscsi:sbp\fR, \fIscsi:srp\fR,
|
||||
+\fIscsi:iscsi\fR, \fIscsi:sas\fR, \fIscsi:adt\fR, \fIscsi:ata\fR,
|
||||
+\fIscsi:unspec\fR, \fIccw\fR, \fIcciss\fR, \fInvme\fR, and \fIundef\fR. This is
|
||||
+\fBnot\fR a regular expression. the path device protcol string must match
|
||||
+exactly. The protocol that a path is using can be viewed by running
|
||||
+\fBmultipathd show paths format "%d %P"\fR
|
||||
+.LP
|
||||
+The following attributes are optional; if not set, the default values are taken
|
||||
+from the \fIoverrides\fR, \fIdevices\fR, or \fIdefaults\fR section:
|
||||
+.sp 1
|
||||
+.PD .1v
|
||||
+.RS
|
||||
+.TP
|
||||
+.B fast_io_fail_tmo
|
||||
+.TP
|
||||
+.B dev_loss_tmo
|
||||
+.TP
|
||||
+.B eh_deadline
|
||||
+.PD
|
||||
.
|
||||
.
|
||||
.\" ----------------------------------------------------------------------------
|
@ -0,0 +1,47 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Thu, 14 Apr 2022 16:11:10 -0500
|
||||
Subject: [PATCH] libmultipath: use symbolic value for invalid pcentry
|
||||
|
||||
Suggested-by: Martin Wilck <mwilck@suse.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
---
|
||||
libmultipath/config.c | 4 ++--
|
||||
libmultipath/config.h | 1 +
|
||||
2 files changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/config.c b/libmultipath/config.c
|
||||
index 8b0e1f72..61b0dd51 100644
|
||||
--- a/libmultipath/config.c
|
||||
+++ b/libmultipath/config.c
|
||||
@@ -384,7 +384,7 @@ alloc_pce (void)
|
||||
{
|
||||
struct pcentry *pce = (struct pcentry *)
|
||||
calloc(1, sizeof(struct pcentry));
|
||||
- pce->type = -1;
|
||||
+ pce->type = PCE_INVALID;
|
||||
return pce;
|
||||
}
|
||||
|
||||
@@ -643,7 +643,7 @@ validate_pctable(struct hwentry *ovr, int idx, const char *table_desc)
|
||||
return;
|
||||
|
||||
vector_foreach_slot_after(ovr->pctable, pce, idx) {
|
||||
- if (pce->type < 0) {
|
||||
+ if (pce->type == PCE_INVALID) {
|
||||
condlog(0, "protocol section in %s missing type",
|
||||
table_desc);
|
||||
vector_del_slot(ovr->pctable, idx--);
|
||||
diff --git a/libmultipath/config.h b/libmultipath/config.h
|
||||
index 57992604..c1e18363 100644
|
||||
--- a/libmultipath/config.h
|
||||
+++ b/libmultipath/config.h
|
||||
@@ -41,6 +41,7 @@ enum force_reload_types {
|
||||
FORCE_RELOAD_WEAK,
|
||||
};
|
||||
|
||||
+#define PCE_INVALID -1
|
||||
struct pcentry {
|
||||
int type;
|
||||
int fast_io_fail;
|
@ -0,0 +1,28 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Fri, 29 Apr 2022 15:57:12 -0500
|
||||
Subject: [PATCH] updated HPE MSA builtin config
|
||||
|
||||
Make the config better align to MSA 4th, 5th and 6th Generation systems.
|
||||
|
||||
Cc: Jon.Paul@hpe.com
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/hwtable.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c
|
||||
index a8ba28e3..d7c487b1 100644
|
||||
--- a/libmultipath/hwtable.c
|
||||
+++ b/libmultipath/hwtable.c
|
||||
@@ -182,8 +182,8 @@ static struct hwentry default_hw[] = {
|
||||
},
|
||||
{
|
||||
/* MSA 1040, 1050, 1060, 2040, 2050 and 2060 families */
|
||||
- .vendor = "HP",
|
||||
- .product = "MSA [12]0[456]0 SA[NS]",
|
||||
+ .vendor = "(HP|HPE)",
|
||||
+ .product = "MSA [12]0[456]0 (SAN|SAS|FC|iSCSI)",
|
||||
.pgpolicy = GROUP_BY_PRIO,
|
||||
.pgfailback = -FAILBACK_IMMEDIATE,
|
||||
.no_path_retry = 18,
|
@ -0,0 +1,30 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Tue, 10 May 2022 14:17:22 -0500
|
||||
Subject: [PATCH] libmultipath: unset detect_checker for clariion / Unity
|
||||
arrays
|
||||
|
||||
Dell EMC would like to always use the emc_clariion checker. Currently
|
||||
detect_checker will switch the checker to TUR for Unity arrays.
|
||||
This can cause problems on some setups with replicated Unity LUNs,
|
||||
which are handled correctly the the emc_checker, but not the TUR
|
||||
checker.
|
||||
|
||||
Cc: vincent.chen1@dell.com
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/hwtable.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c
|
||||
index d7c487b1..22ff1881 100644
|
||||
--- a/libmultipath/hwtable.c
|
||||
+++ b/libmultipath/hwtable.c
|
||||
@@ -343,6 +343,7 @@ static struct hwentry default_hw[] = {
|
||||
.no_path_retry = (300 / DEFAULT_CHECKINT),
|
||||
.checker_name = EMC_CLARIION,
|
||||
.prio_name = PRIO_EMC,
|
||||
+ .detect_checker = DETECT_CHECKER_OFF,
|
||||
},
|
||||
{
|
||||
/* Invista / VPLEX */
|
@ -0,0 +1,26 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Bastian Germann <bage@debian.org>
|
||||
Date: Thu, 14 Oct 2021 00:34:33 +0200
|
||||
Subject: [PATCH] multipathd: Add missing ctype include
|
||||
|
||||
In uxclnt.c, there are isspace calls. Add an explicit include.
|
||||
|
||||
Signed-off-by: Bastian Germann <bage@debian.org>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
multipathd/uxclnt.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/multipathd/uxclnt.c b/multipathd/uxclnt.c
|
||||
index a76f8e29..f16a7309 100644
|
||||
--- a/multipathd/uxclnt.c
|
||||
+++ b/multipathd/uxclnt.c
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <stdarg.h>
|
||||
+#include <ctype.h>
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#include <sys/ioctl.h>
|
@ -0,0 +1,103 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Wilck <mwilck@suse.com>
|
||||
Date: Fri, 12 Aug 2022 18:58:15 +0200
|
||||
Subject: [PATCH] multipathd: replace libreadline with libedit
|
||||
|
||||
Linking multipathd with libreadline may cause a license conflict,
|
||||
because libreadline is licensed under GPL-3.0-or-later, and
|
||||
libmultipath contains several files under GPL-2.0.
|
||||
|
||||
See:
|
||||
https://github.com/opensvc/multipath-tools/issues/36
|
||||
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=979095
|
||||
https://www.gnu.org/licenses/gpl-faq.html#AllCompatibility
|
||||
|
||||
Replace the readline functionality with libedit, which comes under
|
||||
a BSD license. The readline library can still be enabled (e.g. for
|
||||
binaries not intended to be distributed) by running
|
||||
"make READLINE=libreadline".
|
||||
|
||||
Signed-off-by: Martin Wilck <mwilck@suse.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
Makefile.inc | 5 +++++
|
||||
multipathd/Makefile | 12 +++++++++++-
|
||||
multipathd/cli.c | 5 +++++
|
||||
multipathd/uxclnt.c | 6 ++++++
|
||||
4 files changed, 27 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/Makefile.inc b/Makefile.inc
|
||||
index 688c4599..05027703 100644
|
||||
--- a/Makefile.inc
|
||||
+++ b/Makefile.inc
|
||||
@@ -14,6 +14,11 @@
|
||||
#
|
||||
# Uncomment to disable dmevents polling support
|
||||
# ENABLE_DMEVENTS_POLL = 0
|
||||
+#
|
||||
+# Readline library to use, libedit or libreadline
|
||||
+# Caution: Using libreadline may make the multipathd binary undistributable,
|
||||
+# see https://github.com/opensvc/multipath-tools/issues/36
|
||||
+READLINE = libedit
|
||||
|
||||
PKGCONFIG ?= pkg-config
|
||||
|
||||
diff --git a/multipathd/Makefile b/multipathd/Makefile
|
||||
index cd6f7e6d..00342464 100644
|
||||
--- a/multipathd/Makefile
|
||||
+++ b/multipathd/Makefile
|
||||
@@ -19,7 +19,17 @@ CFLAGS += $(BIN_CFLAGS) -I$(multipathdir) -I$(mpathpersistdir) \
|
||||
LDFLAGS += $(BIN_LDFLAGS)
|
||||
LIBDEPS += -L$(multipathdir) -lmultipath -L$(mpathpersistdir) -lmpathpersist \
|
||||
-L$(mpathcmddir) -lmpathcmd -ludev -ldl -lurcu -lpthread \
|
||||
- -ldevmapper -lreadline
|
||||
+ -ldevmapper
|
||||
+
|
||||
+ifeq ($(READLINE),libedit)
|
||||
+CFLAGS += -DUSE_LIBEDIT
|
||||
+LIBDEPS += -ledit
|
||||
+endif
|
||||
+ifeq ($(READLINE),libreadline)
|
||||
+CFLAGS += -DUSE_LIBREADLINE
|
||||
+LIBDEPS += -lreadline
|
||||
+endif
|
||||
+
|
||||
CFLAGS += $(shell $(PKGCONFIG) --modversion liburcu 2>/dev/null | \
|
||||
awk -F. '{ printf("-DURCU_VERSION=0x%06x", 256 * ( 256 * $$1 + $$2) + $$3); }')
|
||||
|
||||
diff --git a/multipathd/cli.c b/multipathd/cli.c
|
||||
index 4d6c37c9..cc547e67 100644
|
||||
--- a/multipathd/cli.c
|
||||
+++ b/multipathd/cli.c
|
||||
@@ -11,7 +11,12 @@
|
||||
#include "parser.h"
|
||||
#include "util.h"
|
||||
#include "version.h"
|
||||
+#ifdef USE_LIBEDIT
|
||||
+#include <editline/readline.h>
|
||||
+#endif
|
||||
+#ifdef USE_LIBREADLINE
|
||||
#include <readline/readline.h>
|
||||
+#endif
|
||||
|
||||
#include "mpath_cmd.h"
|
||||
#include "cli.h"
|
||||
diff --git a/multipathd/uxclnt.c b/multipathd/uxclnt.c
|
||||
index f16a7309..2c17d8fc 100644
|
||||
--- a/multipathd/uxclnt.c
|
||||
+++ b/multipathd/uxclnt.c
|
||||
@@ -16,8 +16,14 @@
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
#include <poll.h>
|
||||
+
|
||||
+#ifdef USE_LIBEDIT
|
||||
+#include <editline/readline.h>
|
||||
+#endif
|
||||
+#ifdef USE_LIBREADLINE
|
||||
#include <readline/readline.h>
|
||||
#include <readline/history.h>
|
||||
+#endif
|
||||
|
||||
#include "mpath_cmd.h"
|
||||
#include "uxsock.h"
|
@ -0,0 +1,35 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Fri, 5 Aug 2022 18:16:03 -0500
|
||||
Subject: [PATCH] multipath: fix systemd timers in the initramfs
|
||||
|
||||
The systemd timers created for "find_multipaths smart" conflict with
|
||||
shutdown.target, but not with initrd-cleanup.service. This can make
|
||||
these timers trigger after the inirtd has started shutting down,
|
||||
restarting multipathd (which then stops initrd-cleanup.service, since it
|
||||
conflicts). To avoid this, make sure the timers and the unit they
|
||||
trigger conflict with inird-cleanup.service. Also don't make them start
|
||||
multipathd. "multipath -u" will not return "maybe" if multipathd isn't
|
||||
running or set to run, and since we no longer wait for udev-settle,
|
||||
multipathd starts up pretty quickly, so it shouldn't be a problem to
|
||||
not trigger it here.
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||
---
|
||||
multipath/multipath.rules | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/multipath/multipath.rules b/multipath/multipath.rules
|
||||
index 0486bf70..68c30644 100644
|
||||
--- a/multipath/multipath.rules
|
||||
+++ b/multipath/multipath.rules
|
||||
@@ -72,7 +72,7 @@ ENV{.SAVED_FM_WAIT_UNTIL}=="?*", GOTO="pretend_mpath"
|
||||
#
|
||||
# We must trigger an "add" event because LVM2 will only act on those.
|
||||
|
||||
-RUN+="/usr/bin/systemd-run --unit=cancel-multipath-wait-$kernel --description 'cancel waiting for multipath siblings of $kernel' --no-block --timer-property DefaultDependencies=no --timer-property Conflicts=shutdown.target --timer-property Before=shutdown.target --timer-property AccuracySec=500ms --property DefaultDependencies=no --property Conflicts=shutdown.target --property Before=shutdown.target --property Wants=multipathd.service --property After=multipathd.service --on-active=$env{FIND_MULTIPATHS_WAIT_UNTIL} /usr/bin/udevadm trigger --action=add $sys$devpath"
|
||||
+RUN+="/usr/bin/systemd-run --unit=cancel-multipath-wait-$kernel --description 'cancel waiting for multipath siblings of $kernel' --no-block --timer-property DefaultDependencies=no --timer-property Conflicts=shutdown.target --timer-property Before=shutdown.target --timer-property Conflicts=initrd-cleanup.service --timer-property Before=initrd-cleanup.service --timer-property AccuracySec=500ms --property DefaultDependencies=no --property Conflicts=shutdown.target --property Before=shutdown.target --property Conflicts=initrd-cleanup.service --property Before=initrd-cleanup.service --on-active=$env{FIND_MULTIPATHS_WAIT_UNTIL} /usr/bin/udevadm trigger --action=add $sys$devpath"
|
||||
|
||||
LABEL="pretend_mpath"
|
||||
ENV{DM_MULTIPATH_DEVICE_PATH}="1"
|
@ -0,0 +1,93 @@
|
||||
# This is a basic configuration file with some examples, for device mapper
|
||||
# multipath.
|
||||
#
|
||||
# For a complete list of the default configuration values, run either
|
||||
# multipath -t
|
||||
# or
|
||||
# multipathd show config
|
||||
#
|
||||
# For a list of configuration options with descriptions, see the multipath.conf
|
||||
# man page
|
||||
|
||||
## By default, devices with vendor = "IBM" and product = "S/390.*" are
|
||||
## blacklisted. To enable mulitpathing on these devies, uncomment the
|
||||
## following lines.
|
||||
#blacklist_exceptions {
|
||||
# device {
|
||||
# vendor "IBM"
|
||||
# product "S/390.*"
|
||||
# }
|
||||
#}
|
||||
|
||||
## Use user friendly names, instead of using WWIDs as names.
|
||||
defaults {
|
||||
user_friendly_names yes
|
||||
find_multipaths yes
|
||||
}
|
||||
##
|
||||
## Here is an example of how to configure some standard options.
|
||||
##
|
||||
#
|
||||
#defaults {
|
||||
# udev_dir /dev
|
||||
# polling_interval 10
|
||||
# selector "round-robin 0"
|
||||
# path_grouping_policy multibus
|
||||
# prio alua
|
||||
# path_checker readsector0
|
||||
# rr_min_io 100
|
||||
# max_fds 8192
|
||||
# rr_weight priorities
|
||||
# failback immediate
|
||||
# no_path_retry fail
|
||||
# user_friendly_names yes
|
||||
#}
|
||||
##
|
||||
## The wwid line in the following blacklist section is shown as an example
|
||||
## of how to blacklist devices by wwid. The 2 devnode lines are the
|
||||
## compiled in default blacklist. If you want to blacklist entire types
|
||||
## of devices, such as all scsi devices, you should use a devnode line.
|
||||
## However, if you want to blacklist specific devices, you should use
|
||||
## a wwid line. Since there is no guarantee that a specific device will
|
||||
## not change names on reboot (from /dev/sda to /dev/sdb for example)
|
||||
## devnode lines are not recommended for blacklisting specific devices.
|
||||
##
|
||||
#blacklist {
|
||||
# wwid 26353900f02796769
|
||||
# devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
|
||||
# devnode "^hd[a-z]"
|
||||
#}
|
||||
#multipaths {
|
||||
# multipath {
|
||||
# wwid 3600508b4000156d700012000000b0000
|
||||
# alias yellow
|
||||
# path_grouping_policy multibus
|
||||
# path_checker readsector0
|
||||
# path_selector "round-robin 0"
|
||||
# failback manual
|
||||
# rr_weight priorities
|
||||
# no_path_retry 5
|
||||
# }
|
||||
# multipath {
|
||||
# wwid 1DEC_____321816758474
|
||||
# alias red
|
||||
# }
|
||||
#}
|
||||
#devices {
|
||||
# device {
|
||||
# vendor "COMPAQ "
|
||||
# product "HSV110 (C)COMPAQ"
|
||||
# path_grouping_policy multibus
|
||||
# path_checker readsector0
|
||||
# path_selector "round-robin 0"
|
||||
# hardware_handler "0"
|
||||
# failback 15
|
||||
# rr_weight priorities
|
||||
# no_path_retry queue
|
||||
# }
|
||||
# device {
|
||||
# vendor "COMPAQ "
|
||||
# product "MSA1000 "
|
||||
# path_grouping_policy multibus
|
||||
# }
|
||||
#}
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue