9abdc502cf
Rebased on top of additional commits staged for upstream * Previous patches 0048-0060 are now patches 0053-0054 & 0059-0069 Add 0048-libmultipath-add-device-to-hwtable.c.patch Add 0049-master-libmultipath-fix-use-after-free-when-iscsi-lo.patch Add 0050-libmultipath-warn-if-freeing-path-that-holds-mpp-hwe.patch Add 0051-libmultipath-warn-about-NULL-value-of-mpp-hwe.patch Add 0052-libmultipath-fix-mpp-hwe-handling-in-sync_paths.patch Add 0055-libmultipath-remove-code-duplication-in-path-countin.patch Add 0056-libmultipath-count-pending-paths-as-active-on-loads.patch Add 0057-libmultipath-deal-with-flushing-no-maps.patch Add 0058-multipath-deal-with-delegation-failures-correctly.patch Add 0070-multipath-add-libmpathvalid-library.patch * adds the libmpathvalid.so library to determine if devices are valid multipath paths. Add 0071-libmultipath-add-uid-failback-for-dasd-devices.patch Add 0072-libmultipath-add-ignore_udev_uid-option.patch
193 lines
6.6 KiB
Diff
193 lines
6.6 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Benjamin Marzinski <bmarzins@redhat.com>
|
|
Date: Wed, 20 May 2020 16:46:55 -0500
|
|
Subject: [PATCH] libmultipath: add ignore_udev_uid option
|
|
|
|
Setting this option to yes will force multipath to get the uid by using
|
|
the fallback sysfs methods, instead of getting it from udev. This will
|
|
cause devices that can't get their uid from the standard locations to
|
|
not get a uid. It will also disable uevent merging.
|
|
|
|
It will not stop uevents from being resent for device that failed to
|
|
get a WWID, although I'm on the fence about the benefit of this.
|
|
|
|
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
|
|
---
|
|
libmultipath/config.h | 1 +
|
|
libmultipath/dict.c | 4 ++++
|
|
libmultipath/discovery.c | 17 +++++++++++------
|
|
libmultipath/discovery.h | 8 +++++++-
|
|
libmultipath/uevent.c | 2 +-
|
|
multipath/multipath.conf.5 | 13 +++++++++++++
|
|
multipathd/main.c | 7 ++++++-
|
|
7 files changed, 43 insertions(+), 9 deletions(-)
|
|
|
|
diff --git a/libmultipath/config.h b/libmultipath/config.h
|
|
index 160867cd..c7a73fba 100644
|
|
--- a/libmultipath/config.h
|
|
+++ b/libmultipath/config.h
|
|
@@ -192,6 +192,7 @@ struct config {
|
|
int find_multipaths_timeout;
|
|
int marginal_pathgroups;
|
|
int skip_delegate;
|
|
+ int ignore_udev_uid;
|
|
unsigned int version[3];
|
|
unsigned int sequence_nr;
|
|
|
|
diff --git a/libmultipath/dict.c b/libmultipath/dict.c
|
|
index 184d4b22..9a0729bf 100644
|
|
--- a/libmultipath/dict.c
|
|
+++ b/libmultipath/dict.c
|
|
@@ -1406,6 +1406,9 @@ declare_hw_snprint(all_tg_pt, print_yes_no_undef)
|
|
declare_def_handler(marginal_pathgroups, set_yes_no)
|
|
declare_def_snprint(marginal_pathgroups, print_yes_no)
|
|
|
|
+declare_def_handler(ignore_udev_uid, set_yes_no)
|
|
+declare_def_snprint(ignore_udev_uid, print_yes_no)
|
|
+
|
|
static int
|
|
def_uxsock_timeout_handler(struct config *conf, vector strvec)
|
|
{
|
|
@@ -1816,6 +1819,7 @@ init_keywords(vector keywords)
|
|
install_keyword("enable_foreign", &def_enable_foreign_handler,
|
|
&snprint_def_enable_foreign);
|
|
install_keyword("marginal_pathgroups", &def_marginal_pathgroups_handler, &snprint_def_marginal_pathgroups);
|
|
+ install_keyword("ignore_udev_uid", &def_ignore_udev_uid_handler, &snprint_def_ignore_udev_uid);
|
|
__deprecated install_keyword("default_selector", &def_selector_handler, NULL);
|
|
__deprecated install_keyword("default_path_grouping_policy", &def_pgpolicy_handler, NULL);
|
|
__deprecated install_keyword("default_uid_attribute", &def_uid_attribute_handler, NULL);
|
|
diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
|
|
index 002d3d18..f0e92227 100644
|
|
--- a/libmultipath/discovery.c
|
|
+++ b/libmultipath/discovery.c
|
|
@@ -2010,7 +2010,7 @@ static bool has_uid_fallback(struct path *pp)
|
|
|
|
int
|
|
get_uid (struct path * pp, int path_state, struct udev_device *udev,
|
|
- int allow_fallback)
|
|
+ int fallback)
|
|
{
|
|
char *c;
|
|
const char *origin = "unknown";
|
|
@@ -2043,7 +2043,9 @@ get_uid (struct path * pp, int path_state, struct udev_device *udev,
|
|
} else
|
|
len = strlen(pp->wwid);
|
|
origin = "callout";
|
|
- } else {
|
|
+ } else if (fallback == UID_FALLBACK_FORCE)
|
|
+ len = uid_fallback(pp, path_state, &origin);
|
|
+ else {
|
|
bool udev_available = udev && pp->uid_attribute
|
|
&& *pp->uid_attribute;
|
|
|
|
@@ -2056,8 +2058,9 @@ get_uid (struct path * pp, int path_state, struct udev_device *udev,
|
|
else
|
|
origin = "udev";
|
|
}
|
|
- if ((!udev_available || (len <= 0 && allow_fallback))
|
|
- && has_uid_fallback(pp)) {
|
|
+ if ((!udev_available ||
|
|
+ (len <= 0 && fallback == UID_FALLBACK_ALLOW)) &&
|
|
+ has_uid_fallback(pp)) {
|
|
used_fallback = 1;
|
|
len = uid_fallback(pp, path_state, &origin);
|
|
}
|
|
@@ -2197,8 +2200,10 @@ int pathinfo(struct path *pp, struct config *conf, int mask)
|
|
}
|
|
|
|
if ((mask & DI_WWID) && !strlen(pp->wwid)) {
|
|
- get_uid(pp, path_state, pp->udev,
|
|
- (pp->retriggers >= conf->retrigger_tries));
|
|
+ int fallback = conf->ignore_udev_uid? UID_FALLBACK_FORCE :
|
|
+ (pp->retriggers >= conf->retrigger_tries)?
|
|
+ UID_FALLBACK_ALLOW : UID_FALLBACK_NONE;
|
|
+ get_uid(pp, path_state, pp->udev, fallback);
|
|
if (!strlen(pp->wwid)) {
|
|
if (pp->bus == SYSFS_BUS_UNDEF)
|
|
return PATHINFO_SKIPPED;
|
|
diff --git a/libmultipath/discovery.h b/libmultipath/discovery.h
|
|
index 6444887d..ca8542d6 100644
|
|
--- a/libmultipath/discovery.h
|
|
+++ b/libmultipath/discovery.h
|
|
@@ -54,8 +54,14 @@ ssize_t sysfs_get_inquiry(struct udev_device *udev,
|
|
unsigned char *buff, size_t len);
|
|
int sysfs_get_asymmetric_access_state(struct path *pp,
|
|
char *buff, int buflen);
|
|
+
|
|
+enum {
|
|
+ UID_FALLBACK_NONE,
|
|
+ UID_FALLBACK_ALLOW,
|
|
+ UID_FALLBACK_FORCE,
|
|
+};
|
|
int get_uid(struct path * pp, int path_state, struct udev_device *udev,
|
|
- int allow_fallback);
|
|
+ int fallback);
|
|
|
|
/*
|
|
* discovery bitmask
|
|
diff --git a/libmultipath/uevent.c b/libmultipath/uevent.c
|
|
index e0d13b11..d67129d1 100644
|
|
--- a/libmultipath/uevent.c
|
|
+++ b/libmultipath/uevent.c
|
|
@@ -179,7 +179,7 @@ uevent_need_merge(void)
|
|
bool need_merge = false;
|
|
|
|
conf = get_multipath_config();
|
|
- if (VECTOR_SIZE(&conf->uid_attrs) > 0)
|
|
+ if (!conf->ignore_udev_uid && VECTOR_SIZE(&conf->uid_attrs) > 0)
|
|
need_merge = true;
|
|
put_multipath_config(conf);
|
|
|
|
diff --git a/multipath/multipath.conf.5 b/multipath/multipath.conf.5
|
|
index 42a192f6..175ca095 100644
|
|
--- a/multipath/multipath.conf.5
|
|
+++ b/multipath/multipath.conf.5
|
|
@@ -286,6 +286,19 @@ The default is: \fB<unset>\fR
|
|
.
|
|
.
|
|
.TP
|
|
+.B ignore_udev_uid
|
|
+Setting this option to yes will force multipath to ignore the the uid_attrs
|
|
+and uid_attribute settings, and generate the WWID by the \fIsysfs\fR
|
|
+method. This will cause devices that cannot get their WWID from the standard
|
|
+locations for their device type to not get a WWID; see \fBWWID generation\fR
|
|
+below.
|
|
+.RS
|
|
+.TP
|
|
+The default is: \fBno\fR
|
|
+.RE
|
|
+.
|
|
+.
|
|
+.TP
|
|
.B prio
|
|
The name of the path priority routine. The specified routine
|
|
should return a numeric value specifying the relative priority
|
|
diff --git a/multipathd/main.c b/multipathd/main.c
|
|
index f014d2a1..48b62937 100644
|
|
--- a/multipathd/main.c
|
|
+++ b/multipathd/main.c
|
|
@@ -1226,6 +1226,7 @@ uev_update_path (struct uevent *uev, struct vectors * vecs)
|
|
if (pp) {
|
|
struct multipath *mpp = pp->mpp;
|
|
char wwid[WWID_SIZE];
|
|
+ int fallback;
|
|
|
|
if (pp->initialized == INIT_REQUESTED_UDEV) {
|
|
needs_reinit = 1;
|
|
@@ -1237,7 +1238,11 @@ uev_update_path (struct uevent *uev, struct vectors * vecs)
|
|
goto out;
|
|
|
|
strcpy(wwid, pp->wwid);
|
|
- rc = get_uid(pp, pp->state, uev->udev, 0);
|
|
+ conf = get_multipath_config();
|
|
+ fallback = conf->ignore_udev_uid? UID_FALLBACK_FORCE:
|
|
+ UID_FALLBACK_NONE;
|
|
+ put_multipath_config(conf);
|
|
+ rc = get_uid(pp, pp->state, uev->udev, fallback);
|
|
|
|
if (rc != 0)
|
|
strcpy(pp->wwid, wwid);
|
|
--
|
|
2.17.2
|
|
|