06.05.2016 22:27, Jeff Mahoney пишет:
> 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
And I still do not understand why it is bad while /dev/sd#n is good.
> 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.
> ---
> 64-btrfs-dm.rules | 10 ++++++++++
> Makefile.in | 7 +++++++
> configure.ac | 2 ++
> 3 files changed, 19 insertions(+)
> create mode 100644 64-btrfs-dm.rules
>
> diff --git a/64-btrfs-dm.rules b/64-btrfs-dm.rules
> new file mode 100644
> index 0000000..bbe1c35
> --- /dev/null
> +++ b/64-btrfs-dm.rules
> @@ -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}=="?*", TEST=="/dev/mapper/$env{DM_NAME}", RUN{builtin}+="btrfs ready /dev/mapper/$env{DM_NAME}"
> +
That won't work for the very first event (presumably "add"). /dev/mapper
link is created only after all rules have been processed, so it will
always evaluate to false.
> +LABEL="btrfs_end"
> diff --git a/Makefile.in b/Makefile.in
> index 19697ff..d555f6a 100644
> --- a/Makefile.in
> +++ b/Makefile.in
> @@ -83,11 +83,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)
> @@ -377,6 +381,9 @@ install: $(libs) $(progs_install) $(INSTALLDIRS)
> cp -a $(lib_links) $(DESTDIR)$(libdir)
> $(INSTALL) -m755 -d $(DESTDIR)$(incdir)
> $(INSTALL) -m644 $(headers) $(DESTDIR)$(incdir)
> +ifneq ($(udevdir), "")
> + $(INSTALL) -m644 $(udev_rules) $(DESTDIR)$(udevruledir)
> +endif
>
> install-static: $(progs_static) $(INSTALLDIRS)
> for p in $(progs_static) ; do \
> diff --git a/configure.ac b/configure.ac
> index fc343ea..4af7474 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -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"
>
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html