commit
450860ec71
@ -0,0 +1 @@
|
|||||||
|
8470daab6fbb871573523a2c64d4f2c0f906ce86 SOURCES/multipath-tools-0.9.9.tgz
|
@ -0,0 +1 @@
|
|||||||
|
SOURCES/multipath-tools-0.9.9.tgz
|
@ -0,0 +1,28 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
Date: Wed, 5 Jun 2024 19:22:48 -0400
|
||||||
|
Subject: [PATCH] multipathd: fix flush check in flush_map()
|
||||||
|
|
||||||
|
Forgot the comparison in the "if" statement.
|
||||||
|
|
||||||
|
Fixes 8a3898339 ("multipathd: sync features on flush_map failure corner case")
|
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
Reviewed-by: Martin Wilck <mwilck@suse.com>
|
||||||
|
---
|
||||||
|
multipathd/main.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/multipathd/main.c b/multipathd/main.c
|
||||||
|
index 09286dd0..58afe14a 100644
|
||||||
|
--- a/multipathd/main.c
|
||||||
|
+++ b/multipathd/main.c
|
||||||
|
@@ -813,7 +813,7 @@ flush_map(struct multipath * mpp, struct vectors * vecs)
|
||||||
|
{
|
||||||
|
int r = dm_suspend_and_flush_map(mpp->alias, 0);
|
||||||
|
if (r != DM_FLUSH_OK) {
|
||||||
|
- if (DM_FLUSH_FAIL_CANT_RESTORE)
|
||||||
|
+ if (r == DM_FLUSH_FAIL_CANT_RESTORE)
|
||||||
|
remove_feature(&mpp->features, "queue_if_no_path");
|
||||||
|
condlog(0, "%s: can't flush", mpp->alias);
|
||||||
|
return r;
|
@ -0,0 +1,63 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
Date: Thu, 13 Apr 2017 07:22:23 -0500
|
||||||
|
Subject: [PATCH] RH: fixup udev rules for redhat
|
||||||
|
|
||||||
|
The multipath rules need to run after scsi_id is run. This means moving
|
||||||
|
them after 60-persistent-storage.rules for redhat. Redhat also uses a
|
||||||
|
different naming scheme for partitions than SuSE.
|
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
---
|
||||||
|
Makefile.inc | 2 +-
|
||||||
|
kpartx/kpartx.rules | 2 +-
|
||||||
|
multipath/Makefile | 4 ++--
|
||||||
|
3 files changed, 4 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Makefile.inc b/Makefile.inc
|
||||||
|
index 81b86cd8..33dbb99c 100644
|
||||||
|
--- a/Makefile.inc
|
||||||
|
+++ b/Makefile.inc
|
||||||
|
@@ -34,7 +34,7 @@ endif
|
||||||
|
# Paths. All these can be overridden on the "make" command line.
|
||||||
|
prefix :=
|
||||||
|
# Prefix for binaries
|
||||||
|
-exec_prefix := $(prefix)
|
||||||
|
+exec_prefix := $(prefix)/usr
|
||||||
|
# Prefix for non-essential libraries (libdmmp)
|
||||||
|
usr_prefix := $(if $(prefix),$(prefix),/usr)
|
||||||
|
# Prefix for configuration files (multipath.conf)
|
||||||
|
diff --git a/kpartx/kpartx.rules b/kpartx/kpartx.rules
|
||||||
|
index 8dd3369c..7c3c7524 100644
|
||||||
|
--- a/kpartx/kpartx.rules
|
||||||
|
+++ b/kpartx/kpartx.rules
|
||||||
|
@@ -39,6 +39,6 @@ LABEL="mpath_kpartx_end"
|
||||||
|
GOTO="kpartx_end"
|
||||||
|
|
||||||
|
LABEL="run_kpartx"
|
||||||
|
-RUN+="/sbin/kpartx -un -p -part /dev/$name"
|
||||||
|
+RUN+="/sbin/kpartx -un /dev/$name"
|
||||||
|
|
||||||
|
LABEL="kpartx_end"
|
||||||
|
diff --git a/multipath/Makefile b/multipath/Makefile
|
||||||
|
index 67fb5e62..2ea9e528 100644
|
||||||
|
--- a/multipath/Makefile
|
||||||
|
+++ b/multipath/Makefile
|
||||||
|
@@ -27,7 +27,7 @@ install:
|
||||||
|
$(Q)$(INSTALL_PROGRAM) -d $(DESTDIR)$(udevrulesdir)
|
||||||
|
$(Q)$(INSTALL_PROGRAM) -m 644 11-dm-mpath.rules $(DESTDIR)$(udevrulesdir)
|
||||||
|
$(Q)$(INSTALL_PROGRAM) -m 644 99-z-dm-mpath-late.rules $(DESTDIR)$(udevrulesdir)
|
||||||
|
- $(Q)$(INSTALL_PROGRAM) -m 644 multipath.rules $(DESTDIR)$(udevrulesdir)/56-multipath.rules
|
||||||
|
+ $(Q)$(INSTALL_PROGRAM) -m 644 multipath.rules $(DESTDIR)$(udevrulesdir)/62-multipath.rules
|
||||||
|
$(Q)$(INSTALL_PROGRAM) -d $(DESTDIR)$(tmpfilesdir)
|
||||||
|
$(Q)$(INSTALL_PROGRAM) -m 644 tmpfiles.conf $(DESTDIR)$(tmpfilesdir)/multipath.conf
|
||||||
|
$(Q)$(INSTALL_PROGRAM) -d $(DESTDIR)$(mandir)/man8
|
||||||
|
@@ -50,7 +50,7 @@ uninstall:
|
||||||
|
$(Q)$(RM) $(DESTDIR)$(udevrulesdir)/99-z-dm-mpath-late.rules
|
||||||
|
$(Q)$(RM) $(DESTDIR)$(modulesloaddir)/multipath.conf
|
||||||
|
$(Q)$(RM) $(DESTDIR)$(modulesloaddir)/scsi_dh.conf
|
||||||
|
- $(Q)$(RM) $(DESTDIR)$(libudevdir)/rules.d/56-multipath.rules
|
||||||
|
+ $(Q)$(RM) $(DESTDIR)$(libudevdir)/rules.d/62-multipath.rules
|
||||||
|
$(Q)$(RM) $(DESTDIR)$(mandir)/man8/$(EXEC).8
|
||||||
|
$(Q)$(RM) $(DESTDIR)$(mandir)/man5/$(EXEC).conf.5
|
||||||
|
$(Q)$(RM) $(DESTDIR)$(tmpfilesdir)/multipath.conf
|
@ -0,0 +1,100 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
Date: Wed, 2 Jul 2014 12:49:53 -0500
|
||||||
|
Subject: [PATCH] RH: Remove the property blacklist exception builtin
|
||||||
|
|
||||||
|
Multipath set the default property blacklist exceptions to
|
||||||
|
(ID_SCSI_VPD|ID_WWN). This has the effect of blacklisting some internal
|
||||||
|
devices. These devices may never have multiple paths, but it is nice
|
||||||
|
to be able to set multipath up on them all the same. This patch simply
|
||||||
|
removes the default, and makes it so that if no property
|
||||||
|
blacklist_exception is given, then devices aren't failed for not matching
|
||||||
|
it.
|
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
---
|
||||||
|
libmultipath/blacklist.c | 5 ++---
|
||||||
|
multipath/multipath.conf.5.in | 11 ++++++-----
|
||||||
|
tests/blacklist.c | 7 ++-----
|
||||||
|
3 files changed, 10 insertions(+), 13 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/libmultipath/blacklist.c b/libmultipath/blacklist.c
|
||||||
|
index 75100b20..0b212078 100644
|
||||||
|
--- a/libmultipath/blacklist.c
|
||||||
|
+++ b/libmultipath/blacklist.c
|
||||||
|
@@ -230,8 +230,6 @@ setup_default_blist (struct config * conf)
|
||||||
|
ORIGIN_DEFAULT))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
- if (store_ble(conf->elist_property, "(SCSI_IDENT_|ID_WWN)", ORIGIN_DEFAULT))
|
||||||
|
- return 1;
|
||||||
|
|
||||||
|
vector_foreach_slot (conf->hwtable, hwe, i) {
|
||||||
|
if (hwe->bl_product) {
|
||||||
|
@@ -438,7 +436,8 @@ filter_property(const struct config *conf, struct udev_device *udev,
|
||||||
|
*uid_attribute != '\0';
|
||||||
|
bool uid_attr_seen = false;
|
||||||
|
|
||||||
|
- r = MATCH_PROPERTY_BLIST_MISSING;
|
||||||
|
+ if (VECTOR_SIZE(conf->elist_property))
|
||||||
|
+ r = MATCH_PROPERTY_BLIST_MISSING;
|
||||||
|
udev_list_entry_foreach(list_entry,
|
||||||
|
udev_device_get_properties_list_entry(udev)) {
|
||||||
|
|
||||||
|
diff --git a/multipath/multipath.conf.5.in b/multipath/multipath.conf.5.in
|
||||||
|
index dacb9b0e..645e8f88 100644
|
||||||
|
--- a/multipath/multipath.conf.5.in
|
||||||
|
+++ b/multipath/multipath.conf.5.in
|
||||||
|
@@ -1468,9 +1468,14 @@ keywords. Both are regular expressions. For a full description of these keywords
|
||||||
|
Regular expression for an udev property. All
|
||||||
|
devices that have matching udev properties will be excluded/included.
|
||||||
|
The handling of the \fIproperty\fR keyword is special,
|
||||||
|
-because devices \fBmust\fR have at least one whitelisted udev property;
|
||||||
|
+because if a property blacklist_exception is set, devices \fBmust\fR have at
|
||||||
|
+least one whitelisted udev property;
|
||||||
|
otherwise they're treated as blacklisted, and the message
|
||||||
|
"\fIblacklisted, udev property missing\fR" is displayed in the logs.
|
||||||
|
+For example, setting the property blacklist_exception to
|
||||||
|
+\fB(SCSI_IDENT_|ID_WWN)\fR, will cause well-behaved SCSI devices and devices
|
||||||
|
+that provide a WWN (World Wide Number) to be included, and all others to be
|
||||||
|
+excluded. This works to exclude most non-multipathable devices.
|
||||||
|
.
|
||||||
|
.RS
|
||||||
|
.PP
|
||||||
|
@@ -1481,10 +1486,6 @@ Blacklisting by missing properties is only applied to devices which do have the
|
||||||
|
property specified by \fIuid_attribute\fR (e.g. \fIID_SERIAL\fR)
|
||||||
|
set. Previously, it was applied to every device, possibly causing devices to be
|
||||||
|
blacklisted because of temporary I/O error conditions.
|
||||||
|
-.PP
|
||||||
|
-The default \fIblacklist exception\fR is: \fB(SCSI_IDENT_|ID_WWN)\fR, causing
|
||||||
|
-well-behaved SCSI devices and devices that provide a WWN (World Wide Number)
|
||||||
|
-to be included, and all others to be excluded.
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
|
.B protocol
|
||||||
|
diff --git a/tests/blacklist.c b/tests/blacklist.c
|
||||||
|
index ba8dfd07..693db3fa 100644
|
||||||
|
--- a/tests/blacklist.c
|
||||||
|
+++ b/tests/blacklist.c
|
||||||
|
@@ -384,9 +384,8 @@ static void test_property_missing(void **state)
|
||||||
|
{
|
||||||
|
static struct udev_device udev = { "sdb", { "ID_FOO", "ID_BAZ", "ID_BAR", "ID_SERIAL", NULL } };
|
||||||
|
conf.blist_property = blist_property_wwn;
|
||||||
|
- expect_condlog(3, "sdb: blacklisted, udev property missing\n");
|
||||||
|
assert_int_equal(filter_property(&conf, &udev, 3, "ID_SERIAL"),
|
||||||
|
- MATCH_PROPERTY_BLIST_MISSING);
|
||||||
|
+ MATCH_NOTHING);
|
||||||
|
assert_int_equal(filter_property(&conf, &udev, 3, "ID_BLAH"),
|
||||||
|
MATCH_NOTHING);
|
||||||
|
assert_int_equal(filter_property(&conf, &udev, 3, ""),
|
||||||
|
@@ -478,9 +477,7 @@ static void test_filter_path_missing1(void **state)
|
||||||
|
conf.blist_device = blist_device_foo_bar;
|
||||||
|
conf.blist_protocol = blist_protocol_fcp;
|
||||||
|
conf.blist_wwid = blist_wwid_xyzzy;
|
||||||
|
- expect_condlog(3, "sdb: blacklisted, udev property missing\n");
|
||||||
|
- assert_int_equal(filter_path(&conf, &miss1_pp),
|
||||||
|
- MATCH_PROPERTY_BLIST_MISSING);
|
||||||
|
+ assert_int_equal(filter_path(&conf, &miss1_pp), MATCH_NOTHING);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This one matches the property whitelist, to test the other missing
|
@ -0,0 +1,137 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
Date: Wed, 15 Oct 2014 10:39:30 -0500
|
||||||
|
Subject: [PATCH] RH: don't start without a config file
|
||||||
|
|
||||||
|
If /etc/multipath.conf doesn't exist, don't start multipathd and blacklist
|
||||||
|
all devices when running multipath. A completely blank configuration file
|
||||||
|
is almost never what users want. Also, people may have the multipath
|
||||||
|
packages installed but don't want to use them. This patch provides a
|
||||||
|
simple way to disable multipath. Simply removing or renaming
|
||||||
|
/etc/multipath.conf will keep multipath from doing anything.
|
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
---
|
||||||
|
libmultipath/config.c | 13 +++++++++++++
|
||||||
|
libmultipath/config.h | 1 +
|
||||||
|
multipath/main.c | 6 ++++++
|
||||||
|
multipath/multipath.rules.in | 1 +
|
||||||
|
multipathd/multipathd.8.in | 2 ++
|
||||||
|
multipathd/multipathd.service.in | 1 +
|
||||||
|
multipathd/multipathd.socket | 1 +
|
||||||
|
7 files changed, 25 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/libmultipath/config.c b/libmultipath/config.c
|
||||||
|
index 83fa7369..002027a7 100644
|
||||||
|
--- a/libmultipath/config.c
|
||||||
|
+++ b/libmultipath/config.c
|
||||||
|
@@ -959,6 +959,19 @@ int _init_config (const char *file, struct config *conf)
|
||||||
|
}
|
||||||
|
factorize_hwtable(conf->hwtable, builtin_hwtable_size, file);
|
||||||
|
validate_pctable(conf->overrides, 0, file);
|
||||||
|
+ } else {
|
||||||
|
+ condlog(0, "/etc/multipath.conf does not exist, blacklisting all devices.");
|
||||||
|
+ if (conf->blist_devnode == NULL) {
|
||||||
|
+ conf->blist_devnode = vector_alloc();
|
||||||
|
+ if (!conf->blist_devnode) {
|
||||||
|
+ condlog(0, "cannot allocate blacklist\n");
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ if (store_ble(conf->blist_devnode, ".*", ORIGIN_NO_CONFIG)) {
|
||||||
|
+ condlog(0, "cannot store default no-config blacklist\n");
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
conf->processed_main_config = 1;
|
||||||
|
diff --git a/libmultipath/config.h b/libmultipath/config.h
|
||||||
|
index 384193ab..158cebf0 100644
|
||||||
|
--- a/libmultipath/config.h
|
||||||
|
+++ b/libmultipath/config.h
|
||||||
|
@@ -10,6 +10,7 @@
|
||||||
|
|
||||||
|
#define ORIGIN_DEFAULT 0
|
||||||
|
#define ORIGIN_CONFIG 1
|
||||||
|
+#define ORIGIN_NO_CONFIG 2
|
||||||
|
|
||||||
|
enum devtypes {
|
||||||
|
DEV_NONE,
|
||||||
|
diff --git a/multipath/main.c b/multipath/main.c
|
||||||
|
index ce702e7f..c21e3e0b 100644
|
||||||
|
--- a/multipath/main.c
|
||||||
|
+++ b/multipath/main.c
|
||||||
|
@@ -842,11 +842,14 @@ main (int argc, char *argv[])
|
||||||
|
char *dev = NULL;
|
||||||
|
struct config *conf;
|
||||||
|
bool enable_foreign = false;
|
||||||
|
+ bool have_config;
|
||||||
|
+ struct stat buf;
|
||||||
|
|
||||||
|
libmultipath_init();
|
||||||
|
if (atexit(dm_lib_exit) || atexit(libmultipath_exit))
|
||||||
|
condlog(1, "failed to register cleanup handler for libmultipath: %m");
|
||||||
|
logsink = LOGSINK_STDERR_WITH_TIME;
|
||||||
|
+ have_config = (stat(DEFAULT_CONFIGFILE, &buf) == 0);
|
||||||
|
if (init_config(DEFAULT_CONFIGFILE))
|
||||||
|
exit(RTVL_FAIL);
|
||||||
|
if (atexit(uninit_config))
|
||||||
|
@@ -1097,6 +1100,9 @@ main (int argc, char *argv[])
|
||||||
|
while ((r = configure(conf, cmd, dev_type, dev)) == RTVL_RETRY)
|
||||||
|
condlog(3, "restart multipath configuration process");
|
||||||
|
|
||||||
|
+ if (!have_config && r == RTVL_OK &&
|
||||||
|
+ (cmd == CMD_LIST_SHORT || cmd == CMD_LIST_LONG))
|
||||||
|
+ r = RTVL_FAIL;
|
||||||
|
out:
|
||||||
|
put_multipath_config(conf);
|
||||||
|
if (dev)
|
||||||
|
diff --git a/multipath/multipath.rules.in b/multipath/multipath.rules.in
|
||||||
|
index 780bf852..2c518378 100644
|
||||||
|
--- a/multipath/multipath.rules.in
|
||||||
|
+++ b/multipath/multipath.rules.in
|
||||||
|
@@ -9,6 +9,7 @@ IMPORT{cmdline}="nompath"
|
||||||
|
ENV{nompath}=="?*", GOTO="end_mpath"
|
||||||
|
IMPORT{cmdline}="multipath"
|
||||||
|
ENV{multipath}=="off", GOTO="end_mpath"
|
||||||
|
+TEST!="/etc/multipath.conf", GOTO="end_mpath"
|
||||||
|
|
||||||
|
ENV{DEVTYPE}!="partition", GOTO="test_dev"
|
||||||
|
IMPORT{parent}="DM_MULTIPATH_DEVICE_PATH"
|
||||||
|
diff --git a/multipathd/multipathd.8.in b/multipathd/multipathd.8.in
|
||||||
|
index 7bc8806e..315884eb 100644
|
||||||
|
--- a/multipathd/multipathd.8.in
|
||||||
|
+++ b/multipathd/multipathd.8.in
|
||||||
|
@@ -49,6 +49,8 @@ map regains its maximum performance and redundancy.
|
||||||
|
With the \fB-k\fR option, \fBmultipathd\fR acts as a client utility that
|
||||||
|
sends commands to a running instance of the multipathd daemon (see
|
||||||
|
\fBCOMMANDS\fR below).
|
||||||
|
+
|
||||||
|
+In this Linux distribution, multipathd does not run unless a /etc/multipath.conf file exists.
|
||||||
|
.
|
||||||
|
.
|
||||||
|
.\" ----------------------------------------------------------------------------
|
||||||
|
diff --git a/multipathd/multipathd.service.in b/multipathd/multipathd.service.in
|
||||||
|
index a63ddd9a..01ceff7d 100644
|
||||||
|
--- a/multipathd/multipathd.service.in
|
||||||
|
+++ b/multipathd/multipathd.service.in
|
||||||
|
@@ -6,6 +6,7 @@ Wants=systemd-udevd-kernel.socket @MODPROBE_UNIT@
|
||||||
|
After=systemd-udevd-kernel.socket @MODPROBE_UNIT@
|
||||||
|
After=multipathd.socket systemd-remount-fs.service
|
||||||
|
Before=initrd-cleanup.service
|
||||||
|
+ConditionPathExists=/etc/multipath.conf
|
||||||
|
DefaultDependencies=no
|
||||||
|
Conflicts=shutdown.target
|
||||||
|
Conflicts=initrd-cleanup.service
|
||||||
|
diff --git a/multipathd/multipathd.socket b/multipathd/multipathd.socket
|
||||||
|
index 6a62f5fd..263b6b0c 100644
|
||||||
|
--- a/multipathd/multipathd.socket
|
||||||
|
+++ b/multipathd/multipathd.socket
|
||||||
|
@@ -1,6 +1,7 @@
|
||||||
|
[Unit]
|
||||||
|
Description=multipathd control socket
|
||||||
|
DefaultDependencies=no
|
||||||
|
+ConditionPathExists=/etc/multipath.conf
|
||||||
|
ConditionKernelCommandLine=!nompath
|
||||||
|
ConditionKernelCommandLine=!multipath=off
|
||||||
|
ConditionVirtualization=!container
|
@ -0,0 +1,26 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
Date: Fri, 25 Jan 2019 14:54:56 -0600
|
||||||
|
Subject: [PATCH] RH: Fix nvme function missing argument
|
||||||
|
|
||||||
|
A future patch will change the compilation options to error when
|
||||||
|
function declarations have unspecified arguments.
|
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
---
|
||||||
|
libmultipath/nvme/argconfig.h | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/libmultipath/nvme/argconfig.h b/libmultipath/nvme/argconfig.h
|
||||||
|
index adb192b6..bfd10ef8 100644
|
||||||
|
--- a/libmultipath/nvme/argconfig.h
|
||||||
|
+++ b/libmultipath/nvme/argconfig.h
|
||||||
|
@@ -76,7 +76,7 @@ struct argconfig_commandline_options {
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
-typedef void argconfig_help_func();
|
||||||
|
+typedef void argconfig_help_func(void);
|
||||||
|
void argconfig_append_usage(const char *str);
|
||||||
|
void argconfig_print_help(const char *program_desc,
|
||||||
|
const struct argconfig_commandline_options *options);
|
@ -0,0 +1,55 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
Date: Wed, 19 Apr 2017 06:10:01 -0500
|
||||||
|
Subject: [PATCH] RH: use rpm optflags if present
|
||||||
|
|
||||||
|
Use the passed in optflags when compiling as an RPM, and keep the
|
||||||
|
default flags as close as possible to the current fedora flags, while
|
||||||
|
still being generic.
|
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
---
|
||||||
|
Makefile.inc | 22 +++++++++++++++++-----
|
||||||
|
1 file changed, 17 insertions(+), 5 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Makefile.inc b/Makefile.inc
|
||||||
|
index 33dbb99c..94e0ec85 100644
|
||||||
|
--- a/Makefile.inc
|
||||||
|
+++ b/Makefile.inc
|
||||||
|
@@ -95,11 +95,23 @@ SYSTEMD_LIBDEPS := $(if $(SYSTEMD),$(if $(shell test $(SYSTEMD) -gt 209 && echo
|
||||||
|
MODPROBE_UNIT := $(shell test "0$(SYSTEMD)" -lt 245 2>/dev/null || \
|
||||||
|
echo "modprobe@dm_multipath.service")
|
||||||
|
|
||||||
|
-OPTFLAGS := -O2 -g $(STACKPROT) --param=ssp-buffer-size=4
|
||||||
|
-WARNFLAGS := -Werror -Wall -Wextra -Wformat=2 $(WFORMATOVERFLOW) -Werror=implicit-int \
|
||||||
|
+ifndef RPM_OPT_FLAGS
|
||||||
|
+ OPTFLAGS := -O2 -g $(STACKPROT) --param=ssp-buffer-size=4 \
|
||||||
|
+ -Wall $(FORTIFY_OPT) -fexceptions -grecord-gcc-switches \
|
||||||
|
+ -fasynchronous-unwind-tables
|
||||||
|
+ ifeq ($(shell test -f /usr/lib/rpm/redhat/redhat-hardened-cc1 && echo 1),1)
|
||||||
|
+ OPTFLAGS += -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1
|
||||||
|
+ endif
|
||||||
|
+ ifeq ($(shell test -f /usr/lib/rpm/redhat/redhat-annobin-cc1 && echo 1),1)
|
||||||
|
+ OPTFLAGS += -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1
|
||||||
|
+ endif
|
||||||
|
+else
|
||||||
|
+ OPTFLAGS := $(RPM_OPT_FLAGS) --param=ssp-buffer-size=4
|
||||||
|
+endif
|
||||||
|
+WARNFLAGS := -Werror -Wextra -Wformat=2 $(WFORMATOVERFLOW) -Werror=implicit-int \
|
||||||
|
-Werror=implicit-function-declaration -Werror=format-security \
|
||||||
|
- $(WNOCLOBBERED) -Werror=cast-qual $(ERROR_DISCARDED_QUALIFIERS) $(W_URCU_TYPE_LIMITS)
|
||||||
|
-CPPFLAGS := $(FORTIFY_OPT) $(CPPFLAGS) $(D_URCU_VERSION) \
|
||||||
|
+ $(WNOCLOBBERED) -Werror=cast-qual $(ERROR_DISCARDED_QUALIFIERS) $(W_URCU_TYPE_LIMITS) -Wstrict-prototypes
|
||||||
|
+CPPFLAGS := $(CPPFLAGS) $(D_URCU_VERSION) \
|
||||||
|
-D_FILE_OFFSET_BITS=64 \
|
||||||
|
-DBIN_DIR=\"$(bindir)\" -DMULTIPATH_DIR=\"$(TGTDIR)$(plugindir)\" \
|
||||||
|
-DRUNTIME_DIR=\"$(runtimedir)\" -DCONFIG_DIR=\"$(TGTDIR)$(configdir)\" \
|
||||||
|
@@ -109,7 +121,7 @@ CFLAGS := -std=gnu99 $(CFLAGS) $(OPTFLAGS) $(WARNFLAGS) -pipe
|
||||||
|
BIN_CFLAGS := -fPIE -DPIE
|
||||||
|
LIB_CFLAGS := -fPIC
|
||||||
|
SHARED_FLAGS := -shared
|
||||||
|
-LDFLAGS := $(LDFLAGS) -Wl,-z,relro -Wl,-z,now -Wl,-z,defs
|
||||||
|
+LDFLAGS := $(LDFLAGS) $(RPM_LD_FLAGS) -Wl,-z,relro -Wl,-z,now -Wl,-z,defs
|
||||||
|
BIN_LDFLAGS := -pie
|
||||||
|
|
||||||
|
# Source code directories. Don't modify.
|
@ -0,0 +1,892 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
Date: Thu, 16 Oct 2014 15:49:01 -0500
|
||||||
|
Subject: [PATCH] RH: add mpathconf
|
||||||
|
|
||||||
|
mpathconf is a program (largely based on lvmcomf) to help users
|
||||||
|
configure /etc/multipath.conf and enable or disable multipathing. It
|
||||||
|
has a couple of built-in options that can be set directly from the
|
||||||
|
command line. But, mostly it is used to get a multipath.conf file
|
||||||
|
with the OS defaults, and to enable and disable multipathing via
|
||||||
|
a single command.
|
||||||
|
|
||||||
|
Co-authored-by: Paul Donohue <git@PaulSD.com>
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
---
|
||||||
|
libmultipath/config.c | 2 +
|
||||||
|
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 002027a7..3d5943d3 100644
|
||||||
|
--- a/libmultipath/config.c
|
||||||
|
+++ b/libmultipath/config.c
|
||||||
|
@@ -961,6 +961,8 @@ int _init_config (const char *file, struct config *conf)
|
||||||
|
validate_pctable(conf->overrides, 0, file);
|
||||||
|
} else {
|
||||||
|
condlog(0, "/etc/multipath.conf does not exist, blacklisting all devices.");
|
||||||
|
+ condlog(0, "You can run \"/sbin/mpathconf --enable\" to create");
|
||||||
|
+ condlog(0, "/etc/multipath.conf. See man mpathconf(8) for more details");
|
||||||
|
if (conf->blist_devnode == NULL) {
|
||||||
|
conf->blist_devnode = vector_alloc();
|
||||||
|
if (!conf->blist_devnode) {
|
||||||
|
diff --git a/multipath/Makefile b/multipath/Makefile
|
||||||
|
index 2ea9e528..3dc241cc 100644
|
||||||
|
--- a/multipath/Makefile
|
||||||
|
+++ b/multipath/Makefile
|
||||||
|
@@ -24,6 +24,7 @@ $(EXEC): $(OBJS) $(multipathdir)/libmultipath.so $(mpathcmddir)/libmpathcmd.so
|
||||||
|
install:
|
||||||
|
$(Q)$(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir)
|
||||||
|
$(Q)$(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir)/
|
||||||
|
+ $(Q)$(INSTALL_PROGRAM) -m 755 mpathconf $(DESTDIR)$(bindir)/
|
||||||
|
$(Q)$(INSTALL_PROGRAM) -d $(DESTDIR)$(udevrulesdir)
|
||||||
|
$(Q)$(INSTALL_PROGRAM) -m 644 11-dm-mpath.rules $(DESTDIR)$(udevrulesdir)
|
||||||
|
$(Q)$(INSTALL_PROGRAM) -m 644 99-z-dm-mpath-late.rules $(DESTDIR)$(udevrulesdir)
|
||||||
|
@@ -32,6 +33,7 @@ install:
|
||||||
|
$(Q)$(INSTALL_PROGRAM) -m 644 tmpfiles.conf $(DESTDIR)$(tmpfilesdir)/multipath.conf
|
||||||
|
$(Q)$(INSTALL_PROGRAM) -d $(DESTDIR)$(mandir)/man8
|
||||||
|
$(Q)$(INSTALL_PROGRAM) -m 644 $(EXEC).8 $(DESTDIR)$(mandir)/man8
|
||||||
|
+ $(Q)$(INSTALL_PROGRAM) -m 644 mpathconf.8 $(DESTDIR)$(mandir)/man8
|
||||||
|
$(Q)$(INSTALL_PROGRAM) -d $(DESTDIR)$(mandir)/man5
|
||||||
|
$(Q)$(INSTALL_PROGRAM) -m 644 $(EXEC).conf.5 $(DESTDIR)$(mandir)/man5
|
||||||
|
$(Q)$(INSTALL_PROGRAM) -d $(DESTDIR)$(modulesloaddir)
|
||||||
|
@@ -46,12 +48,14 @@ endif
|
||||||
|
|
||||||
|
uninstall:
|
||||||
|
$(Q)$(RM) $(DESTDIR)$(bindir)/$(EXEC)
|
||||||
|
+ $(Q)$(RM) $(DESTDIR)$(bindir)/mpathconf
|
||||||
|
$(Q)$(RM) $(DESTDIR)$(udevrulesdir)/11-dm-mpath.rules
|
||||||
|
$(Q)$(RM) $(DESTDIR)$(udevrulesdir)/99-z-dm-mpath-late.rules
|
||||||
|
$(Q)$(RM) $(DESTDIR)$(modulesloaddir)/multipath.conf
|
||||||
|
$(Q)$(RM) $(DESTDIR)$(modulesloaddir)/scsi_dh.conf
|
||||||
|
$(Q)$(RM) $(DESTDIR)$(libudevdir)/rules.d/62-multipath.rules
|
||||||
|
$(Q)$(RM) $(DESTDIR)$(mandir)/man8/$(EXEC).8
|
||||||
|
+ $(Q)$(RM) $(DESTDIR)$(mandir)/man8/mpathconf.8
|
||||||
|
$(Q)$(RM) $(DESTDIR)$(mandir)/man5/$(EXEC).conf.5
|
||||||
|
$(Q)$(RM) $(DESTDIR)$(tmpfilesdir)/multipath.conf
|
||||||
|
|
||||||
|
diff --git a/multipath/mpathconf b/multipath/mpathconf
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000..ce430075
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/multipath/mpathconf
|
||||||
|
@@ -0,0 +1,658 @@
|
||||||
|
+#!/bin/bash
|
||||||
|
+#
|
||||||
|
+# Copyright (C) 2010 Red Hat, Inc. All rights reserved.
|
||||||
|
+#
|
||||||
|
+# This file is part of the device-mapper-multipath package.
|
||||||
|
+#
|
||||||
|
+# This copyrighted material is made available to anyone wishing to use,
|
||||||
|
+# modify, copy, or redistribute it subject to the terms and conditions
|
||||||
|
+# of the GNU General Public License v.2.
|
||||||
|
+#
|
||||||
|
+# You should have received a copy of the GNU General Public License
|
||||||
|
+# along with this program; if not, write to the Free Software Foundation,
|
||||||
|
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
+
|
||||||
|
+#
|
||||||
|
+# Simple editting of /etc/multipath.conf
|
||||||
|
+# This program was largely ripped off from lvmconf
|
||||||
|
+#
|
||||||
|
+
|
||||||
|
+unset ENABLE FIND FRIENDLY PROPERTY FOREIGN MODULE MULTIPATHD HAVE_DISABLE HAVE_WWID_DISABLE HAVE_FIND HAVE_BLACKLIST HAVE_EXCEPTIONS HAVE_DEFAULTS HAVE_FRIENDLY HAVE_PROPERTY HAVE_FOREIGN HAVE_MULTIPATHD HAVE_MODULE HAVE_OUTFILE SHOW_STATUS CHANGED_CONFIG WWID_LIST HAVE_OPTION OPTION_NAME OPTION_VALUE HAVE_RECHECK_WWID RECHECK_WWID
|
||||||
|
+
|
||||||
|
+DEFAULT_CONFIG="# device-mapper-multipath configuration file
|
||||||
|
+
|
||||||
|
+# For a complete list of the default configuration values, run either:
|
||||||
|
+# # multipath -t
|
||||||
|
+# or
|
||||||
|
+# # multipathd show config
|
||||||
|
+
|
||||||
|
+# For a list of configuration options with descriptions, see the
|
||||||
|
+# multipath.conf man page.
|
||||||
|
+
|
||||||
|
+defaults {
|
||||||
|
+ user_friendly_names yes
|
||||||
|
+ find_multipaths on
|
||||||
|
+}"
|
||||||
|
+
|
||||||
|
+CONFIGFILE="/etc/multipath.conf"
|
||||||
|
+OUTPUTFILE="/etc/multipath.conf"
|
||||||
|
+MULTIPATHDIR="/etc/multipath"
|
||||||
|
+TMPFILE="/etc/multipath/.multipath.conf.tmp"
|
||||||
|
+WWIDS=0
|
||||||
|
+
|
||||||
|
+function usage
|
||||||
|
+{
|
||||||
|
+ echo "usage: $0 <command>"
|
||||||
|
+ echo ""
|
||||||
|
+ echo "Commands:"
|
||||||
|
+ echo "Enable: --enable "
|
||||||
|
+ echo "Disable: --disable"
|
||||||
|
+ echo "Only allow certain wwids (instead of enable): --allow <WWID>"
|
||||||
|
+ echo "Set user_friendly_names (Default y): --user_friendly_names <y|n>"
|
||||||
|
+ echo "Set find_multipaths (Default on): --find_multipaths <on|yes|y|off|no|n|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>"
|
||||||
|
+ echo ""
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+function add_wwid
|
||||||
|
+{
|
||||||
|
+ INDEX=0
|
||||||
|
+ while [ "$INDEX" -lt "$WWIDS" ] ; do
|
||||||
|
+ if [ "$1" = "${WWID_LIST[$INDEX]}" ] ; then
|
||||||
|
+ return
|
||||||
|
+ fi
|
||||||
|
+ ((INDEX++))
|
||||||
|
+ done
|
||||||
|
+ WWID_LIST[$WWIDS]="$1"
|
||||||
|
+ ((WWIDS++))
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+function get_dm_deps
|
||||||
|
+{
|
||||||
|
+ shift 3
|
||||||
|
+ while [ -n "$1" -a -n "$2" ]; do
|
||||||
|
+ MAJOR=$(echo $1 | tr -d '(,')
|
||||||
|
+ MINOR=$(echo $2 | tr -d ')')
|
||||||
|
+ UUID=`dmsetup info -c --noheadings -o uuid -j $MAJOR -m $MINOR 2> /dev/null`
|
||||||
|
+ if [ -n "$UUID" ] ; then
|
||||||
|
+ set_dm_wwid $UUID
|
||||||
|
+ fi
|
||||||
|
+ shift 2
|
||||||
|
+ done
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+function set_dm_wwid
|
||||||
|
+{
|
||||||
|
+ if [[ "$1" =~ ^part[[:digit:]]+-mpath- ]] ; then
|
||||||
|
+ add_wwid "${1##part*-mpath-}"
|
||||||
|
+ elif [[ "$1" =~ ^mpath- ]] ; then
|
||||||
|
+ add_wwid "${1##mpath-}"
|
||||||
|
+ else
|
||||||
|
+ get_dm_deps `dmsetup deps -u $1`
|
||||||
|
+ fi
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+function set_wwid
|
||||||
|
+{
|
||||||
|
+ UUID=""
|
||||||
|
+ if [[ "$1" =~ ^[[:digit:]]+:[[:digit:]]+$ ]] ; then
|
||||||
|
+ MAJOR=${1%%:*}
|
||||||
|
+ MINOR=${1##*:}
|
||||||
|
+ UUID=`dmsetup info -c --noheadings -o uuid -j $MAJOR -m $MINOR 2> /dev/null`
|
||||||
|
+ else
|
||||||
|
+ UUID=`dmsetup info -c --noheadings -o uuid $1 2> /dev/null`
|
||||||
|
+ fi
|
||||||
|
+ if [ -n "$UUID" ] ; then
|
||||||
|
+ set_dm_wwid $UUID
|
||||||
|
+ else
|
||||||
|
+ add_wwid "$1"
|
||||||
|
+ fi
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+function parse_args
|
||||||
|
+{
|
||||||
|
+ while [ -n "$1" ]; do
|
||||||
|
+ case $1 in
|
||||||
|
+ --enable)
|
||||||
|
+ ENABLE=1
|
||||||
|
+ shift
|
||||||
|
+ ;;
|
||||||
|
+ --disable)
|
||||||
|
+ ENABLE=0
|
||||||
|
+ shift
|
||||||
|
+ ;;
|
||||||
|
+ --allow)
|
||||||
|
+ ENABLE=2
|
||||||
|
+ if [ -n "$2" ]; then
|
||||||
|
+ set_wwid $2
|
||||||
|
+ shift 2
|
||||||
|
+ else
|
||||||
|
+ usage
|
||||||
|
+ exit 1
|
||||||
|
+ fi
|
||||||
|
+ ;;
|
||||||
|
+ --user_friendly_names)
|
||||||
|
+ if [ -n "$2" ]; then
|
||||||
|
+ FRIENDLY=$2
|
||||||
|
+ shift 2
|
||||||
|
+ else
|
||||||
|
+ usage
|
||||||
|
+ exit 1
|
||||||
|
+ fi
|
||||||
|
+ ;;
|
||||||
|
+ --recheck_wwid)
|
||||||
|
+ if [ -n "$2" ]; then
|
||||||
|
+ RECHECK_WWID=$2
|
||||||
|
+ shift 2
|
||||||
|
+ else
|
||||||
|
+ usage
|
||||||
|
+ exit 1
|
||||||
|
+ fi
|
||||||
|
+ ;;
|
||||||
|
+ --find_multipaths)
|
||||||
|
+ if [ -n "$2" ]; then
|
||||||
|
+ FIND=$2
|
||||||
|
+ shift 2
|
||||||
|
+ else
|
||||||
|
+ usage
|
||||||
|
+ exit 1
|
||||||
|
+ fi
|
||||||
|
+ ;;
|
||||||
|
+ --property_blacklist)
|
||||||
|
+ if [ -n "$2" ]; then
|
||||||
|
+ PROPERTY=$2
|
||||||
|
+ shift 2
|
||||||
|
+ else
|
||||||
|
+ usage
|
||||||
|
+ exit 1
|
||||||
|
+ fi
|
||||||
|
+ ;;
|
||||||
|
+ --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
|
||||||
|
+ shift 2
|
||||||
|
+ else
|
||||||
|
+ usage
|
||||||
|
+ exit 1
|
||||||
|
+ fi
|
||||||
|
+ ;;
|
||||||
|
+ --with_module)
|
||||||
|
+ if [ -n "$2" ]; then
|
||||||
|
+ MODULE=$2
|
||||||
|
+ shift 2
|
||||||
|
+ else
|
||||||
|
+ usage
|
||||||
|
+ exit 1
|
||||||
|
+ fi
|
||||||
|
+ ;;
|
||||||
|
+ --with_multipathd)
|
||||||
|
+ if [ -n "$2" ]; then
|
||||||
|
+ MULTIPATHD=$2
|
||||||
|
+ shift 2
|
||||||
|
+ else
|
||||||
|
+ usage
|
||||||
|
+ exit 1
|
||||||
|
+ fi
|
||||||
|
+ ;;
|
||||||
|
+ --outfile)
|
||||||
|
+ if [ -n "$2" ]; then
|
||||||
|
+ OUTPUTFILE=$2
|
||||||
|
+ HAVE_OUTFILE=1
|
||||||
|
+ shift 2
|
||||||
|
+ else
|
||||||
|
+ usage
|
||||||
|
+ exit 1
|
||||||
|
+ fi
|
||||||
|
+ ;;
|
||||||
|
+ *)
|
||||||
|
+ usage
|
||||||
|
+ exit
|
||||||
|
+ esac
|
||||||
|
+ done
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+function validate_args
|
||||||
|
+{
|
||||||
|
+ if [ "$ENABLE" = "0" ] && [ -n "$FRIENDLY" -o -n "$FIND" -o -n "$PROPERTY" -o -n "$MODULE" -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="on"
|
||||||
|
+ elif [ "$FIND" = "n" ]; then
|
||||||
|
+ FIND="off"
|
||||||
|
+ elif [ -n "$FIND" ] && [ "$FIND" != "on" -a "$FIND" != "yes" -a "$FIND" != "off" -a "$FIND" != "no" -a "$FIND" != "strict" -a "$FIND" != "greedy" -a "$FIND" != "smart" ]; then
|
||||||
|
+ echo "--find_multipaths must be one of 'on' 'yes' 'y' 'off' 'no' 'n' 'strict' 'greedy' or 'smart'"
|
||||||
|
+ exit 1
|
||||||
|
+ fi
|
||||||
|
+ if [ -n "$PROPERTY" ] && [ "$PROPERTY" != "y" -a "$PROPERTY" != "n" ]; then
|
||||||
|
+ echo "--property_blacklist must be either 'y' or 'n'"
|
||||||
|
+ exit 1
|
||||||
|
+ fi
|
||||||
|
+ if [ -n "$FOREIGN" ] && [ "$FOREIGN" != "y" -a "$FOREIGN" != "n" ]; then
|
||||||
|
+ echo "--enable_foreign must be either 'y' or 'n'"
|
||||||
|
+ exit 1
|
||||||
|
+ fi
|
||||||
|
+ if [ -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
|
||||||
|
+ echo "--with_module must be either 'y' or 'n'"
|
||||||
|
+ exit 1
|
||||||
|
+ fi
|
||||||
|
+ if [ -n "$MULTIPATHD" ] && [ "$MULTIPATHD" != "y" -a "$MULTIPATHD" != "n" ]; then
|
||||||
|
+ echo "--with_multipathd must be either 'y' or 'n'"
|
||||||
|
+ exit 1
|
||||||
|
+ fi
|
||||||
|
+ if [ "$ENABLE" = 2 -a -z "$HAVE_OUTFILE" ]; then
|
||||||
|
+ echo "Because --allow makes changes that cannot be automatically reversed,"
|
||||||
|
+ echo "you must set --outfile when you set --allow"
|
||||||
|
+ exit 1
|
||||||
|
+ fi
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+function add_blacklist_exceptions
|
||||||
|
+{
|
||||||
|
+ INDEX=0
|
||||||
|
+ while [ "$INDEX" -lt "$WWIDS" ] ; do
|
||||||
|
+ sed -i '/^blacklist_exceptions[[:space:]]*{/ a\
|
||||||
|
+ wwid '"\"${WWID_LIST[$INDEX]}\""'
|
||||||
|
+' $TMPFILE
|
||||||
|
+ ((INDEX++))
|
||||||
|
+ done
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+umask 0077
|
||||||
|
+
|
||||||
|
+parse_args "$@"
|
||||||
|
+
|
||||||
|
+validate_args
|
||||||
|
+
|
||||||
|
+if [ ! -d "$MULTIPATHDIR" ]; then
|
||||||
|
+ echo "/etc/multipath/ does not exist. failing"
|
||||||
|
+ exit 1
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+rm $TMPFILE 2> /dev/null
|
||||||
|
+echo "$DEFAULT_CONFIG" > $TMPFILE
|
||||||
|
+if [ -f "$CONFIGFILE" ]; then
|
||||||
|
+ cp $CONFIGFILE $TMPFILE
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+if grep -q "^blacklist[[:space:]]*{" $TMPFILE ; then
|
||||||
|
+ HAVE_BLACKLIST=1
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+if grep -q "^blacklist_exceptions[[:space:]]*{" $TMPFILE ; then
|
||||||
|
+ HAVE_EXCEPTIONS=1
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+if grep -q "^defaults[[:space:]]*{" $TMPFILE ; then
|
||||||
|
+ HAVE_DEFAULTS=1
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+if [ -z "$MODULE" -o "$MODULE" = "y" ]; then
|
||||||
|
+ if lsmod | grep -q "dm_multipath" ; then
|
||||||
|
+ HAVE_MODULE=1
|
||||||
|
+ else
|
||||||
|
+ HAVE_MODULE=0
|
||||||
|
+ fi
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+if [ "$MULTIPATHD" = "y" ]; then
|
||||||
|
+ if /bin/systemctl status multipathd.service > /dev/null 2>&1 ; then
|
||||||
|
+ HAVE_MULTIPATHD=1
|
||||||
|
+ else
|
||||||
|
+ HAVE_MULTIPATHD=0
|
||||||
|
+ fi
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+if [ "$HAVE_BLACKLIST" = "1" ]; then
|
||||||
|
+ if sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*devnode[[:space:]][[:space:]]*\"\.\?\*\"" ; then
|
||||||
|
+ HAVE_DISABLE=1
|
||||||
|
+ elif sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*#[[:space:]]*devnode[[:space:]][[:space:]]*\"\.\?\*\"" ; then
|
||||||
|
+ HAVE_DISABLE=0
|
||||||
|
+ fi
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+if [ "$HAVE_BLACKLIST" = "1" ]; then
|
||||||
|
+ if sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*wwid[[:space:]][[:space:]]*\"\.\?\*\"" ; then
|
||||||
|
+ HAVE_WWID_DISABLE=1
|
||||||
|
+ elif sed -n '/^blacklist[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*#[[:space:]]*wwid[[:space:]][[:space:]]*\"\.\?\*\"" ; then
|
||||||
|
+ HAVE_WWID_DISABLE=0
|
||||||
|
+ fi
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+if [ "$HAVE_DEFAULTS" = "1" ]; then
|
||||||
|
+ HAVE_FIND=`sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | sed -n 's/^[[:blank:]]*find_multipaths[[:blank:]][[:blank:]]*\([^[:blank:]]*\).*$/\1/p' | sed -n 1p`
|
||||||
|
+ if [ "$HAVE_FIND" = "1" ]; then
|
||||||
|
+ HAVE_FIND="yes"
|
||||||
|
+ elif [ "$HAVE_FIND" = "0" ]; then
|
||||||
|
+ HAVE_FIND="no"
|
||||||
|
+ fi
|
||||||
|
+ if sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*user_friendly_names[[:space:]][[:space:]]*\(yes\|1\)" ; then
|
||||||
|
+ HAVE_FRIENDLY=1
|
||||||
|
+ elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*user_friendly_names[[:space:]][[:space:]]*\(no\|0\)" ; then
|
||||||
|
+ HAVE_FRIENDLY=0
|
||||||
|
+ fi
|
||||||
|
+ if sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*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
|
||||||
|
+ HAVE_FOREIGN=1
|
||||||
|
+ elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*enable_foreign[[:space:]][[:space:]]*\"\^\$\"" ; then
|
||||||
|
+ HAVE_FOREIGN=2
|
||||||
|
+ elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*enable_foreign[[:space:]][[:space:]]*\"NONE\"" ; then
|
||||||
|
+ HAVE_FOREIGN=2
|
||||||
|
+ elif sed -n '/^defaults[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*enable_foreign" ; then
|
||||||
|
+ HAVE_FOREIGN=3
|
||||||
|
+ fi
|
||||||
|
+ 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
|
||||||
|
+ if sed -n '/^blacklist_exceptions[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*property[[:space:]][[:space:]]*\"(SCSI_IDENT_|ID_WWN)\"" ; then
|
||||||
|
+ HAVE_PROPERTY=1
|
||||||
|
+ elif sed -n '/^blacklist_exceptions[[:space:]]*{/,/^}/ p' $TMPFILE | grep -q "^[[:space:]]*#[[:space:]]*property[[:space:]][[:space:]]*\"(SCSI_IDENT_|ID_WWN)\"" ; then
|
||||||
|
+ HAVE_PROPERTY=0
|
||||||
|
+ fi
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+if [ -n "$SHOW_STATUS" ]; then
|
||||||
|
+ if [ -z "$HAVE_DISABLE" -o "$HAVE_DISABLE" = 0 ]; then
|
||||||
|
+ echo "multipath is enabled"
|
||||||
|
+ else
|
||||||
|
+ echo "multipath is disabled"
|
||||||
|
+ fi
|
||||||
|
+ if [ -z "$HAVE_FIND" ]; then
|
||||||
|
+ echo "find_multipaths is off"
|
||||||
|
+ else
|
||||||
|
+ echo "find_multipaths is $HAVE_FIND"
|
||||||
|
+ fi
|
||||||
|
+ if [ -z "$HAVE_FRIENDLY" -o "$HAVE_FRIENDLY" = 0 ]; then
|
||||||
|
+ echo "user_friendly_names is disabled"
|
||||||
|
+ else
|
||||||
|
+ echo "user_friendly_names is enabled"
|
||||||
|
+ fi
|
||||||
|
+ if [ -z "$HAVE_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
|
||||||
|
+ echo "default property blacklist is enabled"
|
||||||
|
+ fi
|
||||||
|
+ if [ -z "$HAVE_FOREIGN" -o "$HAVE_FOREIGN" = 0 ]; then
|
||||||
|
+ echo "enable_foreign is not set (no foreign multipath devices will be shown)"
|
||||||
|
+ elif [ "$HAVE_FOREIGN" = 1 ]; then
|
||||||
|
+ echo "enable_foreign is set (all foreign multipath devices will be shown)"
|
||||||
|
+ elif [ "$HAVE_FOREIGN" = 2 ]; then
|
||||||
|
+ echo "enable_foreign is set (no foreign multipath devices will be shown)"
|
||||||
|
+ else
|
||||||
|
+ echo "enable_foreign is set (foreign multipath devices may not be shown)"
|
||||||
|
+ fi
|
||||||
|
+ if [ -n "$HAVE_MODULE" ]; then
|
||||||
|
+ if [ "$HAVE_MODULE" = 1 ]; then
|
||||||
|
+ echo "dm_multipath module is loaded"
|
||||||
|
+ else
|
||||||
|
+ echo "dm_multipath module is not loaded"
|
||||||
|
+ fi
|
||||||
|
+ fi
|
||||||
|
+ if [ -z "$HAVE_MULTIPATHD" ]; then
|
||||||
|
+ if /bin/systemctl status multipathd.service > /dev/null 2>&1 ; then
|
||||||
|
+ HAVE_MULTIPATHD=1
|
||||||
|
+ else
|
||||||
|
+ HAVE_MULTIPATHD=0
|
||||||
|
+ fi
|
||||||
|
+ fi
|
||||||
|
+ if [ "$HAVE_MULTIPATHD" = 1 ]; then
|
||||||
|
+ echo "multipathd is running"
|
||||||
|
+ else
|
||||||
|
+ echo "multipathd is not running"
|
||||||
|
+ fi
|
||||||
|
+ exit 0
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+if [ -z "$HAVE_BLACKLIST" ]; then
|
||||||
|
+ cat >> $TMPFILE <<- _EOF_
|
||||||
|
+
|
||||||
|
+blacklist {
|
||||||
|
+}
|
||||||
|
+_EOF_
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+if [ -z "$HAVE_DEFAULTS" ]; then
|
||||||
|
+ cat >> $TMPFILE <<- _EOF_
|
||||||
|
+
|
||||||
|
+defaults {
|
||||||
|
+}
|
||||||
|
+_EOF_
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+if [ "$ENABLE" = 2 ]; then
|
||||||
|
+ if [ "$HAVE_DISABLE" = 1 ]; then
|
||||||
|
+ sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*devnode[[:space:]][[:space:]]*\"\.\?\*\"/# devnode ".*"/' $TMPFILE
|
||||||
|
+ fi
|
||||||
|
+ if [ -z "$HAVE_WWID_DISABLE" ]; then
|
||||||
|
+ sed -i '/^blacklist[[:space:]]*{/ a\
|
||||||
|
+ wwid ".*"
|
||||||
|
+' $TMPFILE
|
||||||
|
+ elif [ "$HAVE_WWID_DISABLE" = 0 ]; then
|
||||||
|
+ sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*#[[:space:]]*wwid[[:space:]][[:space:]]*\"\.\?\*\"/ wwid ".*"/' $TMPFILE
|
||||||
|
+ fi
|
||||||
|
+ if [ "$HAVE_EXCEPTIONS" = 1 ]; then
|
||||||
|
+ sed -i '/^blacklist_exceptions[[:space:]]*{/,/^}/ {/^[[:space:]]*wwid/ d}' $TMPFILE
|
||||||
|
+ else
|
||||||
|
+ cat >> $TMPFILE <<- _EOF_
|
||||||
|
+
|
||||||
|
+blacklist_exceptions {
|
||||||
|
+}
|
||||||
|
+_EOF_
|
||||||
|
+ fi
|
||||||
|
+ add_blacklist_exceptions
|
||||||
|
+elif [ "$ENABLE" = 1 ]; then
|
||||||
|
+ if [ "$HAVE_DISABLE" = 1 ]; then
|
||||||
|
+ sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*devnode[[:space:]][[:space:]]*\"\.\?\*\"/# devnode ".*"/' $TMPFILE
|
||||||
|
+ fi
|
||||||
|
+elif [ "$ENABLE" = 0 ]; then
|
||||||
|
+ if [ -z "$HAVE_DISABLE" ]; then
|
||||||
|
+ sed -i '/^blacklist[[:space:]]*{/ a\
|
||||||
|
+ devnode ".*"
|
||||||
|
+' $TMPFILE
|
||||||
|
+ elif [ "$HAVE_DISABLE" = 0 ]; then
|
||||||
|
+ sed -i '/^blacklist[[:space:]]*{/,/^}/ s/^[[:space:]]*#[[:space:]]*devnode[[:space:]][[:space:]]*\"\.\?\*\"/ devnode ".*"/' $TMPFILE
|
||||||
|
+ fi
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+if [ -n "$FIND" ]; then
|
||||||
|
+ if [ -z "$HAVE_FIND" ]; then
|
||||||
|
+ sed -i '/^defaults[[:space:]]*{/ a\
|
||||||
|
+ find_multipaths '"$FIND"'
|
||||||
|
+' $TMPFILE
|
||||||
|
+ CHANGED_CONFIG=1
|
||||||
|
+ elif [ "$FIND" != "$HAVE_FIND" ]; then
|
||||||
|
+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:blank:]]*find_multipaths[[:blank:]][[:blank:]]*[^[:blank:]]*/ find_multipaths '"$FIND"'/' $TMPFILE
|
||||||
|
+ CHANGED_CONFIG=1
|
||||||
|
+ fi
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+if [ "$FRIENDLY" = "n" ]; then
|
||||||
|
+ if [ "$HAVE_FRIENDLY" = 1 ]; then
|
||||||
|
+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*user_friendly_names[[:space:]][[:space:]]*\(yes\|1\)/ user_friendly_names no/' $TMPFILE
|
||||||
|
+ CHANGED_CONFIG=1
|
||||||
|
+ fi
|
||||||
|
+elif [ "$FRIENDLY" = "y" ]; then
|
||||||
|
+ if [ -z "$HAVE_FRIENDLY" ]; then
|
||||||
|
+ sed -i '/^defaults[[:space:]]*{/ a\
|
||||||
|
+ user_friendly_names yes
|
||||||
|
+' $TMPFILE
|
||||||
|
+ CHANGED_CONFIG=1
|
||||||
|
+ elif [ "$HAVE_FRIENDLY" = 0 ]; then
|
||||||
|
+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*user_friendly_names[[:space:]][[:space:]]*\(no\|0\)/ user_friendly_names yes/' $TMPFILE
|
||||||
|
+ CHANGED_CONFIG=1
|
||||||
|
+ fi
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+if [ "$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
|
||||||
|
+ CHANGED_CONFIG=1
|
||||||
|
+ fi
|
||||||
|
+elif [ "$PROPERTY" = "y" ]; then
|
||||||
|
+ if [ -z "$HAVE_PROPERTY" -a -z "$HAVE_EXCEPTIONS" ]; then
|
||||||
|
+ cat >> $TMPFILE << _EOF_
|
||||||
|
+
|
||||||
|
+blacklist_exceptions {
|
||||||
|
+ property "(SCSI_IDENT_|ID_WWN)"
|
||||||
|
+}
|
||||||
|
+_EOF_
|
||||||
|
+ CHANGED_CONFIG=1
|
||||||
|
+ elif [ -z "$HAVE_PROPERTY" ]; then
|
||||||
|
+ sed -i '/^blacklist_exceptions[[:space:]]*{/ a\
|
||||||
|
+ property "(SCSI_IDENT_|ID_WWN)"
|
||||||
|
+' $TMPFILE
|
||||||
|
+ CHANGED_CONFIG=1
|
||||||
|
+ elif [ "$HAVE_PROPERTY" = 0 ]; then
|
||||||
|
+ sed -i '/^blacklist_exceptions[[:space:]]*{/,/^}/ s/^[[:space:]]*#[[:space:]]*property[[:space:]][[:space:]]*\"(SCSI_IDENT_|ID_WWN)\"/ property \"(SCSI_IDENT_|ID_WWN)\"/' $TMPFILE
|
||||||
|
+ CHANGED_CONFIG=1
|
||||||
|
+ fi
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+if [ "$FOREIGN" = "n" ]; then
|
||||||
|
+ if [ "$HAVE_FOREIGN" = 1 -o "$HAVE_FOREIGN" = 3 ]; then
|
||||||
|
+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*enable_foreign/# enable_foreign/' $TMPFILE
|
||||||
|
+ CHANGED_CONFIG=1
|
||||||
|
+ fi
|
||||||
|
+elif [ "$FOREIGN" = "y" ]; then
|
||||||
|
+ if [ -z "$HAVE_FOREIGN" ]; then
|
||||||
|
+ sed -i '/^defaults[[:space:]]*{/ a\
|
||||||
|
+ enable_foreign ".*"
|
||||||
|
+' $TMPFILE
|
||||||
|
+ CHANGED_CONFIG=1
|
||||||
|
+ elif [ "$HAVE_FOREIGN" = 0 -o "$HAVE_FOREIGN" = 2 -o "$HAVE_FOREIGN" = 3 ]; then
|
||||||
|
+ sed -i '/^defaults[[:space:]]*{/,/^}/ s/^[[:space:]]*#\?[[:space:]]*enable_foreign.*$/ enable_foreign ".*"/' $TMPFILE
|
||||||
|
+ CHANGED_CONFIG=1
|
||||||
|
+ fi
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+if [ -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
|
||||||
|
+ echo "failed to backup old config file, $OUTPUTFILE not updated"
|
||||||
|
+ exit 1
|
||||||
|
+ fi
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+cp $TMPFILE $OUTPUTFILE
|
||||||
|
+if [ $? != 0 ]; then
|
||||||
|
+ echo "failed to copy new config file into place, check $OUTPUTFILE is still OK"
|
||||||
|
+ exit 1
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+rm -f $TMPFILE
|
||||||
|
+
|
||||||
|
+if [ "$ENABLE" = 1 ]; then
|
||||||
|
+ if [ "$HAVE_MODULE" = 0 ]; then
|
||||||
|
+ modprobe dm_multipath
|
||||||
|
+ fi
|
||||||
|
+ if [ "$HAVE_MULTIPATHD" = 0 ]; then
|
||||||
|
+ systemctl start multipathd.service
|
||||||
|
+ fi
|
||||||
|
+elif [ "$ENABLE" = 0 ]; then
|
||||||
|
+ if [ "$HAVE_MULTIPATHD" = 1 ]; then
|
||||||
|
+ systemctl stop multipathd.service
|
||||||
|
+ fi
|
||||||
|
+elif [ -n "$CHANGED_CONFIG" -a "$HAVE_MULTIPATHD" = 1 ]; then
|
||||||
|
+ systemctl reload multipathd.service
|
||||||
|
+fi
|
||||||
|
diff --git a/multipath/mpathconf.8 b/multipath/mpathconf.8
|
||||||
|
new file mode 100644
|
||||||
|
index 00000000..ea025f31
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/multipath/mpathconf.8
|
||||||
|
@@ -0,0 +1,151 @@
|
||||||
|
+.TH MPATHCONF 8 "June 2010" "" "Linux Administrator's Manual"
|
||||||
|
+.SH NAME
|
||||||
|
+mpathconf - A tool for configuring device-mapper-multipath
|
||||||
|
+.SH SYNOPSIS
|
||||||
|
+.B mpathconf
|
||||||
|
+.RB [\| commands \|]
|
||||||
|
+.RB [\| options \|]
|
||||||
|
+.SH DESCRIPTION
|
||||||
|
+.B mpathconf
|
||||||
|
+is a utility that creates or modifies
|
||||||
|
+.B /etc/multipath.conf.
|
||||||
|
+It can enable or disable multipathing and configure some common options.
|
||||||
|
+.B mpathconf
|
||||||
|
+can also load the
|
||||||
|
+.B dm_multipath
|
||||||
|
+module, start and stop the
|
||||||
|
+.B multipathd
|
||||||
|
+daemon, and configure the
|
||||||
|
+.B multipathd
|
||||||
|
+service to start automatically or not. If
|
||||||
|
+.B mpathconf
|
||||||
|
+is called with no commands, it will display the current configuration, but
|
||||||
|
+will not create of modify
|
||||||
|
+.B /etc/multipath.conf
|
||||||
|
+
|
||||||
|
+The default options for mpathconf are
|
||||||
|
+.B --with_module
|
||||||
|
+The
|
||||||
|
+.B --with_multipathd
|
||||||
|
+option is not set by default. Enabling multipathing will load the
|
||||||
|
+.B dm_multipath
|
||||||
|
+module but it will not immediately start it. This is so
|
||||||
|
+that users can manually edit their config file if necessary, before starting
|
||||||
|
+.B multipathd.
|
||||||
|
+
|
||||||
|
+If
|
||||||
|
+.B /etc/multipath.conf
|
||||||
|
+already exists, mpathconf will edit it. If it does not exist, mpathconf will
|
||||||
|
+create a default file with
|
||||||
|
+.B user_friendly_names
|
||||||
|
+set and
|
||||||
|
+.B find_multipaths
|
||||||
|
+set to \fBon\fP. To disable these, use the
|
||||||
|
+.B --user_friendly_names n
|
||||||
|
+and
|
||||||
|
+.B --find_multipaths off
|
||||||
|
+options
|
||||||
|
+.SH COMMANDS
|
||||||
|
+.TP
|
||||||
|
+.B --enable
|
||||||
|
+Removes any line that blacklists all device nodes from the
|
||||||
|
+.B /etc/multipath.conf
|
||||||
|
+blacklist section. Also, creates
|
||||||
|
+.B /etc/multipath.conf
|
||||||
|
+if it doesn't exist.
|
||||||
|
+.TP
|
||||||
|
+.B --disable
|
||||||
|
+Adds a line that blacklists all device nodes to the
|
||||||
|
+.B /etc/multipath.conf
|
||||||
|
+blacklist section. If no blacklist section exists, it will create one.
|
||||||
|
+.TP
|
||||||
|
+.B --allow \fB<device>\fP
|
||||||
|
+Modifies the \fB/etc/multipath/conf\fP blacklist to blacklist all
|
||||||
|
+wwids and the blacklist_exceptions to whitelist \fB<device>\fP. \fB<device>\fP
|
||||||
|
+can be in the form of MAJOR:MINOR, a wwid, or the name of a device-mapper
|
||||||
|
+device, either a multipath device, or any device on stacked on top of one or
|
||||||
|
+more multipath devices. This command can be used multiple times to allow
|
||||||
|
+multiple devices. \fBNOTE:\fP This action will create a configuration file that
|
||||||
|
+mpathconf will not be able to revert back to its previous state. Because
|
||||||
|
+of this, \fB--outfile\fP is required when using \fB--allow\fP.
|
||||||
|
+.TP
|
||||||
|
+.B --user_friendly_names \fP { \fBy\fP | \fBn\fP }
|
||||||
|
+If set to \fBy\fP, this adds the line
|
||||||
|
+.B user_friendly_names yes
|
||||||
|
+to the
|
||||||
|
+.B /etc/multipath.conf
|
||||||
|
+defaults section. If set to \fBn\fP, this removes the line, if present. This
|
||||||
|
+command can be used along with any other command.
|
||||||
|
+.TP
|
||||||
|
+.B --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 { \fBon\fP | \fByes\fP | \fBy\fP | \fBoff\fP | \fBno\fP | \fBn\fP | \fBstrict\fP | \fBgreedy\fP | \fBsmart\fP }
|
||||||
|
+If set to \fB<value>\fP, this adds the line
|
||||||
|
+.B find_multipaths <value>
|
||||||
|
+to the
|
||||||
|
+.B /etc/multipath.conf
|
||||||
|
+defaults section. This command can be used along with any other command.
|
||||||
|
+\fBy\fP and \fBn\fP can be used instead of \fByes\fP and \fBno\fP.
|
||||||
|
+.TP
|
||||||
|
+.B --property_blacklist \fP { \fBy\fP | \fBn\fP }
|
||||||
|
+If set to \fBy\fP, this adds the line
|
||||||
|
+.B property "(SCSI_IDENT_|ID_WWN)"
|
||||||
|
+to the
|
||||||
|
+.B /etc/multipath.conf
|
||||||
|
+blacklist_exceptions section. If set to \fBn\fP, this removes the line, if
|
||||||
|
+present. This command can be used along with any other command.
|
||||||
|
+.TP
|
||||||
|
+.B --enable_foreign\fP { \fBy\fP | \fBn\fP }
|
||||||
|
+If set to \fBy\fP, this adds the line
|
||||||
|
+.B enable_foreign ".*"
|
||||||
|
+to the
|
||||||
|
+.B /etc/multipath.conf
|
||||||
|
+defaults section. if set to \fBn\fP, this removes the line, if present. This
|
||||||
|
+command can be used along with any other command.
|
||||||
|
+.TP
|
||||||
|
+.B --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.
|
||||||
|
+.SH OPTIONS
|
||||||
|
+.TP
|
||||||
|
+.B --with_module\fP { \fBy\fP | \fBn\fP }
|
||||||
|
+If set to \fBy\fP, this runs
|
||||||
|
+.B modprobe dm_multipath
|
||||||
|
+to install the multipath modules. This option only works with the
|
||||||
|
+.B --enable
|
||||||
|
+command. This option is set to \fBy\fP by default.
|
||||||
|
+.TP
|
||||||
|
+.B --with_multipathd { \fBy\fP | \fBn\fP }
|
||||||
|
+If set to \fBy\fP, this runs
|
||||||
|
+.B service multipathd start
|
||||||
|
+to start the multipathd daemon on \fB--enable\fP,
|
||||||
|
+.B service multipathd stop
|
||||||
|
+to stop the multipathd daemon on \fB--disable\fP, and
|
||||||
|
+.B service multipathd reload
|
||||||
|
+to reconfigure multipathd on \fB--user_frindly_names\fP and
|
||||||
|
+\fB--find_multipaths\fP.
|
||||||
|
+This option is set to \fBn\fP by default.
|
||||||
|
+.SH FILES
|
||||||
|
+.BR /etc/multipath.conf
|
||||||
|
+.SH "SEE ALSO"
|
||||||
|
+.BR multipath.conf (5),
|
||||||
|
+.BR modprobe (8),
|
||||||
|
+.BR multipath (8),
|
||||||
|
+.BR multipathd (8),
|
||||||
|
+.BR service (8),
|
||||||
|
+.SH AUTHOR
|
||||||
|
+Benjamin Marzinski <bmarzins@redhat.com>
|
@ -0,0 +1,151 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
Date: Fri, 17 Oct 2014 11:20:34 -0500
|
||||||
|
Subject: [PATCH] RH: add wwids from kernel cmdline mpath.wwids with -A
|
||||||
|
|
||||||
|
This patch adds another option to multipath, "-A", which reads
|
||||||
|
/proc/cmdline for mpath.wwid=<WWID> options, and adds any wwids it finds
|
||||||
|
to /etc/multipath/wwids. While this isn't usually important during
|
||||||
|
normal operation, since these wwids should already be added, it can be
|
||||||
|
helpful during installation, to make sure that multipath can claim
|
||||||
|
devices as its own, before LVM or something else makes use of them. The
|
||||||
|
patch also execs "/sbin/multipath -A" before running multipathd in
|
||||||
|
multipathd.service
|
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
---
|
||||||
|
multipath/main.c | 54 ++++++++++++++++++++++++++++++--
|
||||||
|
multipath/multipath.8.in | 7 ++++-
|
||||||
|
multipathd/multipathd.service.in | 1 +
|
||||||
|
3 files changed, 59 insertions(+), 3 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/multipath/main.c b/multipath/main.c
|
||||||
|
index c21e3e0b..3f3ac9fb 100644
|
||||||
|
--- a/multipath/main.c
|
||||||
|
+++ b/multipath/main.c
|
||||||
|
@@ -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);
|
||||||
|
- fprintf (stderr, " %s [-v level] -W\n", progname);
|
||||||
|
+ fprintf (stderr, " %s [-v level] [-A|-W]\n", progname);
|
||||||
|
fprintf (stderr, " %s [-v level] [-i] [-c|-C] device\n", progname);
|
||||||
|
fprintf (stderr, " %s [-v level] [-i] [-u|-U]\n", progname);
|
||||||
|
fprintf (stderr, " %s [-h|-t|-T]\n", progname);
|
||||||
|
@@ -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"
|
||||||
|
+ " -A add devices from kernel command line mpath.wwids\n"
|
||||||
|
+ " parameters to wwids file\n"
|
||||||
|
" -c check if a device should be a path in a multipath device\n"
|
||||||
|
" -C check if a multipath device has usable paths\n"
|
||||||
|
" -q allow queue_if_no_path when multipathd is not running\n"
|
||||||
|
@@ -448,6 +450,50 @@ static void cleanup_vecs(void)
|
||||||
|
free_pathvec(vecs.pathvec, FREE_PATHS);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int remember_cmdline_wwid(void)
|
||||||
|
+{
|
||||||
|
+ FILE *f = NULL;
|
||||||
|
+ char buf[LINE_MAX], *next, *ptr;
|
||||||
|
+ int ret = 0;
|
||||||
|
+
|
||||||
|
+ f = fopen("/proc/cmdline", "re");
|
||||||
|
+ if (!f) {
|
||||||
|
+ condlog(0, "can't open /proc/cmdline : %s", strerror(errno));
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!fgets(buf, sizeof(buf), f)) {
|
||||||
|
+ if (ferror(f))
|
||||||
|
+ condlog(0, "read of /proc/cmdline failed : %s",
|
||||||
|
+ strerror(errno));
|
||||||
|
+ else
|
||||||
|
+ condlog(0, "couldn't read /proc/cmdline");
|
||||||
|
+ fclose(f);
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+ fclose(f);
|
||||||
|
+ next = buf;
|
||||||
|
+ while((ptr = strstr(next, "mpath.wwid="))) {
|
||||||
|
+ ptr += 11;
|
||||||
|
+ next = strpbrk(ptr, " \t\n");
|
||||||
|
+ if (next) {
|
||||||
|
+ *next = '\0';
|
||||||
|
+ next++;
|
||||||
|
+ }
|
||||||
|
+ if (strlen(ptr)) {
|
||||||
|
+ if (remember_wwid(ptr) != 0)
|
||||||
|
+ ret = -1;
|
||||||
|
+ }
|
||||||
|
+ else {
|
||||||
|
+ condlog(0, "empty mpath.wwid kernel command line option");
|
||||||
|
+ ret = -1;
|
||||||
|
+ }
|
||||||
|
+ if (!next)
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int
|
||||||
|
configure (struct config *conf, enum mpath_cmds cmd,
|
||||||
|
enum devtypes dev_type, char *devpath)
|
||||||
|
@@ -861,7 +907,7 @@ main (int argc, char *argv[])
|
||||||
|
condlog(1, "failed to register cleanup handler for vecs: %m");
|
||||||
|
if (atexit(cleanup_bindings))
|
||||||
|
condlog(1, "failed to register cleanup handler for bindings: %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 'v':
|
||||||
|
if (!isdigit(optarg[0])) {
|
||||||
|
@@ -932,6 +978,10 @@ main (int argc, char *argv[])
|
||||||
|
case 'T':
|
||||||
|
cmd = CMD_DUMP_CONFIG;
|
||||||
|
break;
|
||||||
|
+ case 'A':
|
||||||
|
+ if (remember_cmdline_wwid() != 0)
|
||||||
|
+ exit(RTVL_FAIL);
|
||||||
|
+ exit(RTVL_OK);
|
||||||
|
case 'h':
|
||||||
|
usage(argv[0]);
|
||||||
|
exit(RTVL_OK);
|
||||||
|
diff --git a/multipath/multipath.8.in b/multipath/multipath.8.in
|
||||||
|
index b88e9a4c..edd742aa 100644
|
||||||
|
--- a/multipath/multipath.8.in
|
||||||
|
+++ b/multipath/multipath.8.in
|
||||||
|
@@ -64,7 +64,7 @@ multipath \- Device mapper target autoconfig.
|
||||||
|
.B multipath
|
||||||
|
.RB [\| \-v\ \c
|
||||||
|
.IR level \|]
|
||||||
|
-.B -W
|
||||||
|
+.RB [\| \-A | \-W \|]
|
||||||
|
.
|
||||||
|
.LP
|
||||||
|
.B multipath
|
||||||
|
@@ -146,6 +146,11 @@ device mapper, path checkers ...).
|
||||||
|
Add the WWID for the specified device to the WWIDs file.
|
||||||
|
.
|
||||||
|
.TP
|
||||||
|
+.B \-A
|
||||||
|
+Add the WWIDs from any kernel command line \fImpath.wwid\fR parameters to the
|
||||||
|
+WWIDs file.
|
||||||
|
+.
|
||||||
|
+.TP
|
||||||
|
.B \-w
|
||||||
|
Remove the WWID for the specified device from the WWIDs file.
|
||||||
|
.
|
||||||
|
diff --git a/multipathd/multipathd.service.in b/multipathd/multipathd.service.in
|
||||||
|
index 01ceff7d..e0c2011b 100644
|
||||||
|
--- a/multipathd/multipathd.service.in
|
||||||
|
+++ b/multipathd/multipathd.service.in
|
||||||
|
@@ -17,6 +17,7 @@ ConditionVirtualization=!container
|
||||||
|
[Service]
|
||||||
|
Type=notify
|
||||||
|
NotifyAccess=main
|
||||||
|
+ExecStartPre=-/sbin/multipath -A
|
||||||
|
ExecStart=/sbin/multipathd -d -s
|
||||||
|
ExecReload=/sbin/multipathd reconfigure
|
||||||
|
TasksMax=infinity
|
@ -0,0 +1,41 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
Date: Thu, 7 Jun 2018 17:43:52 -0500
|
||||||
|
Subject: [PATCH] RH: reset default find_mutipaths value to off
|
||||||
|
|
||||||
|
Upstream has changed to default find_multipaths to "strict". For now
|
||||||
|
Redhat will retain the previous default of "off".
|
||||||
|
|
||||||
|
Co-authored-by: Paul Donohue <git@PaulSD.com>
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
---
|
||||||
|
libmultipath/defaults.h | 2 +-
|
||||||
|
multipath/multipath.conf.5.in | 2 +-
|
||||||
|
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/libmultipath/defaults.h b/libmultipath/defaults.h
|
||||||
|
index ed08c251..4b033ff9 100644
|
||||||
|
--- a/libmultipath/defaults.h
|
||||||
|
+++ b/libmultipath/defaults.h
|
||||||
|
@@ -23,7 +23,7 @@
|
||||||
|
#define DEFAULT_NO_PATH_RETRY NO_PATH_RETRY_UNDEF
|
||||||
|
#define DEFAULT_VERBOSITY 2
|
||||||
|
#define DEFAULT_REASSIGN_MAPS 0
|
||||||
|
-#define DEFAULT_FIND_MULTIPATHS FIND_MULTIPATHS_STRICT
|
||||||
|
+#define DEFAULT_FIND_MULTIPATHS FIND_MULTIPATHS_OFF
|
||||||
|
#define DEFAULT_FAST_IO_FAIL 5
|
||||||
|
#define DEFAULT_DEV_LOSS_TMO 600
|
||||||
|
#define DEFAULT_RETAIN_HWHANDLER RETAIN_HWHANDLER_ON
|
||||||
|
diff --git a/multipath/multipath.conf.5.in b/multipath/multipath.conf.5.in
|
||||||
|
index 645e8f88..a7543939 100644
|
||||||
|
--- a/multipath/multipath.conf.5.in
|
||||||
|
+++ b/multipath/multipath.conf.5.in
|
||||||
|
@@ -1225,7 +1225,7 @@ as non-multipath and passed on to upper layers.
|
||||||
|
\fBNote:\fR this may cause delays during device detection if
|
||||||
|
there are single-path devices which aren\'t blacklisted.
|
||||||
|
.TP
|
||||||
|
-The default is: \fBstrict\fR
|
||||||
|
+The default is: \fBoff\fR
|
||||||
|
.RE
|
||||||
|
.
|
||||||
|
.
|
@ -0,0 +1,84 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
Date: Thu, 11 Apr 2019 13:25:42 -0500
|
||||||
|
Subject: [PATCH] RH: attempt to get ANA info via sysfs first
|
||||||
|
|
||||||
|
When the ANA prioritizer is run, first see if the "ana_state" sysfs file
|
||||||
|
exists, and if it does, try to read the state from there. If that fails,
|
||||||
|
fallback to using an ioctl.
|
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
---
|
||||||
|
libmultipath/prioritizers/ana.c | 31 +++++++++++++++++++++++++++++--
|
||||||
|
1 file changed, 29 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/libmultipath/prioritizers/ana.c b/libmultipath/prioritizers/ana.c
|
||||||
|
index e9827dca..80a32aa3 100644
|
||||||
|
--- a/libmultipath/prioritizers/ana.c
|
||||||
|
+++ b/libmultipath/prioritizers/ana.c
|
||||||
|
@@ -24,6 +24,7 @@
|
||||||
|
#include "prio.h"
|
||||||
|
#include "util.h"
|
||||||
|
#include "structs.h"
|
||||||
|
+#include "sysfs.h"
|
||||||
|
|
||||||
|
enum {
|
||||||
|
ANA_ERR_GETCTRL_FAILED = 1,
|
||||||
|
@@ -36,6 +37,7 @@ enum {
|
||||||
|
ANA_ERR_GETNS_FAILED,
|
||||||
|
ANA_ERR_NO_MEMORY,
|
||||||
|
ANA_ERR_NO_INFORMATION,
|
||||||
|
+ ANA_ERR_INVALID_STATE,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *ana_errmsg[] = {
|
||||||
|
@@ -49,6 +51,7 @@ static const char *ana_errmsg[] = {
|
||||||
|
[ANA_ERR_GETNS_FAILED] = "couldn't get namespace info",
|
||||||
|
[ANA_ERR_NO_MEMORY] = "out of memory",
|
||||||
|
[ANA_ERR_NO_INFORMATION] = "invalid fd",
|
||||||
|
+ [ANA_ERR_INVALID_STATE] = "invalid state",
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *anas_string[] = {
|
||||||
|
@@ -107,6 +110,27 @@ static int get_ana_state(__u32 nsid, __u32 anagrpid, void *ana_log,
|
||||||
|
return -ANA_ERR_GETANAS_NOTFOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int get_ana_info_sysfs(struct path *pp)
|
||||||
|
+{
|
||||||
|
+ char state[32];
|
||||||
|
+
|
||||||
|
+ if (!pp->udev || sysfs_attr_get_value(pp->udev, "ana_state", state,
|
||||||
|
+ sizeof(state)) <= 0)
|
||||||
|
+ return -ANA_ERR_NO_INFORMATION;
|
||||||
|
+
|
||||||
|
+ if (strcmp(state, "optimized") == 0)
|
||||||
|
+ return NVME_ANA_OPTIMIZED;
|
||||||
|
+ if (strcmp(state, "non-optimized") == 0)
|
||||||
|
+ return NVME_ANA_NONOPTIMIZED;
|
||||||
|
+ if (strcmp(state, "inaccessible") == 0)
|
||||||
|
+ return NVME_ANA_INACCESSIBLE;
|
||||||
|
+ if (strcmp(state, "persistent-loss") == 0)
|
||||||
|
+ return NVME_ANA_PERSISTENT_LOSS;
|
||||||
|
+ if (strcmp(state, "change") == 0)
|
||||||
|
+ return NVME_ANA_CHANGE;
|
||||||
|
+ return -ANA_ERR_INVALID_STATE;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int get_ana_info(struct path * pp)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
@@ -209,8 +233,11 @@ int getprio(struct path *pp, __attribute__((unused)) char *args)
|
||||||
|
|
||||||
|
if (pp->fd < 0)
|
||||||
|
rc = -ANA_ERR_NO_INFORMATION;
|
||||||
|
- else
|
||||||
|
- rc = get_ana_info(pp);
|
||||||
|
+ else {
|
||||||
|
+ rc = get_ana_info_sysfs(pp);
|
||||||
|
+ if (rc < 0)
|
||||||
|
+ rc = get_ana_info(pp);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
switch (rc) {
|
||||||
|
case NVME_ANA_OPTIMIZED:
|
@ -0,0 +1,96 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
Date: Thu, 25 Mar 2021 13:05:10 -0500
|
||||||
|
Subject: [PATCH] RH: make parse_vpd_pg83 match scsi_id output
|
||||||
|
|
||||||
|
Red Hat sets ID_SERIAL based on the result of scsi_id, instead of using
|
||||||
|
the result of sg_inq and 55-scsi-sg3_id.rules. Make parse_vpd_pg83 match
|
||||||
|
that.
|
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
---
|
||||||
|
libmultipath/discovery.c | 12 ++----------
|
||||||
|
tests/vpd.c | 6 ++++++
|
||||||
|
2 files changed, 8 insertions(+), 10 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
|
||||||
|
index e2052422..3bcd94ce 100644
|
||||||
|
--- a/libmultipath/discovery.c
|
||||||
|
+++ b/libmultipath/discovery.c
|
||||||
|
@@ -1221,13 +1221,9 @@ parse_vpd_pg83(const unsigned char *in, size_t in_len,
|
||||||
|
good_len = 8;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
- /* IEEE Extended: Prio 6 */
|
||||||
|
- new_prio = 6;
|
||||||
|
- good_len = 8;
|
||||||
|
- break;
|
||||||
|
case 3:
|
||||||
|
- /* IEEE Locally assigned: Prio 1 */
|
||||||
|
- new_prio = 1;
|
||||||
|
+ /* IEEE Extended or Locally assigned: Prio 6 */
|
||||||
|
+ new_prio = 6;
|
||||||
|
good_len = 8;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
@@ -1245,10 +1241,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 0x1:
|
||||||
|
/* T-10 Vendor ID: Prio 2 */
|
||||||
|
diff --git a/tests/vpd.c b/tests/vpd.c
|
||||||
|
index e3212e61..cdb111bb 100644
|
||||||
|
--- a/tests/vpd.c
|
||||||
|
+++ b/tests/vpd.c
|
||||||
|
@@ -232,11 +232,13 @@ static const char * const str_prefix[] = {
|
||||||
|
[STR_IQN] = "iqn.",
|
||||||
|
};
|
||||||
|
|
||||||
|
+#if 0
|
||||||
|
static const char byte0[] = {
|
||||||
|
[STR_EUI] = '2',
|
||||||
|
[STR_NAA] = '3',
|
||||||
|
[STR_IQN] = '8',
|
||||||
|
};
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* create_scsi_string_desc() - create a SCSI name string descriptor.
|
||||||
|
@@ -767,6 +769,7 @@ make_test_vpd_naa(2, 18);
|
||||||
|
make_test_vpd_naa(2, 17);
|
||||||
|
make_test_vpd_naa(2, 16);
|
||||||
|
|
||||||
|
+#if 0
|
||||||
|
/* SCSI Name string: EUI64, WWID size: 17 */
|
||||||
|
make_test_vpd_str(0, 20, 18)
|
||||||
|
make_test_vpd_str(0, 20, 17)
|
||||||
|
@@ -802,6 +805,7 @@ make_test_vpd_str(18, 20, 18)
|
||||||
|
make_test_vpd_str(18, 20, 17)
|
||||||
|
make_test_vpd_str(18, 20, 16)
|
||||||
|
make_test_vpd_str(18, 20, 15)
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
static int test_vpd(void)
|
||||||
|
{
|
||||||
|
@@ -910,6 +914,7 @@ static int test_vpd(void)
|
||||||
|
cmocka_unit_test(test_vpd_naa_2_18),
|
||||||
|
cmocka_unit_test(test_vpd_naa_2_17),
|
||||||
|
cmocka_unit_test(test_vpd_naa_2_16),
|
||||||
|
+/*
|
||||||
|
cmocka_unit_test(test_vpd_str_0_20_18),
|
||||||
|
cmocka_unit_test(test_vpd_str_0_20_17),
|
||||||
|
cmocka_unit_test(test_vpd_str_0_20_16),
|
||||||
|
@@ -934,6 +939,7 @@ static int test_vpd(void)
|
||||||
|
cmocka_unit_test(test_vpd_str_18_20_17),
|
||||||
|
cmocka_unit_test(test_vpd_str_18_20_16),
|
||||||
|
cmocka_unit_test(test_vpd_str_18_20_15),
|
||||||
|
+*/
|
||||||
|
};
|
||||||
|
return cmocka_run_group_tests(tests, setup, teardown);
|
||||||
|
}
|
@ -0,0 +1,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 94e0ec85..49514b06 100644
|
||||||
|
--- a/Makefile.inc
|
||||||
|
+++ b/Makefile.inc
|
||||||
|
@@ -16,7 +16,7 @@ READLINE :=
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
EXTRAVERSION := $(shell rev=$$(git rev-parse --short=7 HEAD 2>/dev/null); echo $${rev:+-g$$rev})
|
||||||
|
|
@ -0,0 +1,26 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
Date: Tue, 15 Nov 2022 18:03:33 -0600
|
||||||
|
Subject: [PATCH] RH: compile with libreadline support
|
||||||
|
|
||||||
|
Since the license issue has been resolved, and there are problems with
|
||||||
|
the command completion with libedit, use libreadline.
|
||||||
|
|
||||||
|
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 49514b06..a3ed9f28 100644
|
||||||
|
--- a/Makefile.inc
|
||||||
|
+++ b/Makefile.inc
|
||||||
|
@@ -12,7 +12,7 @@
|
||||||
|
# Readline library to use, libedit, libreadline, or empty
|
||||||
|
# Caution: Using libreadline may make the multipathd binary undistributable,
|
||||||
|
# see https://github.com/opensvc/multipath-tools/issues/36
|
||||||
|
-READLINE :=
|
||||||
|
+READLINE := libreadline
|
||||||
|
|
||||||
|
# List of scsi device handler modules to load on boot, e.g.
|
||||||
|
# SCSI_DH_MODULES_PRELOAD := scsi_dh_alua scsi_dh_rdac
|
@ -0,0 +1,186 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
Date: Fri, 7 Jul 2023 15:25:59 -0500
|
||||||
|
Subject: [PATCH] RH: Add mpathcleanup
|
||||||
|
|
||||||
|
mpathcleanup is a program that will remove a multipath device as well as
|
||||||
|
all of the scsi path devices that make it up.
|
||||||
|
|
||||||
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
||||||
|
---
|
||||||
|
multipath/Makefile | 2 +
|
||||||
|
multipath/mpathcleanup | 145 +++++++++++++++++++++++++++++++++++++++++
|
||||||
|
2 files changed, 147 insertions(+)
|
||||||
|
create mode 100755 multipath/mpathcleanup
|
||||||
|
|
||||||
|
diff --git a/multipath/Makefile b/multipath/Makefile
|
||||||
|
index 3dc241cc..47e82234 100644
|
||||||
|
--- a/multipath/Makefile
|
||||||
|
+++ b/multipath/Makefile
|
||||||
|
@@ -25,6 +25,7 @@ install:
|
||||||
|
$(Q)$(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir)
|
||||||
|
$(Q)$(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir)/
|
||||||
|
$(Q)$(INSTALL_PROGRAM) -m 755 mpathconf $(DESTDIR)$(bindir)/
|
||||||
|
+ $(Q)$(INSTALL_PROGRAM) -m 755 mpathcleanup $(DESTDIR)$(bindir)/
|
||||||
|
$(Q)$(INSTALL_PROGRAM) -d $(DESTDIR)$(udevrulesdir)
|
||||||
|
$(Q)$(INSTALL_PROGRAM) -m 644 11-dm-mpath.rules $(DESTDIR)$(udevrulesdir)
|
||||||
|
$(Q)$(INSTALL_PROGRAM) -m 644 99-z-dm-mpath-late.rules $(DESTDIR)$(udevrulesdir)
|
||||||
|
@@ -49,6 +50,7 @@ endif
|
||||||
|
uninstall:
|
||||||
|
$(Q)$(RM) $(DESTDIR)$(bindir)/$(EXEC)
|
||||||
|
$(Q)$(RM) $(DESTDIR)$(bindir)/mpathconf
|
||||||
|
+ $(Q)$(RM) $(DESTDIR)$(bindir)/mpathcleanup
|
||||||
|
$(Q)$(RM) $(DESTDIR)$(udevrulesdir)/11-dm-mpath.rules
|
||||||
|
$(Q)$(RM) $(DESTDIR)$(udevrulesdir)/99-z-dm-mpath-late.rules
|
||||||
|
$(Q)$(RM) $(DESTDIR)$(modulesloaddir)/multipath.conf
|
||||||
|
diff --git a/multipath/mpathcleanup b/multipath/mpathcleanup
|
||||||
|
new file mode 100755
|
||||||
|
index 00000000..6fd921e4
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/multipath/mpathcleanup
|
||||||
|
@@ -0,0 +1,145 @@
|
||||||
|
+#!/bin/bash
|
||||||
|
+#
|
||||||
|
+# Copyright (C) 2023 Red Hat, Inc. All rights reserved.
|
||||||
|
+#
|
||||||
|
+# This file is part of the device-mapper-multipath package.
|
||||||
|
+#
|
||||||
|
+# This copyrighted material is made available to anyone wishing to use,
|
||||||
|
+# modify, copy, or redistribute it subject to the terms and conditions
|
||||||
|
+# of the GNU General Public License v.2.
|
||||||
|
+#
|
||||||
|
+# You should have received a copy of the GNU General Public License
|
||||||
|
+# along with this program; if not, write to the Free Software Foundation,
|
||||||
|
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
+
|
||||||
|
+unset PROGRAM FLUSH DEVICE DEVNAME MAJOR MINOR PATHDEVS PATHDEV HAVE_MULTIPATHD QUEUEING
|
||||||
|
+
|
||||||
|
+function usage
|
||||||
|
+{
|
||||||
|
+ echo "usage: $PROGRAM [-h] [--flush] <device>"
|
||||||
|
+ echo ""
|
||||||
|
+ echo "remove a multipath device and its scsi path devices"
|
||||||
|
+ echo ""
|
||||||
|
+ echo "options:"
|
||||||
|
+ echo " -h, --help show this help message and exit"
|
||||||
|
+ echo " --flush disable queuing on the multipath device and"
|
||||||
|
+ echo " flush the path devices before removing"
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+function parse_args
|
||||||
|
+{
|
||||||
|
+ while [ -n "$1" ]; do
|
||||||
|
+ case $1 in
|
||||||
|
+ --flush)
|
||||||
|
+ FLUSH=1
|
||||||
|
+ shift
|
||||||
|
+ ;;
|
||||||
|
+ --help | -h)
|
||||||
|
+ usage
|
||||||
|
+ exit 1
|
||||||
|
+ ;;
|
||||||
|
+ *)
|
||||||
|
+ if [ -n "$DEVICE" ]; then
|
||||||
|
+ usage
|
||||||
|
+ exit 1
|
||||||
|
+ fi
|
||||||
|
+ DEVICE=$1
|
||||||
|
+ shift
|
||||||
|
+ ;;
|
||||||
|
+ esac
|
||||||
|
+ done
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+function validate_device
|
||||||
|
+{
|
||||||
|
+ if [ -z "$DEVICE" ]; then
|
||||||
|
+ usage
|
||||||
|
+ exit 1
|
||||||
|
+ fi
|
||||||
|
+ if [[ "$DEVICE" =~ ^[[:digit:]]+:[[:digit:]]+$ ]]; then
|
||||||
|
+ MAJOR=${DEVICE%%:*}
|
||||||
|
+ MINOR=${DEVICE##*:}
|
||||||
|
+ DEVNAME=`dmsetup ls --target multipath | grep "($MAJOR, $MINOR)$" | awk '{print $1}'`
|
||||||
|
+ else
|
||||||
|
+ DEVNAME=`dmsetup ls --target multipath | awk '{print $1}' | grep "^$DEVICE$"`
|
||||||
|
+ fi
|
||||||
|
+ if [ -z "$DEVNAME" ]; then
|
||||||
|
+ DEVNAME=`multipath -v 1 -l $DEVICE 2>/dev/null`
|
||||||
|
+ if [ -z "$DEVNAME" ]; then
|
||||||
|
+ echo "$DEVICE is not a multipath device"
|
||||||
|
+ exit 1
|
||||||
|
+ fi
|
||||||
|
+ # verify that this is not a native nvme multipath device
|
||||||
|
+ dmsetup ls --target multipath | awk '{print $1}' | grep -q "^$DEVNAME$"
|
||||||
|
+ if test $? -eq 1; then
|
||||||
|
+ echo "$DEVICE is not a device-mapper multipath device"
|
||||||
|
+ exit 1
|
||||||
|
+ fi
|
||||||
|
+ fi
|
||||||
|
+ if [ -z "$MINOR" ]; then
|
||||||
|
+ MINOR=`dmsetup info -c --noheadings -o minor $DEVNAME`
|
||||||
|
+ fi
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+function get_paths
|
||||||
|
+{
|
||||||
|
+ PATHDEVS=`ls /sys/block/dm-$MINOR/slaves`
|
||||||
|
+ for PATHDEV in $PATHDEVS; do
|
||||||
|
+ if [[ ! "$PATHDEV" =~ ^sd[a-z]+$ ]]; then
|
||||||
|
+ echo "$PATHDEV is not a scsi device. $PROGRAM only works with scsi devices"
|
||||||
|
+ exit 1
|
||||||
|
+ fi
|
||||||
|
+ done
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+function remove_devs
|
||||||
|
+{
|
||||||
|
+ pidof multipathd > /dev/null
|
||||||
|
+ HAVE_MULTIPATHD=$?
|
||||||
|
+ multipath -v2 -l "$DEVNAME" | grep features | grep -q queue_if_no_path
|
||||||
|
+ QUEUEING=$?
|
||||||
|
+ if [ -n "$FLUSH" ] && [ "$QUEUEING" -eq 0 ]; then
|
||||||
|
+ if test $HAVE_MULTIPATHD -eq 0; then
|
||||||
|
+ multipathd disablequeueing map "$DEVNAME" > /dev/null
|
||||||
|
+ else
|
||||||
|
+ dmsetup message "$DEVNAME" 0 fail_if_no_path
|
||||||
|
+ fi
|
||||||
|
+ sleep 1
|
||||||
|
+ fi
|
||||||
|
+ if test $HAVE_MULTIPATHD -eq 0; then
|
||||||
|
+ multipath -f "$DEVNAME"
|
||||||
|
+ else
|
||||||
|
+ multipathd -Df "$DEVNAME"
|
||||||
|
+ fi
|
||||||
|
+ if test $? -eq 1; then
|
||||||
|
+ echo "$DEVICE cannot be removed"
|
||||||
|
+ exit 1
|
||||||
|
+ fi
|
||||||
|
+ for PATHDEV in $PATHDEVS; do
|
||||||
|
+ if [ -n "$FLUSH" ]; then
|
||||||
|
+ blockdev --flushbufs /dev/"$PATHDEV"
|
||||||
|
+ fi
|
||||||
|
+ echo 1 > /sys/block/"$PATHDEV"/device/delete
|
||||||
|
+ done
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+function verify_removal
|
||||||
|
+{
|
||||||
|
+ multipath -v 1 -d $DEVNAME | grep -q "^$DEVNAME$"
|
||||||
|
+ if test $? -eq 0; then
|
||||||
|
+ echo "$DEVICE removed but path devices still exist"
|
||||||
|
+ exit 1
|
||||||
|
+ fi
|
||||||
|
+ multipath -v 1 -l $DEVNAME | grep -q "^$DEVNAME$"
|
||||||
|
+ if test $? -eq 0; then
|
||||||
|
+ echo "$DEVICE removal succeeded, but device still exists"
|
||||||
|
+ exit 1
|
||||||
|
+ fi
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+PROGRAM="$0"
|
||||||
|
+parse_args "$@"
|
||||||
|
+validate_device
|
||||||
|
+get_paths
|
||||||
|
+remove_devs
|
||||||
|
+verify_removal
|
@ -0,0 +1,93 @@
|
|||||||
|
# This is a basic configuration file with some examples, for device mapper
|
||||||
|
# multipath.
|
||||||
|
#
|
||||||
|
# For a complete list of the default configuration values, run either
|
||||||
|
# multipath -t
|
||||||
|
# or
|
||||||
|
# multipathd show config
|
||||||
|
#
|
||||||
|
# For a list of configuration options with descriptions, see the multipath.conf
|
||||||
|
# man page
|
||||||
|
|
||||||
|
## By default, devices with vendor = "IBM" and product = "S/390.*" are
|
||||||
|
## blacklisted. To enable mulitpathing on these devies, uncomment the
|
||||||
|
## following lines.
|
||||||
|
#blacklist_exceptions {
|
||||||
|
# device {
|
||||||
|
# vendor "IBM"
|
||||||
|
# product "S/390.*"
|
||||||
|
# }
|
||||||
|
#}
|
||||||
|
|
||||||
|
## Use user friendly names, instead of using WWIDs as names.
|
||||||
|
defaults {
|
||||||
|
user_friendly_names yes
|
||||||
|
find_multipaths yes
|
||||||
|
}
|
||||||
|
##
|
||||||
|
## Here is an example of how to configure some standard options.
|
||||||
|
##
|
||||||
|
#
|
||||||
|
#defaults {
|
||||||
|
# udev_dir /dev
|
||||||
|
# polling_interval 10
|
||||||
|
# selector "round-robin 0"
|
||||||
|
# path_grouping_policy multibus
|
||||||
|
# prio alua
|
||||||
|
# path_checker readsector0
|
||||||
|
# rr_min_io 100
|
||||||
|
# max_fds 8192
|
||||||
|
# rr_weight priorities
|
||||||
|
# failback immediate
|
||||||
|
# no_path_retry fail
|
||||||
|
# user_friendly_names yes
|
||||||
|
#}
|
||||||
|
##
|
||||||
|
## The wwid line in the following blacklist section is shown as an example
|
||||||
|
## of how to blacklist devices by wwid. The 2 devnode lines are the
|
||||||
|
## compiled in default blacklist. If you want to blacklist entire types
|
||||||
|
## of devices, such as all scsi devices, you should use a devnode line.
|
||||||
|
## However, if you want to blacklist specific devices, you should use
|
||||||
|
## a wwid line. Since there is no guarantee that a specific device will
|
||||||
|
## not change names on reboot (from /dev/sda to /dev/sdb for example)
|
||||||
|
## devnode lines are not recommended for blacklisting specific devices.
|
||||||
|
##
|
||||||
|
#blacklist {
|
||||||
|
# wwid 26353900f02796769
|
||||||
|
# devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
|
||||||
|
# devnode "^hd[a-z]"
|
||||||
|
#}
|
||||||
|
#multipaths {
|
||||||
|
# multipath {
|
||||||
|
# wwid 3600508b4000156d700012000000b0000
|
||||||
|
# alias yellow
|
||||||
|
# path_grouping_policy multibus
|
||||||
|
# path_checker readsector0
|
||||||
|
# path_selector "round-robin 0"
|
||||||
|
# failback manual
|
||||||
|
# rr_weight priorities
|
||||||
|
# no_path_retry 5
|
||||||
|
# }
|
||||||
|
# multipath {
|
||||||
|
# wwid 1DEC_____321816758474
|
||||||
|
# alias red
|
||||||
|
# }
|
||||||
|
#}
|
||||||
|
#devices {
|
||||||
|
# device {
|
||||||
|
# vendor "COMPAQ "
|
||||||
|
# product "HSV110 (C)COMPAQ"
|
||||||
|
# path_grouping_policy multibus
|
||||||
|
# path_checker readsector0
|
||||||
|
# path_selector "round-robin 0"
|
||||||
|
# hardware_handler "0"
|
||||||
|
# failback 15
|
||||||
|
# rr_weight priorities
|
||||||
|
# no_path_retry queue
|
||||||
|
# }
|
||||||
|
# device {
|
||||||
|
# vendor "COMPAQ "
|
||||||
|
# product "MSA1000 "
|
||||||
|
# path_grouping_policy multibus
|
||||||
|
# }
|
||||||
|
#}
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue