device-mapper-multipath-0.8.9-1
Update source to upstream version 0.8.9 * Previous patches 0001-0024 & 0035 are included in the commit. Add patches from upstream staging branch * Patches 0001-0005 are from the upstream staging branch Rename redhat patches * Previous patches 0025-0034 are now patches 0006-0015 Combine redhat patches * Previous patches 0036 & 0037 are now part of patch 0011 Add 0016-RH-add-scsi-device-handlers-to-modules-load.d.patch Spec file changes * Install multipath.conf and scsi_dh.conf to /usr/lib/modules-load.d
This commit is contained in:
parent
05385b92f8
commit
dad5d3a235
1
.gitignore
vendored
1
.gitignore
vendored
@ -23,3 +23,4 @@ multipath-tools-091027.tar.gz
|
||||
/multipath-tools-0.8.5.tgz
|
||||
/multipath-tools-0.8.6.tgz
|
||||
/multipath-tools-0.8.7.tgz
|
||||
/multipath-tools-0.8.9.tgz
|
||||
|
@ -1,45 +0,0 @@
|
||||
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,29 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Xose Vazquez Perez <xose.vazquez@gmail.com>
|
||||
Date: Thu, 24 Feb 2022 22:06:08 +0100
|
||||
Subject: [PATCH] multipath-tools: identify more arrays under IBM/2145 ID
|
||||
|
||||
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 | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c
|
||||
index bd157103..643caa32 100644
|
||||
--- a/libmultipath/hwtable.c
|
||||
+++ b/libmultipath/hwtable.c
|
||||
@@ -665,7 +665,7 @@ static struct hwentry default_hw[] = {
|
||||
},
|
||||
{
|
||||
// Storwize V5000 and V7000 lines / SAN Volume Controller (SVC) / Flex System V7000 /
|
||||
- // FlashSystem V840/V9000/5000/5100/5200/7200/9100/9200/9200R
|
||||
+ // FlashSystem V840/V9000/5000/5100/5200/7200/7300/9100/9200/9200R/9500
|
||||
.vendor = "IBM",
|
||||
.product = "^2145",
|
||||
.no_path_retry = NO_PATH_RETRY_QUEUE,
|
@ -0,0 +1,32 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Xose Vazquez Perez <xose.vazquez@gmail.com>
|
||||
Date: Thu, 24 Feb 2022 22:23:34 +0100
|
||||
Subject: [PATCH] multipath-tools: add HPE as vendor for OPEN- (XP8 arrays)
|
||||
|
||||
Cc: Matthias Rudolph <Matthias.Rudolph@hitachivantara.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 | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c
|
||||
index 643caa32..3b9e0e0f 100644
|
||||
--- a/libmultipath/hwtable.c
|
||||
+++ b/libmultipath/hwtable.c
|
||||
@@ -467,8 +467,8 @@ static struct hwentry default_hw[] = {
|
||||
* Maintainer: Matthias Rudolph <Matthias.Rudolph@hitachivantara.com>
|
||||
*/
|
||||
{
|
||||
- /* USP-V, HUS VM, VSP, VSP G1X00 and VSP GX00 families / HP XP */
|
||||
- .vendor = "(HITACHI|HP)",
|
||||
+ /* USP-V, HUS VM, VSP, VSP G1X00 and VSP GX00 families / HPE XP */
|
||||
+ .vendor = "(HITACHI|HP|HPE)",
|
||||
.product = "^OPEN-",
|
||||
.pgpolicy = MULTIBUS,
|
||||
},
|
@ -1,52 +0,0 @@
|
||||
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;
|
@ -1,9 +1,9 @@
|
||||
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
|
||||
Date: Thu, 24 Feb 2022 22:24:39 +0100
|
||||
Subject: [PATCH] multipath-tools: add HP/HSVX740 to hwtable
|
||||
|
||||
e-mail was bounced: 550 5.1.1 User Unknown
|
||||
Info from: https://community.hpe.com/hpeb/attachments/hpeb/itrc-248/61618/1/HP_DM_MP_Guide.pdf
|
||||
|
||||
Cc: Martin Wilck <mwilck@suse.com>
|
||||
Cc: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
@ -13,23 +13,19 @@ 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(-)
|
||||
libmultipath/hwtable.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c
|
||||
index 7fc5bc04..763982cd 100644
|
||||
index 3b9e0e0f..ff8ed036 100644
|
||||
--- a/libmultipath/hwtable.c
|
||||
+++ b/libmultipath/hwtable.c
|
||||
@@ -361,11 +361,7 @@ static struct hwentry default_hw[] = {
|
||||
.pgpolicy = MULTIBUS,
|
||||
},
|
||||
@@ -192,7 +192,7 @@ static struct hwentry default_hw[] = {
|
||||
{
|
||||
- /*
|
||||
- * SC Series, formerly Compellent
|
||||
- *
|
||||
- * Maintainer: Sean McGinnis <sean_mcginnis@dell.com>
|
||||
- */
|
||||
+ /* SC Series, formerly Compellent */
|
||||
.vendor = "COMPELNT",
|
||||
.product = "Compellent Vol",
|
||||
/* SAN Virtualization Services Platform */
|
||||
.vendor = "HP",
|
||||
- .product = "HSVX700",
|
||||
+ .product = "(HSVX700|HSVX740)",
|
||||
.hwhandler = "1 alua",
|
||||
.pgpolicy = GROUP_BY_PRIO,
|
||||
.pgfailback = -FAILBACK_IMMEDIATE,
|
@ -1,48 +0,0 @@
|
||||
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,37 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Xose Vazquez Perez <xose.vazquez@gmail.com>
|
||||
Date: Wed, 23 Feb 2022 23:16:44 +0100
|
||||
Subject: [PATCH] multipath-tools: add DellEMC/ME5 (PowerVault ME5) to hardware
|
||||
table
|
||||
|
||||
Convert PowerVault ME4 template for all ME series.
|
||||
|
||||
[MW] https://dl.dell.com/content/manual51886263-dell-powervault-me5-series-administrator's-guide.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 | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c
|
||||
index ff8ed036..0e1c0a41 100644
|
||||
--- a/libmultipath/hwtable.c
|
||||
+++ b/libmultipath/hwtable.c
|
||||
@@ -397,9 +397,9 @@ static struct hwentry default_hw[] = {
|
||||
.fast_io_fail = 15,
|
||||
},
|
||||
{
|
||||
- /* PowerVault ME4 */
|
||||
+ /* PowerVault ME 4/5 families */
|
||||
.vendor = "DellEMC",
|
||||
- .product = "ME4",
|
||||
+ .product = "^ME",
|
||||
.pgpolicy = GROUP_BY_PRIO,
|
||||
.prio_name = PRIO_ALUA,
|
||||
.hwhandler = "1 alua",
|
@ -1,39 +0,0 @@
|
||||
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 */
|
136
0005-multipath-tools-update-mpp-force_readonly-in-ev_add_.patch
Normal file
136
0005-multipath-tools-update-mpp-force_readonly-in-ev_add_.patch
Normal file
@ -0,0 +1,136 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Uday Shankar <ushankar@purestorage.com>
|
||||
Date: Wed, 9 Mar 2022 13:03:26 -0700
|
||||
Subject: [PATCH] multipath-tools: update mpp->force_readonly in ev_add_path
|
||||
|
||||
When NVMe disks are added to the system, no uevent containing the
|
||||
DISK_RO property is generated. As a result, dm-* nodes backed by
|
||||
readonly NVMe disks will not have their RO state set properly. The
|
||||
result looks like this:
|
||||
|
||||
$ multipath -l
|
||||
eui.00c92c091fd6564424a9376600011bd1 dm-3 NVME,Pure Storage FlashArray
|
||||
size=1.0T features='0' hwhandler='0' wp=rw
|
||||
|-+- policy='service-time 0' prio=0 status=active
|
||||
| `- 0:2:2:72657 nvme0n2 259:4 active undef running
|
||||
`-+- policy='service-time 0' prio=0 status=enabled
|
||||
`- 1:0:2:72657 nvme1n2 259:1 active undef running
|
||||
$ cat /sys/block/dm-3/ro
|
||||
0
|
||||
$ cat /sys/block/nvme*n2/ro
|
||||
1
|
||||
1
|
||||
|
||||
This is not a problem for SCSI disks, since the kernel will emit change
|
||||
uevents containing the DISK_RO property when the disk is added to the
|
||||
system. See the following thread for my initial attempt to fix this
|
||||
issue at the kernel level:
|
||||
https://lore.kernel.org/linux-block/Yib8GqCA5e3SQYty@infradead.org/T/#t
|
||||
|
||||
Fix the issue by picking up the path ro state from sysfs in ev_add_path,
|
||||
setting the mpp->force_readonly accordingly, and changing
|
||||
dm_addmap_create to be aware of mpp->force_readonly.
|
||||
|
||||
Signed-off-by: Uday Shankar <ushankar@purestorage.com>
|
||||
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/devmapper.c | 2 +-
|
||||
multipathd/main.c | 50 ++++++++++++++++++++++------------------
|
||||
2 files changed, 29 insertions(+), 23 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/devmapper.c b/libmultipath/devmapper.c
|
||||
index 2507f77f..9819e29b 100644
|
||||
--- a/libmultipath/devmapper.c
|
||||
+++ b/libmultipath/devmapper.c
|
||||
@@ -540,7 +540,7 @@ int dm_addmap_create (struct multipath *mpp, char * params)
|
||||
int ro;
|
||||
uint16_t udev_flags = build_udev_flags(mpp, 0);
|
||||
|
||||
- for (ro = 0; ro <= 1; ro++) {
|
||||
+ for (ro = mpp->force_readonly ? 1 : 0; ro <= 1; ro++) {
|
||||
int err;
|
||||
|
||||
if (dm_addmap(DM_DEVICE_CREATE, TGT_MPATH, mpp, params, ro,
|
||||
diff --git a/multipathd/main.c b/multipathd/main.c
|
||||
index f2c0b280..a67865df 100644
|
||||
--- a/multipathd/main.c
|
||||
+++ b/multipathd/main.c
|
||||
@@ -1130,6 +1130,28 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static 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;
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* returns:
|
||||
* 0: added
|
||||
@@ -1143,6 +1165,7 @@ ev_add_path (struct path * pp, struct vectors * vecs, int need_do_map)
|
||||
int retries = 3;
|
||||
int start_waiter = 0;
|
||||
int ret;
|
||||
+ int ro;
|
||||
|
||||
/*
|
||||
* need path UID to go any further
|
||||
@@ -1207,6 +1230,11 @@ rescan:
|
||||
/* persistent reservation check*/
|
||||
mpath_pr_event_handle(pp);
|
||||
|
||||
+ /* ro check - if new path is ro, force map to be ro as well */
|
||||
+ ro = sysfs_get_ro(pp);
|
||||
+ if (ro == 1)
|
||||
+ mpp->force_readonly = 1;
|
||||
+
|
||||
if (!need_do_map)
|
||||
return 0;
|
||||
|
||||
@@ -1446,28 +1474,6 @@ finish_path_init(struct path *pp, struct vectors * vecs)
|
||||
return -1;
|
||||
}
|
||||
|
||||
-static 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;
|
||||
-}
|
||||
-
|
||||
static bool
|
||||
needs_ro_update(struct multipath *mpp, int ro)
|
||||
{
|
@ -1,32 +0,0 @@
|
||||
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]
|
@ -15,10 +15,10 @@ Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
3 files changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/Makefile.inc b/Makefile.inc
|
||||
index d0ec9b44..2a75dc9c 100644
|
||||
index d24da43e..fb23635c 100644
|
||||
--- a/Makefile.inc
|
||||
+++ b/Makefile.inc
|
||||
@@ -55,7 +55,7 @@ endif
|
||||
@@ -75,7 +75,7 @@ endif
|
||||
prefix =
|
||||
exec_prefix = $(prefix)
|
||||
usr_prefix = $(prefix)
|
||||
@ -26,12 +26,12 @@ index d0ec9b44..2a75dc9c 100644
|
||||
+bindir = $(exec_prefix)/usr/sbin
|
||||
libudevdir = $(prefix)/$(SYSTEMDPATH)/udev
|
||||
udevrulesdir = $(libudevdir)/rules.d
|
||||
multipathdir = $(TOPDIR)/libmultipath
|
||||
modulesloaddir = $(prefix)/$(SYSTEMDPATH)/modules-load.d
|
||||
diff --git a/kpartx/kpartx.rules b/kpartx/kpartx.rules
|
||||
index d7527d7d..0e0d70d5 100644
|
||||
index 1969dee0..d2b28233 100644
|
||||
--- a/kpartx/kpartx.rules
|
||||
+++ b/kpartx/kpartx.rules
|
||||
@@ -36,6 +36,6 @@ LABEL="mpath_kpartx_end"
|
||||
@@ -39,6 +39,6 @@ LABEL="mpath_kpartx_end"
|
||||
GOTO="kpartx_end"
|
||||
|
||||
LABEL="run_kpartx"
|
||||
@ -40,24 +40,24 @@ index d7527d7d..0e0d70d5 100644
|
||||
|
||||
LABEL="kpartx_end"
|
||||
diff --git a/multipath/Makefile b/multipath/Makefile
|
||||
index 0828a8f7..b9bbb3cf 100644
|
||||
index c930499d..2059a4f4 100644
|
||||
--- a/multipath/Makefile
|
||||
+++ b/multipath/Makefile
|
||||
@@ -24,7 +24,7 @@ install:
|
||||
@@ -22,7 +22,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) -m 644 $(EXEC).rules $(DESTDIR)$(udevrulesdir)/56-multipath.rules
|
||||
+ $(INSTALL_PROGRAM) -m 644 $(EXEC).rules $(DESTDIR)$(udevrulesdir)/62-multipath.rules
|
||||
$(INSTALL_PROGRAM) -d $(DESTDIR)$(modulesloaddir)
|
||||
$(INSTALL_PROGRAM) -m 644 modules-load.conf $(DESTDIR)$(modulesloaddir)/multipath.conf
|
||||
$(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)
|
||||
@@ -40,7 +40,7 @@ uninstall:
|
||||
$(RM) $(DESTDIR)$(udevrulesdir)/11-dm-mpath.rules
|
||||
$(RM) $(DESTDIR)$(modulesloaddir)/multipath.conf
|
||||
$(RM) $(DESTDIR)$(modulesloaddir)/scsi_dh.conf
|
||||
- $(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
|
||||
$(RM) $(DESTDIR)$(man8dir)/$(EXEC).8
|
||||
$(RM) $(DESTDIR)$(man5dir)/$(EXEC).conf.5
|
||||
|
@ -1,40 +0,0 @@
|
||||
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 /
|
@ -19,10 +19,10 @@ Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
3 files changed, 10 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/blacklist.c b/libmultipath/blacklist.c
|
||||
index 4e315c97..1e463ef6 100644
|
||||
index 8d15d2ea..eff690fd 100644
|
||||
--- a/libmultipath/blacklist.c
|
||||
+++ b/libmultipath/blacklist.c
|
||||
@@ -202,9 +202,6 @@ setup_default_blist (struct config * conf)
|
||||
@@ -201,9 +201,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;
|
||||
|
||||
@ -32,7 +32,7 @@ index 4e315c97..1e463ef6 100644
|
||||
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,
|
||||
@@ -409,7 +406,8 @@ filter_property(const struct config *conf, struct udev_device *udev,
|
||||
*uid_attribute != '\0';
|
||||
bool uid_attr_seen = false;
|
||||
|
||||
@ -43,10 +43,10 @@ index 4e315c97..1e463ef6 100644
|
||||
udev_device_get_properties_list_entry(udev)) {
|
||||
|
||||
diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5
|
||||
index 88d2a1df..7f85f766 100644
|
||||
index 605b46e0..1844a250 100644
|
||||
--- a/multipath/multipath.conf.5
|
||||
+++ b/multipath/multipath.conf.5
|
||||
@@ -1356,9 +1356,14 @@ keywords. Both are regular expressions. For a full description of these keywords
|
||||
@@ -1365,9 +1365,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,
|
||||
@ -62,7 +62,7 @@ index 88d2a1df..7f85f766 100644
|
||||
.
|
||||
.RS
|
||||
.PP
|
||||
@@ -1369,10 +1374,6 @@ Blacklisting by missing properties is only applied to devices which do have the
|
||||
@@ -1378,10 +1383,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.
|
@ -1,35 +0,0 @@
|
||||
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 */
|
@ -21,10 +21,10 @@ Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
6 files changed, 19 insertions(+)
|
||||
|
||||
diff --git a/libmultipath/config.c b/libmultipath/config.c
|
||||
index 30046a17..5f35c3d3 100644
|
||||
index c595e768..b193de5c 100644
|
||||
--- a/libmultipath/config.c
|
||||
+++ b/libmultipath/config.c
|
||||
@@ -895,6 +895,19 @@ int _init_config (const char *file, struct config *conf)
|
||||
@@ -894,6 +894,19 @@ int _init_config (const char *file, struct config *conf)
|
||||
goto out;
|
||||
}
|
||||
factorize_hwtable(conf->hwtable, builtin_hwtable_size, file);
|
||||
@ -45,7 +45,7 @@ index 30046a17..5f35c3d3 100644
|
||||
|
||||
conf->processed_main_config = 1;
|
||||
diff --git a/libmultipath/config.h b/libmultipath/config.h
|
||||
index 933fe0d1..5f01c1fc 100644
|
||||
index c73389b5..69a01cb7 100644
|
||||
--- a/libmultipath/config.h
|
||||
+++ b/libmultipath/config.h
|
||||
@@ -9,6 +9,7 @@
|
||||
@ -69,7 +69,7 @@ index 9df11a95..0486bf70 100644
|
||||
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
|
||||
index 1e318bdc..6aab9325 100644
|
||||
--- a/multipathd/multipathd.8
|
||||
+++ b/multipathd/multipathd.8
|
||||
@@ -39,6 +39,8 @@ map regains its maximum performance and redundancy.
|
||||
@ -82,17 +82,17 @@ index 048a838d..8bd47a80 100644
|
||||
.
|
||||
.\" ----------------------------------------------------------------------------
|
||||
diff --git a/multipathd/multipathd.service b/multipathd/multipathd.service
|
||||
index 0b2ac814..6d57c7e8 100644
|
||||
index aec62dbb..d76f94f9 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
|
||||
@@ -6,6 +6,7 @@ Wants=systemd-udevd-kernel.socket
|
||||
After=systemd-udevd-kernel.socket
|
||||
After=multipathd.socket systemd-remount-fs.service
|
||||
Before=initrd-cleanup.service
|
||||
+ConditionPathExists=/etc/multipath.conf
|
||||
DefaultDependencies=no
|
||||
Conflicts=shutdown.target
|
||||
ConditionKernelCommandLine=!nompath
|
||||
Conflicts=initrd-cleanup.service
|
||||
diff --git a/multipathd/multipathd.socket b/multipathd/multipathd.socket
|
||||
index c777e5e3..3c20a2ff 100644
|
||||
--- a/multipathd/multipathd.socket
|
@ -1,37 +0,0 @@
|
||||
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 */
|
@ -1,35 +0,0 @@
|
||||
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,
|
||||
},
|
||||
{
|
@ -13,10 +13,10 @@ Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
1 file changed, 19 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/Makefile.inc b/Makefile.inc
|
||||
index 2a75dc9c..5ac660de 100644
|
||||
index fb23635c..4511ab1f 100644
|
||||
--- a/Makefile.inc
|
||||
+++ b/Makefile.inc
|
||||
@@ -92,23 +92,35 @@ TEST_CC_OPTION = $(shell \
|
||||
@@ -114,23 +114,35 @@ TEST_CC_OPTION = $(shell \
|
||||
echo "$(2)"; \
|
||||
fi)
|
||||
|
||||
@ -58,9 +58,12 @@ index 2a75dc9c..5ac660de 100644
|
||||
BIN_LDFLAGS = -pie
|
||||
|
||||
# Check whether a function with name $1 has been declared in header file $2.
|
||||
@@ -139,4 +151,4 @@ check_file = $(shell \
|
||||
@@ -174,7 +186,7 @@ check_var = $(shell \
|
||||
|
||||
%.o: %.c
|
||||
@echo building $@ because of $?
|
||||
- $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<
|
||||
+ $(CC) $(CFLAGS) -c -o $@ $<
|
||||
|
||||
%.abi: %.so.0
|
||||
abidw $< >$@
|
@ -13,18 +13,18 @@ a single command.
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/config.c | 2 +
|
||||
multipath/Makefile | 5 +
|
||||
multipath/mpathconf | 564 ++++++++++++++++++++++++++++++++++++++++++
|
||||
multipath/mpathconf.8 | 135 ++++++++++
|
||||
4 files changed, 706 insertions(+)
|
||||
multipath/Makefile | 4 +
|
||||
multipath/mpathconf | 658 ++++++++++++++++++++++++++++++++++++++++++
|
||||
multipath/mpathconf.8 | 151 ++++++++++
|
||||
4 files changed, 815 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
|
||||
index b193de5c..a8ec3bf4 100644
|
||||
--- a/libmultipath/config.c
|
||||
+++ b/libmultipath/config.c
|
||||
@@ -897,6 +897,8 @@ int _init_config (const char *file, struct config *conf)
|
||||
@@ -896,6 +896,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.");
|
||||
@ -34,45 +34,42 @@ index 5f35c3d3..cee3bbb7 100644
|
||||
conf->blist_devnode = vector_alloc();
|
||||
if (!conf->blist_devnode) {
|
||||
diff --git a/multipath/Makefile b/multipath/Makefile
|
||||
index b9bbb3cf..e720c7f6 100644
|
||||
index 2059a4f4..e2ebe431 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
|
||||
|
||||
@@ -20,6 +20,7 @@ $(EXEC): $(OBJS) $(multipathdir)/libmultipath.so $(mpathcmddir)/libmpathcmd.so
|
||||
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) -m 644 $(EXEC).rules $(DESTDIR)$(udevrulesdir)/62-multipath.rules
|
||||
@@ -29,6 +30,7 @@ install:
|
||||
$(INSTALL_PROGRAM) -m 644 $(EXEC).8 $(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
|
||||
$(INSTALL_PROGRAM) -m 644 $(EXEC).conf.5 $(DESTDIR)$(man5dir)
|
||||
+ $(INSTALL_PROGRAM) -m 644 mpathconf.8 $(DESTDIR)$(man8dir)
|
||||
ifneq ($(SCSI_DH_MODULES_PRELOAD),)
|
||||
$(INSTALL_PROGRAM) -m 644 scsi_dh.conf $(DESTDIR)$(modulesloaddir)/scsi_dh.conf
|
||||
for _x in $(SCSI_DH_MODULES_PRELOAD); do echo "$$_x"; done \
|
||||
@@ -41,8 +43,10 @@ uninstall:
|
||||
$(RM) $(DESTDIR)$(modulesloaddir)/multipath.conf
|
||||
$(RM) $(DESTDIR)$(modulesloaddir)/scsi_dh.conf
|
||||
$(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
|
||||
$(RM) $(DESTDIR)$(man8dir)/$(EXEC).8
|
||||
$(RM) $(DESTDIR)$(man5dir)/$(EXEC).conf.5
|
||||
+ $(RM) $(DESTDIR)$(man8dir)/mpathconf.8
|
||||
|
||||
clean: dep_clean
|
||||
$(RM) core *.o $(EXEC) *.gz
|
||||
$(RM) core *.o $(EXEC)
|
||||
diff --git a/multipath/mpathconf b/multipath/mpathconf
|
||||
new file mode 100644
|
||||
index 00000000..0de6b121
|
||||
index 00000000..319664b1
|
||||
--- /dev/null
|
||||
+++ b/multipath/mpathconf
|
||||
@@ -0,0 +1,564 @@
|
||||
@@ -0,0 +1,658 @@
|
||||
+#!/bin/bash
|
||||
+#
|
||||
+# Copyright (C) 2010 Red Hat, Inc. All rights reserved.
|
||||
@ -92,7 +89,7 @@ index 00000000..0de6b121
|
||||
+# 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 HAVE_RECHECK_WWID RECHECK_WWID
|
||||
+
|
||||
+DEFAULT_CONFIG="# device-mapper-multipath configuration file
|
||||
+
|
||||
@ -127,6 +124,8 @@ index 00000000..0de6b121
|
||||
+ 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>"
|
||||
+ echo "select output file (Default /etc/multipath.conf): --outfile <FILE>"
|
||||
@ -219,6 +218,15 @@ index 00000000..0de6b121
|
||||
+ 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
|
||||
@ -237,6 +245,20 @@ index 00000000..0de6b121
|
||||
+ 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
|
||||
@ -283,17 +305,25 @@ index 00000000..0de6b121
|
||||
+
|
||||
+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" -o -n "$RECHECK_WWID" ]; then
|
||||
+ echo "ignoring extra parameters on disable"
|
||||
+ FRIENDLY=""
|
||||
+ FIND=""
|
||||
+ PROPERTY=""
|
||||
+ MODULE=""
|
||||
+ 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
|
||||
@ -310,7 +340,19 @@ index 00000000..0de6b121
|
||||
+ 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" -a -z "$RECHECK_WWID" ]; then
|
||||
+ SHOW_STATUS=1
|
||||
+ fi
|
||||
+ if [ -n "$MODULE" ] && [ "$MODULE" != "y" -a "$MODULE" != "n" ]; then
|
||||
@ -412,6 +454,11 @@ index 00000000..0de6b121
|
||||
+ 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
|
||||
@ -423,6 +470,13 @@ index 00000000..0de6b121
|
||||
+ 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
|
||||
@ -449,6 +503,11 @@ index 00000000..0de6b121
|
||||
+ 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
|
||||
@ -565,6 +624,23 @@ index 00000000..0de6b121
|
||||
+ 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
|
||||
@ -607,6 +683,21 @@ index 00000000..0de6b121
|
||||
+ 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
|
||||
@ -639,10 +730,10 @@ index 00000000..0de6b121
|
||||
+fi
|
||||
diff --git a/multipath/mpathconf.8 b/multipath/mpathconf.8
|
||||
new file mode 100644
|
||||
index 00000000..a14d831e
|
||||
index 00000000..9c2fb835
|
||||
--- /dev/null
|
||||
+++ b/multipath/mpathconf.8
|
||||
@@ -0,0 +1,135 @@
|
||||
@@ -0,0 +1,151 @@
|
||||
+.TH MPATHCONF 8 "June 2010" "" "Linux Administrator's Manual"
|
||||
+.SH NAME
|
||||
+mpathconf - A tool for configuring device-mapper-multipath
|
||||
@ -722,6 +813,15 @@ index 00000000..a14d831e
|
||||
+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>
|
||||
@ -746,6 +846,13 @@ index 00000000..a14d831e
|
||||
+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.
|
@ -1,35 +0,0 @@
|
||||
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 */
|
@ -20,10 +20,10 @@ Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
3 files changed, 59 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/multipath/main.c b/multipath/main.c
|
||||
index b2d300e5..80fa68e5 100644
|
||||
index d09f62db..0d786ee5 100644
|
||||
--- a/multipath/main.c
|
||||
+++ b/multipath/main.c
|
||||
@@ -122,7 +122,7 @@ usage (char * progname)
|
||||
@@ -120,7 +120,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);
|
||||
@ -32,7 +32,7 @@ index b2d300e5..80fa68e5 100644
|
||||
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)
|
||||
@@ -134,6 +134,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"
|
||||
@ -41,7 +41,7 @@ index b2d300e5..80fa68e5 100644
|
||||
" -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)
|
||||
@@ -448,6 +450,50 @@ static void cleanup_vecs(void)
|
||||
free_pathvec(vecs.pathvec, FREE_PATHS);
|
||||
}
|
||||
|
||||
@ -92,16 +92,16 @@ index b2d300e5..80fa68e5 100644
|
||||
static int
|
||||
configure (struct config *conf, enum mpath_cmds cmd,
|
||||
enum devtypes dev_type, char *devpath)
|
||||
@@ -839,7 +885,7 @@ main (int argc, char *argv[])
|
||||
conf->retrigger_tries = 0;
|
||||
@@ -841,7 +887,7 @@ main (int argc, char *argv[])
|
||||
conf->force_sync = 1;
|
||||
atexit(cleanup_vecs);
|
||||
if (atexit(cleanup_vecs))
|
||||
condlog(1, "failed to register cleanup handler for vecs: %m");
|
||||
- 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;
|
||||
@@ -916,6 +962,10 @@ main (int argc, char *argv[])
|
||||
case 'v':
|
||||
if (!isdigit(optarg[0])) {
|
||||
@@ -912,6 +958,10 @@ main (int argc, char *argv[])
|
||||
case 'T':
|
||||
cmd = CMD_DUMP_CONFIG;
|
||||
break;
|
||||
@ -113,7 +113,7 @@ index b2d300e5..80fa68e5 100644
|
||||
usage(argv[0]);
|
||||
exit(RTVL_OK);
|
||||
diff --git a/multipath/multipath.8 b/multipath/multipath.8
|
||||
index 17df59f5..5ca75359 100644
|
||||
index 4c7e9885..1d062664 100644
|
||||
--- a/multipath/multipath.8
|
||||
+++ b/multipath/multipath.8
|
||||
@@ -63,7 +63,7 @@ multipath \- Device mapper target autoconfig.
|
||||
@ -138,13 +138,13 @@ index 17df59f5..5ca75359 100644
|
||||
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
|
||||
index d76f94f9..bb5f383a 100644
|
||||
--- a/multipathd/multipathd.service
|
||||
+++ b/multipathd/multipathd.service
|
||||
@@ -16,6 +16,7 @@ Type=notify
|
||||
@@ -17,6 +17,7 @@ ConditionVirtualization=!container
|
||||
[Service]
|
||||
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
|
@ -1,38 +0,0 @@
|
||||
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 */
|
@ -12,10 +12,10 @@ Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/libmultipath/defaults.h b/libmultipath/defaults.h
|
||||
index c27946c7..e0dd32ad 100644
|
||||
index 7d95413d..4fe08991 100644
|
||||
--- a/libmultipath/defaults.h
|
||||
+++ b/libmultipath/defaults.h
|
||||
@@ -23,7 +23,7 @@
|
||||
@@ -24,7 +24,7 @@
|
||||
#define DEFAULT_NO_PATH_RETRY NO_PATH_RETRY_UNDEF
|
||||
#define DEFAULT_VERBOSITY 2
|
||||
#define DEFAULT_REASSIGN_MAPS 0
|
@ -1,26 +0,0 @@
|
||||
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 65ece830..b2d300e5 100644
|
||||
--- a/multipath/main.c
|
||||
+++ b/multipath/main.c
|
||||
@@ -560,6 +560,7 @@ configure (struct config *conf, enum mpath_cmds cmd,
|
||||
|
||||
dump_config(conf, hwes, curmp);
|
||||
vector_free(hwes);
|
||||
+ r = RTVL_OK;
|
||||
goto out;
|
||||
}
|
||||
|
@ -1,70 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Thu, 11 Nov 2021 12:53:44 -0600
|
||||
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>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.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);
|
||||
|
@ -9,52 +9,46 @@ that.
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/discovery.c | 18 ++----------------
|
||||
libmultipath/discovery.c | 12 ++----------
|
||||
tests/vpd.c | 6 ++++++
|
||||
2 files changed, 8 insertions(+), 16 deletions(-)
|
||||
2 files changed, 8 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
|
||||
index f25fe9e3..6fb81c28 100644
|
||||
index b969fba1..d2f2a8cf 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;
|
||||
@@ -1156,13 +1156,9 @@ parse_vpd_pg83(const unsigned char *in, size_t in_len,
|
||||
good_len = 8;
|
||||
break;
|
||||
case 2:
|
||||
- /* IEEE Extended: Prio 6 */
|
||||
- naa_prio = 6;
|
||||
- new_prio = 6;
|
||||
- good_len = 8;
|
||||
- break;
|
||||
case 3:
|
||||
- /* IEEE Locally assigned: Prio 1 */
|
||||
- naa_prio = 1;
|
||||
- new_prio = 1;
|
||||
+ /* IEEE Extended or Locally assigned: Prio 6 */
|
||||
+ naa_prio = 6;
|
||||
+ new_prio = 6;
|
||||
good_len = 8;
|
||||
break;
|
||||
default:
|
||||
/* Default: no priority */
|
||||
@@ -1160,17 +1157,6 @@ parse_vpd_pg83(const unsigned char *in, size_t in_len,
|
||||
vpd = d;
|
||||
}
|
||||
@@ -1180,10 +1176,6 @@ parse_vpd_pg83(const unsigned char *in, size_t in_len,
|
||||
break;
|
||||
case 0x8:
|
||||
/* SCSI Name: Prio 3 */
|
||||
- invalid = (d[3] < 4 || (memcmp(d + 4, "eui.", 4) &&
|
||||
- memcmp(d + 4, "naa.", 4) &&
|
||||
- memcmp(d + 4, "iqn.", 4)));
|
||||
- new_prio = 3;
|
||||
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
|
||||
index a7d2092c..2366cfba 100644
|
||||
--- a/tests/vpd.c
|
||||
+++ b/tests/vpd.c
|
||||
@@ -230,11 +230,13 @@ static const char * const str_prefix[] = {
|
||||
@@ -231,11 +231,13 @@ static const char * const str_prefix[] = {
|
||||
[STR_IQN] = "iqn.",
|
||||
};
|
||||
|
||||
@ -68,7 +62,7 @@ index 8e730d37..7bf7990f 100644
|
||||
|
||||
/**
|
||||
* create_scsi_string_desc() - create a SCSI name string descriptor.
|
||||
@@ -659,6 +661,7 @@ make_test_vpd_naa(2, 18);
|
||||
@@ -766,6 +768,7 @@ make_test_vpd_naa(2, 18);
|
||||
make_test_vpd_naa(2, 17);
|
||||
make_test_vpd_naa(2, 16);
|
||||
|
||||
@ -76,7 +70,7 @@ index 8e730d37..7bf7990f 100644
|
||||
/* 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)
|
||||
@@ -801,6 +804,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)
|
||||
@ -84,7 +78,7 @@ index 8e730d37..7bf7990f 100644
|
||||
|
||||
static int test_vpd(void)
|
||||
{
|
||||
@@ -767,6 +771,7 @@ static int test_vpd(void)
|
||||
@@ -909,6 +913,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),
|
||||
@ -92,7 +86,7 @@ index 8e730d37..7bf7990f 100644
|
||||
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)
|
||||
@@ -933,6 +938,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),
|
@ -1,85 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Thu, 11 Nov 2021 12:53:45 -0600
|
||||
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>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.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);
|
25
0016-RH-add-scsi-device-handlers-to-modules-load.d.patch
Normal file
25
0016-RH-add-scsi-device-handlers-to-modules-load.d.patch
Normal file
@ -0,0 +1,25 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Fri, 25 Mar 2022 18:12:06 -0500
|
||||
Subject: [PATCH] RH: add scsi device handlers to modules-load.d
|
||||
|
||||
Make scsi_dh_alua scsi_dh_emc and scsi_dh_rdac get loaded in early boot.
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
Makefile.inc | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/Makefile.inc b/Makefile.inc
|
||||
index 4511ab1f..fec82b00 100644
|
||||
--- a/Makefile.inc
|
||||
+++ b/Makefile.inc
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
# List of scsi device handler modules to load on boot, e.g.
|
||||
# SCSI_DH_MODULES_PRELOAD := scsi_dh_alua scsi_dh_rdac
|
||||
-SCSI_DH_MODULES_PRELOAD :=
|
||||
+SCSI_DH_MODULES_PRELOAD := scsi_dh_alua scsi_dh_emc scsi_dh_rdac
|
||||
|
||||
|
||||
PKGCONFIG ?= pkg-config
|
@ -1,28 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Thu, 11 Nov 2021 12:53:46 -0600
|
||||
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>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.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) {
|
@ -1,528 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Thu, 11 Nov 2021 12:53:47 -0600
|
||||
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>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.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;
|
@ -1,251 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Thu, 11 Nov 2021 12:53:48 -0600
|
||||
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>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.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,
|
@ -1,171 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Thu, 11 Nov 2021 12:53:49 -0600
|
||||
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>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.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)
|
||||
|
||||
/*
|
@ -1,115 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Thu, 11 Nov 2021 12:53:50 -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>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.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 c74129bd..88d2a1df 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.
|
@ -1,192 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Thu, 11 Nov 2021 12:53:51 -0600
|
||||
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>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.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
|
@ -1,202 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Thu, 11 Nov 2021 12:53:52 -0600
|
||||
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>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.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;
|
@ -1,219 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Thu, 11 Nov 2021 19:24:31 -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>
|
||||
Reviewed-by: Martin Wilck <mwilck@suse.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
|
@ -1,129 +0,0 @@
|
||||
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)
|
@ -1,59 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
Date: Tue, 25 Jan 2022 23:02:33 -0600
|
||||
Subject: [PATCH] libmultipath: use asprintf() to allocate prefixed_uuid
|
||||
|
||||
gcc 12.0.1 failed building libmultipath due to a format-overflow false
|
||||
positive on 32-bit architectures. This isn't so surprising as
|
||||
format-overflow=2 is very aggressive in the assumptions it makes about
|
||||
the arguments. Here, it assumes that mpp->wwid could take up all the
|
||||
space that a pointer could point to, even if I add code to this function
|
||||
to explicitly null terminate mpp->wwid to fit in WWID_SIZE.
|
||||
|
||||
To avoid this and simplify the function, switch from using calloc() and
|
||||
sprintf() to just using asprintf().
|
||||
|
||||
For reference, the gcc build error that this fixes is:
|
||||
|
||||
devmapper.c: In function 'dm_addmap.constprop.0':
|
||||
devmapper.h:27:21: error: '%s' directive writing up to 2147483644 bytes into a region of size 2147483641 [-Werror=format-overflow=]
|
||||
27 | #define UUID_PREFIX "mpath-"
|
||||
| ^~~~~~~~
|
||||
devmapper.c:484:53: note: format string is defined here
|
||||
484 | sprintf(prefixed_uuid, UUID_PREFIX "%s", mpp->wwid);
|
||||
| ^~
|
||||
|
||||
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||
---
|
||||
libmultipath/devmapper.c | 7 ++-----
|
||||
1 file changed, 2 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/libmultipath/devmapper.c b/libmultipath/devmapper.c
|
||||
index c05dc201..bae07125 100644
|
||||
--- a/libmultipath/devmapper.c
|
||||
+++ b/libmultipath/devmapper.c
|
||||
@@ -474,14 +474,11 @@ dm_addmap (int task, const char *target, struct multipath *mpp,
|
||||
dm_task_set_ro(dmt);
|
||||
|
||||
if (task == DM_DEVICE_CREATE) {
|
||||
- prefixed_uuid = MALLOC(UUID_PREFIX_LEN +
|
||||
- strlen(mpp->wwid) + 1);
|
||||
- if (!prefixed_uuid) {
|
||||
+ if (asprintf(&prefixed_uuid, UUID_PREFIX "%s", mpp->wwid) < 0) {
|
||||
condlog(0, "cannot create prefixed uuid : %s",
|
||||
strerror(errno));
|
||||
goto addout;
|
||||
}
|
||||
- sprintf(prefixed_uuid, UUID_PREFIX "%s", mpp->wwid);
|
||||
if (!dm_task_set_uuid(dmt, prefixed_uuid))
|
||||
goto freeout;
|
||||
dm_task_skip_lockfs(dmt);
|
||||
@@ -517,7 +514,7 @@ dm_addmap (int task, const char *target, struct multipath *mpp,
|
||||
libmp_udev_wait(cookie);
|
||||
freeout:
|
||||
if (prefixed_uuid)
|
||||
- FREE(prefixed_uuid);
|
||||
+ free(prefixed_uuid);
|
||||
|
||||
addout:
|
||||
dm_task_destroy (dmt);
|
@ -1,149 +0,0 @@
|
||||
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.
|
@ -1,154 +0,0 @@
|
||||
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>
|
@ -1,52 +1,31 @@
|
||||
Name: device-mapper-multipath
|
||||
Version: 0.8.7
|
||||
Release: 8%{?dist}
|
||||
Version: 0.8.9
|
||||
Release: 1%{?dist}
|
||||
Summary: Tools to manage multipath devices using device-mapper
|
||||
License: GPLv2
|
||||
URL: http://christophe.varoqui.free.fr/
|
||||
|
||||
# The source for this package was pulled from upstream's git repo. Use the
|
||||
# following command to generate the tarball
|
||||
# curl -L https://github.com/opensvc/multipath-tools/archive/0.8.7.tar.gz -o multipath-tools-0.8.7.tgz
|
||||
Source0: multipath-tools-0.8.7.tgz
|
||||
# curl -L https://github.com/opensvc/multipath-tools/archive/0.8.9.tar.gz -o multipath-tools-0.8.9.tgz
|
||||
Source0: multipath-tools-0.8.9.tgz
|
||||
Source1: multipath.conf
|
||||
Patch0001: 0001-multipath-tools-add-info-about-IO-affinity-path-sele.patch
|
||||
Patch0002: 0002-multipathd-fix-missing-persistent-reseravtion-for-ac.patch
|
||||
Patch0003: 0003-multipath-tools-minor-fixes-to-multipath.conf.5-man-.patch
|
||||
Patch0004: 0004-multipath-tools-make-IBM-XIV-config-work-with-alua-a.patch
|
||||
Patch0005: 0005-multipathd.socket-add-missing-conditions-from-servic.patch
|
||||
Patch0006: 0006-multipath-tools-make-IBM-2107900-DS8000-config-work-.patch
|
||||
Patch0007: 0007-multipath-tools-make-EMC-SYMMETRIX-config-work-with-.patch
|
||||
Patch0008: 0008-multipath-tools-make-EMC-Invista-config-work-with-al.patch
|
||||
Patch0009: 0009-multipath-tools-make-COMPELNT-Compellent-Vol-config-.patch
|
||||
Patch0010: 0010-multipath-tools-remove-Compellent-maintainer.patch
|
||||
Patch0011: 0011-Revert-multipath-tools-make-EMC-Invista-config-work-.patch
|
||||
Patch0012: 0012-Revert-multipath-tools-make-EMC-SYMMETRIX-config-wor.patch
|
||||
Patch0013: 0013-multipath-fix-exit-status-of-multipath-T.patch
|
||||
Patch0014: 0014-libmultipath-add-section-name-to-invalid-keyword-out.patch
|
||||
Patch0015: 0015-libmultipath-use-typedef-for-keyword-handler-functio.patch
|
||||
Patch0016: 0016-libmultipath-print-the-correct-file-when-parsing-fai.patch
|
||||
Patch0017: 0017-libmultipath-pass-file-and-line-number-to-keyword-ha.patch
|
||||
Patch0018: 0018-libmultipath-make-set_int-take-a-range-for-valid-val.patch
|
||||
Patch0019: 0019-libmultipath-improve-checks-for-set_str.patch
|
||||
Patch0020: 0020-libmultipath-deprecate-file-and-directory-config-opt.patch
|
||||
Patch0021: 0021-libmultipath-split-set_int-to-enable-reuse.patch
|
||||
Patch0022: 0022-libmultipath-cleanup-invalid-config-handling.patch
|
||||
Patch0023: 0023-libmultipath-don-t-return-error-on-invalid-values.patch
|
||||
Patch0024: 0024-multipathd-avoid-unnecessary-path-read-only-reloads.patch
|
||||
Patch0025: 0025-RH-fixup-udev-rules-for-redhat.patch
|
||||
Patch0026: 0026-RH-Remove-the-property-blacklist-exception-builtin.patch
|
||||
Patch0027: 0027-RH-don-t-start-without-a-config-file.patch
|
||||
Patch0028: 0028-RH-Fix-nvme-function-missing-argument.patch
|
||||
Patch0029: 0029-RH-use-rpm-optflags-if-present.patch
|
||||
Patch0030: 0030-RH-add-mpathconf.patch
|
||||
Patch0031: 0031-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch
|
||||
Patch0032: 0032-RH-reset-default-find_mutipaths-value-to-off.patch
|
||||
Patch0033: 0033-RH-attempt-to-get-ANA-info-via-sysfs-first.patch
|
||||
Patch0034: 0034-RH-make-parse_vpd_pg83-match-scsi_id-output.patch
|
||||
Patch0035: 0035-libmultipath-use-asprintf-to-allocate-prefixed_uuid.patch
|
||||
Patch0036: 0036-RH-add-support-to-mpathconf-for-setting-arbitrary-de.patch
|
||||
Patch0037: 0037-RH-add-support-to-mpathconf-for-setting-recheck_wwid.patch
|
||||
Patch0001: 0001-multipath-tools-identify-more-arrays-under-IBM-2145-.patch
|
||||
Patch0002: 0002-multipath-tools-add-HPE-as-vendor-for-OPEN-XP8-array.patch
|
||||
Patch0003: 0003-multipath-tools-add-HP-HSVX740-to-hwtable.patch
|
||||
Patch0004: 0004-multipath-tools-add-DellEMC-ME5-PowerVault-ME5-to-ha.patch
|
||||
Patch0005: 0005-multipath-tools-update-mpp-force_readonly-in-ev_add_.patch
|
||||
Patch0006: 0006-RH-fixup-udev-rules-for-redhat.patch
|
||||
Patch0007: 0007-RH-Remove-the-property-blacklist-exception-builtin.patch
|
||||
Patch0008: 0008-RH-don-t-start-without-a-config-file.patch
|
||||
Patch0009: 0009-RH-Fix-nvme-function-missing-argument.patch
|
||||
Patch0010: 0010-RH-use-rpm-optflags-if-present.patch
|
||||
Patch0011: 0011-RH-add-mpathconf.patch
|
||||
Patch0012: 0012-RH-add-wwids-from-kernel-cmdline-mpath.wwids-with-A.patch
|
||||
Patch0013: 0013-RH-reset-default-find_mutipaths-value-to-off.patch
|
||||
Patch0014: 0014-RH-attempt-to-get-ANA-info-via-sysfs-first.patch
|
||||
Patch0015: 0015-RH-make-parse_vpd_pg83-match-scsi_id-output.patch
|
||||
Patch0016: 0016-RH-add-scsi-device-handlers-to-modules-load.d.patch
|
||||
|
||||
# runtime
|
||||
Requires: %{name}-libs = %{version}-%{release}
|
||||
@ -130,7 +109,7 @@ This package contains the files needed to develop applications that use
|
||||
device-mapper-multipath's libdmmp C API library
|
||||
|
||||
%prep
|
||||
%autosetup -n multipath-tools-0.8.7 -p1
|
||||
%autosetup -n multipath-tools-0.8.9 -p1
|
||||
cp %{SOURCE1} .
|
||||
|
||||
%build
|
||||
@ -188,6 +167,9 @@ fi
|
||||
%{_mandir}/man8/mpathpersist.8.gz
|
||||
%config /usr/lib/udev/rules.d/62-multipath.rules
|
||||
%config /usr/lib/udev/rules.d/11-dm-mpath.rules
|
||||
%dir /usr/lib/modules-load.d
|
||||
/usr/lib/modules-load.d/multipath.conf
|
||||
/usr/lib/modules-load.d/scsi_dh.conf
|
||||
%doc README.md
|
||||
%doc README.alua
|
||||
%doc multipath.conf
|
||||
@ -244,6 +226,19 @@ fi
|
||||
%{_pkgconfdir}/libdmmp.pc
|
||||
|
||||
%changelog
|
||||
* Mon Mar 28 2022 Benjamin Marzinski <bmarzins@redhat.com> - 0.8.9-1
|
||||
- Update source to upstream version 0.8.9
|
||||
* Previous patches 0001-0024 & 0035 are included in the commit.
|
||||
- Add patches from upstream staging branch
|
||||
* Patches 0001-0005 are from the upstream staging branch
|
||||
- Rename redhat patches
|
||||
* Previous patches 0025-0034 are now patches 0006-0015
|
||||
- Combine redhat patches
|
||||
* Previous patches 0036 & 0037 are now part of patch 0011
|
||||
- Add 0016-RH-add-scsi-device-handlers-to-modules-load.d.patch
|
||||
- Spec file changes
|
||||
* Install multipath.conf and scsi_dh.conf to /usr/lib/modules-load.d
|
||||
|
||||
* Mon Feb 7 2022 Benjamin Marzinski <bmarzins@redhat.com> - 0.8.7-8
|
||||
- Add 0036-RH-add-support-to-mpathconf-for-setting-arbitrary-de.patch
|
||||
* add the ability for mpathconf to set arbitray options with --option
|
||||
|
2
sources
2
sources
@ -1,2 +1,2 @@
|
||||
SHA512 (multipath-tools-0.8.7.tgz) = c01aea837b13429d17688455b813947342ca1cabba19b22e13ce640c77e68335a6d410280a8298595e239131e6fcbb655fa6de5ff9857eac99aa175046a450cd
|
||||
SHA512 (multipath-tools-0.8.9.tgz) = 25f2a5d436af6a343804988cef45ca1574d4a981655a2b91563ddb89138619158befdf5af92d836a17c95d6dcf901072b614473c2129274e5dcdb1a1d64edb4d
|
||||
SHA512 (multipath.conf) = 71953dce5a68adcf60a942305f5a66023e6f4c4baf53b1bfdb4edf65ed5b8e03db804363c36d1dcfd85591f4766f52b515269904c53b84d7b076da0b80b09942
|
||||
|
Loading…
Reference in New Issue
Block a user