device-mapper-multipath/0072-libmultipath-add-ignore_udev_uid-option.patch
Benjamin Marzinski 9abdc502cf device-mapper-multipath-0.8.4-4
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
2020-07-21 17:39:38 -05:00

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