@@ -12,6 +12,7 @@
#include <string.h>
#include <sys/file.h>
#include <errno.h>
+#include <ctype.h>
#include <libdevmapper.h>
#include <libudev.h>
#include "mpath_cmd.h"
@@ -476,9 +477,17 @@ trigger_paths_udev_change(struct multipath *mpp, bool is_mpath)
env = udev_device_get_property_value(
pp->udev, "DM_MULTIPATH_DEVICE_PATH");
- if (is_mpath && env != NULL && !strcmp(env, "1"))
- continue;
- else if (!is_mpath &&
+ if (is_mpath && env != NULL && !strcmp(env, "1")) {
+ /*
+ * If FIND_MULTIPATHS_WAIT_UNTIL is not "0",
+ * path is in "maybe" state and timer is running
+ * Send uevent now (see multipath.rules).
+ */
+ env = udev_device_get_property_value(
+ pp->udev, "FIND_MULTIPATHS_WAIT_UNTIL");
+ if (env == NULL || !strcmp(env, "0"))
+ continue;
+ } else if (!is_mpath &&
(env == NULL || !strcmp(env, "0")))
continue;
@@ -245,6 +245,7 @@ static const char * const find_multipaths_optvals[] = {
[FIND_MULTIPATHS_ON] = "on",
[FIND_MULTIPATHS_STRICT] = "strict",
[FIND_MULTIPATHS_GREEDY] = "greedy",
+ [FIND_MULTIPATHS_SMART] = "smart",
};
static int
@@ -978,6 +978,19 @@ with the same WWID have been detected.
Both multipathd and multipath treat every non-blacklisted device as multipath
device path.
.TP
+.I smart
+This differs from \fIfind_multipaths yes\fR only in
+the way it treats new devices for which only one path has been
+detected yet. When such a device is first encounted in udev rules, it is
+treated as a multipath device. multipathd waits whether additional paths with
+the same WWID appears. If that happens, it sets up a multipath map. If it
+doesn\'t happen until a
+timeout expires, or if setting up the map fails, a new uevent is triggered for
+the device; at second encounter in the udev rules, the device will be treated
+as non-multipath and passed on to upper layers.
+\fBNote:\fR this may cause delays during device detection if
+there are single-path devices which aren\'t blacklisted.
+.TP
The default is: \fBstrict\fR
.RE
.