Toshaan Bharvani
3 years ago
commit
a15df5898f
45 changed files with 7807 additions and 0 deletions
@ -0,0 +1,45 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Xose Vazquez Perez <xose.vazquez@gmail.com> |
||||||
|
Date: Wed, 8 Sep 2021 22:33:54 +0200 |
||||||
|
Subject: [PATCH] multipath-tools: add info about IO affinity path selector to |
||||||
|
manpage |
||||||
|
|
||||||
|
Added in 5.11: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e4d2e82b2300b03f66b3ca8417590c86e661fab1 |
||||||
|
|
||||||
|
Cc: Mike Christie <michael.christie@oracle.com> |
||||||
|
Cc: Martin Wilck <mwilck@suse.com> |
||||||
|
Cc: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Cc: Christophe Varoqui <christophe.varoqui@opensvc.com> |
||||||
|
Cc: DM-DEVEL ML <dm-devel@redhat.com> |
||||||
|
Signed-off-by: Xose Vazquez Perez <xose.vazquez@gmail.com> |
||||||
|
|
||||||
|
Reviewed-by: Martin Wilck <mwilck@suse.com> |
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
multipath/multipath.conf.5 | 6 +++++- |
||||||
|
1 file changed, 5 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5 |
||||||
|
index d6b8c7f6..42a15ffd 100644 |
||||||
|
--- a/multipath/multipath.conf.5 |
||||||
|
+++ b/multipath/multipath.conf.5 |
||||||
|
@@ -6,7 +6,7 @@ |
||||||
|
.\" |
||||||
|
.\" ---------------------------------------------------------------------------- |
||||||
|
. |
||||||
|
-.TH MULTIPATH.CONF 5 2018-05-21 Linux |
||||||
|
+.TH MULTIPATH.CONF 5 2021-09-08 Linux |
||||||
|
. |
||||||
|
. |
||||||
|
.\" ---------------------------------------------------------------------------- |
||||||
|
@@ -210,6 +210,10 @@ of outstanding I/O to the path and its relative throughput. |
||||||
|
estimation of future service time based on the history of previous I/O submitted |
||||||
|
to each path. |
||||||
|
.TP |
||||||
|
+.I "io-affinity 0" |
||||||
|
+(Since 5.11 kernel) Choose the path for the next bunch of I/O based on a CPU to |
||||||
|
+path mapping the user passes in and what CPU we are executing on. |
||||||
|
+.TP |
||||||
|
The default is: \fBservice-time 0\fR |
||||||
|
.RE |
||||||
|
. |
@ -0,0 +1,52 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: lixiaokeng <lixiaokeng@huawei.com> |
||||||
|
Date: Mon, 13 Sep 2021 10:43:14 +0800 |
||||||
|
Subject: [PATCH] multipathd: fix missing persistent reseravtion for active |
||||||
|
path |
||||||
|
|
||||||
|
There are two paths(sucu as sda and adb) for one LUN. The two |
||||||
|
paths log in, but before the two uevents have been processed |
||||||
|
(for example there are many uevent), users use multipathd add |
||||||
|
path /dev/sda to cause mpatha and use mpathpersist -o -I to |
||||||
|
register prkey for mpatha. The add map uevent is after add path |
||||||
|
uevent, the the uevent(add sdb) will delay and missing persistent |
||||||
|
reseravtion check. |
||||||
|
|
||||||
|
Here, we add persistent reseravtion check in update_map() which |
||||||
|
is called ev_add_map(). |
||||||
|
|
||||||
|
Signed-off-by: Lixiaokeng <lixiaokeng@huawei.com> |
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
multipathd/main.c | 11 +++++++++++ |
||||||
|
1 file changed, 11 insertions(+) |
||||||
|
|
||||||
|
diff --git a/multipathd/main.c b/multipathd/main.c |
||||||
|
index 3aff241d..1defeaf1 100644 |
||||||
|
--- a/multipathd/main.c |
||||||
|
+++ b/multipathd/main.c |
||||||
|
@@ -490,6 +490,8 @@ update_map (struct multipath *mpp, struct vectors *vecs, int new_map) |
||||||
|
{ |
||||||
|
int retries = 3; |
||||||
|
char *params __attribute__((cleanup(cleanup_charp))) = NULL; |
||||||
|
+ struct path *pp; |
||||||
|
+ int i; |
||||||
|
|
||||||
|
retry: |
||||||
|
condlog(4, "%s: updating new map", mpp->alias); |
||||||
|
@@ -502,6 +504,15 @@ retry: |
||||||
|
verify_paths(mpp); |
||||||
|
mpp->action = ACT_RELOAD; |
||||||
|
|
||||||
|
+ if (mpp->prflag) { |
||||||
|
+ vector_foreach_slot(mpp->paths, pp, i) { |
||||||
|
+ if ((pp->state == PATH_UP) || (pp->state == PATH_GHOST)) { |
||||||
|
+ /* persistent reseravtion check*/ |
||||||
|
+ mpath_pr_event_handle(pp); |
||||||
|
+ } |
||||||
|
+ } |
||||||
|
+ } |
||||||
|
+ |
||||||
|
if (setup_map(mpp, ¶ms, vecs)) { |
||||||
|
condlog(0, "%s: failed to setup new map in update", mpp->alias); |
||||||
|
retries = -1; |
@ -0,0 +1,48 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Xose Vazquez Perez <xose.vazquez@gmail.com> |
||||||
|
Date: Thu, 16 Sep 2021 00:44:49 +0200 |
||||||
|
Subject: [PATCH] multipath-tools: minor fixes to multipath.conf.5 man page |
||||||
|
|
||||||
|
Cc: Martin Wilck <mwilck@suse.com> |
||||||
|
Cc: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Cc: Christophe Varoqui <christophe.varoqui@opensvc.com> |
||||||
|
Cc: DM-DEVEL ML <dm-devel@redhat.com> |
||||||
|
Signed-off-by: Xose Vazquez Perez <xose.vazquez@gmail.com> |
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
multipath/multipath.conf.5 | 6 +++--- |
||||||
|
1 file changed, 3 insertions(+), 3 deletions(-) |
||||||
|
|
||||||
|
diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5 |
||||||
|
index 42a15ffd..c74129bd 100644 |
||||||
|
--- a/multipath/multipath.conf.5 |
||||||
|
+++ b/multipath/multipath.conf.5 |
||||||
|
@@ -1,9 +1,9 @@ |
||||||
|
.\" ---------------------------------------------------------------------------- |
||||||
|
-.\" Update the date below if you make any significant change. |
||||||
|
.\" Make sure there are no errors with: |
||||||
|
.\" groff -z -wall -b -e -t multipath/multipath.conf.5 |
||||||
|
.\" man --warnings -E UTF-8 -l -Tutf8 -Z multipath/multipath.conf.5 >/dev/null |
||||||
|
.\" |
||||||
|
+.\" Update the date below if you make any significant change. |
||||||
|
.\" ---------------------------------------------------------------------------- |
||||||
|
. |
||||||
|
.TH MULTIPATH.CONF 5 2021-09-08 Linux |
||||||
|
@@ -189,7 +189,7 @@ The default is: \fB<system dependent>\fR |
||||||
|
.TP |
||||||
|
.B path_selector |
||||||
|
The default path selector algorithm to use; they are offered by the |
||||||
|
-kernel multipath target. There are three selector algorithms: |
||||||
|
+kernel multipath target: |
||||||
|
.RS |
||||||
|
.TP 12 |
||||||
|
.I "round-robin 0" |
||||||
|
@@ -206,7 +206,7 @@ of outstanding I/O to the path. |
||||||
|
of outstanding I/O to the path and its relative throughput. |
||||||
|
.TP |
||||||
|
.I "historical-service-time 0" |
||||||
|
-(Since 5.8 kernel) Choose the path for the next bunch of IOs based on the |
||||||
|
+(Since 5.8 kernel) Choose the path for the next bunch of I/O based on the |
||||||
|
estimation of future service time based on the history of previous I/O submitted |
||||||
|
to each path. |
||||||
|
.TP |
@ -0,0 +1,39 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Xose Vazquez Perez <xose.vazquez@gmail.com> |
||||||
|
Date: Sat, 25 Sep 2021 00:27:36 +0200 |
||||||
|
Subject: [PATCH] multipath-tools: make IBM/XIV config work with alua and |
||||||
|
multibus |
||||||
|
|
||||||
|
And add recommended pgfailback value. |
||||||
|
|
||||||
|
ALUA is supported since XIV_Gen2 and microcode 10.2.1 |
||||||
|
(All ports across all controllers in single Target Port Group) |
||||||
|
|
||||||
|
https://www.ibm.com/support/pages/ibm-flashsystem%C2%AE-a9000-and-a9000r-hyperswap-solution-deployment-linux%C2%AE-ibm-z-systems%C2%AE |
||||||
|
https://www.google.com/search?q=%222810XIV%22+%22path_grouping_policy%22+site%3Aibm.com |
||||||
|
|
||||||
|
Cc: Martin Wilck <mwilck@suse.com> |
||||||
|
Cc: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Cc: Christophe Varoqui <christophe.varoqui@opensvc.com> |
||||||
|
Cc: DM-DEVEL ML <dm-devel@redhat.com> |
||||||
|
Signed-off-by: Xose Vazquez Perez <xose.vazquez@gmail.com> |
||||||
|
Reviewed-by: Martin Wilck <mwilck@suse.com> |
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
libmultipath/hwtable.c | 3 ++- |
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c |
||||||
|
index 0caac0da..72f81c60 100644 |
||||||
|
--- a/libmultipath/hwtable.c |
||||||
|
+++ b/libmultipath/hwtable.c |
||||||
|
@@ -712,7 +712,8 @@ static struct hwentry default_hw[] = { |
||||||
|
.vendor = "(XIV|IBM)", |
||||||
|
.product = "(NEXTRA|2810XIV)", |
||||||
|
.no_path_retry = NO_PATH_RETRY_QUEUE, |
||||||
|
- .pgpolicy = MULTIBUS, |
||||||
|
+ .pgpolicy = GROUP_BY_PRIO, |
||||||
|
+ .pgfailback = 15, |
||||||
|
}, |
||||||
|
{ |
||||||
|
/* TMS RamSan / FlashSystem 710/720/810/820/840/900 */ |
@ -0,0 +1,32 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Luca BRUNO <luca.bruno@coreos.com> |
||||||
|
Date: Fri, 24 Sep 2021 09:34:01 +0000 |
||||||
|
Subject: [PATCH] multipathd.socket: add missing conditions from service unit |
||||||
|
|
||||||
|
This aligns 'multipathd' socket and service units, by adding the |
||||||
|
start conditions that are set on the service but not on the socket. |
||||||
|
It should help avoiding situations where the socket unit ends up |
||||||
|
marked as failed after hitting its retry-limit. |
||||||
|
|
||||||
|
Fixes: https://github.com/opensvc/multipath-tools/issues/15 |
||||||
|
Signed-off-by: Luca BRUNO <luca.bruno@coreos.com> |
||||||
|
Reviewed-by: Martin Wilck <mwilck@suse.com> |
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
multipathd/multipathd.socket | 3 +++ |
||||||
|
1 file changed, 3 insertions(+) |
||||||
|
|
||||||
|
diff --git a/multipathd/multipathd.socket b/multipathd/multipathd.socket |
||||||
|
index 0ed4a1f7..c777e5e3 100644 |
||||||
|
--- a/multipathd/multipathd.socket |
||||||
|
+++ b/multipathd/multipathd.socket |
||||||
|
@@ -1,6 +1,9 @@ |
||||||
|
[Unit] |
||||||
|
Description=multipathd control socket |
||||||
|
DefaultDependencies=no |
||||||
|
+ConditionKernelCommandLine=!nompath |
||||||
|
+ConditionKernelCommandLine=!multipath=off |
||||||
|
+ConditionVirtualization=!container |
||||||
|
Before=sockets.target |
||||||
|
|
||||||
|
[Socket] |
@ -0,0 +1,40 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Xose Vazquez Perez <xose.vazquez@gmail.com> |
||||||
|
Date: Tue, 28 Sep 2021 18:52:10 +0200 |
||||||
|
Subject: [PATCH] multipath-tools: make IBM/2107900 (DS8000) config work with |
||||||
|
alua and multibus |
||||||
|
|
||||||
|
ALUA is supported since the beginning: |
||||||
|
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/scsi/device_handler/scsi_dh_alua.c?id=057ea7c9683c3d684128cced796f03c179ecf1c2#n683 |
||||||
|
|
||||||
|
... the DS8000 is an Asymmetric Logical Unit Access (ALUA) capable storage array, |
||||||
|
pag#160(144): https://www.redbooks.ibm.com/redbooks/pdfs/sg248887.pdf |
||||||
|
|
||||||
|
kernel log: |
||||||
|
https://marc.info/?l=linux-scsi&m=156407413807511&q=mbox |
||||||
|
|
||||||
|
Cc: Martin Wilck <mwilck@suse.com> |
||||||
|
Cc: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Cc: Christophe Varoqui <christophe.varoqui@opensvc.com> |
||||||
|
Cc: DM-DEVEL ML <dm-devel@redhat.com> |
||||||
|
Signed-off-by: Xose Vazquez Perez <xose.vazquez@gmail.com> |
||||||
|
Reviewed-by: Martin Wilck <mwilck@suse.com> |
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
libmultipath/hwtable.c | 3 ++- |
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c |
||||||
|
index 72f81c60..f115c4f9 100644 |
||||||
|
--- a/libmultipath/hwtable.c |
||||||
|
+++ b/libmultipath/hwtable.c |
||||||
|
@@ -656,7 +656,8 @@ static struct hwentry default_hw[] = { |
||||||
|
.vendor = "IBM", |
||||||
|
.product = "^2107900", |
||||||
|
.no_path_retry = NO_PATH_RETRY_QUEUE, |
||||||
|
- .pgpolicy = MULTIBUS, |
||||||
|
+ .pgpolicy = GROUP_BY_PRIO, |
||||||
|
+ .pgfailback = -FAILBACK_IMMEDIATE, |
||||||
|
}, |
||||||
|
{ |
||||||
|
// Storwize V5000 and V7000 lines / SAN Volume Controller (SVC) / Flex System V7000 / |
@ -0,0 +1,35 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Xose Vazquez Perez <xose.vazquez@gmail.com> |
||||||
|
Date: Tue, 28 Sep 2021 19:20:59 +0200 |
||||||
|
Subject: [PATCH] multipath-tools: make EMC/SYMMETRIX config work with alua and |
||||||
|
multibus |
||||||
|
|
||||||
|
ALUA is supported since VMAX3 and HYPERMAX OS 5977.811.784, pag#113: |
||||||
|
https://www.delltechnologies.com/en-us/collaterals/unauth/technical-guides-support-information/products/storage-2/docu5128.pdf |
||||||
|
|
||||||
|
Cc: Martin Wilck <mwilck@suse.com> |
||||||
|
Cc: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Cc: Christophe Varoqui <christophe.varoqui@opensvc.com> |
||||||
|
Cc: DM-DEVEL ML <dm-devel@redhat.com> |
||||||
|
Signed-off-by: Xose Vazquez Perez <xose.vazquez@gmail.com> |
||||||
|
Reviewed-by: Martin Wilck <mwilck@suse.com> |
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
libmultipath/hwtable.c | 3 ++- |
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c |
||||||
|
index f115c4f9..7095aaf1 100644 |
||||||
|
--- a/libmultipath/hwtable.c |
||||||
|
+++ b/libmultipath/hwtable.c |
||||||
|
@@ -329,8 +329,9 @@ static struct hwentry default_hw[] = { |
||||||
|
/* Symmetrix / DMX / VMAX / PowerMax */ |
||||||
|
.vendor = "EMC", |
||||||
|
.product = "SYMMETRIX", |
||||||
|
- .pgpolicy = MULTIBUS, |
||||||
|
+ .pgpolicy = GROUP_BY_PRIO, |
||||||
|
.no_path_retry = 6, |
||||||
|
+ .pgfailback = -FAILBACK_IMMEDIATE, |
||||||
|
}, |
||||||
|
{ |
||||||
|
/* DGC CLARiiON CX/AX / VNX and Unity */ |
@ -0,0 +1,37 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Xose Vazquez Perez <xose.vazquez@gmail.com> |
||||||
|
Date: Tue, 28 Sep 2021 19:31:21 +0200 |
||||||
|
Subject: [PATCH] multipath-tools: make EMC/Invista config work with alua and |
||||||
|
multibus |
||||||
|
|
||||||
|
Optimal Path Management (OPM) was introduced with VPLEX 5.5 to improve VPLEX |
||||||
|
performance. OPM uses the ALUA mechanism to spread the I/O load across VPLEX directors |
||||||
|
while gaining cache locality, pag #187: |
||||||
|
https://www.delltechnologies.com/en-us/collaterals/unauth/technical-guides-support-information/products/storage-2/docu5128.pdf |
||||||
|
|
||||||
|
Cc: Martin Wilck <mwilck@suse.com> |
||||||
|
Cc: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Cc: Christophe Varoqui <christophe.varoqui@opensvc.com> |
||||||
|
Cc: DM-DEVEL ML <dm-devel@redhat.com> |
||||||
|
Signed-off-by: Xose Vazquez Perez <xose.vazquez@gmail.com> |
||||||
|
Reviewed-by: Martin Wilck <mwilck@suse.com> |
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
libmultipath/hwtable.c | 3 ++- |
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c |
||||||
|
index 7095aaf1..4e8b52ff 100644 |
||||||
|
--- a/libmultipath/hwtable.c |
||||||
|
+++ b/libmultipath/hwtable.c |
||||||
|
@@ -350,8 +350,9 @@ static struct hwentry default_hw[] = { |
||||||
|
.vendor = "EMC", |
||||||
|
.product = "Invista", |
||||||
|
.bl_product = "LUNZ", |
||||||
|
- .pgpolicy = MULTIBUS, |
||||||
|
+ .pgpolicy = GROUP_BY_PRIO, |
||||||
|
.no_path_retry = 5, |
||||||
|
+ .pgfailback = -FAILBACK_IMMEDIATE, |
||||||
|
}, |
||||||
|
{ |
||||||
|
/* XtremIO */ |
@ -0,0 +1,35 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Xose Vazquez Perez <xose.vazquez@gmail.com> |
||||||
|
Date: Tue, 28 Sep 2021 22:15:56 +0200 |
||||||
|
Subject: [PATCH] multipath-tools: make "COMPELNT/Compellent Vol" config work |
||||||
|
with alua and multibus |
||||||
|
|
||||||
|
ALUA is needed by SAS arrays, pag#124: |
||||||
|
https://downloads.dell.com/manuals/all-products/esuprt_solutions_int/esuprt_solutions_int_solutions_resources/general-solution-resources_white-papers2_en-us.pdf |
||||||
|
|
||||||
|
Cc: Sean McGinnis <sean_mcginnis@dell.com> |
||||||
|
Cc: Martin Wilck <mwilck@suse.com> |
||||||
|
Cc: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Cc: Christophe Varoqui <christophe.varoqui@opensvc.com> |
||||||
|
Cc: DM-DEVEL ML <dm-devel@redhat.com> |
||||||
|
Signed-off-by: Xose Vazquez Perez <xose.vazquez@gmail.com> |
||||||
|
Reviewed-by: Martin Wilck <mwilck@suse.com> |
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
libmultipath/hwtable.c | 3 ++- |
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c |
||||||
|
index 4e8b52ff..7fc5bc04 100644 |
||||||
|
--- a/libmultipath/hwtable.c |
||||||
|
+++ b/libmultipath/hwtable.c |
||||||
|
@@ -368,7 +368,8 @@ static struct hwentry default_hw[] = { |
||||||
|
*/ |
||||||
|
.vendor = "COMPELNT", |
||||||
|
.product = "Compellent Vol", |
||||||
|
- .pgpolicy = MULTIBUS, |
||||||
|
+ .pgpolicy = GROUP_BY_PRIO, |
||||||
|
+ .pgfailback = -FAILBACK_IMMEDIATE, |
||||||
|
.no_path_retry = NO_PATH_RETRY_QUEUE, |
||||||
|
}, |
||||||
|
{ |
@ -0,0 +1,35 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Xose Vazquez Perez <xose.vazquez@gmail.com> |
||||||
|
Date: Tue, 28 Sep 2021 22:39:17 +0200 |
||||||
|
Subject: [PATCH] multipath-tools: remove Compellent maintainer |
||||||
|
|
||||||
|
e-mail was bounced: 550 5.1.1 User Unknown |
||||||
|
|
||||||
|
Cc: Martin Wilck <mwilck@suse.com> |
||||||
|
Cc: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Cc: Christophe Varoqui <christophe.varoqui@opensvc.com> |
||||||
|
Cc: DM-DEVEL ML <dm-devel@redhat.com> |
||||||
|
Signed-off-by: Xose Vazquez Perez <xose.vazquez@gmail.com> |
||||||
|
Reviewed-by: Martin Wilck <mwilck@suse.com> |
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
libmultipath/hwtable.c | 6 +----- |
||||||
|
1 file changed, 1 insertion(+), 5 deletions(-) |
||||||
|
|
||||||
|
diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c |
||||||
|
index 7fc5bc04..763982cd 100644 |
||||||
|
--- a/libmultipath/hwtable.c |
||||||
|
+++ b/libmultipath/hwtable.c |
||||||
|
@@ -361,11 +361,7 @@ static struct hwentry default_hw[] = { |
||||||
|
.pgpolicy = MULTIBUS, |
||||||
|
}, |
||||||
|
{ |
||||||
|
- /* |
||||||
|
- * SC Series, formerly Compellent |
||||||
|
- * |
||||||
|
- * Maintainer: Sean McGinnis <sean_mcginnis@dell.com> |
||||||
|
- */ |
||||||
|
+ /* SC Series, formerly Compellent */ |
||||||
|
.vendor = "COMPELNT", |
||||||
|
.product = "Compellent Vol", |
||||||
|
.pgpolicy = GROUP_BY_PRIO, |
@ -0,0 +1,35 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Martin Wilck <mwilck@suse.com> |
||||||
|
Date: Wed, 20 Oct 2021 20:44:54 +0200 |
||||||
|
Subject: [PATCH] Revert "multipath-tools: make EMC/Invista config work with |
||||||
|
alua and multibus" |
||||||
|
|
||||||
|
This reverts commit 309ff281aaa07e862540d3d645a8263f3e9baaed. |
||||||
|
|
||||||
|
Mail from <Wayne.Berthiaume@dell.com>, 20210930: |
||||||
|
|
||||||
|
"OPM is no longer supported in the Dell VPLEX product. If we at Dell had |
||||||
|
wished to change the default device stanzas for any of our products they |
||||||
|
would have been done when the product and/or feature is released. |
||||||
|
Please remove this patch as well. It is not needed." |
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
libmultipath/hwtable.c | 3 +-- |
||||||
|
1 file changed, 1 insertion(+), 2 deletions(-) |
||||||
|
|
||||||
|
diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c |
||||||
|
index 763982cd..211087ad 100644 |
||||||
|
--- a/libmultipath/hwtable.c |
||||||
|
+++ b/libmultipath/hwtable.c |
||||||
|
@@ -350,9 +350,8 @@ static struct hwentry default_hw[] = { |
||||||
|
.vendor = "EMC", |
||||||
|
.product = "Invista", |
||||||
|
.bl_product = "LUNZ", |
||||||
|
- .pgpolicy = GROUP_BY_PRIO, |
||||||
|
+ .pgpolicy = MULTIBUS, |
||||||
|
.no_path_retry = 5, |
||||||
|
- .pgfailback = -FAILBACK_IMMEDIATE, |
||||||
|
}, |
||||||
|
{ |
||||||
|
/* XtremIO */ |
@ -0,0 +1,38 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Martin Wilck <mwilck@suse.com> |
||||||
|
Date: Wed, 20 Oct 2021 20:46:09 +0200 |
||||||
|
Subject: [PATCH] Revert "multipath-tools: make EMC/SYMMETRIX config work with |
||||||
|
alua and multibus" |
||||||
|
|
||||||
|
This reverts commit 831af0dbfa171cd39d968ba6174669f11a278be9. |
||||||
|
|
||||||
|
Mail from "berthiaume, wayne" <Wayne.Berthiaume@dell.com>, 210930: |
||||||
|
|
||||||
|
"As a representative of Dell I request this patch be withdrawn. If we had |
||||||
|
wanted the default stanza changed we would have already implemented it. |
||||||
|
Also for your information we only advertise the entire enterprise storage |
||||||
|
product line (DMX, VMAX, VMAX AFA, PowerMax) as SYMMETRIX in the VPD page. |
||||||
|
The ALUA capability is only used for mobility devices in an SRDF/Metro |
||||||
|
configuration and the current device stanza still works well in all of our |
||||||
|
testing." |
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
libmultipath/hwtable.c | 3 +-- |
||||||
|
1 file changed, 1 insertion(+), 2 deletions(-) |
||||||
|
|
||||||
|
diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c |
||||||
|
index 211087ad..a8ba28e3 100644 |
||||||
|
--- a/libmultipath/hwtable.c |
||||||
|
+++ b/libmultipath/hwtable.c |
||||||
|
@@ -329,9 +329,8 @@ static struct hwentry default_hw[] = { |
||||||
|
/* Symmetrix / DMX / VMAX / PowerMax */ |
||||||
|
.vendor = "EMC", |
||||||
|
.product = "SYMMETRIX", |
||||||
|
- .pgpolicy = GROUP_BY_PRIO, |
||||||
|
+ .pgpolicy = MULTIBUS, |
||||||
|
.no_path_retry = 6, |
||||||
|
- .pgfailback = -FAILBACK_IMMEDIATE, |
||||||
|
}, |
||||||
|
{ |
||||||
|
/* DGC CLARiiON CX/AX / VNX and Unity */ |
@ -0,0 +1,63 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Date: Thu, 13 Apr 2017 07:22:23 -0500 |
||||||
|
Subject: [PATCH] RH: fixup udev rules for redhat |
||||||
|
|
||||||
|
The multipath rules need to run after scsi_id is run. This means moving |
||||||
|
them after 60-persistent-storage.rules for redhat. Redhat also uses a |
||||||
|
different naming scheme for partitions than SuSE. |
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
Makefile.inc | 2 +- |
||||||
|
kpartx/kpartx.rules | 2 +- |
||||||
|
multipath/Makefile | 4 ++-- |
||||||
|
3 files changed, 4 insertions(+), 4 deletions(-) |
||||||
|
|
||||||
|
diff --git a/Makefile.inc b/Makefile.inc |
||||||
|
index d0ec9b44..2a75dc9c 100644 |
||||||
|
--- a/Makefile.inc |
||||||
|
+++ b/Makefile.inc |
||||||
|
@@ -55,7 +55,7 @@ endif |
||||||
|
prefix = |
||||||
|
exec_prefix = $(prefix) |
||||||
|
usr_prefix = $(prefix) |
||||||
|
-bindir = $(exec_prefix)/sbin |
||||||
|
+bindir = $(exec_prefix)/usr/sbin |
||||||
|
libudevdir = $(prefix)/$(SYSTEMDPATH)/udev |
||||||
|
udevrulesdir = $(libudevdir)/rules.d |
||||||
|
multipathdir = $(TOPDIR)/libmultipath |
||||||
|
diff --git a/kpartx/kpartx.rules b/kpartx/kpartx.rules |
||||||
|
index d7527d7d..0e0d70d5 100644 |
||||||
|
--- a/kpartx/kpartx.rules |
||||||
|
+++ b/kpartx/kpartx.rules |
||||||
|
@@ -36,6 +36,6 @@ LABEL="mpath_kpartx_end" |
||||||
|
GOTO="kpartx_end" |
||||||
|
|
||||||
|
LABEL="run_kpartx" |
||||||
|
-RUN+="/sbin/kpartx -un -p -part /dev/$name" |
||||||
|
+RUN+="/sbin/kpartx -un /dev/$name" |
||||||
|
|
||||||
|
LABEL="kpartx_end" |
||||||
|
diff --git a/multipath/Makefile b/multipath/Makefile |
||||||
|
index 0828a8f7..b9bbb3cf 100644 |
||||||
|
--- a/multipath/Makefile |
||||||
|
+++ b/multipath/Makefile |
||||||
|
@@ -24,7 +24,7 @@ install: |
||||||
|
$(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir)/ |
||||||
|
$(INSTALL_PROGRAM) -d $(DESTDIR)$(udevrulesdir) |
||||||
|
$(INSTALL_PROGRAM) -m 644 11-dm-mpath.rules $(DESTDIR)$(udevrulesdir) |
||||||
|
- $(INSTALL_PROGRAM) -m 644 $(EXEC).rules $(DESTDIR)$(libudevdir)/rules.d/56-multipath.rules |
||||||
|
+ $(INSTALL_PROGRAM) -m 644 $(EXEC).rules $(DESTDIR)$(libudevdir)/rules.d/62-multipath.rules |
||||||
|
$(INSTALL_PROGRAM) -d $(DESTDIR)$(man8dir) |
||||||
|
$(INSTALL_PROGRAM) -m 644 $(EXEC).8.gz $(DESTDIR)$(man8dir) |
||||||
|
$(INSTALL_PROGRAM) -d $(DESTDIR)$(man5dir) |
||||||
|
@@ -33,7 +33,7 @@ install: |
||||||
|
uninstall: |
||||||
|
$(RM) $(DESTDIR)$(bindir)/$(EXEC) |
||||||
|
$(RM) $(DESTDIR)$(udevrulesdir)/11-dm-mpath.rules |
||||||
|
- $(RM) $(DESTDIR)$(libudevdir)/rules.d/56-multipath.rules |
||||||
|
+ $(RM) $(DESTDIR)$(libudevdir)/rules.d/62-multipath.rules |
||||||
|
$(RM) $(DESTDIR)$(man8dir)/$(EXEC).8.gz |
||||||
|
$(RM) $(DESTDIR)$(man5dir)/$(EXEC).conf.5.gz |
||||||
|
|
@ -0,0 +1,101 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Date: Wed, 2 Jul 2014 12:49:53 -0500 |
||||||
|
Subject: [PATCH] RH: Remove the property blacklist exception builtin |
||||||
|
|
||||||
|
Multipath set the default property blacklist exceptions to |
||||||
|
(ID_SCSI_VPD|ID_WWN). This has the effect of blacklisting some internal |
||||||
|
devices. These devices may never have multiple paths, but it is nice |
||||||
|
to be able to set multipath up on them all the same. This patch simply |
||||||
|
removes the default, and makes it so that if no property |
||||||
|
blacklist_exception is given, then devices aren't failed for not matching |
||||||
|
it. |
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
libmultipath/blacklist.c | 6 ++---- |
||||||
|
multipath/multipath.conf.5 | 11 ++++++----- |
||||||
|
tests/blacklist.c | 7 ++----- |
||||||
|
3 files changed, 10 insertions(+), 14 deletions(-) |
||||||
|
|
||||||
|
diff --git a/libmultipath/blacklist.c b/libmultipath/blacklist.c |
||||||
|
index 4e315c97..1e463ef6 100644 |
||||||
|
--- a/libmultipath/blacklist.c |
||||||
|
+++ b/libmultipath/blacklist.c |
||||||
|
@@ -202,9 +202,6 @@ setup_default_blist (struct config * conf) |
||||||
|
if (store_ble(conf->blist_devnode, "!^(sd[a-z]|dasd[a-z]|nvme[0-9])", ORIGIN_DEFAULT)) |
||||||
|
return 1; |
||||||
|
|
||||||
|
- if (store_ble(conf->elist_property, "(SCSI_IDENT_|ID_WWN)", ORIGIN_DEFAULT)) |
||||||
|
- return 1; |
||||||
|
- |
||||||
|
vector_foreach_slot (conf->hwtable, hwe, i) { |
||||||
|
if (hwe->bl_product) { |
||||||
|
if (find_blacklist_device(conf->blist_device, |
||||||
|
@@ -410,7 +407,8 @@ filter_property(const struct config *conf, struct udev_device *udev, |
||||||
|
*uid_attribute != '\0'; |
||||||
|
bool uid_attr_seen = false; |
||||||
|
|
||||||
|
- r = MATCH_PROPERTY_BLIST_MISSING; |
||||||
|
+ if (VECTOR_SIZE(conf->elist_property)) |
||||||
|
+ r = MATCH_PROPERTY_BLIST_MISSING; |
||||||
|
udev_list_entry_foreach(list_entry, |
||||||
|
udev_device_get_properties_list_entry(udev)) { |
||||||
|
|
||||||
|
diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5 |
||||||
|
index c74129bd..dd9f4dc7 100644 |
||||||
|
--- a/multipath/multipath.conf.5 |
||||||
|
+++ b/multipath/multipath.conf.5 |
||||||
|
@@ -1351,9 +1351,14 @@ keywords. Both are regular expressions. For a full description of these keywords |
||||||
|
Regular expression for an udev property. All |
||||||
|
devices that have matching udev properties will be excluded/included. |
||||||
|
The handling of the \fIproperty\fR keyword is special, |
||||||
|
-because devices \fBmust\fR have at least one whitelisted udev property; |
||||||
|
+because if a property blacklist_exception is set, devices \fBmust\fR have at |
||||||
|
+least one whitelisted udev property; |
||||||
|
otherwise they're treated as blacklisted, and the message |
||||||
|
"\fIblacklisted, udev property missing\fR" is displayed in the logs. |
||||||
|
+For example, setting the property blacklist_exception to |
||||||
|
+\fB(SCSI_IDENT_|ID_WWN)\fR, will cause well-behaved SCSI devices and devices |
||||||
|
+that provide a WWN (World Wide Number) to be included, and all others to be |
||||||
|
+excluded. This works to exclude most non-multipathable devices. |
||||||
|
. |
||||||
|
.RS |
||||||
|
.PP |
||||||
|
@@ -1364,10 +1369,6 @@ Blacklisting by missing properties is only applied to devices which do have the |
||||||
|
property specified by \fIuid_attribute\fR (e.g. \fIID_SERIAL\fR) |
||||||
|
set. Previously, it was applied to every device, possibly causing devices to be |
||||||
|
blacklisted because of temporary I/O error conditions. |
||||||
|
-.PP |
||||||
|
-The default \fIblacklist exception\fR is: \fB(SCSI_IDENT_|ID_WWN)\fR, causing |
||||||
|
-well-behaved SCSI devices and devices that provide a WWN (World Wide Number) |
||||||
|
-to be included, and all others to be excluded. |
||||||
|
.RE |
||||||
|
.TP |
||||||
|
.B protocol |
||||||
|
diff --git a/tests/blacklist.c b/tests/blacklist.c |
||||||
|
index 882aa3a1..6a22b660 100644 |
||||||
|
--- a/tests/blacklist.c |
||||||
|
+++ b/tests/blacklist.c |
||||||
|
@@ -375,9 +375,8 @@ static void test_property_missing(void **state) |
||||||
|
{ |
||||||
|
static struct udev_device udev = { "sdb", { "ID_FOO", "ID_BAZ", "ID_BAR", "ID_SERIAL", NULL } }; |
||||||
|
conf.blist_property = blist_property_wwn; |
||||||
|
- expect_condlog(3, "sdb: blacklisted, udev property missing\n"); |
||||||
|
assert_int_equal(filter_property(&conf, &udev, 3, "ID_SERIAL"), |
||||||
|
- MATCH_PROPERTY_BLIST_MISSING); |
||||||
|
+ MATCH_NOTHING); |
||||||
|
assert_int_equal(filter_property(&conf, &udev, 3, "ID_BLAH"), |
||||||
|
MATCH_NOTHING); |
||||||
|
assert_int_equal(filter_property(&conf, &udev, 3, ""), |
||||||
|
@@ -469,9 +468,7 @@ static void test_filter_path_missing1(void **state) |
||||||
|
conf.blist_device = blist_device_foo_bar; |
||||||
|
conf.blist_protocol = blist_protocol_fcp; |
||||||
|
conf.blist_wwid = blist_wwid_xyzzy; |
||||||
|
- expect_condlog(3, "sdb: blacklisted, udev property missing\n"); |
||||||
|
- assert_int_equal(filter_path(&conf, &miss1_pp), |
||||||
|
- MATCH_PROPERTY_BLIST_MISSING); |
||||||
|
+ assert_int_equal(filter_path(&conf, &miss1_pp), MATCH_NOTHING); |
||||||
|
} |
||||||
|
|
||||||
|
/* This one matches the property whitelist, to test the other missing |
@ -0,0 +1,107 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Date: Wed, 15 Oct 2014 10:39:30 -0500 |
||||||
|
Subject: [PATCH] RH: don't start without a config file |
||||||
|
|
||||||
|
If /etc/multipath.conf doesn't exist, don't start multipathd and blacklist |
||||||
|
all devices when running multipath. A completely blank configuration file |
||||||
|
is almost never what users want. Also, people may have the multipath |
||||||
|
packages installed but don't want to use them. This patch provides a |
||||||
|
simple way to disable multipath. Simply removing or renaming |
||||||
|
/etc/multipath.conf will keep multipath from doing anything. |
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
libmultipath/config.c | 13 +++++++++++++ |
||||||
|
libmultipath/config.h | 1 + |
||||||
|
multipath/multipath.rules | 1 + |
||||||
|
multipathd/multipathd.8 | 2 ++ |
||||||
|
multipathd/multipathd.service | 1 + |
||||||
|
multipathd/multipathd.socket | 1 + |
||||||
|
6 files changed, 19 insertions(+) |
||||||
|
|
||||||
|
diff --git a/libmultipath/config.c b/libmultipath/config.c |
||||||
|
index 30046a17..5f35c3d3 100644 |
||||||
|
--- a/libmultipath/config.c |
||||||
|
+++ b/libmultipath/config.c |
||||||
|
@@ -895,6 +895,19 @@ int _init_config (const char *file, struct config *conf) |
||||||
|
goto out; |
||||||
|
} |
||||||
|
factorize_hwtable(conf->hwtable, builtin_hwtable_size, file); |
||||||
|
+ } else { |
||||||
|
+ condlog(0, "/etc/multipath.conf does not exist, blacklisting all devices."); |
||||||
|
+ if (conf->blist_devnode == NULL) { |
||||||
|
+ conf->blist_devnode = vector_alloc(); |
||||||
|
+ if (!conf->blist_devnode) { |
||||||
|
+ condlog(0, "cannot allocate blacklist\n"); |
||||||
|
+ goto out; |
||||||
|
+ } |
||||||
|
+ } |
||||||
|
+ if (store_ble(conf->blist_devnode, ".*", ORIGIN_NO_CONFIG)) { |
||||||
|
+ condlog(0, "cannot store default no-config blacklist\n"); |
||||||
|
+ goto out; |
||||||
|
+ } |
||||||
|
} |
||||||
|
|
||||||
|
conf->processed_main_config = 1; |
||||||
|
diff --git a/libmultipath/config.h b/libmultipath/config.h |
||||||
|
index 933fe0d1..5f01c1fc 100644 |
||||||
|
--- a/libmultipath/config.h |
||||||
|
+++ b/libmultipath/config.h |
||||||
|
@@ -9,6 +9,7 @@ |
||||||
|
|
||||||
|
#define ORIGIN_DEFAULT 0 |
||||||
|
#define ORIGIN_CONFIG 1 |
||||||
|
+#define ORIGIN_NO_CONFIG 2 |
||||||
|
|
||||||
|
enum devtypes { |
||||||
|
DEV_NONE, |
||||||
|
diff --git a/multipath/multipath.rules b/multipath/multipath.rules |
||||||
|
index 9df11a95..0486bf70 100644 |
||||||
|
--- a/multipath/multipath.rules |
||||||
|
+++ b/multipath/multipath.rules |
||||||
|
@@ -9,6 +9,7 @@ IMPORT{cmdline}="nompath" |
||||||
|
ENV{nompath}=="?*", GOTO="end_mpath" |
||||||
|
IMPORT{cmdline}="multipath" |
||||||
|
ENV{multipath}=="off", GOTO="end_mpath" |
||||||
|
+TEST!="/etc/multipath.conf", GOTO="end_mpath" |
||||||
|
|
||||||
|
ENV{DEVTYPE}!="partition", GOTO="test_dev" |
||||||
|
IMPORT{parent}="DM_MULTIPATH_DEVICE_PATH" |
||||||
|
diff --git a/multipathd/multipathd.8 b/multipathd/multipathd.8 |
||||||
|
index 048a838d..8bd47a80 100644 |
||||||
|
--- a/multipathd/multipathd.8 |
||||||
|
+++ b/multipathd/multipathd.8 |
||||||
|
@@ -39,6 +39,8 @@ map regains its maximum performance and redundancy. |
||||||
|
This daemon executes the external \fBmultipath\fR tool when events occur. |
||||||
|
In turn, the multipath tool signals the multipathd daemon when it is done with |
||||||
|
devmap reconfiguration, so that it can refresh its failed path list. |
||||||
|
+ |
||||||
|
+In this Linux distribution, multipathd does not run unless a /etc/multipath.conf file exists. |
||||||
|
. |
||||||
|
. |
||||||
|
.\" ---------------------------------------------------------------------------- |
||||||
|
diff --git a/multipathd/multipathd.service b/multipathd/multipathd.service |
||||||
|
index 0b2ac814..6d57c7e8 100644 |
||||||
|
--- a/multipathd/multipathd.service |
||||||
|
+++ b/multipathd/multipathd.service |
||||||
|
@@ -4,6 +4,7 @@ Wants=systemd-udev-trigger.service systemd-udev-settle.service |
||||||
|
Before=iscsi.service iscsid.service lvm2-activation-early.service |
||||||
|
Before=local-fs-pre.target blk-availability.service shutdown.target |
||||||
|
After=multipathd.socket systemd-udev-trigger.service systemd-udev-settle.service |
||||||
|
+ConditionPathExists=/etc/multipath.conf |
||||||
|
DefaultDependencies=no |
||||||
|
Conflicts=shutdown.target |
||||||
|
ConditionKernelCommandLine=!nompath |
||||||
|
diff --git a/multipathd/multipathd.socket b/multipathd/multipathd.socket |
||||||
|
index c777e5e3..3c20a2ff 100644 |
||||||
|
--- a/multipathd/multipathd.socket |
||||||
|
+++ b/multipathd/multipathd.socket |
||||||
|
@@ -1,6 +1,7 @@ |
||||||
|
[Unit] |
||||||
|
Description=multipathd control socket |
||||||
|
DefaultDependencies=no |
||||||
|
+ConditionPathExists=/etc/multipath.conf |
||||||
|
ConditionKernelCommandLine=!nompath |
||||||
|
ConditionKernelCommandLine=!multipath=off |
||||||
|
ConditionVirtualization=!container |
@ -0,0 +1,26 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Date: Fri, 25 Jan 2019 14:54:56 -0600 |
||||||
|
Subject: [PATCH] RH: Fix nvme function missing argument |
||||||
|
|
||||||
|
A future patch will change the compilation options to error when |
||||||
|
function declarations have unspecified arguments. |
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
libmultipath/nvme/argconfig.h | 2 +- |
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/libmultipath/nvme/argconfig.h b/libmultipath/nvme/argconfig.h |
||||||
|
index adb192b6..bfd10ef8 100644 |
||||||
|
--- a/libmultipath/nvme/argconfig.h |
||||||
|
+++ b/libmultipath/nvme/argconfig.h |
||||||
|
@@ -76,7 +76,7 @@ struct argconfig_commandline_options { |
||||||
|
extern "C" { |
||||||
|
#endif |
||||||
|
|
||||||
|
-typedef void argconfig_help_func(); |
||||||
|
+typedef void argconfig_help_func(void); |
||||||
|
void argconfig_append_usage(const char *str); |
||||||
|
void argconfig_print_help(const char *program_desc, |
||||||
|
const struct argconfig_commandline_options *options); |
@ -0,0 +1,66 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Date: Wed, 19 Apr 2017 06:10:01 -0500 |
||||||
|
Subject: [PATCH] RH: use rpm optflags if present |
||||||
|
|
||||||
|
Use the passed in optflags when compiling as an RPM, and keep the |
||||||
|
default flags as close as possible to the current fedora flags, while |
||||||
|
still being generic. |
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
Makefile.inc | 26 +++++++++++++++++++------- |
||||||
|
1 file changed, 19 insertions(+), 7 deletions(-) |
||||||
|
|
||||||
|
diff --git a/Makefile.inc b/Makefile.inc |
||||||
|
index 2a75dc9c..5ac660de 100644 |
||||||
|
--- a/Makefile.inc |
||||||
|
+++ b/Makefile.inc |
||||||
|
@@ -92,23 +92,35 @@ TEST_CC_OPTION = $(shell \ |
||||||
|
echo "$(2)"; \ |
||||||
|
fi) |
||||||
|
|
||||||
|
-STACKPROT := $(call TEST_CC_OPTION,-fstack-protector-strong,-fstack-protector) |
||||||
|
ERROR_DISCARDED_QUALIFIERS := $(call TEST_CC_OPTION,-Werror=discarded-qualifiers,) |
||||||
|
WNOCLOBBERED := $(call TEST_CC_OPTION,-Wno-clobbered -Wno-error=clobbered,) |
||||||
|
WFORMATOVERFLOW := $(call TEST_CC_OPTION,-Wformat-overflow=2,) |
||||||
|
|
||||||
|
-OPTFLAGS := -O2 -g $(STACKPROT) --param=ssp-buffer-size=4 |
||||||
|
-WARNFLAGS := -Werror -Wall -Wextra -Wformat=2 $(WFORMATOVERFLOW) -Werror=implicit-int \ |
||||||
|
+ifndef RPM_OPT_FLAGS |
||||||
|
+ STACKPROT := $(call TEST_CC_OPTION,-fstack-protector-strong,-fstack-protector) |
||||||
|
+ OPTFLAGS := -O2 -g -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions \ |
||||||
|
+ $(STACKPROT) -grecord-gcc-switches \ |
||||||
|
+ -fasynchronous-unwind-tables --param=ssp-buffer-size=4 |
||||||
|
+ ifeq ($(shell test -f /usr/lib/rpm/redhat/redhat-hardened-cc1 && echo 1),1) |
||||||
|
+ OPTFLAGS += -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 |
||||||
|
+ endif |
||||||
|
+ ifeq ($(shell test -f /usr/lib/rpm/redhat/redhat-annobin-cc1 && echo 1),1) |
||||||
|
+ OPTFLAGS += -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 |
||||||
|
+ endif |
||||||
|
+else |
||||||
|
+ OPTFLAGS := $(RPM_OPT_FLAGS) --param=ssp-buffer-size=4 |
||||||
|
+endif |
||||||
|
+WARNFLAGS := -Werror -Wextra -Wformat=2 $(WFORMATOVERFLOW) -Werror=implicit-int \ |
||||||
|
-Werror=implicit-function-declaration -Werror=format-security \ |
||||||
|
- $(WNOCLOBBERED) -Werror=cast-qual $(ERROR_DISCARDED_QUALIFIERS) |
||||||
|
-CPPFLAGS := -Wp,-D_FORTIFY_SOURCE=2 |
||||||
|
+ $(WNOCLOBBERED) -Werror=cast-qual $(ERROR_DISCARDED_QUALIFIERS) \ |
||||||
|
+ -Wstrict-prototypes |
||||||
|
CFLAGS := --std=gnu99 $(CFLAGS) $(OPTFLAGS) $(WARNFLAGS) -pipe \ |
||||||
|
-DBIN_DIR=\"$(bindir)\" -DLIB_STRING=\"${LIB}\" -DRUN_DIR=\"${RUN}\" \ |
||||||
|
-MMD -MP |
||||||
|
BIN_CFLAGS = -fPIE -DPIE |
||||||
|
LIB_CFLAGS = -fPIC |
||||||
|
SHARED_FLAGS = -shared |
||||||
|
-LDFLAGS := $(LDFLAGS) -Wl,-z,relro -Wl,-z,now -Wl,-z,defs |
||||||
|
+LDFLAGS := $(LDFLAGS) $(RPM_LD_FLAGS) -Wl,-z,relro -Wl,-z,now -Wl,-z,defs |
||||||
|
BIN_LDFLAGS = -pie |
||||||
|
|
||||||
|
# Check whether a function with name $1 has been declared in header file $2. |
||||||
|
@@ -139,4 +151,4 @@ check_file = $(shell \ |
||||||
|
|
||||||
|
%.o: %.c |
||||||
|
@echo building $@ because of $? |
||||||
|
- $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $< |
||||||
|
+ $(CC) $(CFLAGS) -c -o $@ $< |
@ -0,0 +1,772 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Date: Thu, 16 Oct 2014 15:49:01 -0500 |
||||||
|
Subject: [PATCH] RH: add mpathconf |
||||||
|
|
||||||
|
mpathconf is a program (largely based on lvmcomf) to help users |
||||||
|
configure /etc/multipath.conf and enable or disable multipathing. It |
||||||
|
has a couple of built-in options that can be set directly from the |
||||||
|
command line. But, mostly it is used to get a multipath.conf file |
||||||
|
with the OS defaults, and to enable and disable multipathing via |
||||||
|
a single command. |
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
libmultipath/config.c | 2 + |
||||||
|
multipath/Makefile | 5 + |
||||||
|
multipath/mpathconf | 556 ++++++++++++++++++++++++++++++++++++++++++ |
||||||
|
multipath/mpathconf.8 | 135 ++++++++++ |
||||||
|
4 files changed, 698 insertions(+) |
||||||
|
create mode 100644 multipath/mpathconf |
||||||
|
create mode 100644 multipath/mpathconf.8 |
||||||
|
|
||||||
|
diff --git a/libmultipath/config.c b/libmultipath/config.c |
||||||
|
index 5f35c3d3..cee3bbb7 100644 |
||||||
|
--- a/libmultipath/config.c |
||||||
|
+++ b/libmultipath/config.c |
||||||
|
@@ -897,6 +897,8 @@ int _init_config (const char *file, struct config *conf) |
||||||
|
factorize_hwtable(conf->hwtable, builtin_hwtable_size, file); |
||||||
|
} else { |
||||||
|
condlog(0, "/etc/multipath.conf does not exist, blacklisting all devices."); |
||||||
|
+ condlog(0, "You can run \"/sbin/mpathconf --enable\" to create"); |
||||||
|
+ condlog(0, "/etc/multipath.conf. See man mpathconf(8) for more details"); |
||||||
|
if (conf->blist_devnode == NULL) { |
||||||
|
conf->blist_devnode = vector_alloc(); |
||||||
|
if (!conf->blist_devnode) { |
||||||
|
diff --git a/multipath/Makefile b/multipath/Makefile |
||||||
|
index b9bbb3cf..e720c7f6 100644 |
||||||
|
--- a/multipath/Makefile |
||||||
|
+++ b/multipath/Makefile |
||||||
|
@@ -18,10 +18,12 @@ $(EXEC): $(OBJS) $(multipathdir)/libmultipath.so $(mpathcmddir)/libmpathcmd.so |
||||||
|
$(CC) $(CFLAGS) $(OBJS) -o $(EXEC) $(LDFLAGS) $(LIBDEPS) |
||||||
|
$(GZIP) $(EXEC).8 > $(EXEC).8.gz |
||||||
|
$(GZIP) $(EXEC).conf.5 > $(EXEC).conf.5.gz |
||||||
|
+ $(GZIP) mpathconf.8 > mpathconf.8.gz |
||||||
|
|
||||||
|
install: |
||||||
|
$(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir) |
||||||
|
$(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir)/ |
||||||
|
+ $(INSTALL_PROGRAM) -m 755 mpathconf $(DESTDIR)$(bindir)/ |
||||||
|
$(INSTALL_PROGRAM) -d $(DESTDIR)$(udevrulesdir) |
||||||
|
$(INSTALL_PROGRAM) -m 644 11-dm-mpath.rules $(DESTDIR)$(udevrulesdir) |
||||||
|
$(INSTALL_PROGRAM) -m 644 $(EXEC).rules $(DESTDIR)$(libudevdir)/rules.d/62-multipath.rules |
||||||
|
@@ -29,13 +31,16 @@ install: |
||||||
|
$(INSTALL_PROGRAM) -m 644 $(EXEC).8.gz $(DESTDIR)$(man8dir) |
||||||
|
$(INSTALL_PROGRAM) -d $(DESTDIR)$(man5dir) |
||||||
|
$(INSTALL_PROGRAM) -m 644 $(EXEC).conf.5.gz $(DESTDIR)$(man5dir) |
||||||
|
+ $(INSTALL_PROGRAM) -m 644 mpathconf.8.gz $(DESTDIR)$(man8dir) |
||||||
|
|
||||||
|
uninstall: |
||||||
|
$(RM) $(DESTDIR)$(bindir)/$(EXEC) |
||||||
|
$(RM) $(DESTDIR)$(udevrulesdir)/11-dm-mpath.rules |
||||||
|
$(RM) $(DESTDIR)$(libudevdir)/rules.d/62-multipath.rules |
||||||
|
+ $(RM) $(DESTDIR)$(bindir)/mpathconf |
||||||
|
$(RM) $(DESTDIR)$(man8dir)/$(EXEC).8.gz |
||||||
|
$(RM) $(DESTDIR)$(man5dir)/$(EXEC).conf.5.gz |
||||||
|
+ $(RM) $(DESTDIR)$(man8dir)/mpathconf.8.gz |
||||||
|
|
||||||
|
clean: dep_clean |
||||||
|
$(RM) core *.o $(EXEC) *.gz |
||||||
|
diff --git a/multipath/mpathconf b/multipath/mpathconf |
||||||
|
new file mode 100644 |
||||||
|
index 00000000..c00d2555 |
||||||
|
--- /dev/null |
||||||
|
+++ b/multipath/mpathconf |
||||||
|
@@ -0,0 +1,556 @@ |
||||||
|
+#!/bin/bash |
||||||
|
+# |
||||||
|
+# Copyright (C) 2010 Red Hat, Inc. All rights reserved. |
||||||
|
+# |
||||||
|
+# This file is part of the device-mapper-multipath package. |
||||||
|
+# |
||||||
|
+# This copyrighted material is made available to anyone wishing to use, |
||||||
|
+# modify, copy, or redistribute it subject to the terms and conditions |
||||||
|
+# of the GNU General Public License v.2. |
||||||
|
+# |
||||||
|
+# You should have received a copy of the GNU General Public License |
||||||
|
+# along with this program; if not, write to the Free Software Foundation, |
||||||
|
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||||||
|
+ |
||||||
|
+# |
||||||
|
+# Simple editting of /etc/multipath.conf |
||||||
|
+# This program was largely ripped off from lvmconf |
||||||
|
+# |
||||||
|
+ |
||||||
|
+unset ENABLE FIND FRIENDLY PROPERTY FOREIGN MODULE MULTIPATHD HAVE_DISABLE HAVE_WWID_DISABLE HAVE_FIND HAVE_BLACKLIST HAVE_EXCEPTIONS HAVE_DEFAULTS HAVE_FRIENDLY HAVE_PROPERTY HAVE_FOREIGN HAVE_MULTIPATHD HAVE_MODULE HAVE_OUTFILE SHOW_STATUS CHANGED_CONFIG WWID_LIST |
||||||
|
+ |
||||||
|
+DEFAULT_CONFIG="# device-mapper-multipath configuration file |
||||||
|
+ |
||||||
|
+# For a complete list of the default configuration values, run either: |
||||||
|
+# # multipath -t |
||||||
|
+# or |
||||||
|
+# # multipathd show config |
||||||
|
+ |
||||||
|
+# For a list of configuration options with descriptions, see the |
||||||
|
+# multipath.conf man page. |
||||||
|
+ |
||||||
|
+defaults { |
||||||
|
+ user_friendly_names yes |
||||||
|
+ find_multipaths yes |
||||||
|
+}" |
||||||
|
+ |
||||||
|
+CONFIGFILE="/etc/multipath.conf" |
||||||
|
+OUTPUTFILE="/etc/multipath.conf" |
||||||
|
+MULTIPATHDIR="/etc/multipath" |
||||||
|
+TMPFILE="/etc/multipath/.multipath.conf.tmp" |
||||||
|
+WWIDS=0 |
||||||
|
+ |
||||||
|
+function usage |
||||||
|
+{ |
||||||
|
+ echo "usage: $0 <command>" |
||||||
|
+ echo "" |
||||||
|
+ echo "Commands:" |
||||||
|
+ echo "Enable: --enable " |
||||||
|
+ echo "Disable: --disable" |
||||||
|
+ echo "Only allow certain wwids (instead of enable): --allow <WWID>" |
||||||
|
+ echo "Set user_friendly_names (Default y): --user_friendly_names <y|n>" |
||||||
|
+ echo "Set find_multipaths (Default y): --find_multipaths <yes|no|strict|greedy|smart>" |
||||||
|
+ echo "Set default property blacklist (Default n): --property_blacklist <y|n>" |
||||||
|
+ echo "Set enable_foreign to show foreign devices (Default n): --enable_foreign <y|n>" |
||||||
|
+ echo "Load the dm-multipath modules on enable (Default y): --with_module <y|n>" |
||||||
|
+ echo "start/stop/reload multipathd (Default n): --with_multipathd <y|n>" |
||||||
|
+ echo "select output file (Default /etc/multipath.conf): --outfile <FILE>" |
||||||
|
+ echo "" |
||||||
|
+} |
||||||
|
+ |
||||||
|
+function add_wwid |
||||||
|
+{ |
||||||
|
+ INDEX=0 |
||||||
|
+ while [ "$INDEX" -lt "$WWIDS" ] ; do |
||||||
|
+ if [ "$1" = "${WWID_LIST[$INDEX]}" ] ; then |
||||||
|
+ return |
||||||
|
+ fi |
||||||
|
+ ((INDEX++)) |
||||||
|
+ done |
||||||
|
+ WWID_LIST[$WWIDS]="$1" |
||||||
|
+ ((WWIDS++)) |
||||||
|
+} |
||||||
|
+ |
||||||
|
+function get_dm_deps |
||||||
|
+{ |
||||||
|
+ shift 3 |
||||||
|
+ while [ -n "$1" -a -n "$2" ]; do |
||||||
|
+ MAJOR=$(echo $1 | tr -d '(,') |
||||||
|
+ MINOR=$(echo $2 | tr -d ')') |
||||||
|
+ UUID=`dmsetup info -c --noheadings -o uuid -j $MAJOR -m $MINOR 2> /dev/null` |
||||||
|
+ if [ -n "$UUID" ] ; then |
||||||
|
+ set_dm_wwid $UUID |
||||||
|
+ fi |
||||||
|
+ shift 2 |
||||||
|
+ done |
||||||
|
+} |
||||||
|
+ |
||||||
|
+function set_dm_wwid |
||||||
|
+{ |
||||||
|
+ if [[ "$1" =~ ^part[[:digit:]]+-mpath- ]] ; then |
||||||
|
+ add_wwid "${1##part*-mpath-}" |
||||||
|
+ elif [[ "$1" =~ ^mpath- ]] ; then |
||||||
|
+ add_wwid "${1##mpath-}" |
||||||
|
+ else |
||||||
|
+ get_dm_deps `dmsetup deps -u $1` |
||||||
|
+ fi |
||||||
|
+} |
||||||
|
+ |
||||||
|
+function set_wwid |
||||||
|
+{ |
||||||
|
+ UUID="" |
||||||
|
+ if [[ "$1" =~ ^[[:digit:]]+:[[:digit:]]+$ ]] ; then |
||||||
|
+ MAJOR=${1%%:*} |
||||||
|
+ MINOR=${1##*:} |
||||||
|
+ UUID=`dmsetup info -c --noheadings -o uuid -j $MAJOR -m $MINOR 2> /dev/null` |
||||||
|
+ else |
||||||
|
+ UUID=`dmsetup info -c --noheadings -o uuid $1 2> /dev/null` |
||||||
|
+ fi |
||||||
|
+ if [ -n "$UUID" ] ; then |
||||||
|
+ set_dm_wwid $UUID |
||||||
|
+ else |
||||||
|
+ add_wwid "$1" |
||||||
|
+ fi |
||||||
|
+} |
||||||
|
+ |
||||||
|
+function parse_args |
||||||
|
+{ |
||||||
|
+ while [ -n "$1" ]; do |
||||||
|
+ case $1 in |
||||||
|
+ --enable) |
||||||
|
+ ENABLE=1 |
||||||
|
+ shift |
||||||
|
+ ;; |
||||||
|
+ --disable) |
||||||
|
+ ENABLE=0 |
||||||
|
+ shift |
||||||
|
+ ;; |
||||||
|
+ --allow) |
||||||
|
+ ENABLE=2 |
||||||
|
+ if [ -n "$2" ]; then |
||||||
|
+ set_wwid $2 |
||||||
|
+ shift 2 |
||||||
|
+ else |
||||||
|
+ usage |
||||||
|
+ exit 1 |
||||||
|
+ fi |
||||||
|
+ ;; |
||||||
|
+ --user_friendly_names) |
||||||
|
+ if [ -n "$2" ]; then |
||||||
|
+ FRIENDLY=$2 |
||||||
|
+ shift 2 |
||||||
|
+ else |
||||||
|
+ usage |
||||||
|
+ exit 1 |
||||||
|
+ fi |
||||||
|
+ ;; |
||||||
|
+ --find_multipaths) |
||||||
|
+ if [ -n "$2" ]; then |
||||||
|
+ FIND=$2 |
||||||
|
+ shift 2 |
||||||
|
+ else |
||||||
|
+ usage |
||||||
|
+ exit 1 |
||||||
|
+ fi |
||||||
|
+ ;; |
||||||
|
+ --property_blacklist) |
||||||
|
+ if [ -n "$2" ]; then |
||||||
|
+ PROPERTY=$2 |
||||||
|
+ shift 2 |
||||||
|
+ else |
||||||
|
+ usage |
||||||
|
+ exit 1 |
||||||
|
+ fi |
||||||
|
+ ;; |
||||||
|
+ --enable_foreign) |
||||||
|
+ if [ -n "$2" ]; then |
||||||
|
+ FOREIGN=$2 |
||||||
|
+ shift 2 |
||||||
|
+ else |
||||||
|
+ usage |
||||||
|
+ exit 1 |
||||||
|
+ fi |
||||||
|
+ ;; |
||||||
|
+ --with_module) |
||||||
|
+ if [ -n "$2" ]; then |
||||||
|
+ MODULE=$2 |
||||||
|
+ shift 2 |
||||||
|
+ else |
||||||
|
+ usage |
||||||
|
+ exit 1 |
||||||
|
+ fi |
||||||
|
+ ;; |
||||||
|
+ --with_multipathd) |
||||||
|
+ if [ -n "$2" ]; then |
||||||
|
+ MULTIPATHD=$2 |
||||||
|
+ shift 2 |
||||||
|
+ else |
||||||
|
+ usage |
||||||
|
+ exit 1 |
||||||
|
+ fi |
||||||
|
+ ;; |
||||||
|
+ --outfile) |
||||||
|
+ if [ -n "$2" ]; then |
||||||
|
+ OUTPUTFILE=$2 |
||||||
|
+ HAVE_OUTFILE=1 |
||||||
|
+ shift 2 |
||||||
|
+ else |
||||||
|
+ usage |
||||||
|
+ exit 1 |
||||||
|
+ fi |
||||||
|
+ ;; |
||||||
|
+ *) |
||||||
|
+ usage |
||||||
|
+ exit |
||||||
|
+ esac |
||||||
|
+ done |
||||||
|
+} |
||||||
|
+ |
||||||
|
+function validate_args |
||||||
|
+{ |
||||||
|
+ if [ "$ENABLE" = "0" ] && [ -n "$FRIENDLY" -o -n "$FIND" -o -n "$PROPERTY" -o -n "$MODULE" ]; then |
||||||
|
+ echo "ignoring extra parameters on disable" |
||||||
|
+ FRIENDLY="" |
||||||
|
+ FIND="" |
||||||
|
+ PROPERTY="" |
||||||
|
+ MODULE="" |
||||||
|
+ fi |
||||||
|
+ if [ -n "$FRIENDLY" ] && [ "$FRIENDLY" != "y" -a "$FRIENDLY" != "n" ]; then |
||||||
|
+ echo "--user_friendly_names must be either 'y' or 'n'" |
||||||
|
+ exit 1 |
||||||
|
+ fi |
||||||
|
+ if [ "$FIND" = "y" ]; then |
||||||
|
+ FIND="yes" |
||||||
|
+ elif [ "$FIND" = "n" ]; then |
||||||
|
+ FIND="no" |
||||||
|
+ elif [ -n "$FIND" ] && [ "$FIND" != "yes" -a "$FIND" != "no" -a "$FIND" != "strict" -a "$FIND" != "greedy" -a "$FIND" != "smart" ]; then |
||||||
|
+ echo "--find_multipaths must be one of 'yes' 'no' 'strict' 'greedy' or 'smart'" |
||||||
|
+ exit 1 |
||||||
|
+ fi |
||||||
|
+ if [ -n "$PROPERTY" ] && [ "$PROPERTY" != "y" -a "$PROPERTY" != "n" ]; then |
||||||
|
+ echo "--property_blacklist must be either 'y' or 'n'" |
||||||
|
+ exit 1 |
||||||
|
+ fi |
||||||
|
+ if [ -n "$FOREIGN" ] && [ "$FOREIGN" != "y" -a "$FOREIGN" != "n" ]; then |
||||||
|
+ echo "--enable_foreign must be either 'y' or 'n'" |
||||||
|
+ exit 1 |
||||||
|
+ fi |
||||||
|
+ if [ -z "$ENABLE" -a -z "$FIND" -a -z "$FRIENDLY" -a -z "$PROPERTY" -a -z "$FOREIGN" ]; then |
||||||
|
+ SHOW_STATUS=1 |
||||||
|
+ fi |
||||||
|
+ if [ -n "$MODULE" ] && [ "$MODULE" != "y" -a "$MODULE" != "n" ]; then |
||||||
|
+ echo "--with_module must be either 'y' or 'n'" |
||||||
|
+ exit 1 |
||||||
|
+ fi |
||||||
|
+ if [ -n "$MULTIPATHD" ] && [ "$MULTIPATHD" != "y" -a "$MULTIPATHD" != "n" ]; then |
||||||
|
+ echo "--with_multipathd must be either 'y' or 'n'" |
||||||
|
+ exit 1 |
||||||
|
+ fi |
||||||
|
+ if [ "$ENABLE" = 2 -a -z "$HAVE_OUTFILE" ]; then |
||||||
|
+ echo "Because --allow makes changes that cannot be automatically reversed," |
||||||
|
+ echo "you must set --outfile when you set --allow" |
||||||
|
+ exit 1 |
||||||
|
+ fi |
||||||
|
+} |
||||||
|
+ |
||||||
|
+function add_blacklist_exceptions |
||||||
|
+{ |
||||||
|
+ INDEX=0 |
||||||
|
+ while [ "$INDEX" -lt "$WWIDS" ] ; do |
||||||
|
+ sed -i '/^blacklist_exceptions[[:space:]]*{/ a\ |
||||||
|
+ wwid '"\"${WWID_LIST[$INDEX]}\""' |
||||||
|
+' $TMPFILE |
||||||
|
+ ((INDEX++)) |
||||||
|
+ done |
||||||
|
+} |
||||||
|
+ |
||||||
|
+umask 0077 |
||||||
|
+ |
||||||
|
+parse_args "$@" |
||||||
|
+ |
||||||
|
+validate_args |
||||||
|
+ |
||||||
|
+if [ ! -d "$MULTIPATHDIR" ]; then |
||||||
|
+ echo "/etc/multipath/ does not exist. failing" |
||||||
|
+ exit 1 |
||||||
|
+fi |
||||||
|
+ |
||||||
|
+rm $TMPFILE 2> /dev/null |
||||||
|
+echo "$DEFAULT_CONFIG" > $TMPFILE |
||||||
|
+if [ -f "$CONFIGFILE" ]; then |
||||||
|
+ cp $CONFIGFILE $TMPFILE |
||||||
|
+fi |
||||||
|
+ |
||||||
|
+if grep -q "^blacklist[[:space:]]*{" $TMPFILE ; then |
||||||
|
+ HAVE_BLACKLIST=1 |
||||||
|
+fi |
||||||
|
+ |
||||||
|
+if grep -q "^blacklist_exceptions[[:space:]]*{" $TMPFILE ; then |
||||||
|
+ HAVE_EXCEPTIONS=1 |
||||||
|
+fi |
||||||
|
+ |
||||||
|
+if grep -q "^defaults[[:space:]]*{" $TMPFILE ; then |
||||||
|
+ HAVE_DEFAULTS=1 |
||||||
|
+fi |
||||||
|
+ |
||||||
|
+if [ -z "$MODULE" -o "$MODULE" = "y" ]; then |
||||||
|
+ if lsmod | grep -q "dm_multipath" ; then |
||||||
|
+ HAVE_MODULE=1 |
||||||
|
+ else |
||||||
|
+ HAVE_MODULE=0 |
||||||
|
+ fi |
||||||
|
+fi |
||||||
|
+ |
||||||
|
+if [ "$MULTIPATHD" = "y" ]; then |
||||||
|
+ if /bin/systemctl status multipathd.service > /dev/null 2>&1 ; then |
||||||
|
+ HAVE_MULTIPATHD=1 |
||||||
|
+ else |
||||||
|
+ HAVE_MULTIPATHD=0 |
||||||
|
+ fi |
||||||
|
+fi |
||||||
|
+ |
||||||
|
+if [ "$HAVE_BLACKLIST" = "1" ]; then |
||||||
|
+ if sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*devnode[[:space:]][[:space:]]*\"\.\?\*\"" ; then |
||||||
|
+ HAVE_DISABLE=1 |
||||||
|
+ elif sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*#[[:space:]]*devnode[[:space:]][[:space:]]*\"\.\?\*\"" ; then |
||||||
|
+ HAVE_DISABLE=0 |
||||||
|
+ fi |
||||||
|
+fi |
||||||
|
+ |
||||||
|
+if [ "$HAVE_BLACKLIST" = "1" ]; then |
||||||
|
+ if sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*wwid[[:space:]][[:space:]]*\"\.\?\*\"" ; then |
||||||
|
+ HAVE_WWID_DISABLE=1 |
||||||
|
+ elif sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*#[[:space:]]*wwid[[:space:]][[:space:]]*\"\.\?\*\"" ; then |
||||||
|
+ HAVE_WWID_DISABLE=0 |
||||||
|
+ fi |
||||||
|
+fi |
||||||
|
+ |
||||||
|
+if [ "$HAVE_DEFAULTS" = "1" ]; then |
||||||
|
+ HAVE_FIND=`sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | sed -n 's/^[[:blank:]]*find_multipaths[[:blank:]][[:blank:]]*\([^[:blank:]]*\).*$/\1/p' | sed -n 1p` |
||||||
|
+ if [ "$HAVE_FIND" = "1" ]; then |
||||||
|
+ HAVE_FIND="yes" |
||||||
|
+ elif [ "$HAVE_FIND" = "0" ]; then |
||||||
|
+ HAVE_FIND="no" |
||||||
|
+ fi |
||||||
|
+ if sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*user_friendly_names[[:space:]][[:space:]]*\(yes\|1\)" ; then |
||||||
|
+ HAVE_FRIENDLY=1 |
||||||
|
+ elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*user_friendly_names[[:space:]][[:space:]]*\(no\|0\)" ; then |
||||||
|
+ HAVE_FRIENDLY=0 |
||||||
|
+ fi |
||||||
|
+ if sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*#[[:space:]]*enable_foreign" ; then |
||||||
|
+ HAVE_FOREIGN=0 |
||||||
|
+ elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*enable_foreign[[:space:]][[:space:]]*\"\.\*\"" ; then |
||||||
|
+ HAVE_FOREIGN=1 |
||||||
|
+ elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*enable_foreign[[:space:]][[:space:]]*\"\^\$\"" ; then |
||||||
|
+ HAVE_FOREIGN=2 |
||||||
|
+ elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*enable_foreign[[:space:]][[:space:]]*\"NONE\"" ; then |
||||||
|
+ HAVE_FOREIGN=2 |
||||||
|
+ elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*enable_foreign" ; then |
||||||
|
+ HAVE_FOREIGN=3 |
||||||
|
+ fi |
||||||
|
+fi |
||||||
|
+ |
||||||
|
+if [ "$HAVE_EXCEPTIONS" = "1" ]; then |
||||||
|
+ if sed -n '/^blacklist_exceptions[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*property[[:space:]][[:space:]]*\"(SCSI_IDENT_|ID_WWN)\"" ; then |
||||||
|
+ HAVE_PROPERTY=1 |
||||||
|
+ elif sed -n '/^blacklist_exceptions[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*#[[:space:]]*property[[:space:]][[:space:]]*\"(SCSI_IDENT_|ID_WWN)\"" ; then |
||||||
|
+ HAVE_PROPERTY=0 |
||||||
|
+ fi |
||||||
|
+fi |
||||||
|
+ |
||||||
|
+if [ -n "$SHOW_STATUS" ]; then |
||||||
|
+ if [ -z "$HAVE_DISABLE" -o "$HAVE_DISABLE" = 0 ]; then |
||||||
|
+ echo "multipath is enabled" |
||||||
|
+ else |
||||||
|
+ echo "multipath is disabled" |
||||||
|
+ fi |
||||||
|
+ if [ -z "$HAVE_FIND" ]; then |
||||||
|
+ echo "find_multipaths is no" |
||||||
|
+ else |
||||||
|
+ echo "find_multipaths is $HAVE_FIND" |
||||||
|
+ fi |
||||||
|
+ if [ -z "$HAVE_FRIENDLY" -o "$HAVE_FRIENDLY" = 0 ]; then |
||||||
|
+ echo "user_friendly_names is disabled" |
||||||
|
+ else |
||||||
|
+ echo "user_friendly_names is enabled" |
||||||
|
+ fi |
||||||
|
+ if [ -z "$HAVE_PROPERTY" -o "$HAVE_PROPERTY" = 0 ]; then |
||||||
|
+ echo "default property blacklist is disabled" |
||||||
|
+ else |
||||||
|
+ echo "default property blacklist is enabled" |
||||||
|
+ fi |
||||||
|
+ if [ -z "$HAVE_FOREIGN" -o "$HAVE_FOREIGN" = 0 ]; then |
||||||
|
+ echo "enable_foreign is not set (no foreign multipath devices will be shown)" |
||||||
|
+ elif [ "$HAVE_FOREIGN" = 1 ]; then |
||||||
|
+ echo "enable_foreign is set (all foreign multipath devices will be shown)" |
||||||
|
+ elif [ "$HAVE_FOREIGN" = 2 ]; then |
||||||
|
+ echo "enable_foreign is set (no foreign multipath devices will be shown)" |
||||||
|
+ else |
||||||
|
+ echo "enable_foreign is set (foreign multipath devices may not be shown)" |
||||||
|
+ fi |
||||||
|
+ if [ -n "$HAVE_MODULE" ]; then |
||||||
|
+ if [ "$HAVE_MODULE" = 1 ]; then |
||||||
|
+ echo "dm_multipath module is loaded" |
||||||
|
+ else |
||||||
|
+ echo "dm_multipath module is not loaded" |
||||||
|
+ fi |
||||||
|
+ fi |
||||||
|
+ if [ -z "$HAVE_MULTIPATHD" ]; then |
||||||
|
+ if /bin/systemctl status multipathd.service > /dev/null 2>&1 ; then |
||||||
|
+ HAVE_MULTIPATHD=1 |
||||||
|
+ else |
||||||
|
+ HAVE_MULTIPATHD=0 |
||||||
|
+ fi |
||||||
|
+ fi |
||||||
|
+ if [ "$HAVE_MULTIPATHD" = 1 ]; then |
||||||
|
+ echo "multipathd is running" |
||||||
|
+ else |
||||||
|
+ echo "multipathd is not running" |
||||||
|
+ fi |
||||||
|
+ exit 0 |
||||||
|
+fi |
||||||
|
+ |
||||||
|
+if [ -z "$HAVE_BLACKLIST" ]; then |
||||||
|
+ cat >> $TMPFILE <<- _EOF_ |
||||||
|
+ |
||||||
|
+blacklist { |
||||||
|
+} |
||||||
|
+_EOF_ |
||||||
|
+fi |
||||||
|
+ |
||||||
|
+if [ -z "$HAVE_DEFAULTS" ]; then |
||||||
|
+ cat >> $TMPFILE <<- _EOF_ |
||||||
|
+ |
||||||
|
+defaults { |
||||||
|
+} |
||||||
|
+_EOF_ |
||||||
|
+fi |
||||||
|
+ |
||||||
|
+if [ "$ENABLE" = 2 ]; then |
||||||
|
+ if [ "$HAVE_DISABLE" = 1 ]; then |
||||||
|
+ sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*devnode[[:space:]][[:space:]]*\"\.\?\*\"/# devnode ".*"/' $TMPFILE |
||||||
|
+ fi |
||||||
|
+ if [ -z "$HAVE_WWID_DISABLE" ]; then |
||||||
|
+ sed -i '/^blacklist[[:space:]]*{/ a\ |
||||||
|
+ wwid ".*" |
||||||
|
+' $TMPFILE |
||||||
|
+ elif [ "$HAVE_WWID_DISABLE" = 0 ]; then |
||||||
|
+ sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*#[[:space:]]*wwid[[:space:]][[:space:]]*\"\.\?\*\"/ wwid ".*"/' $TMPFILE |
||||||
|
+ fi |
||||||
|
+ if [ "$HAVE_EXCEPTIONS" = 1 ]; then |
||||||
|
+ sed -i '/^blacklist_exceptions[[:space:]]*{/,/^}/ {/^[[:space:]]*wwid/ d}' $TMPFILE |
||||||
|
+ else |
||||||
|
+ cat >> $TMPFILE <<- _EOF_ |
||||||
|
+ |
||||||
|
+blacklist_exceptions { |
||||||
|
+} |
||||||
|
+_EOF_ |
||||||
|
+ fi |
||||||
|
+ add_blacklist_exceptions |
||||||
|
+elif [ "$ENABLE" = 1 ]; then |
||||||
|
+ if [ "$HAVE_DISABLE" = 1 ]; then |
||||||
|
+ sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*devnode[[:space:]][[:space:]]*\"\.\?\*\"/# devnode ".*"/' $TMPFILE |
||||||
|
+ fi |
||||||
|
+elif [ "$ENABLE" = 0 ]; then |
||||||
|
+ if [ -z "$HAVE_DISABLE" ]; then |
||||||
|
+ sed -i '/^blacklist[[:space:]]*{/ a\ |
||||||
|
+ devnode ".*" |
||||||
|
+' $TMPFILE |
||||||
|
+ elif [ "$HAVE_DISABLE" = 0 ]; then |
||||||
|
+ sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*#[[:space:]]*devnode[[:space:]][[:space:]]*\"\.\?\*\"/ devnode ".*"/' $TMPFILE |
||||||
|
+ fi |
||||||
|
+fi |
||||||
|
+ |
||||||
|
+if [ -n "$FIND" ]; then |
||||||
|
+ if [ -z "$HAVE_FIND" ]; then |
||||||
|
+ sed -i '/^defaults[[:space:]]*{/ a\ |
||||||
|
+ find_multipaths '"$FIND"' |
||||||
|
+' $TMPFILE |
||||||
|
+ CHANGED_CONFIG=1 |
||||||
|
+ elif [ "$FIND" != "$HAVE_FIND" ]; then |
||||||
|
+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:blank:]]*find_multipaths[[:blank:]][[:blank:]]*[^[:blank:]]*/ find_multipaths '"$FIND"'/' $TMPFILE |
||||||
|
+ CHANGED_CONFIG=1 |
||||||
|
+ fi |
||||||
|
+fi |
||||||
|
+ |
||||||
|
+if [ "$FRIENDLY" = "n" ]; then |
||||||
|
+ if [ "$HAVE_FRIENDLY" = 1 ]; then |
||||||
|
+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*user_friendly_names[[:space:]][[:space:]]*\(yes\|1\)/ user_friendly_names no/' $TMPFILE |
||||||
|
+ CHANGED_CONFIG=1 |
||||||
|
+ fi |
||||||
|
+elif [ "$FRIENDLY" = "y" ]; then |
||||||
|
+ if [ -z "$HAVE_FRIENDLY" ]; then |
||||||
|
+ sed -i '/^defaults[[:space:]]*{/ a\ |
||||||
|
+ user_friendly_names yes |
||||||
|
+' $TMPFILE |
||||||
|
+ CHANGED_CONFIG=1 |
||||||
|
+ elif [ "$HAVE_FRIENDLY" = 0 ]; then |
||||||
|
+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*user_friendly_names[[:space:]][[:space:]]*\(no\|0\)/ user_friendly_names yes/' $TMPFILE |
||||||
|
+ CHANGED_CONFIG=1 |
||||||
|
+ fi |
||||||
|
+fi |
||||||
|
+ |
||||||
|
+if [ "$PROPERTY" = "n" ]; then |
||||||
|
+ if [ "$HAVE_PROPERTY" = 1 ]; then |
||||||
|
+ sed -i '/^blacklist_exceptions[[:space:]]*{/,/^}/ s/^[[:space:]]*property[[:space:]][[:space:]]*\"(SCSI_IDENT_|ID_WWN)\"/# property \"(SCSI_IDENT_|ID_WWN)\"/' $TMPFILE |
||||||
|
+ CHANGED_CONFIG=1 |
||||||
|
+ fi |
||||||
|
+elif [ "$PROPERTY" = "y" ]; then |
||||||
|
+ if [ -z "$HAVE_PROPERTY" ]; then |
||||||
|
+ sed -i '/^blacklist_exceptions[[:space:]]*{/ a\ |
||||||
|
+ property "(SCSI_IDENT_|ID_WWN)" |
||||||
|
+' $TMPFILE |
||||||
|
+ CHANGED_CONFIG=1 |
||||||
|
+ elif [ "$HAVE_PROPERTY" = 0 ]; then |
||||||
|
+ sed -i '/^blacklist_exceptions[[:space:]]*{/,/^}/ s/^[[:space:]]*#[[:space:]]*property[[:space:]][[:space:]]*\"(SCSI_IDENT_|ID_WWN)\"/ property \"(SCSI_IDENT_|ID_WWN)\"/' $TMPFILE |
||||||
|
+ CHANGED_CONFIG=1 |
||||||
|
+ fi |
||||||
|
+fi |
||||||
|
+ |
||||||
|
+if [ "$FOREIGN" = "n" ]; then |
||||||
|
+ if [ "$HAVE_FOREIGN" = 1 -o "$HAVE_FOREIGN" = 3 ]; then |
||||||
|
+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*enable_foreign/# enable_foreign/' $TMPFILE |
||||||
|
+ CHANGED_CONFIG=1 |
||||||
|
+ fi |
||||||
|
+elif [ "$FOREIGN" = "y" ]; then |
||||||
|
+ if [ -z "$HAVE_FOREIGN" ]; then |
||||||
|
+ sed -i '/^defaults[[:space:]]*{/ a\ |
||||||
|
+ enable_foreign ".*" |
||||||
|
+' $TMPFILE |
||||||
|
+ CHANGED_CONFIG=1 |
||||||
|
+ elif [ "$HAVE_FOREIGN" = 0 -o "$HAVE_FOREIGN" = 2 -o "$HAVE_FOREIGN" = 3 ]; then |
||||||
|
+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*#\?[[:space:]]*enable_foreign.*$/ enable_foreign ".*"/' $TMPFILE |
||||||
|
+ CHANGED_CONFIG=1 |
||||||
|
+ fi |
||||||
|
+fi |
||||||
|
+ |
||||||
|
+if [ -f "$OUTPUTFILE" ]; then |
||||||
|
+ cp $OUTPUTFILE $OUTPUTFILE.old |
||||||
|
+ if [ $? != 0 ]; then |
||||||
|
+ echo "failed to backup old config file, $OUTPUTFILE not updated" |
||||||
|
+ exit 1 |
||||||
|
+ fi |
||||||
|
+fi |
||||||
|
+ |
||||||
|
+cp $TMPFILE $OUTPUTFILE |
||||||
|
+if [ $? != 0 ]; then |
||||||
|
+ echo "failed to copy new config file into place, check $OUTPUTFILE is still OK" |
||||||
|
+ exit 1 |
||||||
|
+fi |
||||||
|
+ |
||||||
|
+rm -f $TMPFILE |
||||||
|
+ |
||||||
|
+if [ "$ENABLE" = 1 ]; then |
||||||
|
+ if [ "$HAVE_MODULE" = 0 ]; then |
||||||
|
+ modprobe dm_multipath |
||||||
|
+ fi |
||||||
|
+ if [ "$HAVE_MULTIPATHD" = 0 ]; then |
||||||
|
+ systemctl start multipathd.service |
||||||
|
+ fi |
||||||
|
+elif [ "$ENABLE" = 0 ]; then |
||||||
|
+ if [ "$HAVE_MULTIPATHD" = 1 ]; then |
||||||
|
+ systemctl stop multipathd.service |
||||||
|
+ fi |
||||||
|
+elif [ -n "$CHANGED_CONFIG" -a "$HAVE_MULTIPATHD" = 1 ]; then |
||||||
|
+ systemctl reload multipathd.service |
||||||
|
+fi |
||||||
|
diff --git a/multipath/mpathconf.8 b/multipath/mpathconf.8 |
||||||
|
new file mode 100644 |
||||||
|
index 00000000..a14d831e |
||||||
|
--- /dev/null |
||||||
|
+++ b/multipath/mpathconf.8 |
||||||
|
@@ -0,0 +1,135 @@ |
||||||
|
+.TH MPATHCONF 8 "June 2010" "" "Linux Administrator's Manual" |
||||||
|
+.SH NAME |
||||||
|
+mpathconf - A tool for configuring device-mapper-multipath |
||||||
|
+.SH SYNOPSIS |
||||||
|
+.B mpathconf |
||||||
|
+.RB [\| commands \|] |
||||||
|
+.RB [\| options \|] |
||||||
|
+.SH DESCRIPTION |
||||||
|
+.B mpathconf |
||||||
|
+is a utility that creates or modifies |
||||||
|
+.B /etc/multipath.conf. |
||||||
|
+It can enable or disable multipathing and configure some common options. |
||||||
|
+.B mpathconf |
||||||
|
+can also load the |
||||||
|
+.B dm_multipath |
||||||
|
+module, start and stop the |
||||||
|
+.B multipathd |
||||||
|
+daemon, and configure the |
||||||
|
+.B multipathd |
||||||
|
+service to start automatically or not. If |
||||||
|
+.B mpathconf |
||||||
|
+is called with no commands, it will display the current configuration, but |
||||||
|
+will not create of modify |
||||||
|
+.B /etc/multipath.conf |
||||||
|
+ |
||||||
|
+The default options for mpathconf are |
||||||
|
+.B --with_module |
||||||
|
+The |
||||||
|
+.B --with_multipathd |
||||||
|
+option is not set by default. Enabling multipathing will load the |
||||||
|
+.B dm_multipath |
||||||
|
+module but it will not immediately start it. This is so |
||||||
|
+that users can manually edit their config file if necessary, before starting |
||||||
|
+.B multipathd. |
||||||
|
+ |
||||||
|
+If |
||||||
|
+.B /etc/multipath.conf |
||||||
|
+already exists, mpathconf will edit it. If it does not exist, mpathconf will |
||||||
|
+create a default file with |
||||||
|
+.B user_friendly_names |
||||||
|
+set and |
||||||
|
+.B find_multipaths |
||||||
|
+set to \fByes\fP. To disable these, use the |
||||||
|
+.B --user_friendly_names n |
||||||
|
+and |
||||||
|
+.B --find_multipaths n |
||||||
|
+options |
||||||
|
+.SH COMMANDS |
||||||
|
+.TP |
||||||
|
+.B --enable |
||||||
|
+Removes any line that blacklists all device nodes from the |
||||||
|
+.B /etc/multipath.conf |
||||||
|
+blacklist section. Also, creates |
||||||
|
+.B /etc/multipath.conf |
||||||
|
+if it doesn't exist. |
||||||
|
+.TP |
||||||
|
+.B --disable |
||||||
|
+Adds a line that blacklists all device nodes to the |
||||||
|
+.B /etc/multipath.conf |
||||||
|
+blacklist section. If no blacklist section exists, it will create one. |
||||||
|
+.TP |
||||||
|
+.B --allow \fB<device>\fP |
||||||
|
+Modifies the \fB/etc/multipath/conf\fP blacklist to blacklist all |
||||||
|
+wwids and the blacklist_exceptions to whitelist \fB<device>\fP. \fB<device>\fP |
||||||
|
+can be in the form of MAJOR:MINOR, a wwid, or the name of a device-mapper |
||||||
|
+device, either a multipath device, or any device on stacked on top of one or |
||||||
|
+more multipath devices. This command can be used multiple times to allow |
||||||
|
+multiple devices. \fBNOTE:\fP This action will create a configuration file that |
||||||
|
+mpathconf will not be able to revert back to its previous state. Because |
||||||
|
+of this, \fB--outfile\fP is required when using \fB--allow\fP. |
||||||
|
+.TP |
||||||
|
+.B --user_friendly_names \fP { \fBy\fP | \fBn\fP } |
||||||
|
+If set to \fBy\fP, this adds the line |
||||||
|
+.B user_friendly_names yes |
||||||
|
+to the |
||||||
|
+.B /etc/multipath.conf |
||||||
|
+defaults section. If set to \fBn\fP, this removes the line, if present. This |
||||||
|
+command can be used along with any other command. |
||||||
|
+.TP |
||||||
|
+.B --find_multipaths\fP { \fByes\fP | \fBno\fP | \fBstrict\fP | \fBgreedy\fP | \fBsmart\fP } |
||||||
|
+If set to \fB<value>\fP, this adds the line |
||||||
|
+.B find_multipaths <value> |
||||||
|
+to the |
||||||
|
+.B /etc/multipath.conf |
||||||
|
+defaults section. This command can be used along with any other command. |
||||||
|
+\fBy\fP and \fBn\fP can be used instead of \fByes\fP and \fBno\fP. |
||||||
|
+.TP |
||||||
|
+.B --property_blacklist \fP { \fBy\fP | \fBn\fP } |
||||||
|
+If set to \fBy\fP, this adds the line |
||||||
|
+.B property "(SCSI_IDENT_|ID_WWN)" |
||||||
|
+to the |
||||||
|
+.B /etc/multipath.conf |
||||||
|
+blacklist_exceptions section. If set to \fBn\fP, this removes the line, if |
||||||
|
+present. This command can be used along with any other command. |
||||||
|
+.TP |
||||||
|
+.B --enable_foreign\fP { \fBy\fP | \fBn\fP } |
||||||
|
+If set to \fBy\fP, this adds the line |
||||||
|
+.B enable_foreign ".*" |
||||||
|
+to the |
||||||
|
+.B /etc/multipath.conf |
||||||
|
+defaults section. if set to \fBn\fP, this removes the line, if present. This |
||||||
|
+command can be used along with any other command. |
||||||
|
+.TP |
||||||
|
+.B --outfile \fB<filename>\fP |
||||||
|
+Write the resulting multipath configuration to \fB<filename>\fP instead of |
||||||
|
+\fB/etc/multipath.conf\fP. |
||||||
|
+.SH OPTIONS |
||||||
|
+.TP |
||||||
|
+.B --with_module\fP { \fBy\fP | \fBn\fP } |
||||||
|
+If set to \fBy\fP, this runs |
||||||
|
+.B modprobe dm_multipath |
||||||
|
+to install the multipath modules. This option only works with the |
||||||
|
+.B --enable |
||||||
|
+command. This option is set to \fBy\fP by default. |
||||||
|
+.TP |
||||||
|
+.B --with_multipathd { \fBy\fP | \fBn\fP } |
||||||
|
+If set to \fBy\fP, this runs |
||||||
|
+.B service multipathd start |
||||||
|
+to start the multipathd daemon on \fB--enable\fP, |
||||||
|
+.B service multipathd stop |
||||||
|
+to stop the multipathd daemon on \fB--disable\fP, and |
||||||
|
+.B service multipathd reload |
||||||
|
+to reconfigure multipathd on \fB--user_frindly_names\fP and |
||||||
|
+\fB--find_multipaths\fP. |
||||||
|
+This option is set to \fBn\fP by default. |
||||||
|
+.SH FILES |
||||||
|
+.BR /etc/multipath.conf |
||||||
|
+.SH "SEE ALSO" |
||||||
|
+.BR multipath.conf (5), |
||||||
|
+.BR modprobe (8), |
||||||
|
+.BR multipath (8), |
||||||
|
+.BR multipathd (8), |
||||||
|
+.BR service (8), |
||||||
|
+.SH AUTHOR |
||||||
|
+Benjamin Marzinski <bmarzins@redhat.com> |
@ -0,0 +1,151 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Date: Fri, 17 Oct 2014 11:20:34 -0500 |
||||||
|
Subject: [PATCH] RH: add wwids from kernel cmdline mpath.wwids with -A |
||||||
|
|
||||||
|
This patch adds another option to multipath, "-A", which reads |
||||||
|
/proc/cmdline for mpath.wwid=<WWID> options, and adds any wwids it finds |
||||||
|
to /etc/multipath/wwids. While this isn't usually important during |
||||||
|
normal operation, since these wwids should already be added, it can be |
||||||
|
helpful during installation, to make sure that multipath can claim |
||||||
|
devices as its own, before LVM or something else makes use of them. The |
||||||
|
patch also execs "/sbin/multipath -A" before running multipathd in |
||||||
|
multipathd.service |
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
multipath/main.c | 54 +++++++++++++++++++++++++++++++++-- |
||||||
|
multipath/multipath.8 | 7 ++++- |
||||||
|
multipathd/multipathd.service | 1 + |
||||||
|
3 files changed, 59 insertions(+), 3 deletions(-) |
||||||
|
|
||||||
|
diff --git a/multipath/main.c b/multipath/main.c |
||||||
|
index 65ece830..748e7902 100644 |
||||||
|
--- a/multipath/main.c |
||||||
|
+++ b/multipath/main.c |
||||||
|
@@ -122,7 +122,7 @@ usage (char * progname) |
||||||
|
fprintf (stderr, " %s [-v level] [-R retries] -F\n", progname); |
||||||
|
fprintf (stderr, " %s [-v level] [-l|-ll] [device]\n", progname); |
||||||
|
fprintf (stderr, " %s [-v level] [-a|-w] device\n", progname); |
||||||
|
- fprintf (stderr, " %s [-v level] -W\n", progname); |
||||||
|
+ fprintf (stderr, " %s [-v level] [-A|-W]\n", progname); |
||||||
|
fprintf (stderr, " %s [-v level] [-i] [-c|-C] device\n", progname); |
||||||
|
fprintf (stderr, " %s [-v level] [-i] [-u|-U]\n", progname); |
||||||
|
fprintf (stderr, " %s [-h|-t|-T]\n", progname); |
||||||
|
@@ -136,6 +136,8 @@ usage (char * progname) |
||||||
|
" -f flush a multipath device map\n" |
||||||
|
" -F flush all multipath device maps\n" |
||||||
|
" -a add a device wwid to the wwids file\n" |
||||||
|
+ " -A add devices from kernel command line mpath.wwids\n" |
||||||
|
+ " parameters to wwids file\n" |
||||||
|
" -c check if a device should be a path in a multipath device\n" |
||||||
|
" -C check if a multipath device has usable paths\n" |
||||||
|
" -q allow queue_if_no_path when multipathd is not running\n" |
||||||
|
@@ -450,6 +452,50 @@ static void cleanup_vecs(void) |
||||||
|
free_pathvec(vecs.pathvec, FREE_PATHS); |
||||||
|
} |
||||||
|
|
||||||
|
+static int remember_cmdline_wwid(void) |
||||||
|
+{ |
||||||
|
+ FILE *f = NULL; |
||||||
|
+ char buf[LINE_MAX], *next, *ptr; |
||||||
|
+ int ret = 0; |
||||||
|
+ |
||||||
|
+ f = fopen("/proc/cmdline", "re"); |
||||||
|
+ if (!f) { |
||||||
|
+ condlog(0, "can't open /proc/cmdline : %s", strerror(errno)); |
||||||
|
+ return -1; |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ if (!fgets(buf, sizeof(buf), f)) { |
||||||
|
+ if (ferror(f)) |
||||||
|
+ condlog(0, "read of /proc/cmdline failed : %s", |
||||||
|
+ strerror(errno)); |
||||||
|
+ else |
||||||
|
+ condlog(0, "couldn't read /proc/cmdline"); |
||||||
|
+ fclose(f); |
||||||
|
+ return -1; |
||||||
|
+ } |
||||||
|
+ fclose(f); |
||||||
|
+ next = buf; |
||||||
|
+ while((ptr = strstr(next, "mpath.wwid="))) { |
||||||
|
+ ptr += 11; |
||||||
|
+ next = strpbrk(ptr, " \t\n"); |
||||||
|
+ if (next) { |
||||||
|
+ *next = '\0'; |
||||||
|
+ next++; |
||||||
|
+ } |
||||||
|
+ if (strlen(ptr)) { |
||||||
|
+ if (remember_wwid(ptr) != 0) |
||||||
|
+ ret = -1; |
||||||
|
+ } |
||||||
|
+ else { |
||||||
|
+ condlog(0, "empty mpath.wwid kernel command line option"); |
||||||
|
+ ret = -1; |
||||||
|
+ } |
||||||
|
+ if (!next) |
||||||
|
+ break; |
||||||
|
+ } |
||||||
|
+ return ret; |
||||||
|
+} |
||||||
|
+ |
||||||
|
static int |
||||||
|
configure (struct config *conf, enum mpath_cmds cmd, |
||||||
|
enum devtypes dev_type, char *devpath) |
||||||
|
@@ -838,7 +884,7 @@ main (int argc, char *argv[]) |
||||||
|
conf->retrigger_tries = 0; |
||||||
|
conf->force_sync = 1; |
||||||
|
atexit(cleanup_vecs); |
||||||
|
- while ((arg = getopt(argc, argv, ":adDcChl::eFfM:v:p:b:BrR:itTquUwW")) != EOF ) { |
||||||
|
+ while ((arg = getopt(argc, argv, ":aAdDcChl::eFfM:v:p:b:BrR:itTquUwW")) != EOF ) { |
||||||
|
switch(arg) { |
||||||
|
case 1: printf("optarg : %s\n",optarg); |
||||||
|
break; |
||||||
|
@@ -915,6 +961,10 @@ main (int argc, char *argv[]) |
||||||
|
case 'T': |
||||||
|
cmd = CMD_DUMP_CONFIG; |
||||||
|
break; |
||||||
|
+ case 'A': |
||||||
|
+ if (remember_cmdline_wwid() != 0) |
||||||
|
+ exit(RTVL_FAIL); |
||||||
|
+ exit(RTVL_OK); |
||||||
|
case 'h': |
||||||
|
usage(argv[0]); |
||||||
|
exit(RTVL_OK); |
||||||
|
diff --git a/multipath/multipath.8 b/multipath/multipath.8 |
||||||
|
index 17df59f5..5ca75359 100644 |
||||||
|
--- a/multipath/multipath.8 |
||||||
|
+++ b/multipath/multipath.8 |
||||||
|
@@ -63,7 +63,7 @@ multipath \- Device mapper target autoconfig. |
||||||
|
.B multipath |
||||||
|
.RB [\| \-v\ \c |
||||||
|
.IR level \|] |
||||||
|
-.B -W |
||||||
|
+.RB [\| \-A | \-W \|] |
||||||
|
. |
||||||
|
.LP |
||||||
|
.B multipath |
||||||
|
@@ -145,6 +145,11 @@ device mapper, path checkers ...). |
||||||
|
Add the WWID for the specified device to the WWIDs file. |
||||||
|
. |
||||||
|
.TP |
||||||
|
+.B \-A |
||||||
|
+Add the WWIDs from any kernel command line \fImpath.wwid\fR parameters to the |
||||||
|
+WWIDs file. |
||||||
|
+. |
||||||
|
+.TP |
||||||
|
.B \-w |
||||||
|
Remove the WWID for the specified device from the WWIDs file. |
||||||
|
. |
||||||
|
diff --git a/multipathd/multipathd.service b/multipathd/multipathd.service |
||||||
|
index 6d57c7e8..dfc1e962 100644 |
||||||
|
--- a/multipathd/multipathd.service |
||||||
|
+++ b/multipathd/multipathd.service |
||||||
|
@@ -16,6 +16,7 @@ Type=notify |
||||||
|
NotifyAccess=main |
||||||
|
LimitCORE=infinity |
||||||
|
ExecStartPre=-/sbin/modprobe -a scsi_dh_alua scsi_dh_emc scsi_dh_rdac dm-multipath |
||||||
|
+ExecStartPre=-/sbin/multipath -A |
||||||
|
ExecStart=/sbin/multipathd -d -s |
||||||
|
ExecReload=/sbin/multipathd reconfigure |
||||||
|
TasksMax=infinity |
@ -0,0 +1,26 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Date: Thu, 7 Jun 2018 17:43:52 -0500 |
||||||
|
Subject: [PATCH] RH: reset default find_mutipaths value to off |
||||||
|
|
||||||
|
Upstream has changed to default find_multipaths to "strict". For now |
||||||
|
Redhat will retain the previous default of "off". |
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
libmultipath/defaults.h | 2 +- |
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/libmultipath/defaults.h b/libmultipath/defaults.h |
||||||
|
index c27946c7..e0dd32ad 100644 |
||||||
|
--- a/libmultipath/defaults.h |
||||||
|
+++ b/libmultipath/defaults.h |
||||||
|
@@ -23,7 +23,7 @@ |
||||||
|
#define DEFAULT_NO_PATH_RETRY NO_PATH_RETRY_UNDEF |
||||||
|
#define DEFAULT_VERBOSITY 2 |
||||||
|
#define DEFAULT_REASSIGN_MAPS 0 |
||||||
|
-#define DEFAULT_FIND_MULTIPATHS FIND_MULTIPATHS_STRICT |
||||||
|
+#define DEFAULT_FIND_MULTIPATHS FIND_MULTIPATHS_OFF |
||||||
|
#define DEFAULT_FAST_IO_FAIL 5 |
||||||
|
#define DEFAULT_DEV_LOSS_TMO 600 |
||||||
|
#define DEFAULT_RETAIN_HWHANDLER RETAIN_HWHANDLER_ON |
@ -0,0 +1,84 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Date: Thu, 11 Apr 2019 13:25:42 -0500 |
||||||
|
Subject: [PATCH] RH: attempt to get ANA info via sysfs first |
||||||
|
|
||||||
|
When the ANA prioritizer is run, first see if the "ana_state" sysfs file |
||||||
|
exists, and if it does, try to read the state from there. If that fails, |
||||||
|
fallback to using an ioctl. |
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
libmultipath/prioritizers/ana.c | 31 +++++++++++++++++++++++++++++-- |
||||||
|
1 file changed, 29 insertions(+), 2 deletions(-) |
||||||
|
|
||||||
|
diff --git a/libmultipath/prioritizers/ana.c b/libmultipath/prioritizers/ana.c |
||||||
|
index b5c7873d..e139360c 100644 |
||||||
|
--- a/libmultipath/prioritizers/ana.c |
||||||
|
+++ b/libmultipath/prioritizers/ana.c |
||||||
|
@@ -24,6 +24,7 @@ |
||||||
|
#include "prio.h" |
||||||
|
#include "util.h" |
||||||
|
#include "structs.h" |
||||||
|
+#include "sysfs.h" |
||||||
|
|
||||||
|
enum { |
||||||
|
ANA_ERR_GETCTRL_FAILED = 1, |
||||||
|
@@ -36,6 +37,7 @@ enum { |
||||||
|
ANA_ERR_GETNS_FAILED, |
||||||
|
ANA_ERR_NO_MEMORY, |
||||||
|
ANA_ERR_NO_INFORMATION, |
||||||
|
+ ANA_ERR_INVALID_STATE, |
||||||
|
}; |
||||||
|
|
||||||
|
static const char *ana_errmsg[] = { |
||||||
|
@@ -49,6 +51,7 @@ static const char *ana_errmsg[] = { |
||||||
|
[ANA_ERR_GETNS_FAILED] = "couldn't get namespace info", |
||||||
|
[ANA_ERR_NO_MEMORY] = "out of memory", |
||||||
|
[ANA_ERR_NO_INFORMATION] = "invalid fd", |
||||||
|
+ [ANA_ERR_INVALID_STATE] = "invalid state", |
||||||
|
}; |
||||||
|
|
||||||
|
static const char *anas_string[] = { |
||||||
|
@@ -107,6 +110,27 @@ static int get_ana_state(__u32 nsid, __u32 anagrpid, void *ana_log, |
||||||
|
return -ANA_ERR_GETANAS_NOTFOUND; |
||||||
|
} |
||||||
|
|
||||||
|
+static int get_ana_info_sysfs(struct path *pp) |
||||||
|
+{ |
||||||
|
+ char state[32]; |
||||||
|
+ |
||||||
|
+ if (!pp->udev || sysfs_attr_get_value(pp->udev, "ana_state", state, |
||||||
|
+ sizeof(state)) <= 0) |
||||||
|
+ return -ANA_ERR_NO_INFORMATION; |
||||||
|
+ |
||||||
|
+ if (strcmp(state, "optimized") == 0) |
||||||
|
+ return NVME_ANA_OPTIMIZED; |
||||||
|
+ if (strcmp(state, "non-optimized") == 0) |
||||||
|
+ return NVME_ANA_NONOPTIMIZED; |
||||||
|
+ if (strcmp(state, "inaccessible") == 0) |
||||||
|
+ return NVME_ANA_INACCESSIBLE; |
||||||
|
+ if (strcmp(state, "persistent-loss") == 0) |
||||||
|
+ return NVME_ANA_PERSISTENT_LOSS; |
||||||
|
+ if (strcmp(state, "change") == 0) |
||||||
|
+ return NVME_ANA_CHANGE; |
||||||
|
+ return -ANA_ERR_INVALID_STATE; |
||||||
|
+} |
||||||
|
+ |
||||||
|
static int get_ana_info(struct path * pp) |
||||||
|
{ |
||||||
|
int rc; |
||||||
|
@@ -210,8 +234,11 @@ int getprio(struct path *pp, __attribute__((unused)) char *args, |
||||||
|
|
||||||
|
if (pp->fd < 0) |
||||||
|
rc = -ANA_ERR_NO_INFORMATION; |
||||||
|
- else |
||||||
|
- rc = get_ana_info(pp); |
||||||
|
+ else { |
||||||
|
+ rc = get_ana_info_sysfs(pp); |
||||||
|
+ if (rc < 0) |
||||||
|
+ rc = get_ana_info(pp); |
||||||
|
+ } |
||||||
|
|
||||||
|
switch (rc) { |
||||||
|
case NVME_ANA_OPTIMIZED: |
@ -0,0 +1,102 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Date: Thu, 25 Mar 2021 13:05:10 -0500 |
||||||
|
Subject: [PATCH] RH: make parse_vpd_pg83 match scsi_id output |
||||||
|
|
||||||
|
Red Hat sets ID_SERIAL based on the result of scsi_id, instead of using |
||||||
|
the result of sg_inq and 55-scsi-sg3_id.rules. Make parse_vpd_pg83 match |
||||||
|
that. |
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
libmultipath/discovery.c | 18 ++---------------- |
||||||
|
tests/vpd.c | 6 ++++++ |
||||||
|
2 files changed, 8 insertions(+), 16 deletions(-) |
||||||
|
|
||||||
|
diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c |
||||||
|
index f25fe9e3..6fb81c28 100644 |
||||||
|
--- a/libmultipath/discovery.c |
||||||
|
+++ b/libmultipath/discovery.c |
||||||
|
@@ -1136,12 +1136,9 @@ parse_vpd_pg83(const unsigned char *in, size_t in_len, |
||||||
|
naa_prio = 7; |
||||||
|
break; |
||||||
|
case 2: |
||||||
|
- /* IEEE Extended: Prio 6 */ |
||||||
|
- naa_prio = 6; |
||||||
|
- break; |
||||||
|
case 3: |
||||||
|
- /* IEEE Locally assigned: Prio 1 */ |
||||||
|
- naa_prio = 1; |
||||||
|
+ /* IEEE Extended or Locally assigned: Prio 6 */ |
||||||
|
+ naa_prio = 6; |
||||||
|
break; |
||||||
|
default: |
||||||
|
/* Default: no priority */ |
||||||
|
@@ -1160,17 +1157,6 @@ parse_vpd_pg83(const unsigned char *in, size_t in_len, |
||||||
|
vpd = d; |
||||||
|
} |
||||||
|
break; |
||||||
|
- case 0x8: |
||||||
|
- /* SCSI Name: Prio 3 */ |
||||||
|
- if (memcmp(d + 4, "eui.", 4) && |
||||||
|
- memcmp(d + 4, "naa.", 4) && |
||||||
|
- memcmp(d + 4, "iqn.", 4)) |
||||||
|
- break; |
||||||
|
- if (prio < 3) { |
||||||
|
- prio = 3; |
||||||
|
- vpd = d; |
||||||
|
- } |
||||||
|
- break; |
||||||
|
case 0x1: |
||||||
|
/* T-10 Vendor ID: Prio 2 */ |
||||||
|
if (prio < 2) { |
||||||
|
diff --git a/tests/vpd.c b/tests/vpd.c |
||||||
|
index 8e730d37..7bf7990f 100644 |
||||||
|
--- a/tests/vpd.c |
||||||
|
+++ b/tests/vpd.c |
||||||
|
@@ -230,11 +230,13 @@ static const char * const str_prefix[] = { |
||||||
|
[STR_IQN] = "iqn.", |
||||||
|
}; |
||||||
|
|
||||||
|
+#if 0 |
||||||
|
static const char byte0[] = { |
||||||
|
[STR_EUI] = '2', |
||||||
|
[STR_NAA] = '3', |
||||||
|
[STR_IQN] = '8', |
||||||
|
}; |
||||||
|
+#endif |
||||||
|
|
||||||
|
/** |
||||||
|
* create_scsi_string_desc() - create a SCSI name string descriptor. |
||||||
|
@@ -659,6 +661,7 @@ make_test_vpd_naa(2, 18); |
||||||
|
make_test_vpd_naa(2, 17); |
||||||
|
make_test_vpd_naa(2, 16); |
||||||
|
|
||||||
|
+#if 0 |
||||||
|
/* SCSI Name string: EUI64, WWID size: 17 */ |
||||||
|
make_test_vpd_str(0, 20, 18) |
||||||
|
make_test_vpd_str(0, 20, 17) |
||||||
|
@@ -694,6 +697,7 @@ make_test_vpd_str(18, 20, 18) |
||||||
|
make_test_vpd_str(18, 20, 17) |
||||||
|
make_test_vpd_str(18, 20, 16) |
||||||
|
make_test_vpd_str(18, 20, 15) |
||||||
|
+#endif |
||||||
|
|
||||||
|
static int test_vpd(void) |
||||||
|
{ |
||||||
|
@@ -767,6 +771,7 @@ static int test_vpd(void) |
||||||
|
cmocka_unit_test(test_vpd_naa_2_18), |
||||||
|
cmocka_unit_test(test_vpd_naa_2_17), |
||||||
|
cmocka_unit_test(test_vpd_naa_2_16), |
||||||
|
+/* |
||||||
|
cmocka_unit_test(test_vpd_str_0_20_18), |
||||||
|
cmocka_unit_test(test_vpd_str_0_20_17), |
||||||
|
cmocka_unit_test(test_vpd_str_0_20_16), |
||||||
|
@@ -791,6 +796,7 @@ static int test_vpd(void) |
||||||
|
cmocka_unit_test(test_vpd_str_18_20_17), |
||||||
|
cmocka_unit_test(test_vpd_str_18_20_16), |
||||||
|
cmocka_unit_test(test_vpd_str_18_20_15), |
||||||
|
+*/ |
||||||
|
}; |
||||||
|
return cmocka_run_group_tests(tests, setup, teardown); |
||||||
|
} |
@ -0,0 +1,69 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Date: Thu, 23 Sep 2021 14:16:51 -0500 |
||||||
|
Subject: [PATCH] libmultipath: add section name to invalid keyword output |
||||||
|
|
||||||
|
If users forget the closing brace for a section in multipath.conf, |
||||||
|
multipath has no way to detect that. When it sees the keyword at the |
||||||
|
start of the next section, it will complain that there is an invalid |
||||||
|
keyword, because that keyword doesn't belong in previous section (which |
||||||
|
was never ended with a closing brace). This can confuse users. To make |
||||||
|
this easier to understand, when multipath prints an invalid keyword |
||||||
|
message, it now also prints the current section name, which can give |
||||||
|
users a hint that they didn't end the previous section. |
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
libmultipath/parser.c | 20 +++++++++++++------- |
||||||
|
1 file changed, 13 insertions(+), 7 deletions(-) |
||||||
|
|
||||||
|
diff --git a/libmultipath/parser.c b/libmultipath/parser.c |
||||||
|
index 8ca91bf2..611054f7 100644 |
||||||
|
--- a/libmultipath/parser.c |
||||||
|
+++ b/libmultipath/parser.c |
||||||
|
@@ -504,7 +504,7 @@ validate_config_strvec(vector strvec, const char *file) |
||||||
|
|
||||||
|
static int |
||||||
|
process_stream(struct config *conf, FILE *stream, vector keywords, |
||||||
|
- const char *file) |
||||||
|
+ const char *section, const char *file) |
||||||
|
{ |
||||||
|
int i; |
||||||
|
int r = 0, t; |
||||||
|
@@ -568,16 +568,22 @@ process_stream(struct config *conf, FILE *stream, vector keywords, |
||||||
|
if (keyword->sub) { |
||||||
|
kw_level++; |
||||||
|
r += process_stream(conf, stream, |
||||||
|
- keyword->sub, file); |
||||||
|
+ keyword->sub, |
||||||
|
+ keyword->string, |
||||||
|
+ file); |
||||||
|
kw_level--; |
||||||
|
} |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
- if (i >= VECTOR_SIZE(keywords)) |
||||||
|
- condlog(1, "%s line %d, invalid keyword: %s", |
||||||
|
- file, line_nr, str); |
||||||
|
- |
||||||
|
+ if (i >= VECTOR_SIZE(keywords)) { |
||||||
|
+ if (section) |
||||||
|
+ condlog(1, "%s line %d, invalid keyword in the %s section: %s", |
||||||
|
+ file, line_nr, section, str); |
||||||
|
+ else |
||||||
|
+ condlog(1, "%s line %d, invalid keyword: %s", |
||||||
|
+ file, line_nr, str); |
||||||
|
+ } |
||||||
|
free_strvec(strvec); |
||||||
|
} |
||||||
|
if (kw_level == 1) |
||||||
|
@@ -608,7 +614,7 @@ process_file(struct config *conf, const char *file) |
||||||
|
|
||||||
|
/* Stream handling */ |
||||||
|
line_nr = 0; |
||||||
|
- r = process_stream(conf, stream, conf->keywords, file); |
||||||
|
+ r = process_stream(conf, stream, conf->keywords, NULL, file); |
||||||
|
fclose(stream); |
||||||
|
//free_keywords(keywords); |
||||||
|
|
@ -0,0 +1,84 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Date: Thu, 23 Sep 2021 21:39:36 -0500 |
||||||
|
Subject: [PATCH] libmultipath: use typedef for keyword handler function |
||||||
|
|
||||||
|
Don't keep writing out the function type. |
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
libmultipath/parser.c | 6 +++--- |
||||||
|
libmultipath/parser.h | 15 ++++++--------- |
||||||
|
2 files changed, 9 insertions(+), 12 deletions(-) |
||||||
|
|
||||||
|
diff --git a/libmultipath/parser.c b/libmultipath/parser.c |
||||||
|
index 611054f7..ebe1cbd9 100644 |
||||||
|
--- a/libmultipath/parser.c |
||||||
|
+++ b/libmultipath/parser.c |
||||||
|
@@ -33,7 +33,7 @@ static int line_nr; |
||||||
|
|
||||||
|
int |
||||||
|
keyword_alloc(vector keywords, char *string, |
||||||
|
- int (*handler) (struct config *, vector), |
||||||
|
+ handler_fn *handler, |
||||||
|
print_fn *print, |
||||||
|
int unique) |
||||||
|
{ |
||||||
|
@@ -72,7 +72,7 @@ install_sublevel_end(void) |
||||||
|
|
||||||
|
int |
||||||
|
_install_keyword(vector keywords, char *string, |
||||||
|
- int (*handler) (struct config *, vector), |
||||||
|
+ handler_fn *handler, |
||||||
|
print_fn *print, |
||||||
|
int unique) |
||||||
|
{ |
||||||
|
@@ -558,7 +558,7 @@ process_stream(struct config *conf, FILE *stream, vector keywords, |
||||||
|
goto out; |
||||||
|
} |
||||||
|
if (keyword->handler) { |
||||||
|
- t = (*keyword->handler) (conf, strvec); |
||||||
|
+ t = keyword->handler(conf, strvec); |
||||||
|
r += t; |
||||||
|
if (t) |
||||||
|
condlog(1, "multipath.conf +%d, parsing failed: %s", |
||||||
|
diff --git a/libmultipath/parser.h b/libmultipath/parser.h |
||||||
|
index b43d46f8..3452bde1 100644 |
||||||
|
--- a/libmultipath/parser.h |
||||||
|
+++ b/libmultipath/parser.h |
||||||
|
@@ -43,10 +43,11 @@ struct strbuf; |
||||||
|
|
||||||
|
/* keyword definition */ |
||||||
|
typedef int print_fn(struct config *, struct strbuf *, const void *); |
||||||
|
+typedef int handler_fn(struct config *, vector); |
||||||
|
|
||||||
|
struct keyword { |
||||||
|
char *string; |
||||||
|
- int (*handler) (struct config *, vector); |
||||||
|
+ handler_fn *handler; |
||||||
|
print_fn *print; |
||||||
|
vector sub; |
||||||
|
int unique; |
||||||
|
@@ -62,18 +63,14 @@ struct keyword { |
||||||
|
for (i = 0; i < (k)->sub->allocated && ((p) = (k)->sub->slot[i]); i++) |
||||||
|
|
||||||
|
/* Prototypes */ |
||||||
|
-extern int keyword_alloc(vector keywords, char *string, |
||||||
|
- int (*handler) (struct config *, vector), |
||||||
|
- print_fn *print, |
||||||
|
- int unique); |
||||||
|
+extern int keyword_alloc(vector keywords, char *string, handler_fn *handler, |
||||||
|
+ print_fn *print, int unique); |
||||||
|
#define install_keyword_root(str, h) keyword_alloc(keywords, str, h, NULL, 1) |
||||||
|
extern void install_sublevel(void); |
||||||
|
extern void install_sublevel_end(void); |
||||||
|
|
||||||
|
-extern int _install_keyword(vector keywords, char *string, |
||||||
|
- int (*handler) (struct config *, vector), |
||||||
|
- print_fn *print, |
||||||
|
- int unique); |
||||||
|
+extern int _install_keyword(vector keywords, char *string, handler_fn *handler, |
||||||
|
+ print_fn *print, int unique); |
||||||
|
#define install_keyword(str, vec, pri) _install_keyword(keywords, str, vec, pri, 1) |
||||||
|
#define install_keyword_multi(str, vec, pri) _install_keyword(keywords, str, vec, pri, 0) |
||||||
|
extern void dump_keywords(vector keydump, int level); |
@ -0,0 +1,27 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Date: Fri, 24 Sep 2021 13:13:31 -0500 |
||||||
|
Subject: [PATCH] libmultipath: print the correct file when parsing fails |
||||||
|
|
||||||
|
Don't assume that parsing failed on multipath.conf |
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
libmultipath/parser.c | 4 ++-- |
||||||
|
1 file changed, 2 insertions(+), 2 deletions(-) |
||||||
|
|
||||||
|
diff --git a/libmultipath/parser.c b/libmultipath/parser.c |
||||||
|
index ebe1cbd9..d5595fb0 100644 |
||||||
|
--- a/libmultipath/parser.c |
||||||
|
+++ b/libmultipath/parser.c |
||||||
|
@@ -561,8 +561,8 @@ process_stream(struct config *conf, FILE *stream, vector keywords, |
||||||
|
t = keyword->handler(conf, strvec); |
||||||
|
r += t; |
||||||
|
if (t) |
||||||
|
- condlog(1, "multipath.conf +%d, parsing failed: %s", |
||||||
|
- line_nr, buf); |
||||||
|
+ condlog(1, "%s line %d, parsing failed: %s", |
||||||
|
+ file, line_nr, buf); |
||||||
|
} |
||||||
|
|
||||||
|
if (keyword->sub) { |
@ -0,0 +1,527 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Date: Fri, 24 Sep 2021 17:59:12 -0500 |
||||||
|
Subject: [PATCH] libmultipath: pass file and line number to keyword handlers |
||||||
|
|
||||||
|
This will make it possible for the keyword handlers to print more useful |
||||||
|
warning messages. It will be used by future patches. |
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
libmultipath/dict.c | 143 +++++++++++++++++++++++++----------------- |
||||||
|
libmultipath/parser.c | 3 +- |
||||||
|
libmultipath/parser.h | 2 +- |
||||||
|
3 files changed, 90 insertions(+), 58 deletions(-) |
||||||
|
|
||||||
|
diff --git a/libmultipath/dict.c b/libmultipath/dict.c |
||||||
|
index 7a727389..eb2c44c0 100644 |
||||||
|
--- a/libmultipath/dict.c |
||||||
|
+++ b/libmultipath/dict.c |
||||||
|
@@ -29,7 +29,7 @@ |
||||||
|
#include "strbuf.h" |
||||||
|
|
||||||
|
static int |
||||||
|
-set_int(vector strvec, void *ptr) |
||||||
|
+set_int(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
{ |
||||||
|
int *int_ptr = (int *)ptr; |
||||||
|
char *buff, *eptr; |
||||||
|
@@ -58,7 +58,7 @@ set_int(vector strvec, void *ptr) |
||||||
|
} |
||||||
|
|
||||||
|
static int |
||||||
|
-set_uint(vector strvec, void *ptr) |
||||||
|
+set_uint(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
{ |
||||||
|
unsigned int *uint_ptr = (unsigned int *)ptr; |
||||||
|
char *buff, *eptr, *p; |
||||||
|
@@ -90,7 +90,7 @@ set_uint(vector strvec, void *ptr) |
||||||
|
} |
||||||
|
|
||||||
|
static int |
||||||
|
-set_str(vector strvec, void *ptr) |
||||||
|
+set_str(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
{ |
||||||
|
char **str_ptr = (char **)ptr; |
||||||
|
|
||||||
|
@@ -105,7 +105,7 @@ set_str(vector strvec, void *ptr) |
||||||
|
} |
||||||
|
|
||||||
|
static int |
||||||
|
-set_yes_no(vector strvec, void *ptr) |
||||||
|
+set_yes_no(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
{ |
||||||
|
char * buff; |
||||||
|
int *int_ptr = (int *)ptr; |
||||||
|
@@ -124,7 +124,7 @@ set_yes_no(vector strvec, void *ptr) |
||||||
|
} |
||||||
|
|
||||||
|
static int |
||||||
|
-set_yes_no_undef(vector strvec, void *ptr) |
||||||
|
+set_yes_no_undef(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
{ |
||||||
|
char * buff; |
||||||
|
int *int_ptr = (int *)ptr; |
||||||
|
@@ -187,9 +187,10 @@ static int print_yes_no_undef(struct strbuf *buff, long v) |
||||||
|
|
||||||
|
#define declare_def_handler(option, function) \ |
||||||
|
static int \ |
||||||
|
-def_ ## option ## _handler (struct config *conf, vector strvec) \ |
||||||
|
+def_ ## option ## _handler (struct config *conf, vector strvec, \ |
||||||
|
+ const char *file, int line_nr) \ |
||||||
|
{ \ |
||||||
|
- return function (strvec, &conf->option); \ |
||||||
|
+ return function (strvec, &conf->option, file, line_nr); \ |
||||||
|
} |
||||||
|
|
||||||
|
#define declare_def_snprint(option, function) \ |
||||||
|
@@ -224,12 +225,13 @@ snprint_def_ ## option (struct config *conf, struct strbuf *buff, \ |
||||||
|
|
||||||
|
#define declare_hw_handler(option, function) \ |
||||||
|
static int \ |
||||||
|
-hw_ ## option ## _handler (struct config *conf, vector strvec) \ |
||||||
|
+hw_ ## option ## _handler (struct config *conf, vector strvec, \ |
||||||
|
+ const char *file, int line_nr) \ |
||||||
|
{ \ |
||||||
|
struct hwentry * hwe = VECTOR_LAST_SLOT(conf->hwtable); \ |
||||||
|
if (!hwe) \ |
||||||
|
return 1; \ |
||||||
|
- return function (strvec, &hwe->option); \ |
||||||
|
+ return function (strvec, &hwe->option, file, line_nr); \ |
||||||
|
} |
||||||
|
|
||||||
|
#define declare_hw_snprint(option, function) \ |
||||||
|
@@ -243,11 +245,12 @@ snprint_hw_ ## option (struct config *conf, struct strbuf *buff, \ |
||||||
|
|
||||||
|
#define declare_ovr_handler(option, function) \ |
||||||
|
static int \ |
||||||
|
-ovr_ ## option ## _handler (struct config *conf, vector strvec) \ |
||||||
|
+ovr_ ## option ## _handler (struct config *conf, vector strvec, \ |
||||||
|
+ const char *file, int line_nr) \ |
||||||
|
{ \ |
||||||
|
if (!conf->overrides) \ |
||||||
|
return 1; \ |
||||||
|
- return function (strvec, &conf->overrides->option); \ |
||||||
|
+ return function (strvec, &conf->overrides->option, file, line_nr); \ |
||||||
|
} |
||||||
|
|
||||||
|
#define declare_ovr_snprint(option, function) \ |
||||||
|
@@ -260,12 +263,13 @@ snprint_ovr_ ## option (struct config *conf, struct strbuf *buff, \ |
||||||
|
|
||||||
|
#define declare_mp_handler(option, function) \ |
||||||
|
static int \ |
||||||
|
-mp_ ## option ## _handler (struct config *conf, vector strvec) \ |
||||||
|
+mp_ ## option ## _handler (struct config *conf, vector strvec, \ |
||||||
|
+ const char *file, int line_nr) \ |
||||||
|
{ \ |
||||||
|
struct mpentry * mpe = VECTOR_LAST_SLOT(conf->mptable); \ |
||||||
|
if (!mpe) \ |
||||||
|
return 1; \ |
||||||
|
- return function (strvec, &mpe->option); \ |
||||||
|
+ return function (strvec, &mpe->option, file, line_nr); \ |
||||||
|
} |
||||||
|
|
||||||
|
#define declare_mp_snprint(option, function) \ |
||||||
|
@@ -277,9 +281,10 @@ snprint_mp_ ## option (struct config *conf, struct strbuf *buff, \ |
||||||
|
return function(buff, mpe->option); \ |
||||||
|
} |
||||||
|
|
||||||
|
-static int checkint_handler(struct config *conf, vector strvec) |
||||||
|
+static int checkint_handler(struct config *conf, vector strvec, |
||||||
|
+ const char *file, int line_nr) |
||||||
|
{ |
||||||
|
- int rc = set_uint(strvec, &conf->checkint); |
||||||
|
+ int rc = set_uint(strvec, &conf->checkint, file, line_nr); |
||||||
|
|
||||||
|
if (rc) |
||||||
|
return rc; |
||||||
|
@@ -302,9 +307,10 @@ declare_def_snprint(reassign_maps, print_yes_no) |
||||||
|
declare_def_handler(multipath_dir, set_str) |
||||||
|
declare_def_snprint(multipath_dir, print_str) |
||||||
|
|
||||||
|
-static int def_partition_delim_handler(struct config *conf, vector strvec) |
||||||
|
+static int def_partition_delim_handler(struct config *conf, vector strvec, |
||||||
|
+ const char *file, int line_nr) |
||||||
|
{ |
||||||
|
- int rc = set_str(strvec, &conf->partition_delim); |
||||||
|
+ int rc = set_str(strvec, &conf->partition_delim, file, line_nr); |
||||||
|
|
||||||
|
if (rc != 0) |
||||||
|
return rc; |
||||||
|
@@ -334,13 +340,13 @@ static const char * const find_multipaths_optvals[] = { |
||||||
|
}; |
||||||
|
|
||||||
|
static int |
||||||
|
-def_find_multipaths_handler(struct config *conf, vector strvec) |
||||||
|
+def_find_multipaths_handler(struct config *conf, vector strvec, |
||||||
|
+ const char *file, int line_nr) |
||||||
|
{ |
||||||
|
char *buff; |
||||||
|
int i; |
||||||
|
|
||||||
|
- if (set_yes_no_undef(strvec, &conf->find_multipaths) == 0 && |
||||||
|
- conf->find_multipaths != FIND_MULTIPATHS_UNDEF) |
||||||
|
+ if (set_yes_no_undef(strvec, &conf->find_multipaths, file, line_nr) == 0 && conf->find_multipaths != FIND_MULTIPATHS_UNDEF) |
||||||
|
return 0; |
||||||
|
|
||||||
|
buff = set_value(strvec); |
||||||
|
@@ -396,7 +402,8 @@ static int snprint_uid_attrs(struct config *conf, struct strbuf *buff, |
||||||
|
return total; |
||||||
|
} |
||||||
|
|
||||||
|
-static int uid_attrs_handler(struct config *conf, vector strvec) |
||||||
|
+static int uid_attrs_handler(struct config *conf, vector strvec, |
||||||
|
+ const char *file, int line_nr) |
||||||
|
{ |
||||||
|
char *val; |
||||||
|
|
||||||
|
@@ -597,7 +604,8 @@ declare_hw_handler(skip_kpartx, set_yes_no_undef) |
||||||
|
declare_hw_snprint(skip_kpartx, print_yes_no_undef) |
||||||
|
declare_mp_handler(skip_kpartx, set_yes_no_undef) |
||||||
|
declare_mp_snprint(skip_kpartx, print_yes_no_undef) |
||||||
|
-static int def_disable_changed_wwids_handler(struct config *conf, vector strvec) |
||||||
|
+static int def_disable_changed_wwids_handler(struct config *conf, vector strvec, |
||||||
|
+ const char *file, int line_nr) |
||||||
|
{ |
||||||
|
return 0; |
||||||
|
} |
||||||
|
@@ -629,20 +637,23 @@ declare_def_snprint_defstr(enable_foreign, print_str, |
||||||
|
DEFAULT_ENABLE_FOREIGN) |
||||||
|
|
||||||
|
static int |
||||||
|
-def_config_dir_handler(struct config *conf, vector strvec) |
||||||
|
+def_config_dir_handler(struct config *conf, vector strvec, const char *file, |
||||||
|
+ int line_nr) |
||||||
|
{ |
||||||
|
/* this is only valid in the main config file */ |
||||||
|
if (conf->processed_main_config) |
||||||
|
return 0; |
||||||
|
- return set_str(strvec, &conf->config_dir); |
||||||
|
+ return set_str(strvec, &conf->config_dir, file, line_nr); |
||||||
|
} |
||||||
|
declare_def_snprint(config_dir, print_str) |
||||||
|
|
||||||
|
#define declare_def_attr_handler(option, function) \ |
||||||
|
static int \ |
||||||
|
-def_ ## option ## _handler (struct config *conf, vector strvec) \ |
||||||
|
+def_ ## option ## _handler (struct config *conf, vector strvec, \ |
||||||
|
+ const char *file, int line_nr) \ |
||||||
|
{ \ |
||||||
|
- return function (strvec, &conf->option, &conf->attribute_flags);\ |
||||||
|
+ return function (strvec, &conf->option, &conf->attribute_flags, \ |
||||||
|
+ file, line_nr); \ |
||||||
|
} |
||||||
|
|
||||||
|
#define declare_def_attr_snprint(option, function) \ |
||||||
|
@@ -655,12 +666,14 @@ snprint_def_ ## option (struct config *conf, struct strbuf *buff, \ |
||||||
|
|
||||||
|
#define declare_mp_attr_handler(option, function) \ |
||||||
|
static int \ |
||||||
|
-mp_ ## option ## _handler (struct config *conf, vector strvec) \ |
||||||
|
+mp_ ## option ## _handler (struct config *conf, vector strvec, \ |
||||||
|
+ const char *file, int line_nr) \ |
||||||
|
{ \ |
||||||
|
struct mpentry * mpe = VECTOR_LAST_SLOT(conf->mptable); \ |
||||||
|
if (!mpe) \ |
||||||
|
return 1; \ |
||||||
|
- return function (strvec, &mpe->option, &mpe->attribute_flags); \ |
||||||
|
+ return function (strvec, &mpe->option, &mpe->attribute_flags, \ |
||||||
|
+ file, line_nr); \ |
||||||
|
} |
||||||
|
|
||||||
|
#define declare_mp_attr_snprint(option, function) \ |
||||||
|
@@ -673,7 +686,7 @@ snprint_mp_ ## option (struct config *conf, struct strbuf *buff, \ |
||||||
|
} |
||||||
|
|
||||||
|
static int |
||||||
|
-set_mode(vector strvec, void *ptr, int *flags) |
||||||
|
+set_mode(vector strvec, void *ptr, int *flags, const char *file, int line_nr) |
||||||
|
{ |
||||||
|
mode_t mode; |
||||||
|
mode_t *mode_ptr = (mode_t *)ptr; |
||||||
|
@@ -694,7 +707,7 @@ set_mode(vector strvec, void *ptr, int *flags) |
||||||
|
} |
||||||
|
|
||||||
|
static int |
||||||
|
-set_uid(vector strvec, void *ptr, int *flags) |
||||||
|
+set_uid(vector strvec, void *ptr, int *flags, const char *file, int line_nr) |
||||||
|
{ |
||||||
|
uid_t uid; |
||||||
|
uid_t *uid_ptr = (uid_t *)ptr; |
||||||
|
@@ -719,7 +732,7 @@ set_uid(vector strvec, void *ptr, int *flags) |
||||||
|
} |
||||||
|
|
||||||
|
static int |
||||||
|
-set_gid(vector strvec, void *ptr, int *flags) |
||||||
|
+set_gid(vector strvec, void *ptr, int *flags, const char *file, int line_nr) |
||||||
|
{ |
||||||
|
gid_t gid; |
||||||
|
gid_t *gid_ptr = (gid_t *)ptr; |
||||||
|
@@ -786,7 +799,7 @@ declare_mp_attr_handler(gid, set_gid) |
||||||
|
declare_mp_attr_snprint(gid, print_gid) |
||||||
|
|
||||||
|
static int |
||||||
|
-set_undef_off_zero(vector strvec, void *ptr) |
||||||
|
+set_undef_off_zero(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
{ |
||||||
|
char * buff; |
||||||
|
int *int_ptr = (int *)ptr; |
||||||
|
@@ -827,7 +840,7 @@ declare_hw_handler(fast_io_fail, set_undef_off_zero) |
||||||
|
declare_hw_snprint(fast_io_fail, print_undef_off_zero) |
||||||
|
|
||||||
|
static int |
||||||
|
-set_dev_loss(vector strvec, void *ptr) |
||||||
|
+set_dev_loss(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
{ |
||||||
|
char * buff; |
||||||
|
unsigned int *uint_ptr = (unsigned int *)ptr; |
||||||
|
@@ -870,7 +883,7 @@ declare_hw_handler(eh_deadline, set_undef_off_zero) |
||||||
|
declare_hw_snprint(eh_deadline, print_undef_off_zero) |
||||||
|
|
||||||
|
static int |
||||||
|
-set_pgpolicy(vector strvec, void *ptr) |
||||||
|
+set_pgpolicy(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
{ |
||||||
|
char * buff; |
||||||
|
int *int_ptr = (int *)ptr; |
||||||
|
@@ -936,7 +949,8 @@ get_sys_max_fds(int *max_fds) |
||||||
|
|
||||||
|
|
||||||
|
static int |
||||||
|
-max_fds_handler(struct config *conf, vector strvec) |
||||||
|
+max_fds_handler(struct config *conf, vector strvec, const char *file, |
||||||
|
+ int line_nr) |
||||||
|
{ |
||||||
|
char * buff; |
||||||
|
int r = 0, max_fds; |
||||||
|
@@ -981,7 +995,7 @@ snprint_max_fds (struct config *conf, struct strbuf *buff, const void *data) |
||||||
|
} |
||||||
|
|
||||||
|
static int |
||||||
|
-set_rr_weight(vector strvec, void *ptr) |
||||||
|
+set_rr_weight(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
{ |
||||||
|
int *int_ptr = (int *)ptr; |
||||||
|
char * buff; |
||||||
|
@@ -1025,7 +1039,7 @@ declare_mp_handler(rr_weight, set_rr_weight) |
||||||
|
declare_mp_snprint(rr_weight, print_rr_weight) |
||||||
|
|
||||||
|
static int |
||||||
|
-set_pgfailback(vector strvec, void *ptr) |
||||||
|
+set_pgfailback(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
{ |
||||||
|
int *int_ptr = (int *)ptr; |
||||||
|
char * buff; |
||||||
|
@@ -1075,7 +1089,7 @@ declare_mp_handler(pgfailback, set_pgfailback) |
||||||
|
declare_mp_snprint(pgfailback, print_pgfailback) |
||||||
|
|
||||||
|
static int |
||||||
|
-no_path_retry_helper(vector strvec, void *ptr) |
||||||
|
+no_path_retry_helper(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
{ |
||||||
|
int *int_ptr = (int *)ptr; |
||||||
|
char * buff; |
||||||
|
@@ -1120,7 +1134,8 @@ declare_mp_handler(no_path_retry, no_path_retry_helper) |
||||||
|
declare_mp_snprint(no_path_retry, print_no_path_retry) |
||||||
|
|
||||||
|
static int |
||||||
|
-def_log_checker_err_handler(struct config *conf, vector strvec) |
||||||
|
+def_log_checker_err_handler(struct config *conf, vector strvec, |
||||||
|
+ const char *file, int line_nr) |
||||||
|
{ |
||||||
|
char * buff; |
||||||
|
|
||||||
|
@@ -1193,7 +1208,8 @@ print_reservation_key(struct strbuf *buff, |
||||||
|
} |
||||||
|
|
||||||
|
static int |
||||||
|
-def_reservation_key_handler(struct config *conf, vector strvec) |
||||||
|
+def_reservation_key_handler(struct config *conf, vector strvec, |
||||||
|
+ const char *file, int line_nr) |
||||||
|
{ |
||||||
|
return set_reservation_key(strvec, &conf->reservation_key, |
||||||
|
&conf->sa_flags, |
||||||
|
@@ -1209,7 +1225,8 @@ snprint_def_reservation_key (struct config *conf, struct strbuf *buff, |
||||||
|
} |
||||||
|
|
||||||
|
static int |
||||||
|
-mp_reservation_key_handler(struct config *conf, vector strvec) |
||||||
|
+mp_reservation_key_handler(struct config *conf, vector strvec, const char *file, |
||||||
|
+ int line_nr) |
||||||
|
{ |
||||||
|
struct mpentry * mpe = VECTOR_LAST_SLOT(conf->mptable); |
||||||
|
if (!mpe) |
||||||
|
@@ -1229,7 +1246,7 @@ snprint_mp_reservation_key (struct config *conf, struct strbuf *buff, |
||||||
|
} |
||||||
|
|
||||||
|
static int |
||||||
|
-set_off_int_undef(vector strvec, void *ptr) |
||||||
|
+set_off_int_undef(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
{ |
||||||
|
int *int_ptr = (int *)ptr; |
||||||
|
char * buff; |
||||||
|
@@ -1370,7 +1387,8 @@ declare_hw_snprint(recheck_wwid, print_yes_no_undef) |
||||||
|
|
||||||
|
|
||||||
|
static int |
||||||
|
-def_uxsock_timeout_handler(struct config *conf, vector strvec) |
||||||
|
+def_uxsock_timeout_handler(struct config *conf, vector strvec, const char *file, |
||||||
|
+ int line_nr) |
||||||
|
{ |
||||||
|
unsigned int uxsock_timeout; |
||||||
|
char *buff; |
||||||
|
@@ -1390,7 +1408,8 @@ def_uxsock_timeout_handler(struct config *conf, vector strvec) |
||||||
|
} |
||||||
|
|
||||||
|
static int |
||||||
|
-hw_vpd_vendor_handler(struct config *conf, vector strvec) |
||||||
|
+hw_vpd_vendor_handler(struct config *conf, vector strvec, const char *file, |
||||||
|
+ int line_nr) |
||||||
|
{ |
||||||
|
int i; |
||||||
|
char *buff; |
||||||
|
@@ -1430,7 +1449,8 @@ snprint_hw_vpd_vendor(struct config *conf, struct strbuf *buff, |
||||||
|
* blacklist block handlers |
||||||
|
*/ |
||||||
|
static int |
||||||
|
-blacklist_handler(struct config *conf, vector strvec) |
||||||
|
+blacklist_handler(struct config *conf, vector strvec, const char*file, |
||||||
|
+ int line_nr) |
||||||
|
{ |
||||||
|
if (!conf->blist_devnode) |
||||||
|
conf->blist_devnode = vector_alloc(); |
||||||
|
@@ -1452,7 +1472,8 @@ blacklist_handler(struct config *conf, vector strvec) |
||||||
|
} |
||||||
|
|
||||||
|
static int |
||||||
|
-blacklist_exceptions_handler(struct config *conf, vector strvec) |
||||||
|
+blacklist_exceptions_handler(struct config *conf, vector strvec, |
||||||
|
+ const char *file, int line_nr) |
||||||
|
{ |
||||||
|
if (!conf->elist_devnode) |
||||||
|
conf->elist_devnode = vector_alloc(); |
||||||
|
@@ -1475,7 +1496,8 @@ blacklist_exceptions_handler(struct config *conf, vector strvec) |
||||||
|
|
||||||
|
#define declare_ble_handler(option) \ |
||||||
|
static int \ |
||||||
|
-ble_ ## option ## _handler (struct config *conf, vector strvec) \ |
||||||
|
+ble_ ## option ## _handler (struct config *conf, vector strvec, \ |
||||||
|
+ const char *file, int line_nr) \ |
||||||
|
{ \ |
||||||
|
char *buff; \ |
||||||
|
int rc; \ |
||||||
|
@@ -1494,7 +1516,8 @@ ble_ ## option ## _handler (struct config *conf, vector strvec) \ |
||||||
|
|
||||||
|
#define declare_ble_device_handler(name, option, vend, prod) \ |
||||||
|
static int \ |
||||||
|
-ble_ ## option ## _ ## name ## _handler (struct config *conf, vector strvec) \ |
||||||
|
+ble_ ## option ## _ ## name ## _handler (struct config *conf, vector strvec, \ |
||||||
|
+ const char *file, int line_nr) \ |
||||||
|
{ \ |
||||||
|
char * buff; \ |
||||||
|
int rc; \ |
||||||
|
@@ -1536,13 +1559,15 @@ snprint_ble_simple (struct config *conf, struct strbuf *buff, const void *data) |
||||||
|
} |
||||||
|
|
||||||
|
static int |
||||||
|
-ble_device_handler(struct config *conf, vector strvec) |
||||||
|
+ble_device_handler(struct config *conf, vector strvec, const char *file, |
||||||
|
+ int line_nr) |
||||||
|
{ |
||||||
|
return alloc_ble_device(conf->blist_device); |
||||||
|
} |
||||||
|
|
||||||
|
static int |
||||||
|
-ble_except_device_handler(struct config *conf, vector strvec) |
||||||
|
+ble_except_device_handler(struct config *conf, vector strvec, const char *file, |
||||||
|
+ int line_nr) |
||||||
|
{ |
||||||
|
return alloc_ble_device(conf->elist_device); |
||||||
|
} |
||||||
|
@@ -1574,7 +1599,8 @@ static int snprint_bled_product(struct config *conf, struct strbuf *buff, |
||||||
|
* devices block handlers |
||||||
|
*/ |
||||||
|
static int |
||||||
|
-devices_handler(struct config *conf, vector strvec) |
||||||
|
+devices_handler(struct config *conf, vector strvec, const char *file, |
||||||
|
+ int line_nr) |
||||||
|
{ |
||||||
|
if (!conf->hwtable) |
||||||
|
conf->hwtable = vector_alloc(); |
||||||
|
@@ -1586,7 +1612,8 @@ devices_handler(struct config *conf, vector strvec) |
||||||
|
} |
||||||
|
|
||||||
|
static int |
||||||
|
-device_handler(struct config *conf, vector strvec) |
||||||
|
+device_handler(struct config *conf, vector strvec, const char *file, |
||||||
|
+ int line_nr) |
||||||
|
{ |
||||||
|
struct hwentry * hwe; |
||||||
|
|
||||||
|
@@ -1623,7 +1650,8 @@ declare_hw_snprint(hwhandler, print_str) |
||||||
|
* overrides handlers |
||||||
|
*/ |
||||||
|
static int |
||||||
|
-overrides_handler(struct config *conf, vector strvec) |
||||||
|
+overrides_handler(struct config *conf, vector strvec, const char *file, |
||||||
|
+ int line_nr) |
||||||
|
{ |
||||||
|
if (!conf->overrides) |
||||||
|
conf->overrides = alloc_hwe(); |
||||||
|
@@ -1640,7 +1668,8 @@ overrides_handler(struct config *conf, vector strvec) |
||||||
|
* multipaths block handlers |
||||||
|
*/ |
||||||
|
static int |
||||||
|
-multipaths_handler(struct config *conf, vector strvec) |
||||||
|
+multipaths_handler(struct config *conf, vector strvec, const char *file, |
||||||
|
+ int line_nr) |
||||||
|
{ |
||||||
|
if (!conf->mptable) |
||||||
|
conf->mptable = vector_alloc(); |
||||||
|
@@ -1652,7 +1681,8 @@ multipaths_handler(struct config *conf, vector strvec) |
||||||
|
} |
||||||
|
|
||||||
|
static int |
||||||
|
-multipath_handler(struct config *conf, vector strvec) |
||||||
|
+multipath_handler(struct config *conf, vector strvec, const char *file, |
||||||
|
+ int line_nr) |
||||||
|
{ |
||||||
|
struct mpentry * mpe; |
||||||
|
|
||||||
|
@@ -1681,7 +1711,8 @@ declare_mp_snprint(alias, print_str) |
||||||
|
*/ |
||||||
|
|
||||||
|
static int |
||||||
|
-deprecated_handler(struct config *conf, vector strvec) |
||||||
|
+deprecated_handler(struct config *conf, vector strvec, const char *file, |
||||||
|
+ int line_nr) |
||||||
|
{ |
||||||
|
char * buff; |
||||||
|
|
||||||
|
diff --git a/libmultipath/parser.c b/libmultipath/parser.c |
||||||
|
index d5595fb0..68262d0e 100644 |
||||||
|
--- a/libmultipath/parser.c |
||||||
|
+++ b/libmultipath/parser.c |
||||||
|
@@ -558,7 +558,8 @@ process_stream(struct config *conf, FILE *stream, vector keywords, |
||||||
|
goto out; |
||||||
|
} |
||||||
|
if (keyword->handler) { |
||||||
|
- t = keyword->handler(conf, strvec); |
||||||
|
+ t = keyword->handler(conf, strvec, file, |
||||||
|
+ line_nr); |
||||||
|
r += t; |
||||||
|
if (t) |
||||||
|
condlog(1, "%s line %d, parsing failed: %s", |
||||||
|
diff --git a/libmultipath/parser.h b/libmultipath/parser.h |
||||||
|
index 3452bde1..11ea2278 100644 |
||||||
|
--- a/libmultipath/parser.h |
||||||
|
+++ b/libmultipath/parser.h |
||||||
|
@@ -43,7 +43,7 @@ struct strbuf; |
||||||
|
|
||||||
|
/* keyword definition */ |
||||||
|
typedef int print_fn(struct config *, struct strbuf *, const void *); |
||||||
|
-typedef int handler_fn(struct config *, vector); |
||||||
|
+typedef int handler_fn(struct config *, vector, const char *file, int line_nr); |
||||||
|
|
||||||
|
struct keyword { |
||||||
|
char *string; |
@ -0,0 +1,250 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Date: Tue, 28 Sep 2021 15:59:19 -0500 |
||||||
|
Subject: [PATCH] libmultipath: make set_int take a range for valid values |
||||||
|
|
||||||
|
If a value outside of the valid range is passed to set_int, it caps the |
||||||
|
value at appropriate limit, and issues a warning. |
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
libmultipath/dict.c | 121 +++++++++++++++++++++++++++----------------- |
||||||
|
1 file changed, 75 insertions(+), 46 deletions(-) |
||||||
|
|
||||||
|
diff --git a/libmultipath/dict.c b/libmultipath/dict.c |
||||||
|
index eb2c44c0..57b6a7b6 100644 |
||||||
|
--- a/libmultipath/dict.c |
||||||
|
+++ b/libmultipath/dict.c |
||||||
|
@@ -29,7 +29,8 @@ |
||||||
|
#include "strbuf.h" |
||||||
|
|
||||||
|
static int |
||||||
|
-set_int(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
+set_int(vector strvec, void *ptr, int min, int max, const char *file, |
||||||
|
+ int line_nr) |
||||||
|
{ |
||||||
|
int *int_ptr = (int *)ptr; |
||||||
|
char *buff, *eptr; |
||||||
|
@@ -44,11 +45,17 @@ set_int(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
if (eptr > buff) |
||||||
|
while (isspace(*eptr)) |
||||||
|
eptr++; |
||||||
|
- if (*buff == '\0' || *eptr != '\0' || res > INT_MAX || res < INT_MIN) { |
||||||
|
- condlog(1, "%s: invalid value for %s: \"%s\"", |
||||||
|
- __func__, (char*)VECTOR_SLOT(strvec, 0), buff); |
||||||
|
+ if (*buff == '\0' || *eptr != '\0') { |
||||||
|
+ condlog(1, "%s line %d, invalid value for %s: \"%s\"", |
||||||
|
+ file, line_nr, (char*)VECTOR_SLOT(strvec, 0), buff); |
||||||
|
rc = 1; |
||||||
|
} else { |
||||||
|
+ if (res > max || res < min) { |
||||||
|
+ res = (res > max) ? max : min; |
||||||
|
+ condlog(1, "%s line %d, value for %s too %s, capping at %ld", |
||||||
|
+ file, line_nr, (char*)VECTOR_SLOT(strvec, 0), |
||||||
|
+ (res == max)? "large" : "small", res); |
||||||
|
+ } |
||||||
|
rc = 0; |
||||||
|
*int_ptr = res; |
||||||
|
} |
||||||
|
@@ -77,8 +84,8 @@ set_uint(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
while (isspace(*eptr)) |
||||||
|
eptr++; |
||||||
|
if (*buff == '\0' || *eptr != '\0' || !isdigit(*p) || res > UINT_MAX) { |
||||||
|
- condlog(1, "%s: invalid value for %s: \"%s\"", |
||||||
|
- __func__, (char*)VECTOR_SLOT(strvec, 0), buff); |
||||||
|
+ condlog(1, "%s line %d, invalid value for %s: \"%s\"", |
||||||
|
+ file, line_nr, (char*)VECTOR_SLOT(strvec, 0), buff); |
||||||
|
rc = 1; |
||||||
|
} else { |
||||||
|
rc = 0; |
||||||
|
@@ -193,6 +200,14 @@ def_ ## option ## _handler (struct config *conf, vector strvec, \ |
||||||
|
return function (strvec, &conf->option, file, line_nr); \ |
||||||
|
} |
||||||
|
|
||||||
|
+#define declare_def_range_handler(option, minval, maxval) \ |
||||||
|
+static int \ |
||||||
|
+def_ ## option ## _handler (struct config *conf, vector strvec, \ |
||||||
|
+ const char *file, int line_nr) \ |
||||||
|
+{ \ |
||||||
|
+ return set_int(strvec, &conf->option, minval, maxval, file, line_nr); \ |
||||||
|
+} |
||||||
|
+ |
||||||
|
#define declare_def_snprint(option, function) \ |
||||||
|
static int \ |
||||||
|
snprint_def_ ## option (struct config *conf, struct strbuf *buff, \ |
||||||
|
@@ -234,6 +249,18 @@ hw_ ## option ## _handler (struct config *conf, vector strvec, \ |
||||||
|
return function (strvec, &hwe->option, file, line_nr); \ |
||||||
|
} |
||||||
|
|
||||||
|
+#define declare_hw_range_handler(option, minval, maxval) \ |
||||||
|
+static int \ |
||||||
|
+hw_ ## option ## _handler (struct config *conf, vector strvec, \ |
||||||
|
+ const char *file, int line_nr) \ |
||||||
|
+{ \ |
||||||
|
+ struct hwentry * hwe = VECTOR_LAST_SLOT(conf->hwtable); \ |
||||||
|
+ if (!hwe) \ |
||||||
|
+ return 1; \ |
||||||
|
+ return set_int(strvec, &hwe->option, minval, maxval, file, line_nr); \ |
||||||
|
+} |
||||||
|
+ |
||||||
|
+ |
||||||
|
#define declare_hw_snprint(option, function) \ |
||||||
|
static int \ |
||||||
|
snprint_hw_ ## option (struct config *conf, struct strbuf *buff, \ |
||||||
|
@@ -253,6 +280,17 @@ ovr_ ## option ## _handler (struct config *conf, vector strvec, \ |
||||||
|
return function (strvec, &conf->overrides->option, file, line_nr); \ |
||||||
|
} |
||||||
|
|
||||||
|
+#define declare_ovr_range_handler(option, minval, maxval) \ |
||||||
|
+static int \ |
||||||
|
+ovr_ ## option ## _handler (struct config *conf, vector strvec, \ |
||||||
|
+ const char *file, int line_nr) \ |
||||||
|
+{ \ |
||||||
|
+ if (!conf->overrides) \ |
||||||
|
+ return 1; \ |
||||||
|
+ return set_int(strvec, &conf->overrides->option, minval, maxval, \ |
||||||
|
+ file, line_nr); \ |
||||||
|
+} |
||||||
|
+ |
||||||
|
#define declare_ovr_snprint(option, function) \ |
||||||
|
static int \ |
||||||
|
snprint_ovr_ ## option (struct config *conf, struct strbuf *buff, \ |
||||||
|
@@ -272,6 +310,17 @@ mp_ ## option ## _handler (struct config *conf, vector strvec, \ |
||||||
|
return function (strvec, &mpe->option, file, line_nr); \ |
||||||
|
} |
||||||
|
|
||||||
|
+#define declare_mp_range_handler(option, minval, maxval) \ |
||||||
|
+static int \ |
||||||
|
+mp_ ## option ## _handler (struct config *conf, vector strvec, \ |
||||||
|
+ const char *file, int line_nr) \ |
||||||
|
+{ \ |
||||||
|
+ struct mpentry * mpe = VECTOR_LAST_SLOT(conf->mptable); \ |
||||||
|
+ if (!mpe) \ |
||||||
|
+ return 1; \ |
||||||
|
+ return set_int(strvec, &mpe->option, minval, maxval, file, line_nr); \ |
||||||
|
+} |
||||||
|
+ |
||||||
|
#define declare_mp_snprint(option, function) \ |
||||||
|
static int \ |
||||||
|
snprint_mp_ ## option (struct config *conf, struct strbuf *buff, \ |
||||||
|
@@ -298,7 +347,7 @@ declare_def_snprint(checkint, print_int) |
||||||
|
declare_def_handler(max_checkint, set_uint) |
||||||
|
declare_def_snprint(max_checkint, print_int) |
||||||
|
|
||||||
|
-declare_def_handler(verbosity, set_int) |
||||||
|
+declare_def_range_handler(verbosity, 0, MAX_VERBOSITY) |
||||||
|
declare_def_snprint(verbosity, print_int) |
||||||
|
|
||||||
|
declare_def_handler(reassign_maps, set_yes_no) |
||||||
|
@@ -473,22 +522,22 @@ declare_ovr_snprint(checker_name, print_str) |
||||||
|
declare_hw_handler(checker_name, set_str) |
||||||
|
declare_hw_snprint(checker_name, print_str) |
||||||
|
|
||||||
|
-declare_def_handler(minio, set_int) |
||||||
|
+declare_def_range_handler(minio, 0, INT_MAX) |
||||||
|
declare_def_snprint_defint(minio, print_int, DEFAULT_MINIO) |
||||||
|
-declare_ovr_handler(minio, set_int) |
||||||
|
+declare_ovr_range_handler(minio, 0, INT_MAX) |
||||||
|
declare_ovr_snprint(minio, print_nonzero) |
||||||
|
-declare_hw_handler(minio, set_int) |
||||||
|
+declare_hw_range_handler(minio, 0, INT_MAX) |
||||||
|
declare_hw_snprint(minio, print_nonzero) |
||||||
|
-declare_mp_handler(minio, set_int) |
||||||
|
+declare_mp_range_handler(minio, 0, INT_MAX) |
||||||
|
declare_mp_snprint(minio, print_nonzero) |
||||||
|
|
||||||
|
-declare_def_handler(minio_rq, set_int) |
||||||
|
+declare_def_range_handler(minio_rq, 0, INT_MAX) |
||||||
|
declare_def_snprint_defint(minio_rq, print_int, DEFAULT_MINIO_RQ) |
||||||
|
-declare_ovr_handler(minio_rq, set_int) |
||||||
|
+declare_ovr_range_handler(minio_rq, 0, INT_MAX) |
||||||
|
declare_ovr_snprint(minio_rq, print_nonzero) |
||||||
|
-declare_hw_handler(minio_rq, set_int) |
||||||
|
+declare_hw_range_handler(minio_rq, 0, INT_MAX) |
||||||
|
declare_hw_snprint(minio_rq, print_nonzero) |
||||||
|
-declare_mp_handler(minio_rq, set_int) |
||||||
|
+declare_mp_range_handler(minio_rq, 0, INT_MAX) |
||||||
|
declare_mp_snprint(minio_rq, print_nonzero) |
||||||
|
|
||||||
|
declare_def_handler(queue_without_daemon, set_yes_no) |
||||||
|
@@ -512,7 +561,7 @@ snprint_def_queue_without_daemon(struct config *conf, struct strbuf *buff, |
||||||
|
return append_strbuf_quoted(buff, qwd); |
||||||
|
} |
||||||
|
|
||||||
|
-declare_def_handler(checker_timeout, set_int) |
||||||
|
+declare_def_range_handler(checker_timeout, 0, INT_MAX) |
||||||
|
declare_def_snprint(checker_timeout, print_nonzero) |
||||||
|
|
||||||
|
declare_def_handler(allow_usb_devices, set_yes_no) |
||||||
|
@@ -583,13 +632,13 @@ declare_hw_snprint(deferred_remove, print_yes_no_undef) |
||||||
|
declare_mp_handler(deferred_remove, set_yes_no_undef) |
||||||
|
declare_mp_snprint(deferred_remove, print_yes_no_undef) |
||||||
|
|
||||||
|
-declare_def_handler(retrigger_tries, set_int) |
||||||
|
+declare_def_range_handler(retrigger_tries, 0, INT_MAX) |
||||||
|
declare_def_snprint(retrigger_tries, print_int) |
||||||
|
|
||||||
|
-declare_def_handler(retrigger_delay, set_int) |
||||||
|
+declare_def_range_handler(retrigger_delay, 0, INT_MAX) |
||||||
|
declare_def_snprint(retrigger_delay, print_int) |
||||||
|
|
||||||
|
-declare_def_handler(uev_wait_timeout, set_int) |
||||||
|
+declare_def_range_handler(uev_wait_timeout, 0, INT_MAX) |
||||||
|
declare_def_snprint(uev_wait_timeout, print_int) |
||||||
|
|
||||||
|
declare_def_handler(strict_timing, set_yes_no) |
||||||
|
@@ -616,19 +665,19 @@ static int snprint_def_disable_changed_wwids(struct config *conf, |
||||||
|
return print_ignored(buff); |
||||||
|
} |
||||||
|
|
||||||
|
-declare_def_handler(remove_retries, set_int) |
||||||
|
+declare_def_range_handler(remove_retries, 0, INT_MAX) |
||||||
|
declare_def_snprint(remove_retries, print_int) |
||||||
|
|
||||||
|
-declare_def_handler(max_sectors_kb, set_int) |
||||||
|
+declare_def_range_handler(max_sectors_kb, 0, INT_MAX) |
||||||
|
declare_def_snprint(max_sectors_kb, print_nonzero) |
||||||
|
-declare_ovr_handler(max_sectors_kb, set_int) |
||||||
|
+declare_ovr_range_handler(max_sectors_kb, 0, INT_MAX) |
||||||
|
declare_ovr_snprint(max_sectors_kb, print_nonzero) |
||||||
|
-declare_hw_handler(max_sectors_kb, set_int) |
||||||
|
+declare_hw_range_handler(max_sectors_kb, 0, INT_MAX) |
||||||
|
declare_hw_snprint(max_sectors_kb, print_nonzero) |
||||||
|
-declare_mp_handler(max_sectors_kb, set_int) |
||||||
|
+declare_mp_range_handler(max_sectors_kb, 0, INT_MAX) |
||||||
|
declare_mp_snprint(max_sectors_kb, print_nonzero) |
||||||
|
|
||||||
|
-declare_def_handler(find_multipaths_timeout, set_int) |
||||||
|
+declare_def_range_handler(find_multipaths_timeout, INT_MIN, INT_MAX) |
||||||
|
declare_def_snprint_defint(find_multipaths_timeout, print_int, |
||||||
|
DEFAULT_FIND_MULTIPATHS_TIMEOUT) |
||||||
|
|
||||||
|
@@ -1385,27 +1434,7 @@ declare_ovr_snprint(recheck_wwid, print_yes_no_undef) |
||||||
|
declare_hw_handler(recheck_wwid, set_yes_no_undef) |
||||||
|
declare_hw_snprint(recheck_wwid, print_yes_no_undef) |
||||||
|
|
||||||
|
- |
||||||
|
-static int |
||||||
|
-def_uxsock_timeout_handler(struct config *conf, vector strvec, const char *file, |
||||||
|
- int line_nr) |
||||||
|
-{ |
||||||
|
- unsigned int uxsock_timeout; |
||||||
|
- char *buff; |
||||||
|
- |
||||||
|
- buff = set_value(strvec); |
||||||
|
- if (!buff) |
||||||
|
- return 1; |
||||||
|
- |
||||||
|
- if (sscanf(buff, "%u", &uxsock_timeout) == 1 && |
||||||
|
- uxsock_timeout > DEFAULT_REPLY_TIMEOUT) |
||||||
|
- conf->uxsock_timeout = uxsock_timeout; |
||||||
|
- else |
||||||
|
- conf->uxsock_timeout = DEFAULT_REPLY_TIMEOUT; |
||||||
|
- |
||||||
|
- free(buff); |
||||||
|
- return 0; |
||||||
|
-} |
||||||
|
+declare_def_range_handler(uxsock_timeout, DEFAULT_REPLY_TIMEOUT, INT_MAX) |
||||||
|
|
||||||
|
static int |
||||||
|
hw_vpd_vendor_handler(struct config *conf, vector strvec, const char *file, |
@ -0,0 +1,170 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Date: Wed, 29 Sep 2021 12:56:04 -0500 |
||||||
|
Subject: [PATCH] libmultipath: improve checks for set_str |
||||||
|
|
||||||
|
multipath always requires absolute pathnames, so make sure all file and |
||||||
|
directory names start with a slash. Also check that the directories |
||||||
|
exist. Finally, some strings, like the alias, will be used in paths. |
||||||
|
These must not contain the slash character '/', since it is a forbidden |
||||||
|
character in file/directory names. This patch adds seperate handlers for |
||||||
|
these three cases. If a config line is invalid, these handlers retain |
||||||
|
the existing config string, if any. |
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
libmultipath/dict.c | 88 +++++++++++++++++++++++++++++++++++++++------ |
||||||
|
1 file changed, 78 insertions(+), 10 deletions(-) |
||||||
|
|
||||||
|
diff --git a/libmultipath/dict.c b/libmultipath/dict.c |
||||||
|
index 57b6a7b6..149d3348 100644 |
||||||
|
--- a/libmultipath/dict.c |
||||||
|
+++ b/libmultipath/dict.c |
||||||
|
@@ -5,6 +5,8 @@ |
||||||
|
* Copyright (c) 2005 Kiyoshi Ueda, NEC |
||||||
|
*/ |
||||||
|
#include <sys/types.h> |
||||||
|
+#include <sys/stat.h> |
||||||
|
+#include <unistd.h> |
||||||
|
#include <pwd.h> |
||||||
|
#include <string.h> |
||||||
|
#include "checkers.h" |
||||||
|
@@ -111,6 +113,72 @@ set_str(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
+static int |
||||||
|
+set_dir(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
+{ |
||||||
|
+ char **str_ptr = (char **)ptr; |
||||||
|
+ char *old_str = *str_ptr; |
||||||
|
+ struct stat sb; |
||||||
|
+ |
||||||
|
+ *str_ptr = set_value(strvec); |
||||||
|
+ if (!*str_ptr) { |
||||||
|
+ free(old_str); |
||||||
|
+ return 1; |
||||||
|
+ } |
||||||
|
+ if ((*str_ptr)[0] != '/'){ |
||||||
|
+ condlog(1, "%s line %d, %s is not an absolute directory path. Ignoring", file, line_nr, *str_ptr); |
||||||
|
+ *str_ptr = old_str; |
||||||
|
+ } else { |
||||||
|
+ if (stat(*str_ptr, &sb) == 0 && S_ISDIR(sb.st_mode)) |
||||||
|
+ free(old_str); |
||||||
|
+ else { |
||||||
|
+ condlog(1, "%s line %d, %s is not an existing directory. Ignoring", file, line_nr, *str_ptr); |
||||||
|
+ *str_ptr = old_str; |
||||||
|
+ } |
||||||
|
+ } |
||||||
|
+ return 0; |
||||||
|
+} |
||||||
|
+ |
||||||
|
+static int |
||||||
|
+set_path(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
+{ |
||||||
|
+ char **str_ptr = (char **)ptr; |
||||||
|
+ char *old_str = *str_ptr; |
||||||
|
+ |
||||||
|
+ *str_ptr = set_value(strvec); |
||||||
|
+ if (!*str_ptr) { |
||||||
|
+ free(old_str); |
||||||
|
+ return 1; |
||||||
|
+ } |
||||||
|
+ if ((*str_ptr)[0] != '/'){ |
||||||
|
+ condlog(1, "%s line %d, %s is not an absolute path. Ignoring", |
||||||
|
+ file, line_nr, *str_ptr); |
||||||
|
+ *str_ptr = old_str; |
||||||
|
+ } else |
||||||
|
+ free(old_str); |
||||||
|
+ return 0; |
||||||
|
+} |
||||||
|
+ |
||||||
|
+static int |
||||||
|
+set_str_noslash(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
+{ |
||||||
|
+ char **str_ptr = (char **)ptr; |
||||||
|
+ char *old_str = *str_ptr; |
||||||
|
+ |
||||||
|
+ *str_ptr = set_value(strvec); |
||||||
|
+ if (!*str_ptr) { |
||||||
|
+ free(old_str); |
||||||
|
+ return 1; |
||||||
|
+ } |
||||||
|
+ if (strchr(*str_ptr, '/')) { |
||||||
|
+ condlog(1, "%s line %d, %s cannot contain a slash. Ignoring", |
||||||
|
+ file, line_nr, *str_ptr); |
||||||
|
+ *str_ptr = old_str; |
||||||
|
+ } else |
||||||
|
+ free(old_str); |
||||||
|
+ return 0; |
||||||
|
+} |
||||||
|
+ |
||||||
|
static int |
||||||
|
set_yes_no(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
{ |
||||||
|
@@ -353,13 +421,13 @@ declare_def_snprint(verbosity, print_int) |
||||||
|
declare_def_handler(reassign_maps, set_yes_no) |
||||||
|
declare_def_snprint(reassign_maps, print_yes_no) |
||||||
|
|
||||||
|
-declare_def_handler(multipath_dir, set_str) |
||||||
|
+declare_def_handler(multipath_dir, set_dir) |
||||||
|
declare_def_snprint(multipath_dir, print_str) |
||||||
|
|
||||||
|
static int def_partition_delim_handler(struct config *conf, vector strvec, |
||||||
|
const char *file, int line_nr) |
||||||
|
{ |
||||||
|
- int rc = set_str(strvec, &conf->partition_delim, file, line_nr); |
||||||
|
+ int rc = set_str_noslash(strvec, &conf->partition_delim, file, line_nr); |
||||||
|
|
||||||
|
if (rc != 0) |
||||||
|
return rc; |
||||||
|
@@ -490,11 +558,11 @@ declare_hw_snprint(prio_name, print_str) |
||||||
|
declare_mp_handler(prio_name, set_str) |
||||||
|
declare_mp_snprint(prio_name, print_str) |
||||||
|
|
||||||
|
-declare_def_handler(alias_prefix, set_str) |
||||||
|
+declare_def_handler(alias_prefix, set_str_noslash) |
||||||
|
declare_def_snprint_defstr(alias_prefix, print_str, DEFAULT_ALIAS_PREFIX) |
||||||
|
-declare_ovr_handler(alias_prefix, set_str) |
||||||
|
+declare_ovr_handler(alias_prefix, set_str_noslash) |
||||||
|
declare_ovr_snprint(alias_prefix, print_str) |
||||||
|
-declare_hw_handler(alias_prefix, set_str) |
||||||
|
+declare_hw_handler(alias_prefix, set_str_noslash) |
||||||
|
declare_hw_snprint(alias_prefix, print_str) |
||||||
|
|
||||||
|
declare_def_handler(prio_args, set_str) |
||||||
|
@@ -586,13 +654,13 @@ declare_hw_snprint(user_friendly_names, print_yes_no_undef) |
||||||
|
declare_mp_handler(user_friendly_names, set_yes_no_undef) |
||||||
|
declare_mp_snprint(user_friendly_names, print_yes_no_undef) |
||||||
|
|
||||||
|
-declare_def_handler(bindings_file, set_str) |
||||||
|
+declare_def_handler(bindings_file, set_path) |
||||||
|
declare_def_snprint(bindings_file, print_str) |
||||||
|
|
||||||
|
-declare_def_handler(wwids_file, set_str) |
||||||
|
+declare_def_handler(wwids_file, set_path) |
||||||
|
declare_def_snprint(wwids_file, print_str) |
||||||
|
|
||||||
|
-declare_def_handler(prkeys_file, set_str) |
||||||
|
+declare_def_handler(prkeys_file, set_path) |
||||||
|
declare_def_snprint(prkeys_file, print_str) |
||||||
|
|
||||||
|
declare_def_handler(retain_hwhandler, set_yes_no_undef) |
||||||
|
@@ -692,7 +760,7 @@ def_config_dir_handler(struct config *conf, vector strvec, const char *file, |
||||||
|
/* this is only valid in the main config file */ |
||||||
|
if (conf->processed_main_config) |
||||||
|
return 0; |
||||||
|
- return set_str(strvec, &conf->config_dir, file, line_nr); |
||||||
|
+ return set_path(strvec, &conf->config_dir, file, line_nr); |
||||||
|
} |
||||||
|
declare_def_snprint(config_dir, print_str) |
||||||
|
|
||||||
|
@@ -1732,7 +1800,7 @@ multipath_handler(struct config *conf, vector strvec, const char *file, |
||||||
|
declare_mp_handler(wwid, set_str) |
||||||
|
declare_mp_snprint(wwid, print_str) |
||||||
|
|
||||||
|
-declare_mp_handler(alias, set_str) |
||||||
|
+declare_mp_handler(alias, set_str_noslash) |
||||||
|
declare_mp_snprint(alias, print_str) |
||||||
|
|
||||||
|
/* |
@ -0,0 +1,114 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Date: Wed, 10 Nov 2021 18:34:08 -0600 |
||||||
|
Subject: [PATCH] libmultipath: deprecate file and directory config options |
||||||
|
|
||||||
|
Having multipath able to select pathnames for the files and directories |
||||||
|
it needs causes unnecessary maintainer headaches. Mark these as |
||||||
|
deprecated, but still support them for now. |
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
libmultipath/dict.c | 19 +++++++++++++++---- |
||||||
|
multipath/multipath.conf.5 | 5 +++++ |
||||||
|
2 files changed, 20 insertions(+), 4 deletions(-) |
||||||
|
|
||||||
|
diff --git a/libmultipath/dict.c b/libmultipath/dict.c |
||||||
|
index 149d3348..d14be340 100644 |
||||||
|
--- a/libmultipath/dict.c |
||||||
|
+++ b/libmultipath/dict.c |
||||||
|
@@ -268,6 +268,15 @@ def_ ## option ## _handler (struct config *conf, vector strvec, \ |
||||||
|
return function (strvec, &conf->option, file, line_nr); \ |
||||||
|
} |
||||||
|
|
||||||
|
+#define declare_def_warn_handler(option, function) \ |
||||||
|
+static int \ |
||||||
|
+def_ ## option ## _handler (struct config *conf, vector strvec, \ |
||||||
|
+ const char *file, int line_nr) \ |
||||||
|
+{ \ |
||||||
|
+ condlog(2, "%s line %d, \"" #option "\" is deprecated and will be disabled in a future release", file, line_nr); \ |
||||||
|
+ return function (strvec, &conf->option, file, line_nr); \ |
||||||
|
+} |
||||||
|
+ |
||||||
|
#define declare_def_range_handler(option, minval, maxval) \ |
||||||
|
static int \ |
||||||
|
def_ ## option ## _handler (struct config *conf, vector strvec, \ |
||||||
|
@@ -421,7 +430,7 @@ declare_def_snprint(verbosity, print_int) |
||||||
|
declare_def_handler(reassign_maps, set_yes_no) |
||||||
|
declare_def_snprint(reassign_maps, print_yes_no) |
||||||
|
|
||||||
|
-declare_def_handler(multipath_dir, set_dir) |
||||||
|
+declare_def_warn_handler(multipath_dir, set_dir) |
||||||
|
declare_def_snprint(multipath_dir, print_str) |
||||||
|
|
||||||
|
static int def_partition_delim_handler(struct config *conf, vector strvec, |
||||||
|
@@ -654,13 +663,13 @@ declare_hw_snprint(user_friendly_names, print_yes_no_undef) |
||||||
|
declare_mp_handler(user_friendly_names, set_yes_no_undef) |
||||||
|
declare_mp_snprint(user_friendly_names, print_yes_no_undef) |
||||||
|
|
||||||
|
-declare_def_handler(bindings_file, set_path) |
||||||
|
+declare_def_warn_handler(bindings_file, set_path) |
||||||
|
declare_def_snprint(bindings_file, print_str) |
||||||
|
|
||||||
|
-declare_def_handler(wwids_file, set_path) |
||||||
|
+declare_def_warn_handler(wwids_file, set_path) |
||||||
|
declare_def_snprint(wwids_file, print_str) |
||||||
|
|
||||||
|
-declare_def_handler(prkeys_file, set_path) |
||||||
|
+declare_def_warn_handler(prkeys_file, set_path) |
||||||
|
declare_def_snprint(prkeys_file, print_str) |
||||||
|
|
||||||
|
declare_def_handler(retain_hwhandler, set_yes_no_undef) |
||||||
|
@@ -760,6 +769,8 @@ def_config_dir_handler(struct config *conf, vector strvec, const char *file, |
||||||
|
/* this is only valid in the main config file */ |
||||||
|
if (conf->processed_main_config) |
||||||
|
return 0; |
||||||
|
+ condlog(2, "%s line %d, \"config_dir\" is deprecated and will be disabled in a future release", |
||||||
|
+ file, line_nr); |
||||||
|
return set_path(strvec, &conf->config_dir, file, line_nr); |
||||||
|
} |
||||||
|
declare_def_snprint(config_dir, print_str) |
||||||
|
diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5 |
||||||
|
index dd9f4dc7..7f85f766 100644 |
||||||
|
--- a/multipath/multipath.conf.5 |
||||||
|
+++ b/multipath/multipath.conf.5 |
||||||
|
@@ -178,6 +178,7 @@ The default is: \fBno\fR |
||||||
|
. |
||||||
|
.TP |
||||||
|
.B multipath_dir |
||||||
|
+This option is deprecated, and will be removed in a future release. |
||||||
|
Directory where the dynamic shared objects are stored. Defined at compile time, |
||||||
|
commonly \fI/lib64/multipath/\fR or \fI/lib/multipath/\fR. |
||||||
|
.RS |
||||||
|
@@ -742,6 +743,7 @@ The default is: \fB<unset>\fR |
||||||
|
. |
||||||
|
.TP |
||||||
|
.B bindings_file |
||||||
|
+This option is deprecated, and will be removed in a future release. |
||||||
|
The full pathname of the binding file to be used when the user_friendly_names |
||||||
|
option is set. |
||||||
|
.RS |
||||||
|
@@ -752,6 +754,7 @@ The default is: \fB/etc/multipath/bindings\fR |
||||||
|
. |
||||||
|
.TP |
||||||
|
.B wwids_file |
||||||
|
+This option is deprecated, and will be removed in a future release. |
||||||
|
The full pathname of the WWIDs file, which is used by multipath to keep track |
||||||
|
of the WWIDs for LUNs it has created multipath devices on in the past. |
||||||
|
.RS |
||||||
|
@@ -762,6 +765,7 @@ The default is: \fB/etc/multipath/wwids\fR |
||||||
|
. |
||||||
|
.TP |
||||||
|
.B prkeys_file |
||||||
|
+This option is deprecated, and will be removed in a future release. |
||||||
|
The full pathname of the prkeys file, which is used by multipathd to keep |
||||||
|
track of the persistent reservation key used for a specific WWID, when |
||||||
|
\fIreservation_key\fR is set to \fBfile\fR. |
||||||
|
@@ -933,6 +937,7 @@ The default is: \fB<unset>\fR |
||||||
|
. |
||||||
|
.TP |
||||||
|
.B config_dir |
||||||
|
+This option is deprecated, and will be removed in a future release. |
||||||
|
If set to anything other than "", multipath will search this directory |
||||||
|
alphabetically for file ending in ".conf" and it will read configuration |
||||||
|
information from them, just as if it was in \fI/etc/multipath.conf\fR. |
@ -0,0 +1,191 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Date: Mon, 4 Oct 2021 15:27:36 -0500 |
||||||
|
Subject: [PATCH] libmultipath: split set_int to enable reuse |
||||||
|
|
||||||
|
Split the code that does the actual value parsing out of set_int(), into |
||||||
|
a helper function, do_set_int(), so that it can be used by other |
||||||
|
handlers. These functions no longer set the config value at all, when |
||||||
|
they have invalid input. |
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
libmultipath/dict.c | 82 +++++++++++++++++++++++++-------------------- |
||||||
|
1 file changed, 46 insertions(+), 36 deletions(-) |
||||||
|
|
||||||
|
diff --git a/libmultipath/dict.c b/libmultipath/dict.c |
||||||
|
index d14be340..68647061 100644 |
||||||
|
--- a/libmultipath/dict.c |
||||||
|
+++ b/libmultipath/dict.c |
||||||
|
@@ -31,17 +31,12 @@ |
||||||
|
#include "strbuf.h" |
||||||
|
|
||||||
|
static int |
||||||
|
-set_int(vector strvec, void *ptr, int min, int max, const char *file, |
||||||
|
- int line_nr) |
||||||
|
+do_set_int(vector strvec, void *ptr, int min, int max, const char *file, |
||||||
|
+ int line_nr, char *buff) |
||||||
|
{ |
||||||
|
int *int_ptr = (int *)ptr; |
||||||
|
- char *buff, *eptr; |
||||||
|
+ char *eptr; |
||||||
|
long res; |
||||||
|
- int rc; |
||||||
|
- |
||||||
|
- buff = set_value(strvec); |
||||||
|
- if (!buff) |
||||||
|
- return 1; |
||||||
|
|
||||||
|
res = strtol(buff, &eptr, 10); |
||||||
|
if (eptr > buff) |
||||||
|
@@ -50,17 +45,30 @@ set_int(vector strvec, void *ptr, int min, int max, const char *file, |
||||||
|
if (*buff == '\0' || *eptr != '\0') { |
||||||
|
condlog(1, "%s line %d, invalid value for %s: \"%s\"", |
||||||
|
file, line_nr, (char*)VECTOR_SLOT(strvec, 0), buff); |
||||||
|
- rc = 1; |
||||||
|
- } else { |
||||||
|
- if (res > max || res < min) { |
||||||
|
- res = (res > max) ? max : min; |
||||||
|
- condlog(1, "%s line %d, value for %s too %s, capping at %ld", |
||||||
|
+ return 1; |
||||||
|
+ } |
||||||
|
+ if (res > max || res < min) { |
||||||
|
+ res = (res > max) ? max : min; |
||||||
|
+ condlog(1, "%s line %d, value for %s too %s, capping at %ld", |
||||||
|
file, line_nr, (char*)VECTOR_SLOT(strvec, 0), |
||||||
|
- (res == max)? "large" : "small", res); |
||||||
|
- } |
||||||
|
- rc = 0; |
||||||
|
- *int_ptr = res; |
||||||
|
+ (res == max)? "large" : "small", res); |
||||||
|
} |
||||||
|
+ *int_ptr = res; |
||||||
|
+ return 0; |
||||||
|
+} |
||||||
|
+ |
||||||
|
+static int |
||||||
|
+set_int(vector strvec, void *ptr, int min, int max, const char *file, |
||||||
|
+ int line_nr) |
||||||
|
+{ |
||||||
|
+ char *buff; |
||||||
|
+ int rc; |
||||||
|
+ |
||||||
|
+ buff = set_value(strvec); |
||||||
|
+ if (!buff) |
||||||
|
+ return 1; |
||||||
|
+ |
||||||
|
+ rc = do_set_int(strvec, ptr, min, max, file, line_nr, buff); |
||||||
|
|
||||||
|
FREE(buff); |
||||||
|
return rc; |
||||||
|
@@ -929,6 +937,7 @@ declare_mp_attr_snprint(gid, print_gid) |
||||||
|
static int |
||||||
|
set_undef_off_zero(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
{ |
||||||
|
+ int rc = 0; |
||||||
|
char * buff; |
||||||
|
int *int_ptr = (int *)ptr; |
||||||
|
|
||||||
|
@@ -938,10 +947,10 @@ set_undef_off_zero(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
|
||||||
|
if (strcmp(buff, "off") == 0) |
||||||
|
*int_ptr = UOZ_OFF; |
||||||
|
- else if (sscanf(buff, "%d", int_ptr) != 1 || |
||||||
|
- *int_ptr < UOZ_ZERO) |
||||||
|
- *int_ptr = UOZ_UNDEF; |
||||||
|
- else if (*int_ptr == 0) |
||||||
|
+ else |
||||||
|
+ rc = do_set_int(strvec, int_ptr, 0, INT_MAX, file, line_nr, |
||||||
|
+ buff); |
||||||
|
+ if (rc == 0 && *int_ptr == 0) |
||||||
|
*int_ptr = UOZ_ZERO; |
||||||
|
|
||||||
|
FREE(buff); |
||||||
|
@@ -1093,14 +1102,12 @@ max_fds_handler(struct config *conf, vector strvec, const char *file, |
||||||
|
/* Assume safe limit */ |
||||||
|
max_fds = 4096; |
||||||
|
} |
||||||
|
- if (strlen(buff) == 3 && |
||||||
|
- !strcmp(buff, "max")) |
||||||
|
- conf->max_fds = max_fds; |
||||||
|
- else |
||||||
|
- conf->max_fds = atoi(buff); |
||||||
|
- |
||||||
|
- if (conf->max_fds > max_fds) |
||||||
|
+ if (!strcmp(buff, "max")) { |
||||||
|
conf->max_fds = max_fds; |
||||||
|
+ r = 0; |
||||||
|
+ } else |
||||||
|
+ r = do_set_int(strvec, &conf->max_fds, 0, max_fds, file, |
||||||
|
+ line_nr, buff); |
||||||
|
|
||||||
|
FREE(buff); |
||||||
|
|
||||||
|
@@ -1169,6 +1176,7 @@ declare_mp_snprint(rr_weight, print_rr_weight) |
||||||
|
static int |
||||||
|
set_pgfailback(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
{ |
||||||
|
+ int rc = 0; |
||||||
|
int *int_ptr = (int *)ptr; |
||||||
|
char * buff; |
||||||
|
|
||||||
|
@@ -1183,11 +1191,11 @@ set_pgfailback(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
else if (strlen(buff) == 10 && !strcmp(buff, "followover")) |
||||||
|
*int_ptr = -FAILBACK_FOLLOWOVER; |
||||||
|
else |
||||||
|
- *int_ptr = atoi(buff); |
||||||
|
+ rc = do_set_int(strvec, ptr, 0, INT_MAX, file, line_nr, buff); |
||||||
|
|
||||||
|
FREE(buff); |
||||||
|
|
||||||
|
- return 0; |
||||||
|
+ return rc; |
||||||
|
} |
||||||
|
|
||||||
|
int |
||||||
|
@@ -1219,6 +1227,7 @@ declare_mp_snprint(pgfailback, print_pgfailback) |
||||||
|
static int |
||||||
|
no_path_retry_helper(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
{ |
||||||
|
+ int rc = 0; |
||||||
|
int *int_ptr = (int *)ptr; |
||||||
|
char * buff; |
||||||
|
|
||||||
|
@@ -1230,11 +1239,11 @@ no_path_retry_helper(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
*int_ptr = NO_PATH_RETRY_FAIL; |
||||||
|
else if (!strcmp(buff, "queue")) |
||||||
|
*int_ptr = NO_PATH_RETRY_QUEUE; |
||||||
|
- else if ((*int_ptr = atoi(buff)) < 1) |
||||||
|
- *int_ptr = NO_PATH_RETRY_UNDEF; |
||||||
|
+ else |
||||||
|
+ rc = do_set_int(strvec, ptr, 1, INT_MAX, file, line_nr, buff); |
||||||
|
|
||||||
|
FREE(buff); |
||||||
|
- return 0; |
||||||
|
+ return rc; |
||||||
|
} |
||||||
|
|
||||||
|
int |
||||||
|
@@ -1376,6 +1385,7 @@ snprint_mp_reservation_key (struct config *conf, struct strbuf *buff, |
||||||
|
static int |
||||||
|
set_off_int_undef(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
{ |
||||||
|
+ int rc =0; |
||||||
|
int *int_ptr = (int *)ptr; |
||||||
|
char * buff; |
||||||
|
|
||||||
|
@@ -1385,11 +1395,11 @@ set_off_int_undef(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
|
||||||
|
if (!strcmp(buff, "no") || !strcmp(buff, "0")) |
||||||
|
*int_ptr = NU_NO; |
||||||
|
- else if ((*int_ptr = atoi(buff)) < 1) |
||||||
|
- *int_ptr = NU_UNDEF; |
||||||
|
+ else |
||||||
|
+ rc = do_set_int(strvec, ptr, 1, INT_MAX, file, line_nr, buff); |
||||||
|
|
||||||
|
FREE(buff); |
||||||
|
- return 0; |
||||||
|
+ return rc; |
||||||
|
} |
||||||
|
|
||||||
|
int |
@ -0,0 +1,201 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Date: Mon, 4 Oct 2021 16:52:55 -0500 |
||||||
|
Subject: [PATCH] libmultipath: cleanup invalid config handling |
||||||
|
|
||||||
|
Add error reporting to the remaining config handlers. If the value is |
||||||
|
invalid, do not change the existing config option's value. Also print |
||||||
|
an error whenever 0 is returned for an invalid value. When the handler |
||||||
|
returns 1, config processing already fails with an error message. |
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
libmultipath/dict.c | 73 +++++++++++++++++++++++++++++++-------------- |
||||||
|
1 file changed, 51 insertions(+), 22 deletions(-) |
||||||
|
|
||||||
|
diff --git a/libmultipath/dict.c b/libmultipath/dict.c |
||||||
|
index 68647061..c534d703 100644 |
||||||
|
--- a/libmultipath/dict.c |
||||||
|
+++ b/libmultipath/dict.c |
||||||
|
@@ -199,8 +199,11 @@ set_yes_no(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
|
||||||
|
if (strcmp(buff, "yes") == 0 || strcmp(buff, "1") == 0) |
||||||
|
*int_ptr = YN_YES; |
||||||
|
- else |
||||||
|
+ else if (strcmp(buff, "no") == 0 || strcmp(buff, "0") == 0) |
||||||
|
*int_ptr = YN_NO; |
||||||
|
+ else |
||||||
|
+ condlog(1, "%s line %d, invalid value for %s: \"%s\"", |
||||||
|
+ file, line_nr, (char*)VECTOR_SLOT(strvec, 0), buff); |
||||||
|
|
||||||
|
FREE(buff); |
||||||
|
return 0; |
||||||
|
@@ -221,7 +224,8 @@ set_yes_no_undef(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
else if (strcmp(buff, "yes") == 0 || strcmp(buff, "1") == 0) |
||||||
|
*int_ptr = YNU_YES; |
||||||
|
else |
||||||
|
- *int_ptr = YNU_UNDEF; |
||||||
|
+ condlog(1, "%s line %d, invalid value for %s: \"%s\"", |
||||||
|
+ file, line_nr, (char*)VECTOR_SLOT(strvec, 0), buff); |
||||||
|
|
||||||
|
FREE(buff); |
||||||
|
return 0; |
||||||
|
@@ -480,9 +484,6 @@ def_find_multipaths_handler(struct config *conf, vector strvec, |
||||||
|
char *buff; |
||||||
|
int i; |
||||||
|
|
||||||
|
- if (set_yes_no_undef(strvec, &conf->find_multipaths, file, line_nr) == 0 && conf->find_multipaths != FIND_MULTIPATHS_UNDEF) |
||||||
|
- return 0; |
||||||
|
- |
||||||
|
buff = set_value(strvec); |
||||||
|
if (!buff) |
||||||
|
return 1; |
||||||
|
@@ -495,9 +496,14 @@ def_find_multipaths_handler(struct config *conf, vector strvec, |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
- if (conf->find_multipaths == YNU_UNDEF) { |
||||||
|
- condlog(0, "illegal value for find_multipaths: %s", buff); |
||||||
|
- conf->find_multipaths = DEFAULT_FIND_MULTIPATHS; |
||||||
|
+ if (i >= __FIND_MULTIPATHS_LAST) { |
||||||
|
+ if (strcmp(buff, "no") == 0 || strcmp(buff, "0") == 0) |
||||||
|
+ conf->find_multipaths = FIND_MULTIPATHS_OFF; |
||||||
|
+ else if (strcmp(buff, "yes") == 0 || strcmp(buff, "1") == 0) |
||||||
|
+ conf->find_multipaths = FIND_MULTIPATHS_ON; |
||||||
|
+ else |
||||||
|
+ condlog(1, "%s line %d, invalid value for find_multipaths: \"%s\"", |
||||||
|
+ file, line_nr, buff); |
||||||
|
} |
||||||
|
|
||||||
|
FREE(buff); |
||||||
|
@@ -546,8 +552,10 @@ static int uid_attrs_handler(struct config *conf, vector strvec, |
||||||
|
if (!val) |
||||||
|
return 1; |
||||||
|
if (parse_uid_attrs(val, conf)) |
||||||
|
- condlog(1, "error parsing uid_attrs: \"%s\"", val); |
||||||
|
- condlog(3, "parsed %d uid_attrs", VECTOR_SIZE(&conf->uid_attrs)); |
||||||
|
+ condlog(1, "%s line %d,error parsing uid_attrs: \"%s\"", file, |
||||||
|
+ line_nr, val); |
||||||
|
+ else |
||||||
|
+ condlog(4, "parsed %d uid_attrs", VECTOR_SIZE(&conf->uid_attrs)); |
||||||
|
FREE(val); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
@@ -775,8 +783,11 @@ def_config_dir_handler(struct config *conf, vector strvec, const char *file, |
||||||
|
int line_nr) |
||||||
|
{ |
||||||
|
/* this is only valid in the main config file */ |
||||||
|
- if (conf->processed_main_config) |
||||||
|
+ if (conf->processed_main_config) { |
||||||
|
+ condlog(1, "%s line %d, config_dir option only valid in /etc/multipath.conf", |
||||||
|
+ file, line_nr); |
||||||
|
return 0; |
||||||
|
+ } |
||||||
|
condlog(2, "%s line %d, \"config_dir\" is deprecated and will be disabled in a future release", |
||||||
|
file, line_nr); |
||||||
|
return set_path(strvec, &conf->config_dir, file, line_nr); |
||||||
|
@@ -836,7 +847,9 @@ set_mode(vector strvec, void *ptr, int *flags, const char *file, int line_nr) |
||||||
|
if (sscanf(buff, "%o", &mode) == 1 && mode <= 0777) { |
||||||
|
*flags |= (1 << ATTR_MODE); |
||||||
|
*mode_ptr = mode; |
||||||
|
- } |
||||||
|
+ } else |
||||||
|
+ condlog(1, "%s line %d, invalid value for mode: \"%s\"", |
||||||
|
+ file, line_nr, buff); |
||||||
|
|
||||||
|
FREE(buff); |
||||||
|
return 0; |
||||||
|
@@ -861,7 +874,9 @@ set_uid(vector strvec, void *ptr, int *flags, const char *file, int line_nr) |
||||||
|
else if (sscanf(buff, "%u", &uid) == 1){ |
||||||
|
*flags |= (1 << ATTR_UID); |
||||||
|
*uid_ptr = uid; |
||||||
|
- } |
||||||
|
+ } else |
||||||
|
+ condlog(1, "%s line %d, invalid value for uid: \"%s\"", |
||||||
|
+ file, line_nr, buff); |
||||||
|
|
||||||
|
FREE(buff); |
||||||
|
return 0; |
||||||
|
@@ -887,7 +902,9 @@ set_gid(vector strvec, void *ptr, int *flags, const char *file, int line_nr) |
||||||
|
else if (sscanf(buff, "%u", &gid) == 1){ |
||||||
|
*flags |= (1 << ATTR_GID); |
||||||
|
*gid_ptr = gid; |
||||||
|
- } |
||||||
|
+ } else |
||||||
|
+ condlog(1, "%s line %d, invalid value for gid: \"%s\"", |
||||||
|
+ file, line_nr, buff); |
||||||
|
FREE(buff); |
||||||
|
return 0; |
||||||
|
} |
||||||
|
@@ -989,7 +1006,8 @@ set_dev_loss(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
if (!strcmp(buff, "infinity")) |
||||||
|
*uint_ptr = MAX_DEV_LOSS_TMO; |
||||||
|
else if (sscanf(buff, "%u", uint_ptr) != 1) |
||||||
|
- *uint_ptr = DEV_LOSS_TMO_UNSET; |
||||||
|
+ condlog(1, "%s line %d, invalid value for dev_loss_tmo: \"%s\"", |
||||||
|
+ file, line_nr, buff); |
||||||
|
|
||||||
|
FREE(buff); |
||||||
|
return 0; |
||||||
|
@@ -1023,13 +1041,19 @@ static int |
||||||
|
set_pgpolicy(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
{ |
||||||
|
char * buff; |
||||||
|
+ int policy; |
||||||
|
int *int_ptr = (int *)ptr; |
||||||
|
|
||||||
|
buff = set_value(strvec); |
||||||
|
if (!buff) |
||||||
|
return 1; |
||||||
|
|
||||||
|
- *int_ptr = get_pgpolicy_id(buff); |
||||||
|
+ policy = get_pgpolicy_id(buff); |
||||||
|
+ if (policy != IOPOLICY_UNDEF) |
||||||
|
+ *int_ptr = policy; |
||||||
|
+ else |
||||||
|
+ condlog(1, "%s line %d, invalid value for path_grouping_policy: \"%s\"", |
||||||
|
+ file, line_nr, buff); |
||||||
|
FREE(buff); |
||||||
|
|
||||||
|
return 0; |
||||||
|
@@ -1142,10 +1166,11 @@ set_rr_weight(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
|
||||||
|
if (!strcmp(buff, "priorities")) |
||||||
|
*int_ptr = RR_WEIGHT_PRIO; |
||||||
|
- |
||||||
|
- if (!strcmp(buff, "uniform")) |
||||||
|
+ else if (!strcmp(buff, "uniform")) |
||||||
|
*int_ptr = RR_WEIGHT_NONE; |
||||||
|
- |
||||||
|
+ else |
||||||
|
+ condlog(1, "%s line %d, invalid value for rr_weight: \"%s\"", |
||||||
|
+ file, line_nr, buff); |
||||||
|
FREE(buff); |
||||||
|
|
||||||
|
return 0; |
||||||
|
@@ -1281,10 +1306,13 @@ def_log_checker_err_handler(struct config *conf, vector strvec, |
||||||
|
if (!buff) |
||||||
|
return 1; |
||||||
|
|
||||||
|
- if (strlen(buff) == 4 && !strcmp(buff, "once")) |
||||||
|
+ if (!strcmp(buff, "once")) |
||||||
|
conf->log_checker_err = LOG_CHKR_ERR_ONCE; |
||||||
|
- else if (strlen(buff) == 6 && !strcmp(buff, "always")) |
||||||
|
+ else if (!strcmp(buff, "always")) |
||||||
|
conf->log_checker_err = LOG_CHKR_ERR_ALWAYS; |
||||||
|
+ else |
||||||
|
+ condlog(1, "%s line %d, invalid value for log_checker_err: \"%s\"", |
||||||
|
+ file, line_nr, buff); |
||||||
|
|
||||||
|
free(buff); |
||||||
|
return 0; |
||||||
|
@@ -1545,7 +1573,8 @@ hw_vpd_vendor_handler(struct config *conf, vector strvec, const char *file, |
||||||
|
goto out; |
||||||
|
} |
||||||
|
} |
||||||
|
- hwe->vpd_vendor_id = 0; |
||||||
|
+ condlog(1, "%s line %d, invalid value for vpd_vendor: \"%s\"", |
||||||
|
+ file, line_nr, buff); |
||||||
|
out: |
||||||
|
FREE(buff); |
||||||
|
return 0; |
@ -0,0 +1,218 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Date: Thu, 11 Nov 2021 17:37:05 -0600 |
||||||
|
Subject: [PATCH] libmultipath: don't return error on invalid values |
||||||
|
|
||||||
|
do_set_int and set_uint return 1 for invalid values. This can cause |
||||||
|
multipath to fail completely, while reading the config. The config |
||||||
|
handlers should only return a non-zero value if there is an internal |
||||||
|
error, not if there is just an invalid value. |
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
libmultipath/dict.c | 64 ++++++++++++++++++--------------------------- |
||||||
|
1 file changed, 25 insertions(+), 39 deletions(-) |
||||||
|
|
||||||
|
diff --git a/libmultipath/dict.c b/libmultipath/dict.c |
||||||
|
index c534d703..1b75be47 100644 |
||||||
|
--- a/libmultipath/dict.c |
||||||
|
+++ b/libmultipath/dict.c |
||||||
|
@@ -30,7 +30,7 @@ |
||||||
|
#include "dict.h" |
||||||
|
#include "strbuf.h" |
||||||
|
|
||||||
|
-static int |
||||||
|
+static void |
||||||
|
do_set_int(vector strvec, void *ptr, int min, int max, const char *file, |
||||||
|
int line_nr, char *buff) |
||||||
|
{ |
||||||
|
@@ -45,7 +45,7 @@ do_set_int(vector strvec, void *ptr, int min, int max, const char *file, |
||||||
|
if (*buff == '\0' || *eptr != '\0') { |
||||||
|
condlog(1, "%s line %d, invalid value for %s: \"%s\"", |
||||||
|
file, line_nr, (char*)VECTOR_SLOT(strvec, 0), buff); |
||||||
|
- return 1; |
||||||
|
+ return; |
||||||
|
} |
||||||
|
if (res > max || res < min) { |
||||||
|
res = (res > max) ? max : min; |
||||||
|
@@ -54,7 +54,7 @@ do_set_int(vector strvec, void *ptr, int min, int max, const char *file, |
||||||
|
(res == max)? "large" : "small", res); |
||||||
|
} |
||||||
|
*int_ptr = res; |
||||||
|
- return 0; |
||||||
|
+ return; |
||||||
|
} |
||||||
|
|
||||||
|
static int |
||||||
|
@@ -62,16 +62,15 @@ set_int(vector strvec, void *ptr, int min, int max, const char *file, |
||||||
|
int line_nr) |
||||||
|
{ |
||||||
|
char *buff; |
||||||
|
- int rc; |
||||||
|
|
||||||
|
buff = set_value(strvec); |
||||||
|
if (!buff) |
||||||
|
return 1; |
||||||
|
|
||||||
|
- rc = do_set_int(strvec, ptr, min, max, file, line_nr, buff); |
||||||
|
+ do_set_int(strvec, ptr, min, max, file, line_nr, buff); |
||||||
|
|
||||||
|
FREE(buff); |
||||||
|
- return rc; |
||||||
|
+ return 0; |
||||||
|
} |
||||||
|
|
||||||
|
static int |
||||||
|
@@ -80,7 +79,6 @@ set_uint(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
unsigned int *uint_ptr = (unsigned int *)ptr; |
||||||
|
char *buff, *eptr, *p; |
||||||
|
unsigned long res; |
||||||
|
- int rc; |
||||||
|
|
||||||
|
buff = set_value(strvec); |
||||||
|
if (!buff) |
||||||
|
@@ -93,17 +91,14 @@ set_uint(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
if (eptr > buff) |
||||||
|
while (isspace(*eptr)) |
||||||
|
eptr++; |
||||||
|
- if (*buff == '\0' || *eptr != '\0' || !isdigit(*p) || res > UINT_MAX) { |
||||||
|
+ if (*buff == '\0' || *eptr != '\0' || !isdigit(*p) || res > UINT_MAX) |
||||||
|
condlog(1, "%s line %d, invalid value for %s: \"%s\"", |
||||||
|
file, line_nr, (char*)VECTOR_SLOT(strvec, 0), buff); |
||||||
|
- rc = 1; |
||||||
|
- } else { |
||||||
|
- rc = 0; |
||||||
|
+ else |
||||||
|
*uint_ptr = res; |
||||||
|
- } |
||||||
|
|
||||||
|
FREE(buff); |
||||||
|
- return rc; |
||||||
|
+ return 0; |
||||||
|
} |
||||||
|
|
||||||
|
static int |
||||||
|
@@ -954,7 +949,6 @@ declare_mp_attr_snprint(gid, print_gid) |
||||||
|
static int |
||||||
|
set_undef_off_zero(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
{ |
||||||
|
- int rc = 0; |
||||||
|
char * buff; |
||||||
|
int *int_ptr = (int *)ptr; |
||||||
|
|
||||||
|
@@ -964,11 +958,10 @@ set_undef_off_zero(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
|
||||||
|
if (strcmp(buff, "off") == 0) |
||||||
|
*int_ptr = UOZ_OFF; |
||||||
|
- else |
||||||
|
- rc = do_set_int(strvec, int_ptr, 0, INT_MAX, file, line_nr, |
||||||
|
- buff); |
||||||
|
- if (rc == 0 && *int_ptr == 0) |
||||||
|
+ else if (strcmp(buff, "0") == 0) |
||||||
|
*int_ptr = UOZ_ZERO; |
||||||
|
+ else |
||||||
|
+ do_set_int(strvec, int_ptr, 1, INT_MAX, file, line_nr, buff); |
||||||
|
|
||||||
|
FREE(buff); |
||||||
|
return 0; |
||||||
|
@@ -1114,28 +1107,24 @@ max_fds_handler(struct config *conf, vector strvec, const char *file, |
||||||
|
int line_nr) |
||||||
|
{ |
||||||
|
char * buff; |
||||||
|
- int r = 0, max_fds; |
||||||
|
+ int max_fds; |
||||||
|
|
||||||
|
buff = set_value(strvec); |
||||||
|
|
||||||
|
if (!buff) |
||||||
|
return 1; |
||||||
|
|
||||||
|
- r = get_sys_max_fds(&max_fds); |
||||||
|
- if (r) { |
||||||
|
- /* Assume safe limit */ |
||||||
|
- max_fds = 4096; |
||||||
|
- } |
||||||
|
- if (!strcmp(buff, "max")) { |
||||||
|
+ if (get_sys_max_fds(&max_fds) != 0) |
||||||
|
+ max_fds = 4096; /* Assume safe limit */ |
||||||
|
+ if (!strcmp(buff, "max")) |
||||||
|
conf->max_fds = max_fds; |
||||||
|
- r = 0; |
||||||
|
- } else |
||||||
|
- r = do_set_int(strvec, &conf->max_fds, 0, max_fds, file, |
||||||
|
- line_nr, buff); |
||||||
|
+ else |
||||||
|
+ do_set_int(strvec, &conf->max_fds, 0, max_fds, file, line_nr, |
||||||
|
+ buff); |
||||||
|
|
||||||
|
FREE(buff); |
||||||
|
|
||||||
|
- return r; |
||||||
|
+ return 0; |
||||||
|
} |
||||||
|
|
||||||
|
static int |
||||||
|
@@ -1201,7 +1190,6 @@ declare_mp_snprint(rr_weight, print_rr_weight) |
||||||
|
static int |
||||||
|
set_pgfailback(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
{ |
||||||
|
- int rc = 0; |
||||||
|
int *int_ptr = (int *)ptr; |
||||||
|
char * buff; |
||||||
|
|
||||||
|
@@ -1216,11 +1204,11 @@ set_pgfailback(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
else if (strlen(buff) == 10 && !strcmp(buff, "followover")) |
||||||
|
*int_ptr = -FAILBACK_FOLLOWOVER; |
||||||
|
else |
||||||
|
- rc = do_set_int(strvec, ptr, 0, INT_MAX, file, line_nr, buff); |
||||||
|
+ do_set_int(strvec, ptr, 0, INT_MAX, file, line_nr, buff); |
||||||
|
|
||||||
|
FREE(buff); |
||||||
|
|
||||||
|
- return rc; |
||||||
|
+ return 0; |
||||||
|
} |
||||||
|
|
||||||
|
int |
||||||
|
@@ -1252,7 +1240,6 @@ declare_mp_snprint(pgfailback, print_pgfailback) |
||||||
|
static int |
||||||
|
no_path_retry_helper(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
{ |
||||||
|
- int rc = 0; |
||||||
|
int *int_ptr = (int *)ptr; |
||||||
|
char * buff; |
||||||
|
|
||||||
|
@@ -1265,10 +1252,10 @@ no_path_retry_helper(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
else if (!strcmp(buff, "queue")) |
||||||
|
*int_ptr = NO_PATH_RETRY_QUEUE; |
||||||
|
else |
||||||
|
- rc = do_set_int(strvec, ptr, 1, INT_MAX, file, line_nr, buff); |
||||||
|
+ do_set_int(strvec, ptr, 1, INT_MAX, file, line_nr, buff); |
||||||
|
|
||||||
|
FREE(buff); |
||||||
|
- return rc; |
||||||
|
+ return 0; |
||||||
|
} |
||||||
|
|
||||||
|
int |
||||||
|
@@ -1413,7 +1400,6 @@ snprint_mp_reservation_key (struct config *conf, struct strbuf *buff, |
||||||
|
static int |
||||||
|
set_off_int_undef(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
{ |
||||||
|
- int rc =0; |
||||||
|
int *int_ptr = (int *)ptr; |
||||||
|
char * buff; |
||||||
|
|
||||||
|
@@ -1424,10 +1410,10 @@ set_off_int_undef(vector strvec, void *ptr, const char *file, int line_nr) |
||||||
|
if (!strcmp(buff, "no") || !strcmp(buff, "0")) |
||||||
|
*int_ptr = NU_NO; |
||||||
|
else |
||||||
|
- rc = do_set_int(strvec, ptr, 1, INT_MAX, file, line_nr, buff); |
||||||
|
+ do_set_int(strvec, ptr, 1, INT_MAX, file, line_nr, buff); |
||||||
|
|
||||||
|
FREE(buff); |
||||||
|
- return rc; |
||||||
|
+ return 0; |
||||||
|
} |
||||||
|
|
||||||
|
int |
@ -0,0 +1,129 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Date: Mon, 15 Nov 2021 10:54:35 -0600 |
||||||
|
Subject: [PATCH] multipathd: avoid unnecessary path read-only reloads |
||||||
|
|
||||||
|
A mulitpath device can only be reloaded read/write when all paths are |
||||||
|
read/write. Also, whenever a read-only device is rescanned, the scsi |
||||||
|
subsystem will first unconditionally issue a uevent with DISK_RO=0 |
||||||
|
before checking the read-only status, and if it the device is still |
||||||
|
read-only, issuing another uevent with DISK_RO=1. These uevents cause |
||||||
|
pointless reloads when read-only paths are rescanned. To avoid this, |
||||||
|
check to see if all paths are read/write before changing a multipath |
||||||
|
device from read-only to read/write. |
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
libmultipath/libmultipath.version | 5 +++++ |
||||||
|
libmultipath/sysfs.c | 22 ++++++++++++++++++++++ |
||||||
|
libmultipath/sysfs.h | 1 + |
||||||
|
multipathd/main.c | 31 ++++++++++++++++++++++++++++++- |
||||||
|
4 files changed, 58 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/libmultipath/libmultipath.version b/libmultipath/libmultipath.version |
||||||
|
index eb5b5b55..dd1b4122 100644 |
||||||
|
--- a/libmultipath/libmultipath.version |
||||||
|
+++ b/libmultipath/libmultipath.version |
||||||
|
@@ -287,3 +287,8 @@ global: |
||||||
|
local: |
||||||
|
*; |
||||||
|
}; |
||||||
|
+ |
||||||
|
+LIBMULTIPATH_9.1.0 { |
||||||
|
+global: |
||||||
|
+ sysfs_get_ro; |
||||||
|
+} LIBMULTIPATH_9.0.0; |
||||||
|
diff --git a/libmultipath/sysfs.c b/libmultipath/sysfs.c |
||||||
|
index 9ff145f2..24c12b6a 100644 |
||||||
|
--- a/libmultipath/sysfs.c |
||||||
|
+++ b/libmultipath/sysfs.c |
||||||
|
@@ -236,6 +236,28 @@ sysfs_get_size (struct path *pp, unsigned long long * size) |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
+int |
||||||
|
+sysfs_get_ro (struct path *pp) |
||||||
|
+{ |
||||||
|
+ int ro; |
||||||
|
+ char buff[3]; /* Either "0\n\0" or "1\n\0" */ |
||||||
|
+ |
||||||
|
+ if (!pp->udev) |
||||||
|
+ return -1; |
||||||
|
+ |
||||||
|
+ if (sysfs_attr_get_value(pp->udev, "ro", buff, sizeof(buff)) <= 0) { |
||||||
|
+ condlog(3, "%s: Cannot read ro attribute in sysfs", pp->dev); |
||||||
|
+ return -1; |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ if (sscanf(buff, "%d\n", &ro) != 1 || ro < 0 || ro > 1) { |
||||||
|
+ condlog(3, "%s: Cannot parse ro attribute", pp->dev); |
||||||
|
+ return -1; |
||||||
|
+ } |
||||||
|
+ |
||||||
|
+ return ro; |
||||||
|
+} |
||||||
|
+ |
||||||
|
int sysfs_check_holders(char * check_devt, char * new_devt) |
||||||
|
{ |
||||||
|
unsigned int major, new_minor, table_minor; |
||||||
|
diff --git a/libmultipath/sysfs.h b/libmultipath/sysfs.h |
||||||
|
index 72b39ab2..c948c467 100644 |
||||||
|
--- a/libmultipath/sysfs.h |
||||||
|
+++ b/libmultipath/sysfs.h |
||||||
|
@@ -13,6 +13,7 @@ ssize_t sysfs_attr_get_value(struct udev_device *dev, const char *attr_name, |
||||||
|
ssize_t sysfs_bin_attr_get_value(struct udev_device *dev, const char *attr_name, |
||||||
|
unsigned char * value, size_t value_len); |
||||||
|
int sysfs_get_size (struct path *pp, unsigned long long * size); |
||||||
|
+int sysfs_get_ro(struct path *pp); |
||||||
|
int sysfs_check_holders(char * check_devt, char * new_devt); |
||||||
|
bool sysfs_is_multipathed(struct path *pp, bool set_wwid); |
||||||
|
#endif |
||||||
|
diff --git a/multipathd/main.c b/multipathd/main.c |
||||||
|
index 1defeaf1..6145e512 100644 |
||||||
|
--- a/multipathd/main.c |
||||||
|
+++ b/multipathd/main.c |
||||||
|
@@ -1324,6 +1324,35 @@ fail: |
||||||
|
return REMOVE_PATH_MAP_ERROR; |
||||||
|
} |
||||||
|
|
||||||
|
+static bool |
||||||
|
+needs_ro_update(struct multipath *mpp, int ro) |
||||||
|
+{ |
||||||
|
+ struct pathgroup * pgp; |
||||||
|
+ struct path * pp; |
||||||
|
+ unsigned int i, j; |
||||||
|
+ struct dm_info *dmi = NULL; |
||||||
|
+ |
||||||
|
+ if (!mpp || ro < 0) |
||||||
|
+ return false; |
||||||
|
+ dm_get_info(mpp->alias, &dmi); |
||||||
|
+ if (!dmi) /* assume we do need to reload the device */ |
||||||
|
+ return true; |
||||||
|
+ if (dmi->read_only == ro) { |
||||||
|
+ free(dmi); |
||||||
|
+ return false; |
||||||
|
+ } |
||||||
|
+ free(dmi); |
||||||
|
+ if (ro == 1) |
||||||
|
+ return true; |
||||||
|
+ vector_foreach_slot (mpp->pg, pgp, i) { |
||||||
|
+ vector_foreach_slot (pgp->paths, pp, j) { |
||||||
|
+ if (sysfs_get_ro(pp) == 1) |
||||||
|
+ return false; |
||||||
|
+ } |
||||||
|
+ } |
||||||
|
+ return true; |
||||||
|
+} |
||||||
|
+ |
||||||
|
static int |
||||||
|
uev_update_path (struct uevent *uev, struct vectors * vecs) |
||||||
|
{ |
||||||
|
@@ -1388,7 +1417,7 @@ uev_update_path (struct uevent *uev, struct vectors * vecs) |
||||||
|
} |
||||||
|
|
||||||
|
ro = uevent_get_disk_ro(uev); |
||||||
|
- if (mpp && ro >= 0) { |
||||||
|
+ if (needs_ro_update(mpp, ro)) { |
||||||
|
condlog(2, "%s: update path write_protect to '%d' (uevent)", uev->kernel, ro); |
||||||
|
|
||||||
|
if (mpp->wait_for_udev) |
@ -0,0 +1,26 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Martin Wilck <mwilck@suse.com> |
||||||
|
Date: Fri, 22 Oct 2021 12:58:11 +0200 |
||||||
|
Subject: [PATCH] multipath: fix exit status of multipath -T |
||||||
|
|
||||||
|
We must set the return value in configure(). |
||||||
|
|
||||||
|
Signed-off-by: Martin Wilck <mwilck@suse.com> |
||||||
|
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
multipath/main.c | 1 + |
||||||
|
1 file changed, 1 insertion(+) |
||||||
|
|
||||||
|
diff --git a/multipath/main.c b/multipath/main.c |
||||||
|
index 748e7902..80fa68e5 100644 |
||||||
|
--- a/multipath/main.c |
||||||
|
+++ b/multipath/main.c |
||||||
|
@@ -606,6 +606,7 @@ configure (struct config *conf, enum mpath_cmds cmd, |
||||||
|
|
||||||
|
dump_config(conf, hwes, curmp); |
||||||
|
vector_free(hwes); |
||||||
|
+ r = RTVL_OK; |
||||||
|
goto out; |
||||||
|
} |
||||||
|
|
@ -0,0 +1,34 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Date: Mon, 13 Dec 2021 14:26:30 -0600 |
||||||
|
Subject: [PATCH] RH: mpathconf: fix setting property_blacklist |
||||||
|
|
||||||
|
If there was no blacklist_exceptions section, setting property_blacklist |
||||||
|
didn't work correctly. Fix it. |
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
multipath/mpathconf | 10 +++++++++- |
||||||
|
1 file changed, 9 insertions(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/multipath/mpathconf b/multipath/mpathconf |
||||||
|
index c00d2555..0de6b121 100644 |
||||||
|
--- a/multipath/mpathconf |
||||||
|
+++ b/multipath/mpathconf |
||||||
|
@@ -496,7 +496,15 @@ if [ "$PROPERTY" = "n" ]; then |
||||||
|
CHANGED_CONFIG=1 |
||||||
|
fi |
||||||
|
elif [ "$PROPERTY" = "y" ]; then |
||||||
|
- if [ -z "$HAVE_PROPERTY" ]; then |
||||||
|
+ if [ -z "$HAVE_PROPERTY" -a -z "$HAVE_EXCEPTIONS" ]; then |
||||||
|
+ cat >> $TMPFILE << _EOF_ |
||||||
|
+ |
||||||
|
+blacklist_exceptions { |
||||||
|
+ property "(SCSI_IDENT_|ID_WWN)" |
||||||
|
+} |
||||||
|
+_EOF_ |
||||||
|
+ CHANGED_CONFIG=1 |
||||||
|
+ elif [ -z "$HAVE_PROPERTY" ]; then |
||||||
|
sed -i '/^blacklist_exceptions[[:space:]]*{/ a\ |
||||||
|
property "(SCSI_IDENT_|ID_WWN)" |
||||||
|
' $TMPFILE |
@ -0,0 +1,45 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Date: Wed, 12 Jan 2022 12:26:12 -0600 |
||||||
|
Subject: [PATCH] libmultipath: fix disassemble status for |
||||||
|
historical-service-time PS |
||||||
|
|
||||||
|
The historical-service-time path selector prints out 2 path group status |
||||||
|
arguments. This is the only path selector that uses the group status |
||||||
|
arguments. All the others only have path status arguments. |
||||||
|
disassemble_status() was expecting the number of group status arguments |
||||||
|
to always be zero, causing it to fail at disassembling the status of |
||||||
|
devices that use historical-service-time path selector. Now multipath |
||||||
|
actually checks the number of group arguments, and skips them. |
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
libmultipath/dmparser.c | 14 ++++++++++++-- |
||||||
|
1 file changed, 12 insertions(+), 2 deletions(-) |
||||||
|
|
||||||
|
diff --git a/libmultipath/dmparser.c b/libmultipath/dmparser.c |
||||||
|
index 4ba7f339..bc311421 100644 |
||||||
|
--- a/libmultipath/dmparser.c |
||||||
|
+++ b/libmultipath/dmparser.c |
||||||
|
@@ -437,9 +437,19 @@ int disassemble_status(const char *params, struct multipath *mpp) |
||||||
|
FREE(word); |
||||||
|
|
||||||
|
/* |
||||||
|
- * PG Status (discarded, would be '0' anyway) |
||||||
|
+ * Path Selector Group Arguments |
||||||
|
*/ |
||||||
|
- p += get_word(p, NULL); |
||||||
|
+ p += get_word(p, &word); |
||||||
|
+ |
||||||
|
+ if (!word) |
||||||
|
+ return 1; |
||||||
|
+ |
||||||
|
+ num_pg_args = atoi(word); |
||||||
|
+ free(word); |
||||||
|
+ |
||||||
|
+ /* Ignore ps group arguments */ |
||||||
|
+ for (j = 0; j < num_pg_args; j++) |
||||||
|
+ p += get_word(p, NULL); |
||||||
|
|
||||||
|
p += get_word(p, &word); |
||||||
|
|
@ -0,0 +1,133 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Date: Mon, 17 Jan 2022 14:45:38 -0600 |
||||||
|
Subject: [PATCH] libmultipath: make helper function to trigger path uevents |
||||||
|
|
||||||
|
Pull the code that checks if a path needs to trigger a uevent, and |
||||||
|
triggers, out of trigger_paths_udev_change() and into a new function, |
||||||
|
trigger_path_udev_change(). This function will be used separately by |
||||||
|
a future patch. No functional changes. |
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
libmultipath/configure.c | 79 +++++++++++++++++++++------------------- |
||||||
|
libmultipath/configure.h | 1 + |
||||||
|
2 files changed, 43 insertions(+), 37 deletions(-) |
||||||
|
|
||||||
|
diff --git a/libmultipath/configure.c b/libmultipath/configure.c |
||||||
|
index 7edb355b..043e4232 100644 |
||||||
|
--- a/libmultipath/configure.c |
||||||
|
+++ b/libmultipath/configure.c |
||||||
|
@@ -565,11 +565,8 @@ unref: |
||||||
|
} |
||||||
|
|
||||||
|
void |
||||||
|
-trigger_paths_udev_change(struct multipath *mpp, bool is_mpath) |
||||||
|
+trigger_path_udev_change(struct path *pp, bool is_mpath) |
||||||
|
{ |
||||||
|
- struct pathgroup *pgp; |
||||||
|
- struct path *pp; |
||||||
|
- int i, j; |
||||||
|
/* |
||||||
|
* If a path changes from multipath to non-multipath, we must |
||||||
|
* synthesize an artificial "add" event, otherwise the LVM2 rules |
||||||
|
@@ -577,6 +574,45 @@ trigger_paths_udev_change(struct multipath *mpp, bool is_mpath) |
||||||
|
* irritate ourselves with an "add", so use "change". |
||||||
|
*/ |
||||||
|
const char *action = is_mpath ? "change" : "add"; |
||||||
|
+ const char *env; |
||||||
|
+ |
||||||
|
+ if (!pp->udev) |
||||||
|
+ return; |
||||||
|
+ /* |
||||||
|
+ * Paths that are already classified as multipath |
||||||
|
+ * members don't need another uevent. |
||||||
|
+ */ |
||||||
|
+ env = udev_device_get_property_value( |
||||||
|
+ pp->udev, "DM_MULTIPATH_DEVICE_PATH"); |
||||||
|
+ |
||||||
|
+ if (is_mpath && env != NULL && !strcmp(env, "1")) { |
||||||
|
+ /* |
||||||
|
+ * If FIND_MULTIPATHS_WAIT_UNTIL is not "0", |
||||||
|
+ * path is in "maybe" state and timer is running |
||||||
|
+ * Send uevent now (see multipath.rules). |
||||||
|
+ */ |
||||||
|
+ env = udev_device_get_property_value( |
||||||
|
+ pp->udev, "FIND_MULTIPATHS_WAIT_UNTIL"); |
||||||
|
+ if (env == NULL || !strcmp(env, "0")) |
||||||
|
+ return; |
||||||
|
+ } else if (!is_mpath && |
||||||
|
+ (env == NULL || !strcmp(env, "0"))) |
||||||
|
+ return; |
||||||
|
+ |
||||||
|
+ condlog(3, "triggering %s uevent for %s (is %smultipath member)", |
||||||
|
+ action, pp->dev, is_mpath ? "" : "no "); |
||||||
|
+ sysfs_attr_set_value(pp->udev, "uevent", |
||||||
|
+ action, strlen(action)); |
||||||
|
+ trigger_partitions_udev_change(pp->udev, action, |
||||||
|
+ strlen(action)); |
||||||
|
+} |
||||||
|
+ |
||||||
|
+void |
||||||
|
+trigger_paths_udev_change(struct multipath *mpp, bool is_mpath) |
||||||
|
+{ |
||||||
|
+ struct pathgroup *pgp; |
||||||
|
+ struct path *pp; |
||||||
|
+ int i, j; |
||||||
|
|
||||||
|
if (!mpp || !mpp->pg) |
||||||
|
return; |
||||||
|
@@ -584,39 +620,8 @@ trigger_paths_udev_change(struct multipath *mpp, bool is_mpath) |
||||||
|
vector_foreach_slot (mpp->pg, pgp, i) { |
||||||
|
if (!pgp->paths) |
||||||
|
continue; |
||||||
|
- vector_foreach_slot(pgp->paths, pp, j) { |
||||||
|
- const char *env; |
||||||
|
- |
||||||
|
- if (!pp->udev) |
||||||
|
- continue; |
||||||
|
- /* |
||||||
|
- * Paths that are already classified as multipath |
||||||
|
- * members don't need another uevent. |
||||||
|
- */ |
||||||
|
- env = udev_device_get_property_value( |
||||||
|
- pp->udev, "DM_MULTIPATH_DEVICE_PATH"); |
||||||
|
- |
||||||
|
- if (is_mpath && env != NULL && !strcmp(env, "1")) { |
||||||
|
- /* |
||||||
|
- * If FIND_MULTIPATHS_WAIT_UNTIL is not "0", |
||||||
|
- * path is in "maybe" state and timer is running |
||||||
|
- * Send uevent now (see multipath.rules). |
||||||
|
- */ |
||||||
|
- env = udev_device_get_property_value( |
||||||
|
- pp->udev, "FIND_MULTIPATHS_WAIT_UNTIL"); |
||||||
|
- if (env == NULL || !strcmp(env, "0")) |
||||||
|
- continue; |
||||||
|
- } else if (!is_mpath && |
||||||
|
- (env == NULL || !strcmp(env, "0"))) |
||||||
|
- continue; |
||||||
|
- |
||||||
|
- condlog(3, "triggering %s uevent for %s (is %smultipath member)", |
||||||
|
- action, pp->dev, is_mpath ? "" : "no "); |
||||||
|
- sysfs_attr_set_value(pp->udev, "uevent", |
||||||
|
- action, strlen(action)); |
||||||
|
- trigger_partitions_udev_change(pp->udev, action, |
||||||
|
- strlen(action)); |
||||||
|
- } |
||||||
|
+ vector_foreach_slot(pgp->paths, pp, j) |
||||||
|
+ trigger_path_udev_change(pp, is_mpath); |
||||||
|
} |
||||||
|
|
||||||
|
mpp->needs_paths_uevent = 0; |
||||||
|
diff --git a/libmultipath/configure.h b/libmultipath/configure.h |
||||||
|
index efe18b7d..2bf73e65 100644 |
||||||
|
--- a/libmultipath/configure.h |
||||||
|
+++ b/libmultipath/configure.h |
||||||
|
@@ -56,6 +56,7 @@ int coalesce_paths (struct vectors *vecs, vector curmp, char * refwwid, int forc |
||||||
|
int get_refwwid (enum mpath_cmds cmd, const char *dev, enum devtypes dev_type, |
||||||
|
vector pathvec, char **wwid); |
||||||
|
struct udev_device *get_udev_device(const char *dev, enum devtypes dev_type); |
||||||
|
+void trigger_path_udev_change(struct path *pp, bool is_mpath); |
||||||
|
void trigger_paths_udev_change(struct multipath *mpp, bool is_mpath); |
||||||
|
void trigger_partitions_udev_change(struct udev_device *dev, const char *action, |
||||||
|
int len); |
@ -0,0 +1,54 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Date: Mon, 17 Jan 2022 16:46:18 -0600 |
||||||
|
Subject: [PATCH] multipathd: trigger udev change on path addition |
||||||
|
|
||||||
|
When a multipath device is created for the first time, there is a window |
||||||
|
where some path devices way be added to the multipath device, but never |
||||||
|
claimed in udev. This can allow other device owners, like lvm, to think |
||||||
|
they can use the device. |
||||||
|
|
||||||
|
When a multipath device is first created, all the existing paths that |
||||||
|
are not claimed by multipath have a uevent triggered so that they can |
||||||
|
get claimed. After that, multipath assumes all future paths added to the |
||||||
|
multipath device will have been claimed by multipath, since the device's |
||||||
|
WWID is now in the wwids file. This doesn't work for any paths that |
||||||
|
have already been processed by the multipath.rules udev rules before |
||||||
|
the multipath device was created. |
||||||
|
|
||||||
|
To close this window, when path device is added, and a matching |
||||||
|
multipath device already exists, multipathd now checks if the device is |
||||||
|
claimed by multipath, and if not, triggers a uevent to claim it. |
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
libmultipath/libmultipath.version | 5 +++++ |
||||||
|
multipathd/main.c | 2 ++ |
||||||
|
2 files changed, 7 insertions(+) |
||||||
|
|
||||||
|
diff --git a/libmultipath/libmultipath.version b/libmultipath/libmultipath.version |
||||||
|
index dd1b4122..0d89e9e1 100644 |
||||||
|
--- a/libmultipath/libmultipath.version |
||||||
|
+++ b/libmultipath/libmultipath.version |
||||||
|
@@ -292,3 +292,8 @@ LIBMULTIPATH_9.1.0 { |
||||||
|
global: |
||||||
|
sysfs_get_ro; |
||||||
|
} LIBMULTIPATH_9.0.0; |
||||||
|
+ |
||||||
|
+LIBMULTIPATH_9.1.1 { |
||||||
|
+global: |
||||||
|
+ trigger_path_udev_change; |
||||||
|
+} LIBMULTIPATH_9.1.0; |
||||||
|
diff --git a/multipathd/main.c b/multipathd/main.c |
||||||
|
index 6145e512..5def5301 100644 |
||||||
|
--- a/multipathd/main.c |
||||||
|
+++ b/multipathd/main.c |
||||||
|
@@ -1062,6 +1062,8 @@ ev_add_path (struct path * pp, struct vectors * vecs, int need_do_map) |
||||||
|
free_path(pp); |
||||||
|
return 1; |
||||||
|
} |
||||||
|
+ if (mpp) |
||||||
|
+ trigger_path_udev_change(pp, true); |
||||||
|
if (mpp && mpp->wait_for_udev && |
||||||
|
(pathcount(mpp, PATH_UP) > 0 || |
||||||
|
(pathcount(mpp, PATH_GHOST) > 0 && |
@ -0,0 +1,149 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Date: Wed, 2 Feb 2022 17:00:21 -0600 |
||||||
|
Subject: [PATCH] RH: add support to mpathconf for setting arbitrary default |
||||||
|
options |
||||||
|
|
||||||
|
mpathconf now supports --option <name>:[<value>] for setting, changing, |
||||||
|
or removing options from the defaults section of multipath.conf. |
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
multipath/mpathconf | 58 ++++++++++++++++++++++++++++++++++++++++--- |
||||||
|
multipath/mpathconf.8 | 7 ++++++ |
||||||
|
2 files changed, 62 insertions(+), 3 deletions(-) |
||||||
|
|
||||||
|
diff --git a/multipath/mpathconf b/multipath/mpathconf |
||||||
|
index 0de6b121..6e33fb99 100644 |
||||||
|
--- a/multipath/mpathconf |
||||||
|
+++ b/multipath/mpathconf |
||||||
|
@@ -17,7 +17,7 @@ |
||||||
|
# This program was largely ripped off from lvmconf |
||||||
|
# |
||||||
|
|
||||||
|
-unset ENABLE FIND FRIENDLY PROPERTY FOREIGN MODULE MULTIPATHD HAVE_DISABLE HAVE_WWID_DISABLE HAVE_FIND HAVE_BLACKLIST HAVE_EXCEPTIONS HAVE_DEFAULTS HAVE_FRIENDLY HAVE_PROPERTY HAVE_FOREIGN HAVE_MULTIPATHD HAVE_MODULE HAVE_OUTFILE SHOW_STATUS CHANGED_CONFIG WWID_LIST |
||||||
|
+unset ENABLE FIND FRIENDLY PROPERTY FOREIGN MODULE MULTIPATHD HAVE_DISABLE HAVE_WWID_DISABLE HAVE_FIND HAVE_BLACKLIST HAVE_EXCEPTIONS HAVE_DEFAULTS HAVE_FRIENDLY HAVE_PROPERTY HAVE_FOREIGN HAVE_MULTIPATHD HAVE_MODULE HAVE_OUTFILE SHOW_STATUS CHANGED_CONFIG WWID_LIST HAVE_OPTION OPTION_NAME OPTION_VALUE |
||||||
|
|
||||||
|
DEFAULT_CONFIG="# device-mapper-multipath configuration file |
||||||
|
|
||||||
|
@@ -52,6 +52,7 @@ function usage |
||||||
|
echo "Set find_multipaths (Default y): --find_multipaths <yes|no|strict|greedy|smart>" |
||||||
|
echo "Set default property blacklist (Default n): --property_blacklist <y|n>" |
||||||
|
echo "Set enable_foreign to show foreign devices (Default n): --enable_foreign <y|n>" |
||||||
|
+ echo "Add/Change/Remove option in defaults section: --option <option_name>:<value>" |
||||||
|
echo "Load the dm-multipath modules on enable (Default y): --with_module <y|n>" |
||||||
|
echo "start/stop/reload multipathd (Default n): --with_multipathd <y|n>" |
||||||
|
echo "select output file (Default /etc/multipath.conf): --outfile <FILE>" |
||||||
|
@@ -162,6 +163,20 @@ function parse_args |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
;; |
||||||
|
+ --option) |
||||||
|
+ if [ -n "$2" ]; then |
||||||
|
+ OPTION_NAME=$(echo $2 | cut -s -f1 -d:) |
||||||
|
+ OPTION_VALUE=$(echo $2 | cut -s -f2 -d:) |
||||||
|
+ if [ -z "$OPTION_NAME" ]; then |
||||||
|
+ usage |
||||||
|
+ exit 1 |
||||||
|
+ fi |
||||||
|
+ shift 2 |
||||||
|
+ else |
||||||
|
+ usage |
||||||
|
+ exit 1 |
||||||
|
+ fi |
||||||
|
+ ;; |
||||||
|
--enable_foreign) |
||||||
|
if [ -n "$2" ]; then |
||||||
|
FOREIGN=$2 |
||||||
|
@@ -208,12 +223,15 @@ function parse_args |
||||||
|
|
||||||
|
function validate_args |
||||||
|
{ |
||||||
|
- if [ "$ENABLE" = "0" ] && [ -n "$FRIENDLY" -o -n "$FIND" -o -n "$PROPERTY" -o -n "$MODULE" ]; then |
||||||
|
+ if [ "$ENABLE" = "0" ] && [ -n "$FRIENDLY" -o -n "$FIND" -o -n "$PROPERTY" -o -n "$MODULE" -o -n "$FOREIGN" -o -n "$OPTION_NAME" ]; then |
||||||
|
echo "ignoring extra parameters on disable" |
||||||
|
FRIENDLY="" |
||||||
|
FIND="" |
||||||
|
PROPERTY="" |
||||||
|
MODULE="" |
||||||
|
+ FOREIGN="" |
||||||
|
+ OPTION_NAME="" |
||||||
|
+ OPTION_VALUE="" |
||||||
|
fi |
||||||
|
if [ -n "$FRIENDLY" ] && [ "$FRIENDLY" != "y" -a "$FRIENDLY" != "n" ]; then |
||||||
|
echo "--user_friendly_names must be either 'y' or 'n'" |
||||||
|
@@ -235,7 +253,19 @@ function validate_args |
||||||
|
echo "--enable_foreign must be either 'y' or 'n'" |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
- if [ -z "$ENABLE" -a -z "$FIND" -a -z "$FRIENDLY" -a -z "$PROPERTY" -a -z "$FOREIGN" ]; then |
||||||
|
+ if [ -n "$OPTION_NAME" ]; then |
||||||
|
+ if [[ $OPTION_NAME =~ [[:space:]]|#|\"|!|\{|\} ]]; then |
||||||
|
+ echo "--option name \"$OPTION_NAME\" is invalid" |
||||||
|
+ exit 1 |
||||||
|
+ elif [[ $OPTION_VALUE =~ \"|#|!|\{|\} ]]; then |
||||||
|
+ echo "--option value \"$OPTION_VALUE\" is invalid" |
||||||
|
+ exit 1 |
||||||
|
+ fi |
||||||
|
+ if [[ $OPTION_VALUE =~ [[:space:]] ]]; then |
||||||
|
+ OPTION_VALUE=\"$OPTION_VALUE\" |
||||||
|
+ fi |
||||||
|
+ fi |
||||||
|
+ if [ -z "$ENABLE" -a -z "$FIND" -a -z "$FRIENDLY" -a -z "$PROPERTY" -a -z "$FOREIGN" -a -z "$OPTION_NAME" ]; then |
||||||
|
SHOW_STATUS=1 |
||||||
|
fi |
||||||
|
if [ -n "$MODULE" ] && [ "$MODULE" != "y" -a "$MODULE" != "n" ]; then |
||||||
|
@@ -348,6 +378,13 @@ if [ "$HAVE_DEFAULTS" = "1" ]; then |
||||||
|
elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*enable_foreign" ; then |
||||||
|
HAVE_FOREIGN=3 |
||||||
|
fi |
||||||
|
+ if [ -n "$OPTION_NAME" ]; then |
||||||
|
+ if sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q '^[[:space:]]*'"$OPTION_NAME"'[[:space:]][[:space:]]*'"$OPTION_VALUE" ; then |
||||||
|
+ HAVE_OPTION=1 |
||||||
|
+ elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q '^[[:space:]]*'"$OPTION_NAME"'\([[:space:]].*\)\?$' ; then |
||||||
|
+ HAVE_OPTION=0 |
||||||
|
+ fi |
||||||
|
+ fi |
||||||
|
fi |
||||||
|
|
||||||
|
if [ "$HAVE_EXCEPTIONS" = "1" ]; then |
||||||
|
@@ -532,6 +569,21 @@ elif [ "$FOREIGN" = "y" ]; then |
||||||
|
fi |
||||||
|
fi |
||||||
|
|
||||||
|
+if [ -n "$OPTION_NAME" -a -n "$OPTION_VALUE" ]; then |
||||||
|
+ if [ -z "$HAVE_OPTION" ]; then |
||||||
|
+ sed -i '/^defaults[[:space:]]*{/ a\ |
||||||
|
+ '"$OPTION_NAME"' '"$OPTION_VALUE"' |
||||||
|
+' $TMPFILE |
||||||
|
+ CHANGED_CONFIG=1 |
||||||
|
+ elif [ "$HAVE_OPTION" = 0 ]; then |
||||||
|
+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*'"$OPTION_NAME"'\([[:space:]].*\)\?$/ '"$OPTION_NAME"' '"$OPTION_VALUE"'/' $TMPFILE |
||||||
|
+ CHANGED_CONFIG=1 |
||||||
|
+ fi |
||||||
|
+elif [ -n "$OPTION_NAME" -a -n "$HAVE_OPTION" ]; then |
||||||
|
+ sed -i '/^defaults[[:space:]]*{/,/^}/{/^[[:space:]]*'"$OPTION_NAME"'\([[:space:]].*\)\?$/d}' $TMPFILE |
||||||
|
+ CHANGED_CONFIG=1 |
||||||
|
+fi |
||||||
|
+ |
||||||
|
if [ -f "$OUTPUTFILE" ]; then |
||||||
|
cp $OUTPUTFILE $OUTPUTFILE.old |
||||||
|
if [ $? != 0 ]; then |
||||||
|
diff --git a/multipath/mpathconf.8 b/multipath/mpathconf.8 |
||||||
|
index a14d831e..496383b7 100644 |
||||||
|
--- a/multipath/mpathconf.8 |
||||||
|
+++ b/multipath/mpathconf.8 |
||||||
|
@@ -101,6 +101,13 @@ to the |
||||||
|
defaults section. if set to \fBn\fP, this removes the line, if present. This |
||||||
|
command can be used along with any other command. |
||||||
|
.TP |
||||||
|
+.B --option \fB<option_name>:[<value>]\fP |
||||||
|
+Sets the defaults section option \fB<option_name>\fP to \fB<value>\fP. If the |
||||||
|
+option was not previously set in the defaults section, it is added. If it was |
||||||
|
+set, its value is changed to \fB<value>\fP. If \fB<value>\fP is left blank, |
||||||
|
+then the option is removed from the defaults section, if was set there. This |
||||||
|
+command can be used along with any other command. |
||||||
|
+.TP |
||||||
|
.B --outfile \fB<filename>\fP |
||||||
|
Write the resulting multipath configuration to \fB<filename>\fP instead of |
||||||
|
\fB/etc/multipath.conf\fP. |
@ -0,0 +1,154 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Date: Thu, 3 Feb 2022 13:26:18 -0600 |
||||||
|
Subject: [PATCH] RH: add support to mpathconf for setting recheck_wwid |
||||||
|
|
||||||
|
mpathconf now supports --recheck_wwid <y|n> for setthing the |
||||||
|
recheck_wwid option |
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
multipath/mpathconf | 48 ++++++++++++++++++++++++++++++++++++++++--- |
||||||
|
multipath/mpathconf.8 | 9 ++++++++ |
||||||
|
2 files changed, 54 insertions(+), 3 deletions(-) |
||||||
|
|
||||||
|
diff --git a/multipath/mpathconf b/multipath/mpathconf |
||||||
|
index 6e33fb99..319664b1 100644 |
||||||
|
--- a/multipath/mpathconf |
||||||
|
+++ b/multipath/mpathconf |
||||||
|
@@ -17,7 +17,7 @@ |
||||||
|
# This program was largely ripped off from lvmconf |
||||||
|
# |
||||||
|
|
||||||
|
-unset ENABLE FIND FRIENDLY PROPERTY FOREIGN MODULE MULTIPATHD HAVE_DISABLE HAVE_WWID_DISABLE HAVE_FIND HAVE_BLACKLIST HAVE_EXCEPTIONS HAVE_DEFAULTS HAVE_FRIENDLY HAVE_PROPERTY HAVE_FOREIGN HAVE_MULTIPATHD HAVE_MODULE HAVE_OUTFILE SHOW_STATUS CHANGED_CONFIG WWID_LIST HAVE_OPTION OPTION_NAME OPTION_VALUE |
||||||
|
+unset ENABLE FIND FRIENDLY PROPERTY FOREIGN MODULE MULTIPATHD HAVE_DISABLE HAVE_WWID_DISABLE HAVE_FIND HAVE_BLACKLIST HAVE_EXCEPTIONS HAVE_DEFAULTS HAVE_FRIENDLY HAVE_PROPERTY HAVE_FOREIGN HAVE_MULTIPATHD HAVE_MODULE HAVE_OUTFILE SHOW_STATUS CHANGED_CONFIG WWID_LIST HAVE_OPTION OPTION_NAME OPTION_VALUE HAVE_RECHECK_WWID RECHECK_WWID |
||||||
|
|
||||||
|
DEFAULT_CONFIG="# device-mapper-multipath configuration file |
||||||
|
|
||||||
|
@@ -52,6 +52,7 @@ function usage |
||||||
|
echo "Set find_multipaths (Default y): --find_multipaths <yes|no|strict|greedy|smart>" |
||||||
|
echo "Set default property blacklist (Default n): --property_blacklist <y|n>" |
||||||
|
echo "Set enable_foreign to show foreign devices (Default n): --enable_foreign <y|n>" |
||||||
|
+ echo "Set recheck_wwid (Defaut n): --recheck_wwid <y|n>" |
||||||
|
echo "Add/Change/Remove option in defaults section: --option <option_name>:<value>" |
||||||
|
echo "Load the dm-multipath modules on enable (Default y): --with_module <y|n>" |
||||||
|
echo "start/stop/reload multipathd (Default n): --with_multipathd <y|n>" |
||||||
|
@@ -145,6 +146,15 @@ function parse_args |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
;; |
||||||
|
+ --recheck_wwid) |
||||||
|
+ if [ -n "$2" ]; then |
||||||
|
+ RECHECK_WWID=$2 |
||||||
|
+ shift 2 |
||||||
|
+ else |
||||||
|
+ usage |
||||||
|
+ exit 1 |
||||||
|
+ fi |
||||||
|
+ ;; |
||||||
|
--find_multipaths) |
||||||
|
if [ -n "$2" ]; then |
||||||
|
FIND=$2 |
||||||
|
@@ -223,7 +233,7 @@ function parse_args |
||||||
|
|
||||||
|
function validate_args |
||||||
|
{ |
||||||
|
- if [ "$ENABLE" = "0" ] && [ -n "$FRIENDLY" -o -n "$FIND" -o -n "$PROPERTY" -o -n "$MODULE" -o -n "$FOREIGN" -o -n "$OPTION_NAME" ]; then |
||||||
|
+ if [ "$ENABLE" = "0" ] && [ -n "$FRIENDLY" -o -n "$FIND" -o -n "$PROPERTY" -o -n "$MODULE" -o -n "$FOREIGN" -o -n "$OPTION_NAME" -o -n "$RECHECK_WWID" ]; then |
||||||
|
echo "ignoring extra parameters on disable" |
||||||
|
FRIENDLY="" |
||||||
|
FIND="" |
||||||
|
@@ -232,11 +242,16 @@ function validate_args |
||||||
|
FOREIGN="" |
||||||
|
OPTION_NAME="" |
||||||
|
OPTION_VALUE="" |
||||||
|
+ RECHECK_WWID="" |
||||||
|
fi |
||||||
|
if [ -n "$FRIENDLY" ] && [ "$FRIENDLY" != "y" -a "$FRIENDLY" != "n" ]; then |
||||||
|
echo "--user_friendly_names must be either 'y' or 'n'" |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
+ if [ -n "$RECHECK_WWID" ] && [ "$RECHECK_WWID" != "y" -a "$RECHECK_WWID" != "n" ]; then |
||||||
|
+ echo "--recheck_wwid must be either 'y' or 'n'" |
||||||
|
+ exit 1 |
||||||
|
+ fi |
||||||
|
if [ "$FIND" = "y" ]; then |
||||||
|
FIND="yes" |
||||||
|
elif [ "$FIND" = "n" ]; then |
||||||
|
@@ -265,7 +280,7 @@ function validate_args |
||||||
|
OPTION_VALUE=\"$OPTION_VALUE\" |
||||||
|
fi |
||||||
|
fi |
||||||
|
- if [ -z "$ENABLE" -a -z "$FIND" -a -z "$FRIENDLY" -a -z "$PROPERTY" -a -z "$FOREIGN" -a -z "$OPTION_NAME" ]; then |
||||||
|
+ if [ -z "$ENABLE" -a -z "$FIND" -a -z "$FRIENDLY" -a -z "$PROPERTY" -a -z "$FOREIGN" -a -z "$OPTION_NAME" -a -z "$RECHECK_WWID" ]; then |
||||||
|
SHOW_STATUS=1 |
||||||
|
fi |
||||||
|
if [ -n "$MODULE" ] && [ "$MODULE" != "y" -a "$MODULE" != "n" ]; then |
||||||
|
@@ -367,6 +382,11 @@ if [ "$HAVE_DEFAULTS" = "1" ]; then |
||||||
|
elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*user_friendly_names[[:space:]][[:space:]]*\(no\|0\)" ; then |
||||||
|
HAVE_FRIENDLY=0 |
||||||
|
fi |
||||||
|
+ if sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*recheck_wwid[[:space:]][[:space:]]*\(yes\|1\)" ; then |
||||||
|
+ HAVE_RECHECK_WWID=1 |
||||||
|
+ elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*recheck_wwid[[:space:]][[:space:]]*\(no\|0\)" ; then |
||||||
|
+ HAVE_RECHECK_WWID=0 |
||||||
|
+ fi |
||||||
|
if sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*#[[:space:]]*enable_foreign" ; then |
||||||
|
HAVE_FOREIGN=0 |
||||||
|
elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*enable_foreign[[:space:]][[:space:]]*\"\.\*\"" ; then |
||||||
|
@@ -411,6 +431,11 @@ if [ -n "$SHOW_STATUS" ]; then |
||||||
|
else |
||||||
|
echo "user_friendly_names is enabled" |
||||||
|
fi |
||||||
|
+ if [ -z "$HAVE_RECHECK_WWID" -o "$HAVE_RECHECK_WWID" = 0 ]; then |
||||||
|
+ echo "recheck_wwid is disabled" |
||||||
|
+ else |
||||||
|
+ echo "recheck_wwid is enabled" |
||||||
|
+ fi |
||||||
|
if [ -z "$HAVE_PROPERTY" -o "$HAVE_PROPERTY" = 0 ]; then |
||||||
|
echo "default property blacklist is disabled" |
||||||
|
else |
||||||
|
@@ -527,6 +552,23 @@ elif [ "$FRIENDLY" = "y" ]; then |
||||||
|
fi |
||||||
|
fi |
||||||
|
|
||||||
|
+if [ "$RECHECK_WWID" = "n" ]; then |
||||||
|
+ if [ "$HAVE_RECHECK_WWID" = 1 ]; then |
||||||
|
+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*recheck_wwid[[:space:]][[:space:]]*\(yes\|1\)/ recheck_wwid no/' $TMPFILE |
||||||
|
+ CHANGED_CONFIG=1 |
||||||
|
+ fi |
||||||
|
+elif [ "$RECHECK_WWID" = "y" ]; then |
||||||
|
+ if [ -z "$HAVE_RECHECK_WWID" ]; then |
||||||
|
+ sed -i '/^defaults[[:space:]]*{/ a\ |
||||||
|
+ recheck_wwid yes |
||||||
|
+' $TMPFILE |
||||||
|
+ CHANGED_CONFIG=1 |
||||||
|
+ elif [ "$HAVE_RECHECK_WWID" = 0 ]; then |
||||||
|
+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*recheck_wwid[[:space:]][[:space:]]*\(no\|0\)/ recheck_wwid yes/' $TMPFILE |
||||||
|
+ CHANGED_CONFIG=1 |
||||||
|
+ fi |
||||||
|
+fi |
||||||
|
+ |
||||||
|
if [ "$PROPERTY" = "n" ]; then |
||||||
|
if [ "$HAVE_PROPERTY" = 1 ]; then |
||||||
|
sed -i '/^blacklist_exceptions[[:space:]]*{/,/^}/ s/^[[:space:]]*property[[:space:]][[:space:]]*\"(SCSI_IDENT_|ID_WWN)\"/# property \"(SCSI_IDENT_|ID_WWN)\"/' $TMPFILE |
||||||
|
diff --git a/multipath/mpathconf.8 b/multipath/mpathconf.8 |
||||||
|
index 496383b7..9c2fb835 100644 |
||||||
|
--- a/multipath/mpathconf.8 |
||||||
|
+++ b/multipath/mpathconf.8 |
||||||
|
@@ -77,6 +77,15 @@ to the |
||||||
|
defaults section. If set to \fBn\fP, this removes the line, if present. This |
||||||
|
command can be used along with any other command. |
||||||
|
.TP |
||||||
|
+.B --recheck_wwid \fP { \fBy\fP | \fBn\fP } |
||||||
|
+If set to \fBy\fP, this adds the line |
||||||
|
+.B recheck_wwid yes |
||||||
|
+to the |
||||||
|
+.B /etc/multipath.conf |
||||||
|
+defaults section, or sets an existing line to \fByes\fP. If set to \fBn\fP, this |
||||||
|
+sets an existing \fBrecheck_wwid\fP line to \fBno\fP. This command can be used |
||||||
|
+along with any other command. |
||||||
|
+.TP |
||||||
|
.B --find_multipaths\fP { \fByes\fP | \fBno\fP | \fBstrict\fP | \fBgreedy\fP | \fBsmart\fP } |
||||||
|
If set to \fB<value>\fP, this adds the line |
||||||
|
.B find_multipaths <value> |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,73 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Date: Fri, 11 Feb 2022 17:23:39 -0600 |
||||||
|
Subject: [PATCH] multipathd: disallow changing to/from fpin marginal paths on |
||||||
|
reconfig |
||||||
|
|
||||||
|
Setting marginal_pathgroups to fpin causes two new threads to be created |
||||||
|
when multipathd starts. Turning it on after multipathd starts up won't |
||||||
|
cause the theads to start, and turing it off won't keep the threads from |
||||||
|
working. So disallow changing marginal_pathgroups to/from "fpin" on |
||||||
|
reconfigure. |
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
--- |
||||||
|
multipath/multipath.conf.5 | 13 ++++++++----- |
||||||
|
multipathd/main.c | 9 +++++++++ |
||||||
|
2 files changed, 17 insertions(+), 5 deletions(-) |
||||||
|
|
||||||
|
diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5 |
||||||
|
index 5ed2cd3c..58ad5c9c 100644 |
||||||
|
--- a/multipath/multipath.conf.5 |
||||||
|
+++ b/multipath/multipath.conf.5 |
||||||
|
@@ -1102,15 +1102,18 @@ have been tried first. This prevents the possibility of IO errors occuring |
||||||
|
while marginal paths are still usable. After the path has been monitored |
||||||
|
for the configured time, and is declared healthy, it will be returned to its |
||||||
|
normal pathgroup. |
||||||
|
-However if this option is set to \fIfpin\fR multipathd will receive fpin |
||||||
|
+If this option is set to \fIfpin\fR, multipathd will receive fpin |
||||||
|
notifications, set path states to "marginal" accordingly, and regroup paths |
||||||
|
-as described for "marginal_pathgroups yes". This option can't be used in combination |
||||||
|
-with other options for "Shaky path detection" (see below).If it is set to fpin, |
||||||
|
-marginal_path_xyz and san_path_err_xyz parameters are implicitly set to 0. |
||||||
|
+as described for \fIon\fR. This option can't be used in combination |
||||||
|
+with other options for "Shaky path detection" (see below). \fBNote:\fR If this |
||||||
|
+is set to \fIfpin\fR, the \fImarginal_path_*\fR and \fIsan_path_err_*\fR |
||||||
|
+options are implicitly set to \fIno\fP. Also, this option cannot be switched |
||||||
|
+either to or from \fIfpin\fR on a multipathd reconfigure. multipathd must be |
||||||
|
+restarted for the change to take effect. |
||||||
|
See "Shaky paths detection" below for more information. |
||||||
|
.RS |
||||||
|
.TP |
||||||
|
-The default is: \fBno\fR |
||||||
|
+The default is: \fBoff\fR |
||||||
|
.RE |
||||||
|
. |
||||||
|
. |
||||||
|
diff --git a/multipathd/main.c b/multipathd/main.c |
||||||
|
index 53be9b95..45b9572f 100644 |
||||||
|
--- a/multipathd/main.c |
||||||
|
+++ b/multipathd/main.c |
||||||
|
@@ -2792,6 +2792,7 @@ int |
||||||
|
reconfigure (struct vectors * vecs) |
||||||
|
{ |
||||||
|
struct config * old, *conf; |
||||||
|
+ int old_marginal_pathgroups; |
||||||
|
|
||||||
|
conf = load_config(DEFAULT_CONFIGFILE); |
||||||
|
if (!conf) |
||||||
|
@@ -2819,6 +2820,14 @@ reconfigure (struct vectors * vecs) |
||||||
|
uxsock_timeout = conf->uxsock_timeout; |
||||||
|
|
||||||
|
old = rcu_dereference(multipath_conf); |
||||||
|
+ old_marginal_pathgroups = old->marginal_pathgroups; |
||||||
|
+ if ((old_marginal_pathgroups == MARGINAL_PATHGROUP_FPIN) != |
||||||
|
+ (conf->marginal_pathgroups == MARGINAL_PATHGROUP_FPIN)) { |
||||||
|
+ condlog(1, "multipathd must be restarted to turn %s fpin marginal paths", |
||||||
|
+ (old_marginal_pathgroups == MARGINAL_PATHGROUP_FPIN)? |
||||||
|
+ "off" : "on"); |
||||||
|
+ conf->marginal_pathgroups = old_marginal_pathgroups; |
||||||
|
+ } |
||||||
|
conf->sequence_nr = old->sequence_nr + 1; |
||||||
|
rcu_assign_pointer(multipath_conf, conf); |
||||||
|
call_rcu(&old->rcu, rcu_free_config); |
@ -0,0 +1,33 @@ |
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Date: Wed, 16 Feb 2022 00:12:29 -0600 |
||||||
|
Subject: [PATCH] libmultipath: fix printing native nvme multipath topology. |
||||||
|
|
||||||
|
Since commit 2f05df4 ("libmultipath: use strbuf in print.c"), when |
||||||
|
multipath prints the topology of native nvme devices, instead of |
||||||
|
printing the multipath device information, it prints "w [G]:d s". This |
||||||
|
is because nvme_style() switched from calling snprintf(), which supports |
||||||
|
format specifiers, to append_strbuf_str(), which doesn't, while still |
||||||
|
keeping the same string, "%%w [%%G]:%%d %%s". Remove the extra percent |
||||||
|
signs, since they don't need to be escaped in append_strbuf_str(). |
||||||
|
|
||||||
|
Fixes: 2f05df4 ("libmultipath: use strbuf in print.c") |
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com> |
||||||
|
Reviewed-by: Martin Wilck <mwilck@suse.com> |
||||||
|
--- |
||||||
|
libmultipath/foreign/nvme.c | 2 +- |
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-) |
||||||
|
|
||||||
|
diff --git a/libmultipath/foreign/nvme.c b/libmultipath/foreign/nvme.c |
||||||
|
index d40c0869..23355ca5 100644 |
||||||
|
--- a/libmultipath/foreign/nvme.c |
||||||
|
+++ b/libmultipath/foreign/nvme.c |
||||||
|
@@ -335,7 +335,7 @@ static int snprint_nvme_pg(const struct gen_pathgroup *gmp, |
||||||
|
static int nvme_style(__attribute__((unused)) const struct gen_multipath* gm, |
||||||
|
struct strbuf *buf, __attribute__((unused)) int verbosity) |
||||||
|
{ |
||||||
|
- return append_strbuf_str(buf, "%%w [%%G]:%%d %%s"); |
||||||
|
+ return append_strbuf_str(buf, "%w [%G]:%d %s"); |
||||||
|
} |
||||||
|
|
||||||
|
static const struct gen_multipath_ops nvme_map_ops = { |
@ -0,0 +1,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