All of lore.kernel.org
 help / color / mirror / Atom feed
From: Martin Wilck <mwilck@suse.com>
To: Christophe Varoqui <christophe.varoqui@opensvc.com>,
	Benjamin Marzinski <bmarzins@redhat.com>
Cc: dm-devel@redhat.com, Martin Wilck <mwilck@suse.com>
Subject: [PATCH v5 19/22] multipath -u: don't grab devices already passed to system
Date: Sat, 14 Apr 2018 00:00:12 +0200	[thread overview]
Message-ID: <20180413220015.7032-20-mwilck@suse.com> (raw)
In-Reply-To: <20180413220015.7032-1-mwilck@suse.com>

Setting SYSTEMD_READY=0 on a device that has previously been passed to
systemd is dangerous - already mounted file systems might be unmounted by
systemd.

Avoid that by checking for previously set DM_MULTIPATH_DEVICE_PATH
environment variable.

This requires to change the exit status of multipath -u - it needs to exit
with status 0 even if the path is not a multipath device path, otherwise
udev doesn't import the printed key-value pairs. We do this only for
"multipath -u"; legacy "multipath -c", which is more likely to be run in user
scripts, still exits with 1 for non-multipath devices.

The condition ENV{DM_MULTIPATH_DEVICE_PATH}!="1" before the "multipath -u"
statement in multipath.rules needs to be removed. This condition was
pointless anyway, because until this patch, DM_MULTIPATH_DEVICE_PATH hadn't
been imported from the db and thus was never set, and "multipath -u" was
always invoked. We want to keep this behavior.

Signed-off-by: Martin Wilck <mwilck@suse.com>
---
 multipath/main.c          | 46 +++++++++++++++++++++++++++++++++++++++++++++-
 multipath/multipath.rules |  5 ++++-
 2 files changed, 49 insertions(+), 2 deletions(-)

diff --git a/multipath/main.c b/multipath/main.c
index 96e37a7a..573d94f9 100644
--- a/multipath/main.c
+++ b/multipath/main.c
@@ -25,6 +25,7 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <unistd.h>
 #include <ctype.h>
 #include <libudev.h>
@@ -494,6 +495,25 @@ static int print_cmd_valid(int k, const vector pathvec,
 	return k == 1;
 }
 
+/*
+ * Returns true if this device has been handled before,
+ * and released to systemd.
+ *
+ * This must be called before get_refwwid(),
+ * otherwise udev_device_new_from_environment() will have
+ * destroyed environ(7).
+ */
+static bool released_to_systemd(void)
+{
+	static const char dmdp[] = "DM_MULTIPATH_DEVICE_PATH";
+	const char *dm_mp_dev_path = getenv(dmdp);
+	bool ret;
+
+	ret = dm_mp_dev_path != NULL && !strcmp(dm_mp_dev_path, "0");
+	condlog(4, "%s: %s=%s -> %d", __func__, dmdp, dm_mp_dev_path, ret);
+	return ret;
+}
+
 /*
  * Return value:
  *  -1: Retry
@@ -511,6 +531,7 @@ configure (struct config *conf, enum mpath_cmds cmd,
 	int di_flag = 0;
 	char * refwwid = NULL;
 	char * dev = NULL;
+	bool released = released_to_systemd();
 
 	/*
 	 * allocate core vectors to store paths and multipaths
@@ -602,6 +623,20 @@ configure (struct config *conf, enum mpath_cmds cmd,
 				r = 0;
 				goto print_valid;
 			}
+
+			/*
+			 * DM_MULTIPATH_DEVICE_PATH=="0" means that we have
+			 * been called for this device already, and have
+			 * released it to systemd. Unless the device is now
+			 * already multipathed (see above), we can't try to
+			 * grab it, because setting SYSTEMD_READY=0 would
+			 * cause file systems to be unmounted.
+			 * Leave DM_MULTIPATH_DEVICE_PATH="0".
+			 */
+			if (released) {
+				r = 1;
+				goto print_valid;
+			}
 			if (r == 0)
 				goto print_valid;
 			/* find_multipaths_on: Fall through to path detection */
