btrfs-progs: udev: add rules for dm devices
authorJeff Mahoney <jeffm@suse.com>
Mon, 9 May 2016 15:44:26 +0000 (11:44 -0400)
committerDavid Sterba <dsterba@suse.com>
Wed, 1 Jun 2016 12:56:56 +0000 (14:56 +0200)
Systemd's btrfs rule runs btrfs dev ready on each device
as it's discovered.  The btrfs command is executed as a builtin
command via an IMPORT{builtin} rule, which means it gets
executed at rule evaluation time, not rule execution time.  That
means that the device mapper links haven't been setup yet and the only
nodes that can be depended upon are /dev/dm-#.  That we see
/dev/mapper/name names in /proc/mounts is only because we replace the
device name we have cached with the one passed in via mount.  If
we have a multi-device file system and the primary device is removed,
the remaining devices will show /dev/dm-#.  In addition, if the
udev rule is executed again by someone generating a change event (e.g.
partprobe), the names are also replaced by the /dev/dm-# names.

This patch adds a new rule that adds a run rule that calls btrfs dev
ready again using the device mapper links once they're created.

Signed-off-by: Jeff Mahoney <jeffm@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
64-btrfs-dm.rules [new file with mode: 0644]
Makefile.in
configure.ac

diff --git a/64-btrfs-dm.rules b/64-btrfs-dm.rules
new file mode 100644 (file)
index 0000000..b2e49f4
--- /dev/null
@@ -0,0 +1,10 @@
+SUBSYSTEM!="block", GOTO="btrfs_end"
+KERNEL!="dm-[0-9]*", GOTO="btrfs_end"
+ACTION!="add|change", GOTO="btrfs_end"
+ENV{ID_FS_TYPE}!="btrfs", GOTO="btrfs_end"
+
+# Once the device mapper symlink is created, tell btrfs about it
+# so we get the friendly name in /proc/mounts (and tools that read it)
+ENV{DM_NAME}=="?*", RUN{builtin}+="btrfs ready /dev/mapper/$env{DM_NAME}"
+
+LABEL="btrfs_end"
index 0a1aece70dab41dae278138dcc4cb19f36d03b29..dadfd409750c14ab2498b02504b27c73177f60fd 100644 (file)
@@ -84,11 +84,15 @@ libbtrfs_headers = send-stream.h send-utils.h send.h rbtree.h btrfs-list.h \
               extent_io.h ioctl.h ctree.h btrfsck.h version.h
 TESTS = fsck-tests.sh convert-tests.sh
 
+udev_rules = 64-btrfs-dm.rules
+
 prefix ?= @prefix@
 exec_prefix = @exec_prefix@
 bindir = @bindir@
 libdir ?= @libdir@
 incdir = @includedir@/btrfs
+udevdir = @UDEVDIR@
+udevruledir = ${udevdir}/rules.d
 
 ifeq ("$(origin V)", "command line")
   BUILD_VERBOSE = $(V)
@@ -390,6 +394,10 @@ install: $(libs) $(progs_install) $(INSTALLDIRS)
        cp -a $(lib_links) $(DESTDIR)$(libdir)
        $(INSTALL) -m755 -d $(DESTDIR)$(incdir)
        $(INSTALL) -m644 $(headers) $(DESTDIR)$(incdir)
+ifneq ($(udevdir),)
+       $(INSTALL) -m755 -d $(DESTDIR)$(udevruledir)
+       $(INSTALL) -m644 $(udev_rules) $(DESTDIR)$(udevruledir)
+endif
 
 install-static: $(progs_static) $(INSTALLDIRS)
        $(INSTALL) -m755 -d $(DESTDIR)$(bindir)
index 797eb790352010b0d1212240f1763b426cb8562d..68a37012d60d13e802c63f41888514afea0f4ed0 100644 (file)
@@ -124,6 +124,8 @@ PKG_STATIC(UUID_LIBS_STATIC, [uuid])
 PKG_CHECK_MODULES(ZLIB, [zlib])
 PKG_STATIC(ZLIB_LIBS_STATIC, [zlib])
 
+PKG_CHECK_VAR([UDEVDIR], [udev], [udevdir])
+
 dnl lzo library does not provide pkg-config, let use classic way
 AC_CHECK_LIB([lzo2], [lzo_version], [
        LZO2_LIBS="-llzo2"