btrfs-progs: udev: add rules for dm devices
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>
This commit is contained in:
parent
640391b299
commit
62c0666378
|
@ -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"
|
|
@ -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)
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue