dmt->type == DM_DEVICE_REMOVE ||
dmt->type == DM_DEVICE_RENAME;
- /*
- * Prevent udev vs. libdevmapper race when processing nodes and
- * symlinks. This can happen when the udev rules are installed and
- * udev synchronisation code is enabled in libdevmapper but the
- * software using libdevmapper does not make use of it (by not calling
- * dm_task_set_cookie before). We need to instruct the udev rules not
- * to be applied at all in this situation so we can gracefully fallback
- * to libdevmapper's node and symlink creation code.
- */
- if (dm_udev_get_sync_support() && !dmt->cookie_set && ioctl_with_uevent) {
- log_debug("Cookie value is not set while trying to call "
- "DM_DEVICE_RESUME, DM_DEVICE_REMOVE or DM_DEVICE_RENAME "
- "ioctl. Please, consider using libdevmapper's udev "
- "synchronisation interface or disable it explicitly "
- "by calling dm_udev_set_sync_support(0).");
- log_debug("Switching off device-mapper and all subsystem related "
- "udev rules. Falling back to libdevmapper node creation.");
+ if (ioctl_with_uevent && dm_cookie_supported()) {
/*
- * Disable general dm and subsystem rules but keep dm disk rules
- * if not flagged out explicitly before. We need /dev/disk content
- * for the software that expects it.
- */
- dmi->event_nr |= (DM_UDEV_DISABLE_DM_RULES_FLAG |
- DM_UDEV_DISABLE_SUBSYSTEM_RULES_FLAG) <<
+ * Always mark events coming from libdevmapper as
+ * "primary sourced". This is needed to distinguish
+ * any spurious events so we can act appropriately.
+ * This needs to be applied even when udev_sync is
+ * not used because udev flags could be used alone.
+ */
+ dmi->event_nr |= DM_UDEV_PRIMARY_SOURCE_FLAG <<
DM_UDEV_FLAGS_SHIFT;
+
+ /*
+ * Prevent udev vs. libdevmapper race when processing nodes
+ * and symlinks. This can happen when the udev rules are
+ * installed and udev synchronisation code is enabled in
+ * libdevmapper but the software using libdevmapper does not
+ * make use of it (by not calling dm_task_set_cookie before).
+ * We need to instruct the udev rules not to be applied at
+ * all in this situation so we can gracefully fallback to
+ * libdevmapper's node and symlink creation code.
+ */
+ if (!dmt->cookie_set && dm_udev_get_sync_support()) {
+ log_debug("Cookie value is not set while trying to call "
+ "DM_DEVICE_RESUME, DM_DEVICE_REMOVE or DM_DEVICE_RENAME "
+ "ioctl. Please, consider using libdevmapper's udev "
+ "synchronisation interface or disable it explicitly "
+ "by calling dm_udev_set_sync_support(0).");
+ log_debug("Switching off device-mapper and all subsystem related "
+ "udev rules. Falling back to libdevmapper node creation.");
+ /*
+ * Disable general dm and subsystem rules but keep
+ * dm disk rules if not flagged out explicitly before.
+ * We need /dev/disk content for the software that expects it.
+ */
+ dmi->event_nr |= (DM_UDEV_DISABLE_DM_RULES_FLAG |
+ DM_UDEV_DISABLE_SUBSYSTEM_RULES_FLAG) <<
+ DM_UDEV_FLAGS_SHIFT;
+ }
}
log_debug("dm %s %s %s%s%s %s%.0d%s%.0d%s"
* udev does something improperly.
*/
#define DM_UDEV_DISABLE_LIBRARY_FALLBACK 0x0020
+/*
+ * DM_UDEV_PRIMARY_SOURCE_FLAG is automatically appended by
+ * libdevmapper for all ioctls generating udev uevents. Once used in
+ * udev rules, we know if this is a real "primary sourced" event or not.
+ * We need to distinguish real events originated in libdevmapper from
+ * any spurious events to gather all missing information (e.g. events
+ * generated as a result of "udevadm trigger" command or as a result
+ * of the "watch" udev rule).
+ */
+#define DM_UDEV_PRIMARY_SOURCE_FLAG 0x0040
int dm_cookie_supported(void);
ACTION!="add|change", GOTO="dm_end"
+# There is no cookie set nor any flags encoded in events not originating
+# in libdevmapper so we need to detect this and try to behave correctly.
+# For such spurious events, regenerate all flags from current udev database content
+# (this information would normally be inaccessible for spurious ADD and CHANGE events).
+ENV{DM_UDEV_PRIMARY_SOURCE_FLAG}=="1", GOTO="dm_flags_done"
+IMPORT{db}="DM_UDEV_DISABLE_DM_RULES_FLAG"
+IMPORT{db}="DM_UDEV_DISABLE_SUBSYSTEM_RULES_FLAG"
+IMPORT{db}="DM_UDEV_DISABLE_DISK_RULES_FLAG"
+IMPORT{db}="DM_UDEV_DISABLE_OTHER_RULES_FLAG"
+IMPORT{db}="DM_UDEV_LOW_PRIORITY_FLAG"
+IMPORT{db}="DM_UDEV_DISABLE_LIBRARY_FALLBACK_FLAG"
+IMPORT{db}="DM_UDEV_FLAG7"
+IMPORT{db}="DM_SUBSYSTEM_UDEV_FLAG0"
+IMPORT{db}="DM_SUBSYSTEM_UDEV_FLAG1"
+IMPORT{db}="DM_SUBSYSTEM_UDEV_FLAG2"
+IMPORT{db}="DM_SUBSYSTEM_UDEV_FLAG3"
+IMPORT{db}="DM_SUBSYSTEM_UDEV_FLAG4"
+IMPORT{db}="DM_SUBSYSTEM_UDEV_FLAG5"
+IMPORT{db}="DM_SUBSYSTEM_UDEV_FLAG6"
+IMPORT{db}="DM_SUBSYSTEM_UDEV_FLAG7"
+LABEL="dm_flags_done"
+
# Normally, we operate on "change" events only. But when
# coldplugging, there's an "add" event present. We have to
# recognize this and do our actions in this particular