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
|
||
|
|