@@ -641,7 +676,9 @@ configure (struct config *conf, enum mpath_cmds cmd,
 
 	if (cmd == CMD_VALID_PATH) {
 		/* This only happens if find_multipaths and
-		 * ignore_wwids is set.
+		 * ignore_wwids is set, and the path is not in WWIDs
+		 * file, not currently multipathed, and has
+		 * never been released to systemd.
 		 * If there is currently a multipath device matching
 		 * the refwwid, or there is more than one path matching
 		 * the refwwid, then the path is valid */
@@ -1064,6 +1101,13 @@ out:
 	cleanup_prio();
 	cleanup_checkers();
 
+	/*
+	 * multipath -u must exit with status 0, otherwise udev won't
+	 * import its output.
+	 */
+	if (cmd == CMD_VALID_PATH && dev_type == DEV_UEVENT && r == 1)
+		r = 0;
+
 	if (dev_type == DEV_UEVENT)
 		closelog();
 
diff --git a/multipath/multipath.rules b/multipath/multipath.rules
index 37f4f6d8..ef857271 100644
--- a/multipath/multipath.rules
+++ b/multipath/multipath.rules
@@ -21,8 +21,11 @@ LABEL="test_dev"
 ENV{MPATH_SBIN_PATH}="/sbin"
 TEST!="$env{MPATH_SBIN_PATH}/multipath", ENV{MPATH_SBIN_PATH}="/usr/sbin"
 
+# multipath -u needs to know if this device has ever been exported
+IMPORT{db}="DM_MULTIPATH_DEVICE_PATH"
+
 # multipath -u sets DM_MULTIPATH_DEVICE_PATH
-ENV{DM_MULTIPATH_DEVICE_PATH}!="1", IMPORT{program}="$env{MPATH_SBIN_PATH}/multipath -u %k"
+IMPORT{program}="$env{MPATH_SBIN_PATH}/multipath -u %k"
 ENV{DM_MULTIPATH_DEVICE_PATH}=="1", ENV{ID_FS_TYPE}="mpath_member", \
 	ENV{SYSTEMD_READY}="0"
 
-- 
2.16.1

  parent reply	other threads:[~2018-04-13 22:00 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-13 21:59 [PATCH v5 00/22] multipath path classification Martin Wilck
2018-04-13 21:59 ` [PATCH v5 01/22] Revert "multipath: ignore -i if find_multipaths is set" Martin Wilck
2018-04-16  6:07   ` Hannes Reinecke
2018-04-13 21:59 ` [PATCH v5 02/22] Revert "multipathd: imply -n " Martin Wilck
2018-04-16  6:07   ` Hannes Reinecke
2018-04-13 21:59 ` [PATCH v5 03/22] libmultipath: should_multipath: keep existing maps Martin Wilck
2018-04-16  6:08   ` Hannes Reinecke
2018-04-13 21:59 ` [PATCH v5 04/22] multipath -u -i: respect entries in WWIDs file Martin Wilck
2018-04-16  6:09   ` Hannes Reinecke
2018-04-13 21:59 ` [PATCH v5 05/22] libmultipath: trigger change uevent on new device creation Martin Wilck
2018-04-16  6:10   ` Hannes Reinecke
2018-04-13 21:59 ` [PATCH v5 06/22] libmultipath: trigger path uevent only when necessary Martin Wilck
2018-04-16  6:10   ` Hannes Reinecke
2018-04-13 22:00 ` [PATCH v5 07/22] libmultipath: change find_multipaths option to multi-value Martin Wilck
2018-04-16  6:11   ` Hannes Reinecke
2018-04-13 22:00 ` [PATCH v5 08/22] libmultipath: use const char* in open_file() Martin Wilck
2018-04-16  6:11   ` Hannes Reinecke
2018-04-13 22:00 ` [PATCH v5 09/22] libmultipath: functions to indicate mapping failure in /dev/shm Martin Wilck
2018-04-16  6:12   ` Hannes Reinecke
2018-04-13 22:00 ` [PATCH v5 10/22] libmultipath: indicate wwid failure in dm_addmap_create() Martin Wilck
2018-04-16  6:13   ` Hannes Reinecke
2018-04-13 22:00 ` [PATCH v5 11/22] multipath -u: common code path for result message Martin Wilck
2018-04-16  6:14   ` Hannes Reinecke
2018-04-13 22:00 ` [PATCH v5 12/22] multipath -u: change output to environment/key format Martin Wilck
2018-04-16  6:14   ` Hannes Reinecke
2018-04-13 22:00 ` [PATCH v5 13/22] multipath -u: treat failed wwids as invalid Martin Wilck
2018-04-16  6:21   ` Hannes Reinecke
2018-04-13 22:00 ` [PATCH v5 14/22] multipath -u: add DM_MULTIPATH_DEVICE_PATH=2 for "maybe" Martin Wilck
2018-04-16  6:23   ` Hannes Reinecke
2018-04-13 22:00 ` [PATCH v5 15/22] libmultipath: implement find_multipaths_timeout Martin Wilck
2018-04-16  6:23   ` Hannes Reinecke
2018-04-13 22:00 ` [PATCH v5 16/22] multipath -u : set FIND_MULTIPATHS_WAIT_UNTIL from /dev/shm Martin Wilck
2018-04-16  6:25   ` Hannes Reinecke
2018-04-16 19:40   ` Benjamin Marzinski
2018-04-13 22:00 ` [PATCH v5 17/22] multipath -u: cleanup logic Martin Wilck
2018-04-16  6:26   ` Hannes Reinecke
2018-04-16 20:52   ` Benjamin Marzinski
2018-04-13 22:00 ` [PATCH v5 18/22] multipath -u: quick check if path is multipathed Martin Wilck
2018-04-16  6:29   ` Hannes Reinecke
2018-04-13 22:00 ` Martin Wilck [this message]
2018-04-16  6:30   ` [PATCH v5 19/22] multipath -u: don't grab devices already passed to system Hannes Reinecke
2018-04-16 21:29   ` Benjamin Marzinski
2018-04-13 22:00 ` [PATCH v5 20/22] multipath -u: test if path is busy Martin Wilck
2018-04-16  6:32   ` Hannes Reinecke
2018-04-16  8:00     ` Martin Wilck
2018-04-16 23:15   ` Benjamin Marzinski
2018-04-13 22:00 ` [PATCH v5 21/22] libmultipath: enable find_multipaths "smart" Martin Wilck
2018-04-16  6:40   ` Hannes Reinecke
2018-04-13 22:00 ` [PATCH v5 22/22] multipath.rules: find_multipaths "smart" logic Martin Wilck
2018-04-16  6:40   ` Hannes Reinecke

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180413220015.7032-20-mwilck@suse.com \
    --to=mwilck@suse.com \
    --cc=bmarzins@redhat.com \
    --cc=christophe.varoqui@opensvc.com \
    --cc=dm-devel@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.