kpartx.rules: move symlink code to other files
authorMartin Wilck <>
Thu, 14 Sep 2017 20:00:10 +0000 (22:00 +0200)
committerChristophe Varoqui <>
Wed, 20 Sep 2017 16:51:02 +0000 (18:51 +0200)
Current kpartx.rules combines two purposes: setting properties and
creating symlinks for dm partition devices, and creating such
partition devices on top of other devices. This is contrary to
common conventions for udev rules files.

This patch moves the code for properties and symlinks into other
files. The code that generates symlinks for multipath maps is moved
to 11-dm-mpath.rules, and for partitions we introduce a new file
11-dm-parts.rules. Necessarily this results in minor code duplication.
OTOH quite some code is removed because the properties are now set
before 13-dm-disk.rules runs, so we can rely on the latter to create
the symlinks.

The reason I put this last in the series is that it will possibly
require changes in other packages, notably dracut, in order to make
sure partitions mappings are cleanly set up during boot.

Signed-off-by: Martin Wilck <>
kpartx/dm-parts.rules [new file with mode: 0644]

index da1e1fb..bf7362d 100644 (file)
@@ -29,6 +29,7 @@ install: $(EXEC) $(EXEC).8
        $(INSTALL_PROGRAM) -d $(DESTDIR)$(libudevdir)
        $(INSTALL_PROGRAM) -m 755 kpartx_id $(DESTDIR)$(libudevdir)
        $(INSTALL_PROGRAM) -d $(DESTDIR)$(libudevdir)/rules.d
+       $(INSTALL_PROGRAM) -m 644 dm-parts.rules $(DESTDIR)$(libudevdir)/rules.d/11-dm-parts.rules
        $(INSTALL_PROGRAM) -m 644 kpartx.rules $(DESTDIR)$(libudevdir)/rules.d/66-kpartx.rules
        $(INSTALL_PROGRAM) -m 644 del-part-nodes.rules $(DESTDIR)$(libudevdir)/rules.d/68-del-part-nodes.rules
        $(INSTALL_PROGRAM) -d $(DESTDIR)$(man8dir)
@@ -38,6 +39,7 @@ uninstall:
        $(RM) $(DESTDIR)$(bindir)/$(EXEC)
        $(RM) $(DESTDIR)$(man8dir)/$(EXEC).8.gz
        $(RM) $(DESTDIR)$(libudevdir)/kpartx_id
+       $(RM) $(DESTDIR)$(libudevdir)/rules.d/11-dm-parts.rules
        $(RM) $(DESTDIR)$(libudevdir)/rules.d/66-kpartx.rules
        $(RM) $(DESTDIR)$(libudevdir)/rules.d/67-kpartx-compat.rules
        $(RM) $(DESTDIR)$(libudevdir)/rules.d/68-del-part-nodes.rules
diff --git a/kpartx/dm-parts.rules b/kpartx/dm-parts.rules
new file mode 100644 (file)
index 0000000..235642f
--- /dev/null
@@ -0,0 +1,39 @@
+# Rules for partitions created by kpartx
+KERNEL!="dm-*", GOTO="dm_parts_end"
+ACTION!="add|change", GOTO="dm_parts_end"
+ENV{DM_UUID}!="part[0-9]*", GOTO="dm_parts_end"
+# We must take care that symlinks don't get lost,
+# even if blkid fails in 13-dm-disk.rules later.
+# Fixme: we have currently no way to avoid calling blkid on
+# partitions of broken mpath maps such as DM_NOSCAN.
+# But when partition devices appear, kpartx has likely read
+# the partition table shortly before, so odds are not bad
+# that blkid will also succeed.
+# Maps should take precedence over their members.
+ENV{DM_UDEV_LOW_PRIORITY_FLAG}!="1", OPTIONS+="link_priority=50"
+# Set some additional symlinks that typically exist for mpath
+# path members, too, and should be overridden.
+# kpartx_id is very robust, it works for suspended maps and maps
+# with 0 dependencies. It sets DM_TYPE, DM_PART, DM_WWN
+IMPORT{program}=="kpartx_id %M %m $env{DM_UUID}"
+# DM_TYPE only has a reasonable value for partitions on multipath.
+ENV{DM_UUID}=="*-mpath-*", ENV{DM_TYPE}=="?*" \
+       SYMLINK+="disk/by-id/$env{DM_TYPE}-$env{DM_NAME}"
+ENV{DM_WWN}=="?*", ENV{DM_PART}=="?*", \
+       SYMLINK+="disk/by-id/wwn-$env{DM_WWN}-part$env{DM_PART}"
index 1cbe942..8f99049 100644 (file)
@@ -8,50 +8,6 @@ KERNEL!="dm-*", GOTO="kpartx_end"
 ACTION!="add|change", GOTO="kpartx_end"
 ENV{DM_UUID}!="?*", GOTO="kpartx_end"
