All of lore.kernel.org
 help / color / mirror / Atom feed
From: Martin Wilck <mwilck@suse.com>
To: Christophe Varoqui <christophe.varoqui@opensvc.com>,
	dm-devel@redhat.com, Benjamin Marzinski <bmarzins@redhat.com>
Cc: Xose Vazquez Perez <xose.vazquez@gmail.com>,
	Martin Wilck <mwilck@suse.com>
Subject: [RFC PATCH 14/16] multipath.rules: find_multipaths+ignore_wwids logic
Date: Fri, 19 Jan 2018 01:29:14 +0100	[thread overview]
Message-ID: <20180119002916.10323-15-mwilck@suse.com> (raw)
In-Reply-To: <20180119002916.10323-1-mwilck@suse.com>

Solve the problem that, when the first path to a device appears,
we don't know if more paths are going to follow.

These rules apply only if both find_multipaths and ignore_wwids are
set in multipath.conf.

multipath -u sets DM_MULTIPATH_DEVICE_PATH=2 if a device is "maybe"
a multipath member (not blacklisted, only one path seen).
In that case, pretend to be a multipath member and disallow further
processing by systemd (allowing multipathd some time to grab the path),
and check again after some time. If the path is still not multipathed by then,
pass it on to systemd for further processing. Ensure that this happens only
once. The timeout values FIND_MULTIPATHS_BOOT_TMO (time to wait since system
boot) and FIND_MULTIPATHS_PATH_TMO (time to wait after detection of first
path) can be configured in udev rules that are run before "multipath.rules".
The earlier timeout wins, thus if the first path is detected after
FIND_MULTIPATHS_BOOT_TMO has expired, the timer will expire immediately.
---
 multipath/multipath.rules | 59 +++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 57 insertions(+), 2 deletions(-)

diff --git a/multipath/multipath.rules b/multipath/multipath.rules
index 5b3c3c9c1135..6b4a418d0009 100644
--- a/multipath/multipath.rules
+++ b/multipath/multipath.rules
@@ -19,9 +19,64 @@ LABEL="test_dev"
 ENV{MPATH_SBIN_PATH}="/sbin"
 TEST!="$env{MPATH_SBIN_PATH}/multipath", ENV{MPATH_SBIN_PATH}="/usr/sbin"
 
+# find_multipaths + ignore_wwids logic, part 1
+#
+# Recover environment on next uevent after waiting for the timer.
+# This happens only once because DM_MULTIPATH_SAVED_FS_TYPE will be empty
+# on subsequent events.
+
+IMPORT{db}="DM_MULTIPATH_WAIT_DONE"
+IMPORT{db}="DM_MULTIPATH_SAVED_FS_TYPE"
+ENV{DM_MULTIPATH_WAIT_DONE}!="1", GOTO="skip_restore"
+ENV{DM_MULTIPATH_SAVED_FS_TYPE}=="", GOTO="skip_restore"
+
+# Reset if it's our dummy value, see below
+ENV{DM_MULTIPATH_SAVED_FS_TYPE}=="dm_multipath_unkown", ENV{DM_MULTIPATH_SAVED_FS_TYPE}=""
+ENV{ID_FS_TYPE}="$env{DM_MULTIPATH_SAVED_FS_TYPE}"
+ENV{DM_MULTIPATH_SAVED_FS_TYPE}=""
+ENV{DM_MULTIPATH_DEVICE_PATH}=""
+ENV{SYSTEMD_READY}=""
+
+# Special case:
+# An "add" event happened while we were waiting for the timer.
+# This happens during "coldplug" after switching root FS, if a timer
+# started during initramfs processing was interrupted. We may not have
+# waited long enough: try again.
+ACTION=="add", ENV{DM_MULTIPATH_WAIT_DONE}=""
+
+LABEL="skip_restore"
+
 # multipath -u sets DM_MULTIPATH_DEVICE_PATH
