Toshaan Bharvani
3 years ago
commit
a15df5898f
45 changed files with 7807 additions and 0 deletions
@ -0,0 +1,45 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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 @@
@@ -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,93 @@
@@ -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 |
||||
# } |
||||
#} |
Loading…
Reference in new issue