-# kpartx_id is very robust, it works for suspended maps and maps
-# with 0 dependencies
-IMPORT{program}=="kpartx_id %M %m $env{DM_UUID}"
-ENV{DM_UDEV_LOW_PRIORITY_FLAG}!="1", OPTIONS+="link_priority=50"
-ENV{DM_UUID}=="*mpath-*", ENV{DM_TYPE}=="?*" \
-       SYMLINK+="disk/by-id/$env{DM_TYPE}-$env{DM_NAME}"
-# Create persistent links for multipath tables
-ENV{DM_WWN}=="?*", ENV{DM_PART}!="?*", \
-       SYMLINK+="disk/by-id/wwn-$env{DM_WWN}"
-# Create persistent links for partitions
-ENV{DM_WWN}=="?*", ENV{DM_PART}=="?*", \
-       SYMLINK+="disk/by-id/wwn-$env{DM_WWN}-part$env{DM_PART}"
-# Create persistent by-label/by-uuid links.
-# multipath maps with DM_NOSCAN!=1 are handled in 13-dm-disk.rules.
-DM_UUID=="mpath-*", ENV{DM_NOSCAN}!="1", GOTO="symlink_end"
-# For partitions, we don't have DM_NOSCAN.
-# Simply load variables from db if they aren't set.
-# 11-dm-mpath.rules does this for mpath maps.
-# Fixme: we have currently no way to avoid calling blkid on
-# partitions of broken mpath maps.
-ENV{DM_UUID}!="part*-*-*", GOTO="import_end"
-ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{ID_FS_UUID_ENC}=="?*", \
-       SYMLINK+="disk/by-uuid/$env{ID_FS_UUID_ENC}"
-ENV{ID_FS_USAGE}=="filesystem|other", ENV{ID_FS_LABEL_ENC}=="?*", \
-       SYMLINK+="disk/by-label/$env{ID_FS_LABEL_ENC}"
-ENV{ID_PART_ENTRY_UUID}=="?*", SYMLINK+="disk/by-partuuid/$env{ID_PART_ENTRY_UUID}"
-       SYMLINK+="disk/by-partlabel/$env{ID_PART_ENTRY_NAME}"
 # Create dm tables for partitions on multipath devices.
 ENV{DM_UUID}!="mpath-?*", GOTO="mpath_kpartx_end"
index 716f390..91d8058 100644 (file)
@@ -73,8 +73,12 @@ ENV{MPATH_DEVICE_READY}!="0", ENV{.MPATH_DEVICE_READY_OLD}=="0",\
+# The code to check multipath state ends here. We need to set
+# properties and symlinks regardless whether the map is usable or
+# not. If symlinks get lost, systemd may auto-unmount file systems.
-ENV{DM_NOSCAN}!="1", GOTO="mpath_end"
+ENV{DM_NOSCAN}!="1", GOTO="import_end"
@@ -83,4 +87,20 @@ IMPORT{db}="ID_FS_LABEL"
+# Multipath maps should take precedence over their members.
+ENV{DM_UDEV_LOW_PRIORITY_FLAG}!="1", OPTIONS+="link_priority=50"
+# Set some additional symlinks that typically exist for mpath
+# path members, too, and should be overridden.
+# kpartx_id is very robust, it works for suspended maps and maps
+# with 0 dependencies. It sets DM_TYPE, DM_PART, DM_WWN
+TEST=="/usr/lib/udev/kpartx_id", \
+       IMPORT{program}=="kpartx_id %M %m $env{DM_UUID}"
+ENV{DM_TYPE}=="?*", SYMLINK+="disk/by-id/$env{DM_TYPE}-$env{DM_NAME}"
+ENV{DM_WWN}=="?*", SYMLINK+="disk/by-id/wwn-$env{DM_WWN}"