-ENV{DM_MULTIPATH_DEVICE_PATH}!="1", IMPORT="$env{MPATH_SBIN_PATH}/multipath -u %k"
+ENV{DM_MULTIPATH_DEVICE_PATH}!="1", 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"
+	ENV{SYSTEMD_READY}="0", GOTO="end_mpath"
+
+# find_multipaths + ignore_wwids logic, part 2
+#
+# multipath -u sets DM_MULTIPATH_DEVICE_PATH=2 if a device is "maybe"
+# a multipath member (not blacklisted, only one path seen).
+# In that case, pretend to be a multipath member (allowing multipathd
+# some time to grab the path), and check again after some time.
+# If the path is still not multipathed by then, pass it on to systemd
+# for further processing.
+# DM_MULTIPATH_WAIT_DONE ensures that this happens only once.
+# (But see "special case" exception above).
+
+ENV{DM_MULTIPATH_WAIT_DONE}=="1", GOTO="end_mpath"
+ENV{DM_MULTIPATH_DEVICE_PATH}!="2", GOTO="end_mpath"
+
+# Default timeout values for the timer. Use early udev rules files to customize.
+# Timeouts are in seconds after system boot, and seconds after first path
+# discovery, respectively. The earlier timeout wins.
+ENV{FIND_MULTIPATHS_BOOT_TMO}!="?*", ENV{FIND_MULTIPATHS_BOOT_TMO}="180"
+ENV{FIND_MULTIPATHS_PATH_TMO}!="?*", ENV{FIND_MULTIPATHS_PATH_TMO}="30"
+
+ENV{DM_MULTIPATH_WAIT_DONE}="1"
+ENV{DM_MULTIPATH_SAVED_FS_TYPE}="$env{ID_FS_TYPE}"
+ENV{DM_MULTIPATH_SAVED_FS_TYPE}=="", ENV{DM_MULTIPATH_SAVED_FS_TYPE}="dm_multipath_unkown"
+ENV{ID_FS_TYPE}="maybe_mpath_member"
+ENV{DM_MULTIPATH_DEVICE_PATH}="1"
+ENV{SYSTEMD_READY}="0"
+RUN+="/usr/bin/systemd-run --action change --on-boot $env{FIND_MULTIPATHS_BOOT_TMO} --on-active $env{FIND_MULTIPATHS_PATH_TMO} /usr/bin/udevadm trigger $sys$devpath"
 
 LABEL="end_mpath"
-- 
2.15.1

  parent reply	other threads:[~2018-01-19  0:29 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-19  0:29 [RFC PATCH 00/16] multipath path classification Martin Wilck
2018-01-19  0:29 ` [RFC PATCH 01/16] Revert "multipath: ignore -i if find_multipaths is set" Martin Wilck
2018-01-19  0:29 ` [RFC PATCH 02/16] Revert "multipathd: imply -n " Martin Wilck
2018-01-19  0:29 ` [RFC PATCH 03/16] libmultipath: add mpvec param to should_multipath() Martin Wilck
2018-01-19  0:29 ` [RFC PATCH 04/16] libmultipath: should_multipath: keep existing maps Martin Wilck
2018-01-19 16:06   ` Benjamin Marzinski
2018-01-19  0:29 ` [RFC PATCH 05/16] multipath -u -i: change logic for find_multipaths Martin Wilck
2018-01-19  0:29 ` [RFC PATCH 06/16] libmultipath: let ignore_wwids be set in config file Martin Wilck
2018-01-19  0:29 ` [RFC PATCH 07/16] multipathd: replace -n with !ignore_wwids Martin Wilck
2018-01-19  0:29 ` [RFC PATCH 08/16] multipath.conf.5: document "ignore_wwids" Martin Wilck
2018-01-19  0:29 ` [RFC PATCH 09/16] multipath.8: adapt documentation of '-i' Martin Wilck
2018-01-19  0:29 ` [RFC PATCH 10/16] multipathd.8: document that '-n' is now ignored Martin Wilck
2018-01-19  0:29 ` [RFC PATCH 11/16] multipath: common code path for CMD_VALID_PATH Martin Wilck
2018-01-19  0:29 ` [RFC PATCH 12/16] multipath -u/-c: change output to environment/key format Martin Wilck
2018-01-19  0:29 ` [RFC PATCH 13/16] multipath -u/-c: add "$DEV is maybe a valid path" Martin Wilck
2018-01-19  0:29 ` Martin Wilck [this message]
2018-01-19 18:12   ` [RFC PATCH 14/16] multipath.rules: find_multipaths+ignore_wwids logic Benjamin Marzinski
2018-01-20  1:20     ` Martin Wilck
2018-01-21  3:21       ` Benjamin Marzinski
2018-01-22 21:56         ` Martin Wilck
2018-01-25 13:40           ` Benjamin Marzinski
2018-01-26 17:29             ` Martin Wilck
2018-01-29 22:28               ` Benjamin Marzinski
2018-01-30 13:07                 ` Martin Wilck
2018-01-30 23:40                   ` Benjamin Marzinski
2018-01-20  0:27   ` [FIX for 14/16] multipath.rules: set job properties for systemd-run correctly Martin Wilck
2018-01-19  0:29 ` [RFC PATCH 15/16] libmultipath: trigger change uevent on new device creation Martin Wilck
2018-01-19  0:29 ` [RFC PATCH 16/16] libmultipath: trigger path uevent only when necessary Martin Wilck
2018-03-07  8:53 ` [RFC PATCH 00/16] multipath path classification Christophe Varoqui
2018-03-07  9:26   ` Martin Wilck

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=20180119002916.10323-15-mwilck@suse.com \
    --to=mwilck@suse.com \
    --cc=bmarzins@redhat.com \
    --cc=christophe.varoqui@opensvc.com \
    --cc=dm-devel@redhat.com \
    --cc=xose.vazquez@gmail.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.