[lvm2] Clean up spec file, compile in lvmetad, autoactivation.
Peter Rajnoha
prajnoha at fedoraproject.org
Mon Jul 2 09:47:57 UTC 2012
commit f8e882d2095b4faa6818b48e1b4ab7e39c24fe32
Author: Peter Rajnoha <prajnoha at redhat.com>
Date: Mon Jul 2 11:46:03 2012 +0200
Clean up spec file, compile in lvmetad, autoactivation.
...for-udev-systemd-lvmetad-upstream-changes.patch | 2053 ++++++++++++++++++++
lvm2.spec | 127 +-
2 files changed, 2099 insertions(+), 81 deletions(-)
---
diff --git a/lvm2-2_02_97-composite-patch-for-udev-systemd-lvmetad-upstream-changes.patch b/lvm2-2_02_97-composite-patch-for-udev-systemd-lvmetad-upstream-changes.patch
new file mode 100644
index 0000000..3b585a8
--- /dev/null
+++ b/lvm2-2_02_97-composite-patch-for-udev-systemd-lvmetad-upstream-changes.patch
@@ -0,0 +1,2053 @@
+ WHATS_NEW | 10 ++
+ WHATS_NEW_DM | 10 ++
+ configure | 144 +++++++++++++++-----
+ configure.in | 81 ++++++++---
+ daemons/dmeventd/dmeventd.h | 4 +-
+ daemons/lvmetad/lvmetad-core.c | 2 +-
+ doc/example.conf.in | 9 ++
+ lib/activate/activate.c | 24 +++-
+ lib/activate/activate.h | 5 +
+ lib/cache/lvmetad.c | 39 ++++--
+ lib/cache/lvmetad.h | 19 +--
+ lib/device/dev-io.c | 2 +-
+ lib/metadata/lv_manip.c | 9 ++
+ lib/metadata/metadata-exported.h | 11 +-
+ lib/metadata/metadata.c | 3 +-
+ lib/misc/configure.h.in | 11 +-
+ man/lvchange.8.in | 12 +-
+ man/lvcreate.8.in | 16 ++-
+ man/lvm.conf.5.in | 11 ++
+ man/pvscan.8.in | 8 ++
+ man/vgchange.8.in | 11 +-
+ scripts/Makefile.in | 8 +-
+ scripts/dm_event_systemd_red_hat.service.in | 1 +
+ scripts/dm_event_systemd_red_hat.socket | 11 --
+ scripts/dm_event_systemd_red_hat.socket.in | 12 ++
+ scripts/lvm2_lvmetad_init_red_hat.in | 2 +-
+ scripts/lvm2_lvmetad_systemd_red_hat.service.in | 3 +-
+ scripts/lvm2_lvmetad_systemd_red_hat.socket.in | 1 +
+ scripts/lvm2_monitoring_systemd_red_hat.service.in | 1 +
+ tools/args.h | 3 +-
+ tools/commands.h | 44 +++---
+ tools/lvchange.c | 31 +++--
+ tools/lvcreate.c | 10 +-
+ tools/lvmcmdline.c | 11 +-
+ tools/pvremove.c | 2 +-
+ tools/pvscan.c | 40 +++++-
+ tools/toollib.c | 2 +-
+ tools/tools.h | 5 +-
+ tools/vgchange.c | 51 +++----
+ udev/10-dm.rules.in | 12 +-
+ udev/11-dm-lvm.rules | 37 -----
+ udev/11-dm-lvm.rules.in | 37 +++++
+ udev/69-dm-lvm-metad.rules | 30 ----
+ udev/69-dm-lvm-metad.rules.in | 26 ++++
+ udev/95-dm-notify.rules | 12 --
+ udev/95-dm-notify.rules.in | 12 ++
+ udev/Makefile.in | 33 +++--
+ 47 files changed, 590 insertions(+), 288 deletions(-)
+
+diff --git a/WHATS_NEW b/WHATS_NEW
+index 89e26b5..d779fda 100644
+--- a/WHATS_NEW
++++ b/WHATS_NEW
+@@ -1,3 +1,13 @@
++Version 2.02.97 -
++===============================
++ Update man pages with --activate ay option and auto_activation_volume_list.
++ Use vgchange -aay instead of vgchange -ay in clmvd init script.
++ Add activation/auto_activation_volume_list to lvm.conf.
++ Add --activate ay to lvcreate, lvchange, pvscan and vgchange.
++ Add support for volume autoactivation using lvmetad.
++ Add --activate synonym for --available arg and prefer --activate.
++ Open device read-only to obtain readahead value.
++
+ Version 2.02.96 - 8th June 2012
+ ===============================
+ Upstream source repo now fedorahosted.org git not sources.redhat.com CVS.
+diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM
+index 1246f19..52f9142 100644
+--- a/WHATS_NEW_DM
++++ b/WHATS_NEW_DM
+@@ -1,3 +1,13 @@
++Version 1.02.76 -
++===============================
++ Add configure --enable-udev-rule-exec-detection to detect exec path in rules.
++ Use sbindir in udev rules by default and remove executable path detection.
++ Remove hard-coded paths for dmeventd fifos and use default-dm-run-dir.
++ Add configure --with-lvmetad-pidfile to remove hard-coded value.
++ Add configure --with-default-pid-dir for common directory with pid files.
++ Add configure --with-default-dm-run-dir to set run directory for dm tools.
++ Add documentation references in systemd units.
++
+ Version 1.02.75 - 8th June 2012
+ ===============================
+ Upstream source repo now fedorahosted.org git not sources.redhat.com CVS.
+diff --git a/configure b/configure
+index a7907a6..fc54774 100755
+--- a/configure
++++ b/configure
+@@ -605,9 +605,11 @@ kernelvsn
+ missingkernel
+ kerneldir
+ interface
++LVMETAD_PIDFILE
+ DMEVENTD_PIDFILE
+ WRITE_INSTALL
+ UDEV_HAS_BUILTIN_BLKID
++UDEV_RULE_EXEC_DETECTION
+ UDEV_SYNC
+ UDEV_RULES
+ UDEV_PC
+@@ -659,6 +661,7 @@ DMEVENTD
+ DL_LIBS
+ DEVMAPPER
+ DEFAULT_RUN_DIR
++DEFAULT_DM_RUN_DIR
+ DEFAULT_LOCK_DIR
+ DEFAULT_DATA_ALIGNMENT
+ DEFAULT_CACHE_SUBDIR
+@@ -821,6 +824,9 @@ enable_readline
+ enable_realtime
+ enable_ocf
+ with_ocfdir
++with_default_pid_dir
++with_default_dm_run_dir
++with_default_run_dir
+ with_clvmd
+ with_clvmd_pidfile
+ enable_cmirrord
+@@ -832,8 +838,10 @@ enable_testing
+ enable_valgrind_pool
+ enable_devmapper
+ enable_lvmetad
++with_lvmetad_pidfile
+ enable_udev_sync
+ enable_udev_rules
++enable_udev_rule_exec_detection
+ enable_compat
+ enable_units_compat
+ enable_ioctl
+@@ -858,7 +866,6 @@ with_systemdsystemunitdir
+ with_tmpfilesdir
+ with_dmeventd_pidfile
+ with_dmeventd_path
+-with_default_run_dir
+ with_default_system_dir
+ with_default_archive_subdir
+ with_default_backup_subdir
+@@ -1537,6 +1544,8 @@ Optional Features:
+ --enable-lvmetad enable the LVM Metadata Daemon
+ --enable-udev_sync enable synchronisation with udev processing
+ --enable-udev_rules install rule files needed for udev synchronisation
++ --enable-udev-rule-exec-detection
++ enable executable path detection in udev rules
+ --enable-compat enable support for old device-mapper versions
+ --enable-units-compat enable output compatibility with old versions that
+ that do not use KiB-style unit suffixes
+@@ -1583,6 +1592,12 @@ Optional Packages:
+ --with-thin-check=PATH thin_check tool: [[autodetect]]
+ --with-ocfdir=DIR install OCF files in DIR
+ [[PREFIX/lib/ocf/resource.d/lvm2]]
++ --with-default-pid-dir=PID_DIR
++ Default directory to keep PID files in. [[/var/run]]
++ --with-default-dm-run-dir=DM_RUN_DIR
++ Default DM run directory. [[/var/run]]
++ --with-default-run-dir=RUN_DIR
++ Default LVM run directory. [[/var/run/lvm]]
+ --with-clvmd=TYPE build cluster LVM Daemon
+ The following cluster manager combinations are valid:
+ * cman (RHEL5 or equivalent)
+@@ -1592,11 +1607,13 @@ Optional Packages:
+ * none (disable build)
+ [TYPE=none]
+ --with-clvmd-pidfile=PATH
+- clvmd pidfile [[/var/run/clvmd.pid]]
++ clvmd pidfile [[PID_DIR/clvmd.pid]]
+ --with-cmirrord-pidfile=PATH
+- cmirrord pidfile [[/var/run/cmirrord.pid]]
++ cmirrord pidfile [[PID_DIR/cmirrord.pid]]
+ --with-optimisation=OPT C optimisation flag [[OPT=-O2]]
+ --with-veritysetup=TYPE build veritysetup using openssl/nss/gcrypt
++ --with-lvmetad-pidfile=PATH
++ lvmetad pidfile [[PID_DIR/lvmetad.pid]]
+ --with-localedir=DIR translation files in DIR [[PREFIX/share/locale]]
+ --with-confdir=DIR configuration files in DIR [[/etc]]
+ --with-staticdir=DIR static binaries in DIR [[EPREFIX/sbin]]
+@@ -1611,10 +1628,9 @@ Optional Packages:
+ volatile files and directories in DIR
+ [[SYSCONFDIR/tmpfiles.d]]
+ --with-dmeventd-pidfile=PATH
+- dmeventd pidfile [[/var/run/dmeventd.pid]]
++ dmeventd pidfile [[PID_DIR/dmeventd.pid]]
+ --with-dmeventd-path=PATH
+ dmeventd path [[EPREFIX/sbin/dmeventd]]
+- --with-default-run-dir=DIR Default run directory [/var/run/lvm]
+ --with-default-system-dir=DIR
+ default LVM system directory [[/etc/lvm]]
+ --with-default-archive-subdir=SUBDIR
+@@ -7336,6 +7352,52 @@ fi
+ }
+
+ ################################################################################
++
++
++# Check whether --with-default-pid-dir was given.
++if test "${with_default_pid_dir+set}" = set; then :
++ withval=$with_default_pid_dir; DEFAULT_PID_DIR="$withval"
++else
++ DEFAULT_PID_DIR="/var/run"
++fi
++
++
++cat >>confdefs.h <<_ACEOF
++#define DEFAULT_PID_DIR "$DEFAULT_PID_DIR"
++_ACEOF
++
++
++
++
++# Check whether --with-default-dm-run-dir was given.
++if test "${with_default_dm_run_dir+set}" = set; then :
++ withval=$with_default_dm_run_dir; DEFAULT_DM_RUN_DIR="$withval"
++else
++ DEFAULT_DM_RUN_DIR="/var/run"
++fi
++
++
++cat >>confdefs.h <<_ACEOF
++#define DEFAULT_DM_RUN_DIR "$DEFAULT_DM_RUN_DIR"
++_ACEOF
++
++
++
++
++# Check whether --with-default-run-dir was given.
++if test "${with_default_run_dir+set}" = set; then :
++ withval=$with_default_run_dir; DEFAULT_RUN_DIR="$withval"
++else
++ DEFAULT_RUN_DIR="/var/run/lvm"
++fi
++
++
++cat >>confdefs.h <<_ACEOF
++#define DEFAULT_RUN_DIR "$DEFAULT_RUN_DIR"
++_ACEOF
++
++
++################################################################################
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build cluster LVM daemon" >&5
+ $as_echo_n "checking whether to build cluster LVM daemon... " >&6; }
+
+@@ -8238,7 +8300,7 @@ if test "x$CLVMD" != xnone; then
+ if test "${with_clvmd_pidfile+set}" = set; then :
+ withval=$with_clvmd_pidfile; CLVMD_PIDFILE=$withval
+ else
+- CLVMD_PIDFILE="/var/run/clvmd.pid"
++ CLVMD_PIDFILE="$DEFAULT_PID_DIR/clvmd.pid"
+ fi
+
+
+@@ -8270,7 +8332,7 @@ if test "x$BUILD_CMIRRORD" = xyes; then
+ if test "${with_cmirrord_pidfile+set}" = set; then :
+ withval=$with_cmirrord_pidfile; CMIRRORD_PIDFILE=$withval
+ else
+- CMIRRORD_PIDFILE="/var/run/cmirrord.pid"
++ CMIRRORD_PIDFILE="$DEFAULT_PID_DIR/cmirrord.pid"
+ fi
+
+
+@@ -8822,6 +8884,20 @@ if test x$BUILD_LVMETAD = xyes; then
+
+ $as_echo "#define LVMETAD_SUPPORT 1" >>confdefs.h
+
++
++
++# Check whether --with-lvmetad-pidfile was given.
++if test "${with_lvmetad_pidfile+set}" = set; then :
++ withval=$with_lvmetad_pidfile; LVMETAD_PIDFILE=$withval
++else
++ LVMETAD_PIDFILE="$DEFAULT_PID_DIR/lvmetad.pid"
++fi
++
++
++cat >>confdefs.h <<_ACEOF
++#define LVMETAD_PIDFILE "$LVMETAD_PIDFILE"
++_ACEOF
++
+ fi
+
+ ################################################################################
+@@ -8949,18 +9025,28 @@ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UDEV_RULES" >&5
+ $as_echo "$UDEV_RULES" >&6; }
+
+-if test x$UDEV_RULES = xyes; then
+- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether udev supports builtin blkid" >&5
+-$as_echo_n "checking whether udev supports builtin blkid... " >&6; }
+- udev_version=$(udevadm info --version 2>/dev/null)
+- if test -n "$udev_version" && test "$udev_version" -ge 176; then
+- UDEV_HAS_BUILTIN_BLKID=yes
+- else
+- UDEV_HAS_BUILTIN_BLKID=no
+- fi
+- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UDEV_HAS_BUILTIN_BLKID" >&5
+-$as_echo "$UDEV_HAS_BUILTIN_BLKID" >&6; }
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable executable path detection in udev rules" >&5
++$as_echo_n "checking whether to enable executable path detection in udev rules... " >&6; }
++# Check whether --enable-udev_rule_exec_detection was given.
++if test "${enable_udev_rule_exec_detection+set}" = set; then :
++ enableval=$enable_udev_rule_exec_detection; UDEV_RULE_EXEC_DETECTION=$enableval
++else
++ UDEV_RULE_EXEC_DETECTION=no
++fi
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $UDEV_RULE_EXEC_DETECTION" >&5
++$as_echo "$UDEV_RULE_EXEC_DETECTION" >&6; }
++
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether udev supports built-in blkid" >&5
++$as_echo_n "checking whether udev supports built-in blkid... " >&6; }
++test x$PKGCONFIG_INIT != x1 && pkg_config_init
++if $($PKG_CONFIG --atleast-version=176 libudev); then
++ UDEV_HAS_BUILTIN_BLKID=yes
++else
++ UDEV_HAS_BUILTIN_BLKID=no
+ fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $UDEV_HAS_BUILTIN_BLKID" >&5
++$as_echo "$UDEV_HAS_BUILTIN_BLKID" >&6; }
+
+ ################################################################################
+ # Check whether --enable-compat was given.
+@@ -10633,7 +10719,7 @@ if test "$BUILD_DMEVENTD" = yes; then
+ if test "${with_dmeventd_pidfile+set}" = set; then :
+ withval=$with_dmeventd_pidfile; DMEVENTD_PIDFILE=$withval
+ else
+- DMEVENTD_PIDFILE="/var/run/dmeventd.pid"
++ DMEVENTD_PIDFILE="$DEFAULT_PID_DIR/dmeventd.pid"
+ fi
+
+
+@@ -10659,20 +10745,6 @@ _ACEOF
+
+ fi
+
+-
+-
+-# Check whether --with-default-run-dir was given.
+-if test "${with_default_run_dir+set}" = set; then :
+- withval=$with_default_run_dir; DEFAULT_RUN_DIR="$withval"
+-else
+- DEFAULT_RUN_DIR="/var/run/lvm"
+-fi
+-
+-cat >>confdefs.h <<_ACEOF
+-#define DEFAULT_RUN_DIR "$DEFAULT_RUN_DIR"
+-_ACEOF
+-
+-
+ ################################################################################
+
+ # Check whether --with-default-system-dir was given.
+@@ -10913,8 +10985,11 @@ LVM_LIBAPI=`echo "$VER" | $AWK -F '[()]' '{print $2}'`
+
+
+
++
++
++
+ ################################################################################
+-ac_config_files="$ac_config_files Makefile make.tmpl daemons/Makefile daemons/clvmd/Makefile daemons/cmirrord/Makefile daemons/dmeventd/Makefile daemons/dmeventd/libdevmapper-event.pc daemons/dmeventd/plugins/Makefile daemons/dmeventd/plugins/lvm2/Makefile daemons/dmeventd/plugins/raid/Makefile daemons/dmeventd/plugins/mirror/Makefile daemons/dmeventd/plugins/snapshot/Makefile daemons/dmeventd/plugins/thin/Makefile daemons/lvmetad/Makefile doc/Makefile doc/example.conf include/.symlinks include/Makefile lib/Makefile lib/format1/Makefile lib/format_pool/Makefile lib/locking/Makefile lib/mirror/Makefile lib/replicator/Makefile lib/misc/lvm-version.h lib/raid/Makefile lib/snapshot/Makefile lib/thin/Makefile libdaemon/Makefile libdaemon/client/Makefile libdaemon/server/Makefile libdm/Makefile libdm/libdevmapper.pc liblvm/Makefile liblvm/liblvm2app.pc man/Makefile po/Makefile scripts/clvmd_init_red_hat scripts/cmirrord_init_red_hat scripts/lvm2_lvmetad_init_red_hat scripts/lvm2_
lvmetad_systemd_red_hat.socket scripts/lvm2_lvmetad_systemd_red_hat.service scripts/lvm2_monitoring_init_red_hat scripts/dm_event_systemd_red_hat.service scripts/lvm2_monitoring_systemd_red_hat.service scripts/lvm2_tmpfiles_red_hat.conf scripts/Makefile test/Makefile test/api/Makefile test/unit/Makefile tools/Makefile udev/Makefile unit-tests/datastruct/Makefile unit-tests/regex/Makefile unit-tests/mm/Makefile verity/Makefile"
++ac_config_files="$ac_config_files Makefile make.tmpl daemons/Makefile daemons/clvmd/Makefile daemons/cmirrord/Makefile daemons/dmeventd/Makefile daemons/dmeventd/libdevmapper-event.pc daemons/dmeventd/plugins/Makefile daemons/dmeventd/plugins/lvm2/Makefile daemons/dmeventd/plugins/raid/Makefile daemons/dmeventd/plugins/mirror/Makefile daemons/dmeventd/plugins/snapshot/Makefile daemons/dmeventd/plugins/thin/Makefile daemons/lvmetad/Makefile doc/Makefile doc/example.conf include/.symlinks include/Makefile lib/Makefile lib/format1/Makefile lib/format_pool/Makefile lib/locking/Makefile lib/mirror/Makefile lib/replicator/Makefile lib/misc/lvm-version.h lib/raid/Makefile lib/snapshot/Makefile lib/thin/Makefile libdaemon/Makefile libdaemon/client/Makefile libdaemon/server/Makefile libdm/Makefile libdm/libdevmapper.pc liblvm/Makefile liblvm/liblvm2app.pc man/Makefile po/Makefile scripts/clvmd_init_red_hat scripts/cmirrord_init_red_hat scripts/lvm2_lvmetad_init_red_hat scripts/lvm2_
lvmetad_systemd_red_hat.socket scripts/lvm2_lvmetad_systemd_red_hat.service scripts/lvm2_monitoring_init_red_hat scripts/dm_event_systemd_red_hat.socket scripts/dm_event_systemd_red_hat.service scripts/lvm2_monitoring_systemd_red_hat.service scripts/lvm2_tmpfiles_red_hat.conf scripts/Makefile test/Makefile test/api/Makefile test/unit/Makefile tools/Makefile udev/Makefile unit-tests/datastruct/Makefile unit-tests/regex/Makefile unit-tests/mm/Makefile verity/Makefile"
+
+ cat >confcache <<\_ACEOF
+ # This file is a shell script that caches the results of configure
+@@ -11646,6 +11721,7 @@ do
+ "scripts/lvm2_lvmetad_systemd_red_hat.socket") CONFIG_FILES="$CONFIG_FILES scripts/lvm2_lvmetad_systemd_red_hat.socket" ;;
+ "scripts/lvm2_lvmetad_systemd_red_hat.service") CONFIG_FILES="$CONFIG_FILES scripts/lvm2_lvmetad_systemd_red_hat.service" ;;
+ "scripts/lvm2_monitoring_init_red_hat") CONFIG_FILES="$CONFIG_FILES scripts/lvm2_monitoring_init_red_hat" ;;
++ "scripts/dm_event_systemd_red_hat.socket") CONFIG_FILES="$CONFIG_FILES scripts/dm_event_systemd_red_hat.socket" ;;
+ "scripts/dm_event_systemd_red_hat.service") CONFIG_FILES="$CONFIG_FILES scripts/dm_event_systemd_red_hat.service" ;;
+ "scripts/lvm2_monitoring_systemd_red_hat.service") CONFIG_FILES="$CONFIG_FILES scripts/lvm2_monitoring_systemd_red_hat.service" ;;
+ "scripts/lvm2_tmpfiles_red_hat.conf") CONFIG_FILES="$CONFIG_FILES scripts/lvm2_tmpfiles_red_hat.conf" ;;
+diff --git a/configure.in b/configure.in
+index 5e8c6f9..dec23dc 100644
+--- a/configure.in
++++ b/configure.in
+@@ -472,6 +472,32 @@ pkg_config_init() {
+ }
+
+ ################################################################################
++dnl -- Set up pidfile and run directory
++AH_TEMPLATE(DEFAULT_PID_DIR)
++AC_ARG_WITH(default-pid-dir,
++ AC_HELP_STRING([--with-default-pid-dir=PID_DIR],
++ [Default directory to keep PID files in. [[/var/run]]]),
++ DEFAULT_PID_DIR="$withval", DEFAULT_PID_DIR="/var/run")
++AC_DEFINE_UNQUOTED(DEFAULT_PID_DIR, ["$DEFAULT_PID_DIR"],
++ [Default directory to keep PID files in.])
++
++AH_TEMPLATE(DEFAULT_DM_RUN_DIR, [Name of default DM run directory.])
++AC_ARG_WITH(default-dm-run-dir,
++ AC_HELP_STRING([--with-default-dm-run-dir=DM_RUN_DIR],
++ [ Default DM run directory. [[/var/run]]]),
++ DEFAULT_DM_RUN_DIR="$withval", DEFAULT_DM_RUN_DIR="/var/run")
++AC_DEFINE_UNQUOTED(DEFAULT_DM_RUN_DIR, ["$DEFAULT_DM_RUN_DIR"],
++ [Default DM run directory.])
++
++AH_TEMPLATE(DEFAULT_RUN_DIR, [Name of default LVM run directory.])
++AC_ARG_WITH(default-run-dir,
++ AC_HELP_STRING([--with-default-run-dir=RUN_DIR],
++ [Default LVM run directory. [[/var/run/lvm]]]),
++ DEFAULT_RUN_DIR="$withval", DEFAULT_RUN_DIR="/var/run/lvm")
++AC_DEFINE_UNQUOTED(DEFAULT_RUN_DIR, ["$DEFAULT_RUN_DIR"],
++ [Default LVM run directory.])
++
++################################################################################
+ dnl -- Build cluster LVM daemon
+ AC_MSG_CHECKING(whether to build cluster LVM daemon)
+ AC_ARG_WITH(clvmd,
+@@ -723,9 +749,9 @@ dnl -- clvmd pidfile
+ if test "x$CLVMD" != xnone; then
+ AC_ARG_WITH(clvmd-pidfile,
+ AC_HELP_STRING([--with-clvmd-pidfile=PATH],
+- [clvmd pidfile [[/var/run/clvmd.pid]]]),
++ [clvmd pidfile [[PID_DIR/clvmd.pid]]]),
+ CLVMD_PIDFILE=$withval,
+- CLVMD_PIDFILE="/var/run/clvmd.pid")
++ CLVMD_PIDFILE="$DEFAULT_PID_DIR/clvmd.pid")
+ AC_DEFINE_UNQUOTED(CLVMD_PIDFILE, ["$CLVMD_PIDFILE"],
+ [Path to clvmd pidfile.])
+ fi
+@@ -746,9 +772,9 @@ dnl -- cmirrord pidfile
+ if test "x$BUILD_CMIRRORD" = xyes; then
+ AC_ARG_WITH(cmirrord-pidfile,
+ AC_HELP_STRING([--with-cmirrord-pidfile=PATH],
+- [cmirrord pidfile [[/var/run/cmirrord.pid]]]),
++ [cmirrord pidfile [[PID_DIR/cmirrord.pid]]]),
+ CMIRRORD_PIDFILE=$withval,
+- CMIRRORD_PIDFILE="/var/run/cmirrord.pid")
++ CMIRRORD_PIDFILE="$DEFAULT_PID_DIR/cmirrord.pid")
+ AC_DEFINE_UNQUOTED(CMIRRORD_PIDFILE, ["$CMIRRORD_PIDFILE"],
+ [Path to cmirrord pidfile.])
+ fi
+@@ -874,6 +900,14 @@ BUILD_LVMETAD=$LVMETAD
+
+ if test x$BUILD_LVMETAD = xyes; then
+ AC_DEFINE([LVMETAD_SUPPORT], 1, [Define to 1 to include code that uses lvmetad.])
++
++ AC_ARG_WITH(lvmetad-pidfile,
++ AC_HELP_STRING([--with-lvmetad-pidfile=PATH],
++ [lvmetad pidfile [[PID_DIR/lvmetad.pid]]]),
++ LVMETAD_PIDFILE=$withval,
++ LVMETAD_PIDFILE="$DEFAULT_PID_DIR/lvmetad.pid")
++ AC_DEFINE_UNQUOTED(LVMETAD_PIDFILE, ["$LVMETAD_PIDFILE"],
++ [Path to lvmetad pidfile.])
+ fi
+
+ ################################################################################
+@@ -902,16 +936,22 @@ AC_ARG_ENABLE(udev_rules,
+ UDEV_RULES=$enableval, UDEV_RULES=$UDEV_SYNC)
+ AC_MSG_RESULT($UDEV_RULES)
+
+-if test x$UDEV_RULES = xyes; then
+- AC_MSG_CHECKING(whether udev supports builtin blkid)
+- udev_version=$(udevadm info --version 2>/dev/null)
+- if test -n "$udev_version" && test "$udev_version" -ge 176; then
+- UDEV_HAS_BUILTIN_BLKID=yes
+- else
+- UDEV_HAS_BUILTIN_BLKID=no
+- fi
+- AC_MSG_RESULT($UDEV_HAS_BUILTIN_BLKID)
++AC_MSG_CHECKING(whether to enable executable path detection in udev rules)
++AC_ARG_ENABLE(udev_rule_exec_detection,
++ AC_HELP_STRING([--enable-udev-rule-exec-detection],
++ [enable executable path detection in udev rules]),
++ UDEV_RULE_EXEC_DETECTION=$enableval, UDEV_RULE_EXEC_DETECTION=no)
++AC_MSG_RESULT($UDEV_RULE_EXEC_DETECTION)
++
++dnl -- Check support for built-in blkid against target udev version
++AC_MSG_CHECKING(whether udev supports built-in blkid)
++test x$PKGCONFIG_INIT != x1 && pkg_config_init
++if $($PKG_CONFIG --atleast-version=176 libudev); then
++ UDEV_HAS_BUILTIN_BLKID=yes
++else
++ UDEV_HAS_BUILTIN_BLKID=no
+ fi
++AC_MSG_RESULT($UDEV_HAS_BUILTIN_BLKID)
+
+ ################################################################################
+ dnl -- Compatibility mode
+@@ -1369,9 +1409,9 @@ dnl -- dmeventd pidfile and executable path
+ if test "$BUILD_DMEVENTD" = yes; then
+ AC_ARG_WITH(dmeventd-pidfile,
+ AC_HELP_STRING([--with-dmeventd-pidfile=PATH],
+- [dmeventd pidfile [[/var/run/dmeventd.pid]]]),
++ [dmeventd pidfile [[PID_DIR/dmeventd.pid]]]),
+ DMEVENTD_PIDFILE=$withval,
+- DMEVENTD_PIDFILE="/var/run/dmeventd.pid")
++ DMEVENTD_PIDFILE="$DEFAULT_PID_DIR/dmeventd.pid")
+ AC_DEFINE_UNQUOTED(DMEVENTD_PIDFILE, ["$DMEVENTD_PIDFILE"],
+ [Path to dmeventd pidfile.])
+ fi
+@@ -1386,13 +1426,6 @@ if test "$BUILD_DMEVENTD" = yes; then
+ [Path to dmeventd binary.])
+ fi
+
+-AH_TEMPLATE(DEFAULT_RUN_DIR, [Name of default run directory.])
+-AC_ARG_WITH(default-run-dir,
+- [ --with-default-run-dir=DIR Default run directory [[/var/run/lvm]] ],
+- [ DEFAULT_RUN_DIR="$withval" ],
+- [ DEFAULT_RUN_DIR="/var/run/lvm" ])
+-AC_DEFINE_UNQUOTED(DEFAULT_RUN_DIR,["$DEFAULT_RUN_DIR"] )
+-
+ ################################################################################
+ dnl -- various defaults
+ AC_ARG_WITH(default-system-dir,
+@@ -1504,6 +1537,7 @@ AC_SUBST(DEFAULT_BACKUP_SUBDIR)
+ AC_SUBST(DEFAULT_CACHE_SUBDIR)
+ AC_SUBST(DEFAULT_DATA_ALIGNMENT)
+ AC_SUBST(DEFAULT_LOCK_DIR)
++AC_SUBST(DEFAULT_DM_RUN_DIR)
+ AC_SUBST(DEFAULT_RUN_DIR)
+ AC_SUBST(DEVMAPPER)
+ AC_SUBST(DLM_CFLAGS)
+@@ -1567,11 +1601,13 @@ AC_SUBST(UDEV_LIBS)
+ AC_SUBST(UDEV_PC)
+ AC_SUBST(UDEV_RULES)
+ AC_SUBST(UDEV_SYNC)
++AC_SUBST(UDEV_RULE_EXEC_DETECTION)
+ AC_SUBST(UDEV_HAS_BUILTIN_BLKID)
+ AC_SUBST(CUNIT_LIBS)
+ AC_SUBST(CUNIT_CFLAGS)
+ AC_SUBST(WRITE_INSTALL)
+ AC_SUBST(DMEVENTD_PIDFILE)
++AC_SUBST(LVMETAD_PIDFILE)
+ AC_SUBST(interface)
+ AC_SUBST(kerneldir)
+ AC_SUBST(missingkernel)
+@@ -1631,6 +1667,7 @@ scripts/lvm2_lvmetad_init_red_hat
+ scripts/lvm2_lvmetad_systemd_red_hat.socket
+ scripts/lvm2_lvmetad_systemd_red_hat.service
+ scripts/lvm2_monitoring_init_red_hat
++scripts/dm_event_systemd_red_hat.socket
+ scripts/dm_event_systemd_red_hat.service
+ scripts/lvm2_monitoring_systemd_red_hat.service
+ scripts/lvm2_tmpfiles_red_hat.conf
+diff --git a/daemons/dmeventd/dmeventd.h b/daemons/dmeventd/dmeventd.h
+index 81056e9..e21cf45 100644
+--- a/daemons/dmeventd/dmeventd.h
++++ b/daemons/dmeventd/dmeventd.h
+@@ -17,8 +17,8 @@
+
+ /* FIXME This stuff must be configurable. */
+
+-#define DM_EVENT_FIFO_CLIENT "/var/run/dmeventd-client"
+-#define DM_EVENT_FIFO_SERVER "/var/run/dmeventd-server"
++#define DM_EVENT_FIFO_CLIENT DEFAULT_DM_RUN_DIR "/dmeventd-client"
++#define DM_EVENT_FIFO_SERVER DEFAULT_DM_RUN_DIR "/dmeventd-server"
+
+ #define DM_EVENT_DEFAULT_TIMEOUT 10
+
+diff --git a/daemons/lvmetad/lvmetad-core.c b/daemons/lvmetad/lvmetad-core.c
+index 5b34e21..d41a905 100644
+--- a/daemons/lvmetad/lvmetad-core.c
++++ b/daemons/lvmetad/lvmetad-core.c
+@@ -1094,7 +1094,7 @@ int main(int argc, char *argv[])
+ s.socket_path = getenv("LVM_LVMETAD_SOCKET");
+ if (!s.socket_path)
+ s.socket_path = DEFAULT_RUN_DIR "/lvmetad.socket";
+- s.pidfile = DEFAULT_RUN_DIR "/lvmetad.pid";
++ s.pidfile = LVMETAD_PIDFILE;
+ s.log_level = 0;
+ s.protocol = "lvmetad";
+ s.protocol_version = 1;
+diff --git a/doc/example.conf.in b/doc/example.conf.in
+index 9092e32..fbb9271 100644
+--- a/doc/example.conf.in
++++ b/doc/example.conf.in
+@@ -550,6 +550,15 @@ activation {
+ #
+ # volume_list = [ "vg1", "vg2/lvol1", "@tag1", "@*" ]
+
++ # If auto_activation_volume_list is defined, each LV that is to be
++ # activated is checked against the list while using the autoactivation
++ # option (--activate ay/-a ay), and if it matches, it is activated.
++ # "vgname" and "vgname/lvname" are matched exactly.
++ # "@tag" matches any tag set in the LV or VG.
++ # "@*" matches if any tag defined on the host is also set in the LV or VG
++ #
++ # auto_activation_volume_list = [ "vg1", "vg2/lvol1", "@tag1", "@*" ]
++
+ # If read_only_volume_list is defined, each LV that is to be activated
+ # is checked against the list, and if it matches, it as activated
+ # in read-only mode. (This overrides '--permission rw' stored in the
+diff --git a/lib/activate/activate.c b/lib/activate/activate.c
+index d2cc5bf..1205e58 100644
+--- a/lib/activate/activate.c
++++ b/lib/activate/activate.c
+@@ -328,10 +328,8 @@ int activation(void)
+ return _activation;
+ }
+
+-static int _passes_volumes_filter(struct cmd_context *cmd,
+- struct logical_volume *lv,
+- const struct dm_config_node *cn,
+- const char *config_path)
++static int _lv_passes_volumes_filter(struct cmd_context *cmd, struct logical_volume *lv,
++ const struct dm_config_node *cn, const char *config_path)
+ {
+ const struct dm_config_value *cv;
+ const char *str;
+@@ -429,7 +427,7 @@ static int _passes_activation_filter(struct cmd_context *cmd,
+ return 0;
+ }
+
+- return _passes_volumes_filter(cmd, lv, cn, "activation/volume_list");
++ return _lv_passes_volumes_filter(cmd, lv, cn, "activation/volume_list");
+ }
+
+ static int _passes_readonly_filter(struct cmd_context *cmd,
+@@ -440,7 +438,21 @@ static int _passes_readonly_filter(struct cmd_context *cmd,
+ if (!(cn = find_config_tree_node(cmd, "activation/read_only_volume_list")))
+ return 0;
+
+- return _passes_volumes_filter(cmd, lv, cn, "activation/read_only_volume_list");
++ return _lv_passes_volumes_filter(cmd, lv, cn, "activation/read_only_volume_list");
++}
++
++
++int lv_passes_auto_activation_filter(struct cmd_context *cmd, struct logical_volume *lv)
++{
++ const struct dm_config_node *cn;
++
++ if (!(cn = find_config_tree_node(cmd, "activation/auto_activation_volume_list"))) {
++ log_verbose("activation/auto_activation_volume_list configuration setting "
++ "not defined: All logical volumes will be auto-activated.");
++ return 1;
++ }
++
++ return _lv_passes_volumes_filter(cmd, lv, cn, "activation/auto_activation_volume_list");
+ }
+
+ int library_version(char *version, size_t size)
+diff --git a/lib/activate/activate.h b/lib/activate/activate.h
+index 2b90a7b..f473a11 100644
+--- a/lib/activate/activate.h
++++ b/lib/activate/activate.h
+@@ -93,6 +93,11 @@ int lv_check_not_in_use(struct cmd_context *cmd, struct logical_volume *lv,
+ */
+ int lv_activation_filter(struct cmd_context *cmd, const char *lvid_s,
+ int *activate_lv);
++/*
++ * Checks against the auto_activation_volume_list and
++ * returns 1 if the LV should be activated, 0 otherwise.
++ */
++int lv_passes_auto_activation_filter(struct cmd_context *cmd, struct logical_volume *lv);
+
+ int lv_check_transient(struct logical_volume *lv);
+ /*
+diff --git a/lib/cache/lvmetad.c b/lib/cache/lvmetad.c
+index f2bb8eb..31cda0b 100644
+--- a/lib/cache/lvmetad.c
++++ b/lib/cache/lvmetad.c
+@@ -322,7 +322,7 @@ int lvmetad_vg_update(struct volume_group *vg)
+ /* NB. the PV fmt pointer is sometimes wrong during vgconvert */
+ if (pvl->pv->dev && !lvmetad_pv_found(pvl->pv->id, pvl->pv->dev,
+ vg->fid ? vg->fid->fmt : pvl->pv->fmt,
+- pvl->pv->label_sector, NULL))
++ pvl->pv->label_sector, NULL, NULL))
+ return 0;
+ }
+
+@@ -536,7 +536,7 @@ static const char *_print_mdas(struct lvmcache_info *info)
+ }
+
+ int lvmetad_pv_found(struct id pvid, struct device *device, const struct format_type *fmt,
+- uint64_t label_sector, struct volume_group *vg)
++ uint64_t label_sector, struct volume_group *vg, activation_handler handler)
+ {
+ char uuid[64];
+ daemon_reply reply;
+@@ -544,6 +544,7 @@ int lvmetad_pv_found(struct id pvid, struct device *device, const struct format_
+ const char *mdas = NULL;
+ char *pvmeta;
+ char *buf = NULL;
++ const char *status;
+ int result;
+
+ if (!_using_lvmetad)
+@@ -603,12 +604,26 @@ int lvmetad_pv_found(struct id pvid, struct device *device, const struct format_
+ dm_free(pvmeta);
+
+ result = _lvmetad_handle_reply(reply, "update PV", uuid, NULL);
++
++ if (result && handler) {
++ status = daemon_reply_str(reply, "status", "<missing>");
++ if (!strcmp(status, "partial"))
++ handler(vg, 1, CHANGE_AAY);
++ else if (!strcmp(status, "complete"))
++ handler(vg, 0, CHANGE_AAY);
++ else if (!strcmp(status, "orphan"))
++ ;
++ else
++ log_error("Request to %s %s in lvmetad gave status %s.",
++ "update PV", uuid, status);
++ }
++
+ daemon_reply_destroy(reply);
+
+ return result;
+ }
+
+-int lvmetad_pv_gone(dev_t device, const char *pv_name)
++int lvmetad_pv_gone(dev_t device, const char *pv_name, activation_handler handler)
+ {
+ daemon_reply reply;
+ int result;
+@@ -617,6 +632,13 @@ int lvmetad_pv_gone(dev_t device, const char *pv_name)
+ if (!_using_lvmetad)
+ return 1;
+
++ /*
++ * TODO: automatic volume deactivation takes place here *before*
++ * all cached info is gone - call handler. Also, consider
++ * integrating existing deactivation script that deactivates
++ * the whole stack from top to bottom (not yet upstream).
++ */
++
+ reply = daemon_send_simple(_lvmetad, "pv_gone", "device = %d", device, NULL);
+
+ result = _lvmetad_handle_reply(reply, "drop PV", pv_name, &found);
+@@ -627,9 +649,9 @@ int lvmetad_pv_gone(dev_t device, const char *pv_name)
+ return result;
+ }
+
+-int lvmetad_pv_gone_by_dev(struct device *dev)
++int lvmetad_pv_gone_by_dev(struct device *dev, activation_handler handler)
+ {
+- return lvmetad_pv_gone(dev->dev, dev_name(dev));
++ return lvmetad_pv_gone(dev->dev, dev_name(dev), handler);
+ }
+
+ int lvmetad_active(void)
+@@ -665,7 +687,8 @@ static int _pvscan_lvmetad_single(struct metadata_area *mda, void *baton)
+ return 1;
+ }
+
+-int pvscan_lvmetad_single(struct cmd_context *cmd, struct device *dev)
++int pvscan_lvmetad_single(struct cmd_context *cmd, struct device *dev,
++ activation_handler handler)
+ {
+ struct label *label;
+ struct lvmcache_info *info;
+@@ -681,7 +704,7 @@ int pvscan_lvmetad_single(struct cmd_context *cmd, struct device *dev)
+
+ if (!label_read(dev, &label, 0)) {
+ log_print("No PV label found on %s.", dev_name(dev));
+- if (!lvmetad_pv_gone_by_dev(dev))
++ if (!lvmetad_pv_gone_by_dev(dev, handler))
+ goto_bad;
+ return 1;
+ }
+@@ -703,7 +726,7 @@ int pvscan_lvmetad_single(struct cmd_context *cmd, struct device *dev)
+ * sync needs to be killed.
+ */
+ if (!lvmetad_pv_found(*(struct id *)dev->pvid, dev, lvmcache_fmt(info),
+- label->sector, baton.vg)) {
++ label->sector, baton.vg, handler)) {
+ release_vg(baton.vg);
+ goto_bad;
+ }
+diff --git a/lib/cache/lvmetad.h b/lib/cache/lvmetad.h
+index 091ff5e..713c5a3 100644
+--- a/lib/cache/lvmetad.h
++++ b/lib/cache/lvmetad.h
+@@ -19,6 +19,8 @@ struct volume_group;
+ struct cmd_context;
+ struct dm_config_tree;
+
++typedef int (*activation_handler) (struct volume_group *vg, int partial, int activate);
++
+ #ifdef LVMETAD_SUPPORT
+ /*
+ * Initialise the communication with lvmetad. Normally called by
+@@ -64,13 +66,13 @@ int lvmetad_vg_remove(struct volume_group *vg);
+ */
+ int lvmetad_pv_found(struct id pvid, struct device *device,
+ const struct format_type *fmt, uint64_t label_sector,
+- struct volume_group *vg);
++ struct volume_group *vg, activation_handler handler);
+
+ /*
+ * Inform the daemon that the device no longer exists.
+ */
+-int lvmetad_pv_gone(dev_t devno, const char *pv_name);
+-int lvmetad_pv_gone_by_dev(struct device *dev);
++int lvmetad_pv_gone(dev_t devno, const char *pv_name, activation_handler handler);
++int lvmetad_pv_gone_by_dev(struct device *dev, activation_handler handler);
+
+ /*
+ * Request a list of all PVs available to lvmetad. If requested, this will also
+@@ -102,7 +104,8 @@ struct volume_group *lvmetad_vg_lookup(struct cmd_context *cmd,
+ /*
+ * Scan a single device and update lvmetad with the result(s).
+ */
+-int pvscan_lvmetad_single(struct cmd_context *cmd, struct device *dev);
++int pvscan_lvmetad_single(struct cmd_context *cmd, struct device *dev,
++ activation_handler handler);
+
+ # else /* LVMETAD_SUPPORT */
+
+@@ -111,15 +114,15 @@ int pvscan_lvmetad_single(struct cmd_context *cmd, struct device *dev);
+ # define lvmetad_active() (0)
+ # define lvmetad_vg_update(vg) (1)
+ # define lvmetad_vg_remove(vg) (1)
+-# define lvmetad_pv_found(pvid, device, fmt, label_sector, vg) (1)
+-# define lvmetad_pv_gone(devno, pv_name) (1)
+-# define lvmetad_pv_gone_by_dev(dev) (1)
++# define lvmetad_pv_found(pvid, device, fmt, label_sector, vg, handler) (1)
++# define lvmetad_pv_gone(devno, pv_name, handler) (1)
++# define lvmetad_pv_gone_by_dev(dev, handler) (1)
+ # define lvmetad_pv_list_to_lvmcache(cmd) (1)
+ # define lvmetad_pv_lookup(cmd, pvid, found) (0)
+ # define lvmetad_pv_lookup_by_dev(cmd, dev, found) (0)
+ # define lvmetad_vg_list_to_lvmcache(cmd) (1)
+ # define lvmetad_vg_lookup(cmd, vgname, vgid) (NULL)
+-# define pvscan_lvmetad_single(cmd, dev) (0)
++# define pvscan_lvmetad_single(cmd, dev, handler) (0)
+
+ # endif /* LVMETAD_SUPPORT */
+
+diff --git a/lib/device/dev-io.c b/lib/device/dev-io.c
+index eecc759..3bb9d65 100644
+--- a/lib/device/dev-io.c
++++ b/lib/device/dev-io.c
+@@ -282,7 +282,7 @@ static int _dev_read_ahead_dev(struct device *dev, uint32_t *read_ahead)
+ return 1;
+ }
+
+- if (!dev_open(dev))
++ if (!dev_open_readonly(dev))
+ return_0;
+
+ if (ioctl(dev->fd, BLKRAGET, &read_ahead_long) < 0) {
+diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
+index 3913680..fb36b59 100644
+--- a/lib/metadata/lv_manip.c
++++ b/lib/metadata/lv_manip.c
+@@ -4411,6 +4411,15 @@ static struct logical_volume *_lv_create_an_lv(struct volume_group *vg, struct l
+
+ backup(vg);
+
++ /*
++ * Check for autoactivation.
++ * If the LV passes the auto activation filter, activate
++ * it just as if CHANGE_AY was used, CHANGE_AN otherwise.
++ */
++ if (lp->activate == CHANGE_AAY)
++ lp->activate = lv_passes_auto_activation_filter(cmd, lv) ?
++ CHANGE_ALY : CHANGE_ALN;
++
+ if (test_mode()) {
+ log_verbose("Test mode: Skipping activation and zeroing.");
+ goto out;
+diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h
+index f42ec33..8c655c7 100644
+--- a/lib/metadata/metadata-exported.h
++++ b/lib/metadata/metadata-exported.h
+@@ -563,11 +563,12 @@ int update_pool_lv(struct logical_volume *lv, int activate);
+ * Activation options
+ */
+ typedef enum {
+- CHANGE_AY = 0,
+- CHANGE_AN = 1,
+- CHANGE_AE = 2,
+- CHANGE_ALY = 3,
+- CHANGE_ALN = 4
++ CHANGE_AY = 0, /* activate */
++ CHANGE_AN = 1, /* deactivate */
++ CHANGE_AE = 2, /* activate exclusively */
++ CHANGE_ALY = 3, /* activate locally */
++ CHANGE_ALN = 4, /* deactivate locally */
++ CHANGE_AAY = 5 /* automatic activation */
+ } activation_change_t;
+
+ /* FIXME: refactor and reduce the size of this struct! */
+diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c
+index 7c22785..c14125a 100644
+--- a/lib/metadata/metadata.c
++++ b/lib/metadata/metadata.c
+@@ -3800,7 +3800,8 @@ int pv_write(struct cmd_context *cmd __attribute__((unused)),
+ if (!pv->fmt->ops->pv_write(pv->fmt, pv))
+ return_0;
+
+- if (!lvmetad_pv_found(pv->id, pv->dev, pv->fmt, pv->label_sector, NULL))
++ if (!lvmetad_pv_found(pv->id, pv->dev, pv->fmt, pv->label_sector,
++ NULL, NULL))
+ return_0;
+
+ return 1;
+diff --git a/lib/misc/configure.h.in b/lib/misc/configure.h.in
+index dc6a260..06a5855 100644
+--- a/lib/misc/configure.h.in
++++ b/lib/misc/configure.h.in
+@@ -53,10 +53,16 @@
+ /* Define default name mangling behaviour */
+ #undef DEFAULT_DM_NAME_MANGLING
+
++/* Default DM run directory. */
++#undef DEFAULT_DM_RUN_DIR
++
+ /* Name of default locking directory. */
+ #undef DEFAULT_LOCK_DIR
+
+-/* Name of default run directory. */
++/* Default directory to keep PID files in. */
++#undef DEFAULT_PID_DIR
++
++/* Default LVM run directory. */
+ #undef DEFAULT_RUN_DIR
+
+ /* Define to 0 to reinstate the pre-2.02.54 handling of unit suffixes. */
+@@ -464,6 +470,9 @@
+ /* Define to 1 to include built-in support for LVM1 metadata. */
+ #undef LVM1_INTERNAL
+
++/* Path to lvmetad pidfile. */
++#undef LVMETAD_PIDFILE
++
+ /* Define to 1 to include code that uses lvmetad. */
+ #undef LVMETAD_SUPPORT
+
+diff --git a/man/lvchange.8.in b/man/lvchange.8.in
+index 927be25..c7507d4 100644
+--- a/man/lvchange.8.in
++++ b/man/lvchange.8.in
+@@ -7,8 +7,8 @@ lvchange \- change attributes of a logical volume
+ .IR Tag ]
+ .RB [ \-A | \-\-autobackup
+ .RI { y | n }]
+-.RB [ \-a | \-\-available
+-.RI [ e | l ]{ y | n }]
++.RB [ \-a | \-\-activate
++.RI [ a | e | l ]{ y | n }]
+ .RB [ \-\-alloc
+ .IR AllocationPolicy ]
+ .RB [ \-C | \-\-contiguous
+@@ -46,11 +46,15 @@ including making them known to the kernel ready for use.
+ .SH OPTIONS
+ See \fBlvm\fP(8) for common options.
+ .TP
+-.BR \-a ", " \-\-available " [" \fIe | \fIl ]{ \fIy | \fIn }
++.BR \-a ", " \-\-activate " [" \fIa | \fIe | \fIl ]{ \fIy | \fIn }
+ Controls the availability of the logical volumes for use.
+ Communicates with the kernel device-mapper driver via
+ libdevmapper to activate (\-ay) or deactivate (\-an) the
+-logical volumes.
++logical volumes. If autoactivation option is used (\-aay),
++the logical volume is activated only if it matches an item in
++the activation/auto_activation_volume_list set in lvm.conf.
++Autoactivation is not yet supported for logical volumes that
++are part of partial or clustered volume groups.
+ .IP
+ If clustered locking is enabled, -aey will activate exclusively
+ on one node and -aly will activate only on the local node.
+diff --git a/man/lvcreate.8.in b/man/lvcreate.8.in
+index 97fe624..2917775 100644
+--- a/man/lvcreate.8.in
++++ b/man/lvcreate.8.in
+@@ -7,8 +7,8 @@ lvcreate \- create a logical volume in an existing volume group
+ .IR Tag ]
+ .RB [ \-\-alloc
+ .IR AllocationPolicy ]
+-.RB [ \-a | \-\-available
+-.RI [ e | l ]{ y | n }]
++.RB [ \-a | \-\-activate
++.RI [ a | e | l ]{ y | n }]
+ .RB [ \-A | \-\-autobackup
+ .RI { y | n }]
+ .RB [ \-C | \-\-contiguous
+@@ -107,17 +107,21 @@ See
+ .BR lvm (8)
+ for common options.
+ .TP
+-.IR \fB\-a ", " \fB\-\-available " {" y | n | ey | en | ly | ln }
++.IR \fB\-a ", " \fB\-\-activate " {" y | ay | n | ey | en | ly | ln }
+ Controls the availability of the Logical Volumes for immediate use after
+ the command finishes running.
+-By default, new Logical Volumes are activated automatically (\fB-a\fIy\fR).
++By default, new Logical Volumes are activated (\fB-a\fIy\fR).
+ If it is possible technically, \fB-a\fIn\fR will leave the new Logical
+ Volume inactive. But for example, snapshots can only be created
+ in the active state so \fB\-a\fIn\fR cannot be used with \fB\-\-snapshot\fP.
+ Normally the \fB\-\-zero n\fP argument has to be supplied too because
+ zeroing (the default behaviour) also requires activation.
+-If clustered locking is enabled, \fB\-a\fIey\fR will activate exclusively
+-on one node and \fB\-a\fIly\fR will activate only on the local node.
++If autoactivation option is used (\fB\-a\fIay\fR), the logical volume is
++activated only if it matches an item in the activation/auto_activation_volume_list
++set in lvm.conf. For autoactivated logical volumes, \fB\-\-zero n\fP is
++always assumed and it can't be overridden. If clustered locking is enabled,
++\fB\-a\fIey\fR will activate exclusively on one node and \fB\-a\fIly\fR will
++activate only on the local node.
+ .TP
+ .BR \-c ", " \-\-chunksize " " \fIChunkSize
+ Gives the size of chunk for snapshot and thin pool logical volumes.
+diff --git a/man/lvm.conf.5.in b/man/lvm.conf.5.in
+index 6de7419..47ee9f1 100644
+--- a/man/lvm.conf.5.in
++++ b/man/lvm.conf.5.in
+@@ -424,6 +424,17 @@ metadata for a match.
+ Logical volume and volume groups can also be included in the list
+ by name e.g. vg00, vg00/lvol1.
+ .IP
++\fBauto_activation_volume_list\fP \(em This acts as a filter through
++which all requests to autoactivate a logical volume on this machine
++are passed. A logical volume is autoactivated if it matches
++an item in the list. Volumes must also pass the \fBvolume_list\fP
++filter, if present. Tags must be preceded by @ and are checked against
++all tags defined in the logical volume and volume group metadata for
++a match. @* is short-hand to check every tag set on the host machine
++(see \fBtags\fP above).
++Logical volume and volume groups can also be included in the list
++by name e.g. vg00, vg00/lvol1.
++.IP
+ \fBread_only_volume_list\fP \(em This acts as a filter through
+ which all requests to activate a logical volume on this machine
+ are passed. A logical volume is activated in read-only mode (instead
+diff --git a/man/pvscan.8.in b/man/pvscan.8.in
+index b75773b..1be3109 100644
+--- a/man/pvscan.8.in
++++ b/man/pvscan.8.in
+@@ -18,6 +18,7 @@ pvscan \- scan all disks for physical volumes
+ .RB [ \-d | \-\-debug ]
+ .RB [ \-h | \-\-help ]
+ .B \-\-cache
++.RB [ \-a | \-\-activate " " \fIay ]
+ .RB [ \-\-major
+ .I major
+ .B \-\-minor
+@@ -42,6 +43,13 @@ Short listing format.
+ .BR \-u ", " \-\-uuid
+ Show UUIDs (Uniform Unique Identifiers) in addition to device special names.
+ .TP
++.BR \-a ", " \-\-activate " " \fIay
++Together with the information already cached in lvmetad, automatically activate
++any logical volumes that become activatable after the scan done on one or more devices.
++The logical volume to autoactivate is matched against the
++activation/auto_activation_volume_list set in lvm.conf. Autoactivation is not yet
++supported on logical volumes that are part of partial or clustered volume groups.
++.TP
+ .BR \-\-cache " [" \-\-major " " \fImajor " " \-\-minor " " \fIminor " | " \fIDevicePath " ]..."
+ Scan one or more devices and instruct the lvmetad daemon to update its cached
+ state accordingly. Called internally by udev rules.
+diff --git a/man/vgchange.8.in b/man/vgchange.8.in
+index d43f79a..28e2623 100644
+--- a/man/vgchange.8.in
++++ b/man/vgchange.8.in
+@@ -9,8 +9,8 @@ vgchange \- change attributes of a volume group
+ .IR AllocationPolicy ]
+ .RB [ \-A | \-\-autobackup
+ .RI { y | n }]
+-.RB [ \-a | \-\-available
+-.RI [ e | l ]
++.RB [ \-a | \-\-activate
++.RI [ a | e | l ]
+ .RI { y | n }]
+ .RB [ \-\-monitor
+ .RI { y | n }]
+@@ -64,10 +64,15 @@ Controls automatic backup of metadata after the change. See
+ .BR vgcfgbackup (8).
+ Default is yes.
+ .TP
+-.BR \-a ", " \-\-available " [" \fIe | \fIl ]{ \fIy | \fIn }
++.BR \-a ", " \-\-activate " [" \fIa | \fIe | \fIl ]{ \fIy | \fIn }
+ Controls the availability of the logical volumes in the volume
+ group for input/output.
+ In other words, makes the logical volumes known/unknown to the kernel.
++If autoactivation option is used (\-aay), each logical volume in
++the volume group is activated only if it matches an item in the
++activation/auto_activation_volume_list set in lvm.conf.
++Autoactivation is not yet supported for partial or clustered
++volume groups.
+ .IP
+ If clustered locking is enabled, add 'e' to activate/deactivate
+ exclusively on one node or 'l' to activate/deactivate only
+diff --git a/scripts/Makefile.in b/scripts/Makefile.in
+index be012d6..53c85f5 100644
+--- a/scripts/Makefile.in
++++ b/scripts/Makefile.in
+@@ -75,7 +75,9 @@ install_tmpfiles_configuration:
+ $(INSTALL_DIR) $(tmpfiles_dir)
+ $(INSTALL_DATA) lvm2_tmpfiles_red_hat.conf $(tmpfiles_dir)/lvm2.conf
+
+-DISTCLEAN_TARGETS += clvmd_init_red_hat cmirrord_init_red_hat lvm2_monitoring_init_red_hat \
+- dm_event_systemd_red_hat.service lvm2_monitoring_systemd_red_hat.service \
++DISTCLEAN_TARGETS += clvmd_init_red_hat cmirrord_init_red_hat \
++ lvm2_monitoring_init_red_hat lvm2_lvmetad_init_red_hat \
++ dm_event_systemd_red_hat.socket dm_event_systemd_red_hat.service \
++ lvm2_monitoring_systemd_red_hat.service \
+ lvm2_lvmetad_systemd_red_hat.socket lvm2_lvmetad_systemd_red_hat.service \
+- lvm2_lvmetad_init_red_hat lvm2_tmpfiles_red_hat.conf
++ lvm2_tmpfiles_red_hat.conf
+diff --git a/scripts/dm_event_systemd_red_hat.service.in b/scripts/dm_event_systemd_red_hat.service.in
+index 02a24c6..96c5225 100644
+--- a/scripts/dm_event_systemd_red_hat.service.in
++++ b/scripts/dm_event_systemd_red_hat.service.in
+@@ -1,5 +1,6 @@
+ [Unit]
+ Description=Device-mapper event daemon
++Documentation=man:dmeventd(8)
+ Requires=dm-event.socket
+ After=dm-event.socket
+ Before=local-fs.target
+diff --git a/scripts/dm_event_systemd_red_hat.socket b/scripts/dm_event_systemd_red_hat.socket
+deleted file mode 100644
+index c580555..0000000
+--- a/scripts/dm_event_systemd_red_hat.socket
++++ /dev/null
+@@ -1,11 +0,0 @@
+-[Unit]
+-Description=Device-mapper event daemon FIFOs
+-DefaultDependencies=no
+-
+-[Socket]
+-ListenFIFO=/var/run/dmeventd-server
+-ListenFIFO=/var/run/dmeventd-client
+-SocketMode=0600
+-
+-[Install]
+-WantedBy=sockets.target
+diff --git a/scripts/dm_event_systemd_red_hat.socket.in b/scripts/dm_event_systemd_red_hat.socket.in
+new file mode 100644
+index 0000000..b27c68d
+--- /dev/null
++++ b/scripts/dm_event_systemd_red_hat.socket.in
+@@ -0,0 +1,12 @@
++[Unit]
++Description=Device-mapper event daemon FIFOs
++Documentation=man:dmeventd(8)
++DefaultDependencies=no
++
++[Socket]
++ListenFIFO=@DEFAULT_DM_RUN_DIR@/dmeventd-server
++ListenFIFO=@DEFAULT_DM_RUN_DIR@/dmeventd-client
++SocketMode=0600
++
++[Install]
++WantedBy=sockets.target
+diff --git a/scripts/lvm2_lvmetad_init_red_hat.in b/scripts/lvm2_lvmetad_init_red_hat.in
+index 886944e..888c730 100644
+--- a/scripts/lvm2_lvmetad_init_red_hat.in
++++ b/scripts/lvm2_lvmetad_init_red_hat.in
+@@ -41,7 +41,7 @@ sbindir=@sbindir@
+ lvm_pvscan="${sbindir}/lvm pvscan --cache"
+
+ LOCK_FILE="/var/lock/subsys/$DAEMON"
+-PID_FILE="@DEFAULT_RUN_DIR@/${DAEMON}.pid"
++PID_FILE="@LVMETAD_PIDFILE@"
+
+
+ rh_status() {
+diff --git a/scripts/lvm2_lvmetad_systemd_red_hat.service.in b/scripts/lvm2_lvmetad_systemd_red_hat.service.in
+index e32c8a1..e527369 100644
+--- a/scripts/lvm2_lvmetad_systemd_red_hat.service.in
++++ b/scripts/lvm2_lvmetad_systemd_red_hat.service.in
+@@ -1,5 +1,6 @@
+ [Unit]
+ Description=LVM2 metadata daemon
++Documentation=man:lvmetad(8)
+ Requires=lvm2-lvmetad.socket
+ After=lvm2-lvmetad.socket
+ DefaultDependencies=no
+@@ -13,7 +14,7 @@ ExecStartPost=@sbindir@/lvm pvscan --cache
+ ExecReload=@sbindir@/lvmetad -R
+ Environment=SD_ACTIVATION=1
+ Restart=on-abort
+-PIDFile=@DEFAULT_RUN_DIR@/lvmetad.pid
++PIDFile=@LVMETAD_PIDFILE@
+
+ [Install]
+ WantedBy=sysinit.target
+diff --git a/scripts/lvm2_lvmetad_systemd_red_hat.socket.in b/scripts/lvm2_lvmetad_systemd_red_hat.socket.in
+index f4c82a5..9a46f50 100644
+--- a/scripts/lvm2_lvmetad_systemd_red_hat.socket.in
++++ b/scripts/lvm2_lvmetad_systemd_red_hat.socket.in
+@@ -1,5 +1,6 @@
+ [Unit]
+ Description=LVM2 metadata daemon socket
++Documentation=man:lvmetad(8)
+ DefaultDependencies=no
+
+ [Socket]
+diff --git a/scripts/lvm2_monitoring_systemd_red_hat.service.in b/scripts/lvm2_monitoring_systemd_red_hat.service.in
+index e93414d..a8d5183 100644
+--- a/scripts/lvm2_monitoring_systemd_red_hat.service.in
++++ b/scripts/lvm2_monitoring_systemd_red_hat.service.in
+@@ -1,5 +1,6 @@
+ [Unit]
+ Description=Monitoring of LVM2 mirrors, snapshots etc. using dmeventd or progress polling
++Documentation=man:dmeventd(8) man:lvcreate(8) man:lvchange(8) man:vgchange(8)
+ Requires=dm-event.socket
+ After=dm-event.socket fedora-storage-init.service fedora-storage-init-late.service
+ Before=local-fs.target
+diff --git a/tools/args.h b/tools/args.h
+index f2fa14b..2ce3c36 100644
+--- a/tools/args.h
++++ b/tools/args.h
+@@ -79,11 +79,12 @@ arg(thinpool_ARG, '\0', "thinpool", string_arg, 0)
+ /* Allow some variations */
+ arg(resizable_ARG, '\0', "resizable", yes_no_arg, 0)
+ arg(allocation_ARG, '\0', "allocation", yes_no_arg, 0)
++arg(available_ARG, '\0', "available", activation_arg, 0)
+
+ /*
+ * ... and now the short args.
+ */
+-arg(available_ARG, 'a', "available", yes_no_excl_arg, 0)
++arg(activate_ARG, 'a', "activate", activation_arg, 0)
+ arg(all_ARG, 'a', "all", NULL, 0)
+ arg(autobackup_ARG, 'A', "autobackup", yes_no_arg, 0)
+ arg(activevolumegroups_ARG, 'A', "activevolumegroups", NULL, 0)
+diff --git a/tools/commands.h b/tools/commands.h
+index a008a7b..3454951 100644
+--- a/tools/commands.h
++++ b/tools/commands.h
+@@ -61,7 +61,7 @@ xx(lvchange,
+ CACHE_VGMETADATA | PERMITTED_READ_ONLY,
+ "lvchange\n"
+ "\t[-A|--autobackup y|n]\n"
+- "\t[-a|--available [e|l]y|n]\n"
++ "\t[-a|--activate [a|e|l]{y|n}]\n"
+ "\t[--addtag Tag]\n"
+ "\t[--alloc AllocationPolicy]\n"
+ "\t[-C|--contiguous y|n]\n"
+@@ -87,11 +87,11 @@ xx(lvchange,
+ "\t[--version]" "\n"
+ "\tLogicalVolume[Path] [LogicalVolume[Path]...]\n",
+
+- alloc_ARG, autobackup_ARG, available_ARG, contiguous_ARG, force_ARG,
+- ignorelockingfailure_ARG, ignoremonitoring_ARG, major_ARG, minor_ARG,
+- monitor_ARG, noudevsync_ARG, partial_ARG, permission_ARG, persistent_ARG,
+- poll_ARG, readahead_ARG, resync_ARG, refresh_ARG, addtag_ARG, deltag_ARG,
+- sysinit_ARG, test_ARG, yes_ARG)
++ alloc_ARG, autobackup_ARG, activate_ARG, available_ARG, contiguous_ARG,
++ force_ARG, ignorelockingfailure_ARG, ignoremonitoring_ARG, major_ARG,
++ minor_ARG, monitor_ARG, noudevsync_ARG, partial_ARG, permission_ARG,
++ persistent_ARG, poll_ARG, readahead_ARG, resync_ARG, refresh_ARG,
++ addtag_ARG, deltag_ARG, sysinit_ARG, test_ARG, yes_ARG)
+
+ xx(lvconvert,
+ "Change logical volume layout",
+@@ -159,7 +159,7 @@ xx(lvcreate,
+ 0,
+ "lvcreate " "\n"
+ "\t[-A|--autobackup {y|n}]\n"
+- "\t[-a|--available [e|l]y|n]\n"
++ "\t[-a|--activate [a|e|l]{y|n}]\n"
+ "\t[--addtag Tag]\n"
+ "\t[--alloc AllocationPolicy]\n"
+ "\t[-C|--contiguous {y|n}]\n"
+@@ -214,13 +214,13 @@ xx(lvcreate,
+
+ "\t[PhysicalVolumePath...]\n\n",
+
+- addtag_ARG, alloc_ARG, autobackup_ARG, available_ARG, chunksize_ARG,
+- contiguous_ARG, corelog_ARG, extents_ARG, ignoremonitoring_ARG, major_ARG,
+- minor_ARG, mirrorlog_ARG, mirrors_ARG, monitor_ARG, name_ARG, nosync_ARG,
+- noudevsync_ARG, permission_ARG, persistent_ARG, readahead_ARG,
+- regionsize_ARG, size_ARG, snapshot_ARG, stripes_ARG, stripesize_ARG,
+- test_ARG, thin_ARG, thinpool_ARG, type_ARG, virtualoriginsize_ARG,
+- poolmetadatasize_ARG, virtualsize_ARG, zero_ARG)
++ addtag_ARG, alloc_ARG, autobackup_ARG, activate_ARG, available_ARG,
++ chunksize_ARG, contiguous_ARG, corelog_ARG, extents_ARG,
++ ignoremonitoring_ARG, major_ARG, minor_ARG, mirrorlog_ARG, mirrors_ARG,
++ monitor_ARG, name_ARG, nosync_ARG, noudevsync_ARG, permission_ARG,
++ persistent_ARG, readahead_ARG, regionsize_ARG, size_ARG, snapshot_ARG,
++ stripes_ARG, stripesize_ARG, test_ARG, thin_ARG, thinpool_ARG, type_ARG,
++ virtualoriginsize_ARG, poolmetadatasize_ARG, virtualsize_ARG, zero_ARG)
+
+ xx(lvdisplay,
+ "Display information about a logical volume",
+@@ -671,6 +671,7 @@ xx(pvscan,
+ "List all physical volumes",
+ PERMITTED_READ_ONLY,
+ "pvscan " "\n"
++ "\t[-a|--activate ay]\n"
+ "\t[--cache [ DevicePath | --major major --minor minor]...]\n"
+ "\t[-d|--debug] " "\n"
+ "\t{-e|--exported | -n|--novolumegroup} " "\n"
+@@ -682,7 +683,8 @@ xx(pvscan,
+ "\t[-v|--verbose] " "\n"
+ "\t[--version]\n",
+
+- cache_ARG, exported_ARG, ignorelockingfailure_ARG, major_ARG, minor_ARG,
++ activate_ARG, available_ARG, cache_ARG, exported_ARG,
++ ignorelockingfailure_ARG, major_ARG, minor_ARG,
+ novolumegroup_ARG, partial_ARG, short_ARG, uuid_ARG)
+
+ xx(segtypes,
+@@ -742,7 +744,7 @@ xx(vgchange,
+ "\t[-u|--uuid] " "\n"
+ "\t[-v|--verbose] " "\n"
+ "\t[--version]" "\n"
+- "\t{-a|--available [e|l]{y|n} |" "\n"
++ "\t{-a|--activate [a|e|l]{y|n} |" "\n"
+ "\t -c|--clustered {y|n} |" "\n"
+ "\t -x|--resizeable {y|n} |" "\n"
+ "\t -l|--logicalvolume MaxLogicalVolumes |" "\n"
+@@ -752,11 +754,11 @@ xx(vgchange,
+ "\t --deltag Tag}\n"
+ "\t[VolumeGroupName...]\n",
+
+- addtag_ARG, alloc_ARG, allocation_ARG, autobackup_ARG, available_ARG,
+- clustered_ARG, deltag_ARG, ignorelockingfailure_ARG, ignoremonitoring_ARG,
+- logicalvolume_ARG, maxphysicalvolumes_ARG, monitor_ARG, noudevsync_ARG,
+- metadatacopies_ARG, vgmetadatacopies_ARG, partial_ARG,
+- physicalextentsize_ARG, poll_ARG, refresh_ARG, resizeable_ARG,
++ addtag_ARG, alloc_ARG, allocation_ARG, autobackup_ARG, activate_ARG,
++ available_ARG, clustered_ARG, deltag_ARG, ignorelockingfailure_ARG,
++ ignoremonitoring_ARG, logicalvolume_ARG, maxphysicalvolumes_ARG,
++ monitor_ARG, noudevsync_ARG, metadatacopies_ARG, vgmetadatacopies_ARG,
++ partial_ARG, physicalextentsize_ARG, poll_ARG, refresh_ARG, resizeable_ARG,
+ resizable_ARG, sysinit_ARG, test_ARG, uuid_ARG)
+
+ xx(vgck,
+diff --git a/tools/lvchange.c b/tools/lvchange.c
+index 2ed8c16..9876847 100644
+--- a/tools/lvchange.c
++++ b/tools/lvchange.c
+@@ -127,16 +127,21 @@ static int lvchange_background_polling(struct cmd_context *cmd,
+ return 1;
+ }
+
+-static int lvchange_availability(struct cmd_context *cmd,
+- struct logical_volume *lv)
++static int _lvchange_activate(struct cmd_context *cmd, struct logical_volume *lv)
+ {
+ int activate;
+
+- activate = arg_uint_value(cmd, available_ARG, 0);
++ activate = arg_uint_value(cmd, activate_ARG, 0);
+
+ if (lv_is_cow(lv) && !lv_is_virtual_origin(origin_from_cow(lv)))
+ lv = origin_from_cow(lv);
+
++ if (activate == CHANGE_AAY) {
++ if (!lv_passes_auto_activation_filter(cmd, lv))
++ return 1;
++ activate = CHANGE_ALY;
++ }
++
+ if (activate == CHANGE_ALN) {
+ log_verbose("Deactivating logical volume \"%s\" locally",
+ lv->name);
+@@ -556,7 +561,7 @@ static int lvchange_single(struct cmd_context *cmd, struct logical_volume *lv,
+ }
+
+ if (lv_is_cow(lv) && !lv_is_virtual_origin(origin = origin_from_cow(lv)) &&
+- arg_count(cmd, available_ARG)) {
++ arg_count(cmd, activate_ARG)) {
+ if (origin->origin_count < 2)
+ snaps_msg[0] = '\0';
+ else if (dm_snprintf(snaps_msg, sizeof(snaps_msg),
+@@ -577,7 +582,7 @@ static int lvchange_single(struct cmd_context *cmd, struct logical_volume *lv,
+
+ if (lv->status & PVMOVE) {
+ log_error("Unable to change pvmove LV %s", lv->name);
+- if (arg_count(cmd, available_ARG))
++ if (arg_count(cmd, activate_ARG))
+ log_error("Use 'pvmove --abort' to abandon a pvmove");
+ return ECMD_FAILED;
+ }
+@@ -594,7 +599,7 @@ static int lvchange_single(struct cmd_context *cmd, struct logical_volume *lv,
+ }
+
+ /* If LV is sparse, activate origin instead */
+- if (arg_count(cmd, available_ARG) && lv_is_cow(lv) &&
++ if (arg_count(cmd, activate_ARG) && lv_is_cow(lv) &&
+ lv_is_virtual_origin(origin = origin_from_cow(lv)))
+ lv = origin;
+
+@@ -696,9 +701,9 @@ static int lvchange_single(struct cmd_context *cmd, struct logical_volume *lv,
+ return ECMD_FAILED;
+ }
+
+- /* availability change */
+- if (arg_count(cmd, available_ARG)) {
+- if (!lvchange_availability(cmd, lv)) {
++ /* activation change */
++ if (arg_count(cmd, activate_ARG)) {
++ if (!_lvchange_activate(cmd, lv)) {
+ stack;
+ return ECMD_FAILED;
+ }
+@@ -710,7 +715,7 @@ static int lvchange_single(struct cmd_context *cmd, struct logical_volume *lv,
+ return ECMD_FAILED;
+ }
+
+- if (!arg_count(cmd, available_ARG) &&
++ if (!arg_count(cmd, activate_ARG) &&
+ !arg_count(cmd, refresh_ARG) &&
+ arg_count(cmd, monitor_ARG)) {
+ if (!lvchange_monitoring(cmd, lv)) {
+@@ -719,7 +724,7 @@ static int lvchange_single(struct cmd_context *cmd, struct logical_volume *lv,
+ }
+ }
+
+- if (!arg_count(cmd, available_ARG) &&
++ if (!arg_count(cmd, activate_ARG) &&
+ !arg_count(cmd, refresh_ARG) &&
+ arg_count(cmd, poll_ARG)) {
+ if (!lvchange_background_polling(cmd, lv)) {
+@@ -745,7 +750,7 @@ int lvchange(struct cmd_context *cmd, int argc, char **argv)
+ arg_count(cmd, resync_ARG) || arg_count(cmd, alloc_ARG);
+
+ if (!update &&
+- !arg_count(cmd, available_ARG) && !arg_count(cmd, refresh_ARG) &&
++ !arg_count(cmd, activate_ARG) && !arg_count(cmd, refresh_ARG) &&
+ !arg_count(cmd, monitor_ARG) && !arg_count(cmd, poll_ARG)) {
+ log_error("Need 1 or more of -a, -C, -M, -p, -r, "
+ "--resync, --refresh, --alloc, --addtag, --deltag, "
+@@ -753,7 +758,7 @@ int lvchange(struct cmd_context *cmd, int argc, char **argv)
+ return EINVALID_CMD_LINE;
+ }
+
+- if (arg_count(cmd, available_ARG) && arg_count(cmd, refresh_ARG)) {
++ if (arg_count(cmd, activate_ARG) && arg_count(cmd, refresh_ARG)) {
+ log_error("Only one of -a and --refresh permitted.");
+ return EINVALID_CMD_LINE;
+ }
+diff --git a/tools/lvcreate.c b/tools/lvcreate.c
+index 28d4dbf..ab217cf 100644
+--- a/tools/lvcreate.c
++++ b/tools/lvcreate.c
+@@ -560,13 +560,19 @@ static int _read_activation_params(struct lvcreate_params *lp, struct cmd_contex
+ unsigned pagesize;
+
+ lp->activate = (activation_change_t)
+- arg_uint_value(cmd, available_ARG, CHANGE_AY);
++ arg_uint_value(cmd, activate_ARG, CHANGE_AY);
+
+ if (lp->activate == CHANGE_AN || lp->activate == CHANGE_ALN) {
+ if (lp->zero && !seg_is_thin(lp)) {
+- log_error("--available n requires --zero n");
++ log_error("--activate n requires --zero n");
+ return 0;
+ }
++ } else if (lp->activate == CHANGE_AAY) {
++ if (arg_count(cmd, zero_ARG)) {
++ log_error("-Z is incompatible with --activate a");
++ return 0;
++ }
++ lp->zero = 0;
+ }
+
+ /*
+diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c
+index 2c3bb39..16e15a1 100644
+--- a/tools/lvmcmdline.c
++++ b/tools/lvmcmdline.c
+@@ -172,7 +172,7 @@ int yes_no_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_value
+ return 1;
+ }
+
+-int yes_no_excl_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av)
++int activation_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_values *av)
+ {
+ av->sign = SIGN_NONE;
+ av->percent = PERCENT_NONE;
+@@ -188,6 +188,12 @@ int yes_no_excl_arg(struct cmd_context *cmd __attribute__((unused)), struct arg_
+ av->ui_value = CHANGE_AY;
+ }
+
++ else if (!strcmp(av->value, "a") || !strcmp(av->value, "ay") ||
++ !strcmp(av->value, "ya")) {
++ av->i_value = CHANGE_AAY;
++ av->ui_value = CHANGE_AAY;
++ }
++
+ else if (!strcmp(av->value, "n") || !strcmp(av->value, "en") ||
+ !strcmp(av->value, "ne")) {
+ av->i_value = CHANGE_AN;
+@@ -889,7 +895,8 @@ static int _get_settings(struct cmd_context *cmd)
+ if (!_merge_synonym(cmd, resizable_ARG, resizeable_ARG) ||
+ !_merge_synonym(cmd, allocation_ARG, allocatable_ARG) ||
+ !_merge_synonym(cmd, allocation_ARG, resizeable_ARG) ||
+- !_merge_synonym(cmd, virtualoriginsize_ARG, virtualsize_ARG))
++ !_merge_synonym(cmd, virtualoriginsize_ARG, virtualsize_ARG) ||
++ !_merge_synonym(cmd, available_ARG, activate_ARG))
+ return EINVALID_CMD_LINE;
+
+ if ((!strncmp(cmd->command->name, "pv", 2) &&
+diff --git a/tools/pvremove.c b/tools/pvremove.c
+index 0c06c7f..7d05758 100644
+--- a/tools/pvremove.c
++++ b/tools/pvremove.c
+@@ -128,7 +128,7 @@ static int pvremove_single(struct cmd_context *cmd, const char *pv_name,
+ goto out;
+ }
+
+- if (!lvmetad_pv_gone_by_dev(dev))
++ if (!lvmetad_pv_gone_by_dev(dev, NULL))
+ goto_out;
+
+ log_print("Labels on physical volume \"%s\" successfully wiped",
+diff --git a/tools/pvscan.c b/tools/pvscan.c
+index f0e7408..b0e172d 100644
+--- a/tools/pvscan.c
++++ b/tools/pvscan.c
+@@ -99,7 +99,21 @@ static void _pvscan_display_single(struct cmd_context *cmd,
+ pv_pe_size(pv)));
+ }
+
+-static int _pvscan_lvmetad_all_devs(struct cmd_context *cmd)
++static int _auto_activation_handler(struct volume_group *vg, int partial, int activate)
++{
++ /* TODO: add support for partial and clustered VGs */
++ if (partial || vg_is_clustered(vg))
++ return 1;
++
++ if (!vgchange_activate(vg->cmd, vg, activate)) {
++ log_error("%s: autoactivation failed.", vg->name);
++ return 0;
++ }
++
++ return 1;
++}
++
++static int _pvscan_lvmetad_all_devs(struct cmd_context *cmd, activation_handler handler)
+ {
+ struct dev_iter *iter;
+ struct device *dev;
+@@ -111,7 +125,7 @@ static int _pvscan_lvmetad_all_devs(struct cmd_context *cmd)
+ }
+
+ while ((dev = dev_iter_get(iter))) {
+- if (!pvscan_lvmetad_single(cmd, dev)) {
++ if (!pvscan_lvmetad_single(cmd, dev, handler)) {
+ r = 0;
+ break;
+ }
+@@ -136,6 +150,15 @@ static int _pvscan_lvmetad(struct cmd_context *cmd, int argc, char **argv)
+ struct arg_value_group_list *current_group;
+ dev_t devno;
+ char *buf;
++ activation_handler handler = NULL;
++
++ if (arg_count(cmd, activate_ARG)) {
++ if (arg_uint_value(cmd, activate_ARG, CHANGE_AAY) != CHANGE_AAY) {
++ log_error("Only --activate ay allowed with pvscan.");
++ return 0;
++ }
++ handler = _auto_activation_handler;
++ }
+
+ if (arg_count(cmd, major_ARG) + arg_count(cmd, minor_ARG))
+ devno_args = 1;
+@@ -152,7 +175,7 @@ static int _pvscan_lvmetad(struct cmd_context *cmd, int argc, char **argv)
+
+ /* Scan everything? */
+ if (!argc && !devno_args) {
+- if (!_pvscan_lvmetad_all_devs(cmd))
++ if (!_pvscan_lvmetad_all_devs(cmd, handler))
+ ret = ECMD_FAILED;
+ goto out;
+ }
+@@ -169,7 +192,7 @@ static int _pvscan_lvmetad(struct cmd_context *cmd, int argc, char **argv)
+ continue;
+ }
+
+- if (!pvscan_lvmetad_single(cmd, dev)) {
++ if (!pvscan_lvmetad_single(cmd, dev, handler)) {
+ ret = ECMD_FAILED;
+ break;
+ }
+@@ -194,7 +217,7 @@ static int _pvscan_lvmetad(struct cmd_context *cmd, int argc, char **argv)
+ if (!dm_asprintf(&buf, "%" PRIi32 ":%" PRIi32, major, minor))
+ stack;
+ /* FIXME Filters? */
+- if (!lvmetad_pv_gone(devno, buf ? : "")) {
++ if (!lvmetad_pv_gone(devno, buf ? : "", handler)) {
+ ret = ECMD_FAILED;
+ if (buf)
+ dm_free(buf);
+@@ -208,7 +231,7 @@ static int _pvscan_lvmetad(struct cmd_context *cmd, int argc, char **argv)
+ continue;
+ }
+
+- if (!pvscan_lvmetad_single(cmd, dev)) {
++ if (!pvscan_lvmetad_single(cmd, dev, handler)) {
+ ret = ECMD_FAILED;
+ break;
+ }
+@@ -242,6 +265,11 @@ int pvscan(struct cmd_context *cmd, int argc, char **argv)
+ if (arg_count(cmd, cache_ARG))
+ return _pvscan_lvmetad(cmd, argc, argv);
+
++ if (arg_count(cmd, activate_ARG)) {
++ log_error("--activate is only valid with --cache.");
++ return EINVALID_CMD_LINE;
++ }
++
+ if (arg_count(cmd, major_ARG) + arg_count(cmd, minor_ARG)) {
+ log_error("--major and --minor are only valid with --cache.");
+ return EINVALID_CMD_LINE;
+diff --git a/tools/toollib.c b/tools/toollib.c
+index d5ad805..3df0ef0 100644
+--- a/tools/toollib.c
++++ b/tools/toollib.c
+@@ -129,7 +129,7 @@ int process_each_lv_in_vg(struct cmd_context *cmd,
+
+ /* Skip availability change for non-virt snaps when processing all LVs */
+ /* FIXME: pass process_all to process_single_lv() */
+- if (process_all && arg_count(cmd, available_ARG) &&
++ if (process_all && arg_count(cmd, activate_ARG) &&
+ lv_is_cow(lvl->lv) && !lv_is_virtual_origin(origin_from_cow(lvl->lv)))
+ continue;
+
+diff --git a/tools/tools.h b/tools/tools.h
+index b467e4b..7a44651 100644
+--- a/tools/tools.h
++++ b/tools/tools.h
+@@ -138,7 +138,7 @@ void usage(const char *name);
+
+ /* the argument verify/normalise functions */
+ int yes_no_arg(struct cmd_context *cmd, struct arg_values *av);
+-int yes_no_excl_arg(struct cmd_context *cmd, struct arg_values *av);
++int activation_arg(struct cmd_context *cmd, struct arg_values *av);
+ int size_kb_arg(struct cmd_context *cmd, struct arg_values *av);
+ int size_mb_arg(struct cmd_context *cmd, struct arg_values *av);
+ int int_arg(struct cmd_context *cmd, struct arg_values *av);
+@@ -185,4 +185,7 @@ int mirror_remove_missing(struct cmd_context *cmd,
+ struct logical_volume *lv, int force);
+
+ uint32_t percent_of_extents(uint32_t percents, uint32_t count, int roundup);
++
++int vgchange_activate(struct cmd_context *cmd, struct volume_group *vg,
++ activation_change_t activate);
+ #endif
+diff --git a/tools/vgchange.c b/tools/vgchange.c
+index dc06ac9..ebabb08 100644
+--- a/tools/vgchange.c
++++ b/tools/vgchange.c
+@@ -81,8 +81,8 @@ static int _poll_lvs_in_vg(struct cmd_context *cmd,
+ return count;
+ }
+
+-static int _activate_lvs_in_vg(struct cmd_context *cmd,
+- struct volume_group *vg, int activate)
++static int _activate_lvs_in_vg(struct cmd_context *cmd, struct volume_group *vg,
++ activation_change_t activate)
+ {
+ struct lv_list *lvl;
+ struct logical_volume *lv;
+@@ -131,6 +131,12 @@ static int _activate_lvs_in_vg(struct cmd_context *cmd,
+ continue;
+ }
+
++ if (activate == CHANGE_AAY) {
++ if (!lv_passes_auto_activation_filter(cmd, lv))
++ continue;
++ activate = CHANGE_ALY;
++ }
++
+ expected_count++;
+
+ if (activate == CHANGE_AN) {
+@@ -211,35 +217,32 @@ static int _vgchange_background_polling(struct cmd_context *cmd, struct volume_g
+ return 1;
+ }
+
+-static int _vgchange_available(struct cmd_context *cmd, struct volume_group *vg)
++int vgchange_activate(struct cmd_context *cmd, struct volume_group *vg,
++ activation_change_t activate)
+ {
+- int lv_open, active, monitored = 0;
+- int available, r = 1;
+- int activate = 1;
++ int lv_open, active, monitored = 0, r = 1, do_activate = 1;
++
++ if ((activate == CHANGE_AN) || (activate == CHANGE_ALN))
++ do_activate = 0;
+
+ /*
+ * Safe, since we never write out new metadata here. Required for
+ * partial activation to work.
+ */
+- cmd->handles_missing_pvs = 1;
+-
+- available = arg_uint_value(cmd, available_ARG, 0);
+-
+- if ((available == CHANGE_AN) || (available == CHANGE_ALN))
+- activate = 0;
++ cmd->handles_missing_pvs = 1;
+
+ /* FIXME: Force argument to deactivate them? */
+- if (!activate && (lv_open = lvs_in_vg_opened(vg))) {
++ if (!do_activate && (lv_open = lvs_in_vg_opened(vg))) {
+ log_error("Can't deactivate volume group \"%s\" with %d open "
+ "logical volume(s)", vg->name, lv_open);
+ return 0;
+ }
+
+ /* FIXME Move into library where clvmd can use it */
+- if (activate)
++ if (do_activate)
+ check_current_backup(vg);
+
+- if (activate && (active = lvs_in_vg_activated(vg))) {
++ if (do_activate && (active = lvs_in_vg_activated(vg))) {
+ log_verbose("%d logical volume(s) in volume group \"%s\" "
+ "already active", active, vg->name);
+ if (dmeventd_monitor_mode() != DMEVENTD_MONITOR_IGNORE) {
+@@ -252,7 +255,7 @@ static int _vgchange_available(struct cmd_context *cmd, struct volume_group *vg)
+ }
+ }
+
+- if (!_activate_lvs_in_vg(cmd, vg, available))
++ if (!_activate_lvs_in_vg(cmd, vg, activate))
+ r = 0;
+
+ /* Print message only if there was not found a missing VG */
+@@ -508,8 +511,8 @@ static int vgchange_single(struct cmd_context *cmd, const char *vg_name,
+ log_print("Volume group \"%s\" successfully changed", vg->name);
+ }
+
+- if (arg_count(cmd, available_ARG)) {
+- if (!_vgchange_available(cmd, vg))
++ if (arg_count(cmd, activate_ARG)) {
++ if (!vgchange_activate(cmd, vg, arg_uint_value(cmd, activate_ARG, CHANGE_AY)))
+ return ECMD_FAILED;
+ }
+
+@@ -519,7 +522,7 @@ static int vgchange_single(struct cmd_context *cmd, const char *vg_name,
+ return ECMD_FAILED;
+ }
+
+- if (!arg_count(cmd, available_ARG) &&
++ if (!arg_count(cmd, activate_ARG) &&
+ !arg_count(cmd, refresh_ARG) &&
+ arg_count(cmd, monitor_ARG)) {
+ /* -ay* will have already done monitoring changes */
+@@ -551,7 +554,7 @@ int vgchange(struct cmd_context *cmd, int argc, char **argv)
+ arg_count(cmd, vgmetadatacopies_ARG);
+
+ if (!update &&
+- !arg_count(cmd, available_ARG) &&
++ !arg_count(cmd, activate_ARG) &&
+ !arg_count(cmd, monitor_ARG) &&
+ !arg_count(cmd, poll_ARG) &&
+ !arg_count(cmd, refresh_ARG)) {
+@@ -562,7 +565,7 @@ int vgchange(struct cmd_context *cmd, int argc, char **argv)
+ return EINVALID_CMD_LINE;
+ }
+
+- if (arg_count(cmd, available_ARG) && arg_count(cmd, refresh_ARG)) {
++ if (arg_count(cmd, activate_ARG) && arg_count(cmd, refresh_ARG)) {
+ log_error("Only one of -a and --refresh permitted.");
+ return EINVALID_CMD_LINE;
+ }
+@@ -573,9 +576,9 @@ int vgchange(struct cmd_context *cmd, int argc, char **argv)
+ return EINVALID_CMD_LINE;
+ }
+
+- if (arg_count(cmd, available_ARG) &&
++ if (arg_count(cmd, activate_ARG) &&
+ (arg_count(cmd, monitor_ARG) || arg_count(cmd, poll_ARG))) {
+- int activate = arg_uint_value(cmd, available_ARG, 0);
++ int activate = arg_uint_value(cmd, activate_ARG, 0);
+ if (activate == CHANGE_AN || activate == CHANGE_ALN) {
+ log_error("Only -ay* allowed with --monitor or --poll.");
+ return EINVALID_CMD_LINE;
+@@ -587,7 +590,7 @@ int vgchange(struct cmd_context *cmd, int argc, char **argv)
+ return EINVALID_CMD_LINE;
+ }
+
+- if (arg_count(cmd, available_ARG) == 1
++ if (arg_count(cmd, activate_ARG) == 1
+ && arg_count(cmd, autobackup_ARG)) {
+ log_error("-A option not necessary with -a option");
+ return EINVALID_CMD_LINE;
+diff --git a/udev/10-dm.rules.in b/udev/10-dm.rules.in
+index 605e088..29af467 100644
+--- a/udev/10-dm.rules.in
++++ b/udev/10-dm.rules.in
+@@ -18,11 +18,7 @@ KERNEL=="device-mapper", NAME="(DM_DIR)/control"
+
+ SUBSYSTEM!="block", GOTO="dm_end"
+ KERNEL!="dm-[0-9]*", GOTO="dm_end"
+-
+-# Set proper sbin path, /sbin has higher priority than /usr/sbin.
+-ENV{DM_SBIN_PATH}="/sbin"
+-TEST!="$env{DM_SBIN_PATH}/dmsetup", ENV{DM_SBIN_PATH}="/usr/sbin"
+-TEST!="$env{DM_SBIN_PATH}/dmsetup", GOTO="dm_end"
++(DM_EXEC_RULE)
+
+ # Device created, major and minor number assigned - "add" event generated.
+ # Table loaded - no event generated.
+@@ -40,7 +36,7 @@ ACTION!="add|change", GOTO="dm_end"
+ # These flags are encoded in DM_COOKIE variable that was introduced in
+ # kernel version 2.6.31. Therefore, we can use this feature with
+ # kernels >= 2.6.31 only. Cookie is not decoded for remove event.
+-ENV{DM_COOKIE}=="?*", IMPORT{program}="$env{DM_SBIN_PATH}/dmsetup udevflags $env{DM_COOKIE}"
++ENV{DM_COOKIE}=="?*", IMPORT{program}="(DM_EXEC)/dmsetup udevflags $env{DM_COOKIE}"
+
+ # Rule out easy-to-detect inappropriate events first.
+ ENV{DISK_RO}=="1", GOTO="dm_disable"
+@@ -91,8 +87,8 @@ ACTION=="add", ENV{DM_UDEV_RULES_VSN}!="1", ENV{DM_UDEV_PRIMARY_SOURCE_FLAG}!="1
+ # so we also have to call dmsetup if the kernel version used
+ # is in between these releases.
+ TEST=="dm", ENV{DM_NAME}="$attr{dm/name}", ENV{DM_UUID}="$attr{dm/uuid}", ENV{DM_SUSPENDED}="$attr{dm/suspended}"
+-TEST!="dm", IMPORT{program}="$env{DM_SBIN_PATH}/dmsetup info -j %M -m %m -c --nameprefixes --noheadings --rows -o name,uuid,suspended"
+-ENV{DM_SUSPENDED}!="?*", IMPORT{program}="$env{DM_SBIN_PATH}/dmsetup info -j %M -m %m -c --nameprefixes --noheadings --rows -o suspended"
++TEST!="dm", IMPORT{program}="(DM_EXEC)/dmsetup info -j %M -m %m -c --nameprefixes --noheadings --rows -o name,uuid,suspended"
++ENV{DM_SUSPENDED}!="?*", IMPORT{program}="(DM_EXEC)/dmsetup info -j %M -m %m -c --nameprefixes --noheadings --rows -o suspended"
+
+ # dmsetup tool provides suspended state information in textual
+ # form with values "Suspended"/"Active". We translate it to
+diff --git a/udev/11-dm-lvm.rules b/udev/11-dm-lvm.rules
+deleted file mode 100644
+index 8244464..0000000
+--- a/udev/11-dm-lvm.rules
++++ /dev/null
+@@ -1,37 +0,0 @@
+-# Copyright (C) 2009 Red Hat, Inc. All rights reserved.
+-#
+-# This file is part of LVM2.
+-
+-# Udev rules for LVM.
+-#
+-# These rules create symlinks for LVM logical volumes in
+-# /dev/VG directory (VG is an actual VG name). Some udev
+-# environment variables are set (they can be used in later
+-# rules as well):
+-# DM_LV_NAME - logical volume name
+-# DM_VG_NAME - volume group name
+-# DM_LV_LAYER - logical volume layer (blank if not set)
+-
+-# "add" event is processed on coldplug only!
+-ACTION!="add|change", GOTO="lvm_end"
+-ENV{DM_UDEV_RULES_VSN}!="?*", GOTO="lvm_end"
+-ENV{DM_UUID}!="LVM-?*", GOTO="lvm_end"
+-
+-# Use DM name and split it up into its VG/LV/layer constituents.
+-IMPORT{program}="$env{DM_SBIN_PATH}/dmsetup splitname --nameprefixes --noheadings --rows $env{DM_NAME}"
+-
+-ENV{DM_UDEV_DISABLE_SUBSYSTEM_RULES_FLAG}=="1", GOTO="lvm_end"
+-
+-# Do not create symlinks for inappropriate subdevices.
+-ENV{DM_LV_NAME}=="pvmove?*|?*_vorigin", GOTO="lvm_disable"
+-ENV{DM_LV_LAYER}=="?*", GOTO="lvm_disable"
+-
+-# Create symlinks for top-level devices only.
+-ENV{DM_VG_NAME}=="?*", ENV{DM_LV_NAME}=="?*", SYMLINK+="$env{DM_VG_NAME}/$env{DM_LV_NAME}", GOTO="lvm_end"
+-
+-LABEL="lvm_disable"
+-ENV{DM_UDEV_DISABLE_DISK_RULES_FLAG}="1"
+-ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}="1"
+-OPTIONS:="nowatch"
+-
+-LABEL="lvm_end"
+diff --git a/udev/11-dm-lvm.rules.in b/udev/11-dm-lvm.rules.in
+new file mode 100644
+index 0000000..58ef210
+--- /dev/null
++++ b/udev/11-dm-lvm.rules.in
+@@ -0,0 +1,37 @@
++# Copyright (C) 2009 Red Hat, Inc. All rights reserved.
++#
++# This file is part of LVM2.
++
++# Udev rules for LVM.
++#
++# These rules create symlinks for LVM logical volumes in
++# /dev/VG directory (VG is an actual VG name). Some udev
++# environment variables are set (they can be used in later
++# rules as well):
++# DM_LV_NAME - logical volume name
++# DM_VG_NAME - volume group name
++# DM_LV_LAYER - logical volume layer (blank if not set)
++
++# "add" event is processed on coldplug only!
++ACTION!="add|change", GOTO="lvm_end"
++ENV{DM_UDEV_RULES_VSN}!="?*", GOTO="lvm_end"
++ENV{DM_UUID}!="LVM-?*", GOTO="lvm_end"
++
++# Use DM name and split it up into its VG/LV/layer constituents.
++IMPORT{program}="(DM_EXEC)/dmsetup splitname --nameprefixes --noheadings --rows $env{DM_NAME}"
++
++ENV{DM_UDEV_DISABLE_SUBSYSTEM_RULES_FLAG}=="1", GOTO="lvm_end"
++
++# Do not create symlinks for inappropriate subdevices.
++ENV{DM_LV_NAME}=="pvmove?*|?*_vorigin", GOTO="lvm_disable"
++ENV{DM_LV_LAYER}=="?*", GOTO="lvm_disable"
++
++# Create symlinks for top-level devices only.
++ENV{DM_VG_NAME}=="?*", ENV{DM_LV_NAME}=="?*", SYMLINK+="$env{DM_VG_NAME}/$env{DM_LV_NAME}", GOTO="lvm_end"
++
++LABEL="lvm_disable"
++ENV{DM_UDEV_DISABLE_DISK_RULES_FLAG}="1"
++ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}="1"
++OPTIONS:="nowatch"
++
++LABEL="lvm_end"
+diff --git a/udev/69-dm-lvm-metad.rules b/udev/69-dm-lvm-metad.rules
+deleted file mode 100644
+index d272e6e..0000000
+--- a/udev/69-dm-lvm-metad.rules
++++ /dev/null
+@@ -1,30 +0,0 @@
+-# Copyright (C) 2012 Red Hat, Inc. All rights reserved.
+-#
+-# This file is part of LVM2.
+-
+-# Udev rules for LVM.
+-#
+-# Scan all block devices having a PV label for LVM metadata.
+-# Store this information in LVMetaD (the LVM metadata daemon) and maintain LVM
+-# metadata state for improved performance by avoiding further scans while
+-# running subsequent LVM commands or while using lvm2app library.
+-# Also, notify LVMetaD about any relevant block device removal.
+-#
+-# This rule is essential for having the information in LVMetaD up-to-date.
+-# It also requires blkid to be called on block devices before so only devices
+-# used as LVM PVs are processed (ID_FS_TYPE="LVM2_member" or "LVM1_member").
+-
+-SUBSYSTEM!="block", GOTO="lvm_end"
+-
+-# Device-mapper devices are processed only on change event or on supported synthesized event.
+-KERNEL=="dm-[0-9]*", ENV{DM_UDEV_RULES_VSN}!="?*", GOTO="lvm_end"
+-
+-# Set proper sbin path, /sbin has higher priority than /usr/sbin.
+-ENV{LVM_SBIN_PATH}="/sbin"
+-TEST!="$env{LVM_SBIN_PATH}/lvm", ENV{LVM_SBIN_PATH}="/usr/sbin"
+-TEST!="$env{LVM_SBIN_PATH}/lvm", GOTO="lvm_end"
+-
+-# Only process devices already marked as a PV - this requires blkid to be called before.
+-ENV{ID_FS_TYPE}=="LVM2_member|LVM1_member", RUN+="$env{LVM_SBIN_PATH}/lvm pvscan --cache --major $major --minor $minor"
+-
+-LABEL="lvm_end"
+diff --git a/udev/69-dm-lvm-metad.rules.in b/udev/69-dm-lvm-metad.rules.in
+new file mode 100644
+index 0000000..706c03b
+--- /dev/null
++++ b/udev/69-dm-lvm-metad.rules.in
+@@ -0,0 +1,26 @@
++# Copyright (C) 2012 Red Hat, Inc. All rights reserved.
++#
++# This file is part of LVM2.
++
++# Udev rules for LVM.
++#
++# Scan all block devices having a PV label for LVM metadata.
++# Store this information in LVMetaD (the LVM metadata daemon) and maintain LVM
++# metadata state for improved performance by avoiding further scans while
++# running subsequent LVM commands or while using lvm2app library.
++# Also, notify LVMetaD about any relevant block device removal.
++#
++# This rule is essential for having the information in LVMetaD up-to-date.
++# It also requires blkid to be called on block devices before so only devices
++# used as LVM PVs are processed (ID_FS_TYPE="LVM2_member" or "LVM1_member").
++
++SUBSYSTEM!="block", GOTO="lvm_end"
++(LVM_EXEC_RULE)
++
++# Device-mapper devices are processed only on change event or on supported synthesized event.
++KERNEL=="dm-[0-9]*", ENV{DM_UDEV_RULES_VSN}!="?*", GOTO="lvm_end"
++
++# Only process devices already marked as a PV - this requires blkid to be called before.
++ENV{ID_FS_TYPE}=="LVM2_member|LVM1_member", RUN+="(LVM_EXEC)/lvm pvscan --cache --activate ay --major $major --minor $minor"
++
++LABEL="lvm_end"
+diff --git a/udev/95-dm-notify.rules b/udev/95-dm-notify.rules
+deleted file mode 100644
+index 72cc609..0000000
+--- a/udev/95-dm-notify.rules
++++ /dev/null
+@@ -1,12 +0,0 @@
+-# Copyright (C) 2009 Red Hat, Inc. All rights reserved.
+-#
+-# This file is part of LVM2.
+-
+-# Udev rules for device-mapper devices.
+-#
+-# These rules are responsible for sending a notification to a process
+-# waiting for completion of udev rules. The process is identified by
+-# a cookie value sent within "change" and "remove" events (the cookie
+-# value is set before by that process for every action requested).
+-
+-ENV{DM_COOKIE}=="?*", RUN+="$env{DM_SBIN_PATH}/dmsetup udevcomplete $env{DM_COOKIE}"
+diff --git a/udev/95-dm-notify.rules.in b/udev/95-dm-notify.rules.in
+new file mode 100644
+index 0000000..80d59d3
+--- /dev/null
++++ b/udev/95-dm-notify.rules.in
+@@ -0,0 +1,12 @@
++# Copyright (C) 2009 Red Hat, Inc. All rights reserved.
++#
++# This file is part of LVM2.
++
++# Udev rules for device-mapper devices.
++#
++# These rules are responsible for sending a notification to a process
++# waiting for completion of udev rules. The process is identified by
++# a cookie value sent within "change" and "remove" events (the cookie
++# value is set before by that process for every action requested).
++
++ENV{DM_COOKIE}=="?*", RUN+="(DM_EXEC)/dmsetup udevcomplete $env{DM_COOKIE}"
+diff --git a/udev/Makefile.in b/udev/Makefile.in
+index 4ace910..5c15bdb 100644
+--- a/udev/Makefile.in
++++ b/udev/Makefile.in
+@@ -15,28 +15,39 @@ srcdir = @srcdir@
+ top_srcdir = @top_srcdir@
+ top_builddir = @top_builddir@
+
++include $(top_builddir)/make.tmpl
++vpath %.rules $(srcdir)
++
+ DM_RULES=10-dm.rules 13-dm-disk.rules 95-dm-notify.rules
+ LVM_RULES=11-dm-lvm.rules
+-DM_DIR=$(shell grep "\#define DM_DIR" $(top_srcdir)/libdm/misc/dm-ioctl.h | awk '{print $$3}')
+-
+ ifeq ("@BUILD_LVMETAD@", "yes")
+ LVM_RULES+=69-dm-lvm-metad.rules
+ endif
+
+-ifeq ("@UDEV_HAS_BUILTIN_BLKID@", "yes")
+- BLKID_RULE=IMPORT{builtin}=\"blkid\"
++DM_DIR=$(shell grep "\#define DM_DIR" $(top_srcdir)/libdm/misc/dm-ioctl.h | awk '{print $$3}')
++
++ifeq ("@UDEV_RULE_EXEC_DETECTION@", "yes")
++SBIN=\$$env{DM_SBIN_PATH}
++DM_EXEC_RULE=ENV{DM_SBIN_PATH}=\"\/sbin\"\\nTEST!=\"\$$env{DM_SBIN_PATH}\/dmsetup\", ENV{DM_SBIN_PATH}=\"\/usr\/sbin\"
++DM_EXEC=\$$env{DM_SBIN_PATH}
++LVM_EXEC_RULE=ENV{LVM_SBIN_PATH}=\"\/sbin\"\\nTEST!=\"\$$env{LVM_SBIN_PATH}\/lvm\", ENV{LVM_SBIN_PATH}=\"\/usr\/sbin\"
++LVM_EXEC=\$$env{LVM_SBIN_PATH}
+ else
+- BLKID_RULE=IMPORT{program}=\"\$$env{DM_SBIN_PATH}\/blkid -o udev -p \$$tempnode\"
++SBIN="@sbindir@"
++DM_EXEC_RULE=""
++DM_EXEC=${SBIN}
++LVM_EXEC_RULE=""
++LVM_EXEC=${SBIN}
+ endif
+
+-CLEAN_TARGETS = 10-dm.rules 13-dm-disk.rules
+-
+-include $(top_builddir)/make.tmpl
+-
+-vpath %.rules $(srcdir)
++ifeq ("@UDEV_HAS_BUILTIN_BLKID@", "yes")
++BLKID_RULE=IMPORT{builtin}=\"blkid\"
++else
++BLKID_RULE=IMPORT{program}=\"${SBIN}\/blkid -o udev -p \$$tempnode\"
++endif
+
+ %.rules: %.rules.in
+- $(SED) -e "s/(DM_DIR)/$(DM_DIR)/" -e "s/(BLKID_RULE)/$(BLKID_RULE)/" $< >$@
++ $(SED) -e "s+(DM_DIR)+$(DM_DIR)+;s+(BLKID_RULE)+$(BLKID_RULE)+;s+(DM_EXEC_RULE)+$(DM_EXEC_RULE)+;s+(DM_EXEC)+$(DM_EXEC)+;s+(LVM_EXEC_RULE)+$(LVM_EXEC_RULE)+;s+(LVM_EXEC)+$(LVM_EXEC)+;" $< >$@
+
+ %_install: %.rules
+ $(INSTALL_DATA) -D $< $(udevdir)/$(<F)
diff --git a/lvm2.spec b/lvm2.spec
index 9a037af..9ce4397 100644
--- a/lvm2.spec
+++ b/lvm2.spec
@@ -1,41 +1,19 @@
%define device_mapper_version 1.02.75
-%define enable_thin 0
+%define enable_thin 1
%define enable_cluster 1
-%define enable_openais 1
%define enable_cmirror 1
%define enable_udev 1
%define enable_systemd 1
-%define udev_systemd_merge 0
-%define enable_lvmetad 0
+%define udev_systemd_merge 1
+%define enable_lvmetad 1
-%if "%{fedora}" == "12"
-%define enable_systemd 0
-%define enable_udev 0
-%define configure_default_data_alignment --with-default-data-alignment=0
-%else
-%if "%{fedora}" == "13"
-%define enable_systemd 0
-%define udev_version 153-1
-%define configure_default_data_alignment --with-default-data-alignment=0
-%else
-%if "%{fedora}" == "14"
-%define enable_systemd 0
-%define udev_version 158-1
-%else
-%if "%{fedora}" == "15"
-%define udev_version 158-1
-%else
-%if "%{fedora}" == "16"
-%define udev_version 158-1
-%else
%if "%{fedora}" == "17"
%define udev_version 176-1
-%define enable_thin 1
-%define enable_openais 0
+%define udev_systemd_merge 0
%define corosync_version 1.99.9-1
-%else
-%if 0%{?rhel}
+%define enable_lvmetad 0
+%else %if 0%{?rhel}
%ifarch i686 x86_64
%define enable_cluster 1
%define enable_cmirror 1
@@ -43,26 +21,13 @@
%define enable_cluster 0
%define enable_cmirror 0
%endif
- %define enable_thin 1
- %define enable_openais 0
- %define enable_lvmetad 1
-
%define udev_version 176-1
+ %define udev_systemd_merge 0
%define corosync_version 1.99.9-1
-%else
-# rawhide
+%else # rawhide
%define udev_version 183-1
-%define enable_thin 1
%define persistent_data_version 0.1.4
-%define enable_openais 0
%define corosync_version 1.99.9-1
-%define udev_systemd_merge 1
-%endif
-%endif
-%endif
-%endif
-%endif
-%endif
%endif
%if %{enable_cluster}
@@ -71,15 +36,8 @@
%else
%define configure_cmirror --disable-cmirrord
%endif
-%if %{enable_openais}
-%define corosync_version 1.2.0-1
-%define openais_version 1.1.1-1
-%define clusterlib_version 3.0.6-1
-%define configure_cluster --with-cluster=internal --with-clvmd=cman,openais,corosync
-%else
%define dlm_version 3.99.1-1
%define configure_cluster --with-cluster=internal --with-clvmd=corosync
-%endif
%else
%define configure_cluster --with-cluster=internal --with-clvmd=none
%define configure_cmirror --disable-cmirrord
@@ -92,25 +50,21 @@
Summary: Userland logical volume management tools
Name: lvm2
Version: 2.02.96
-Release: 1%{?dist}
+Release: 2%{?dist}
License: GPLv2
Group: System Environment/Base
URL: http://sources.redhat.com/lvm2
Source0: ftp://sources.redhat.com/pub/lvm2/LVM2.%{version}.tgz
Patch0: lvm2-set-default-preferred_names.patch
+Patch1: lvm2-2_02_97-composite-patch-for-udev-systemd-lvmetad-upstream-changes.patch
BuildRequires: libselinux-devel >= 1.30.19-4, libsepol-devel
BuildRequires: ncurses-devel
BuildRequires: readline-devel
%if %{enable_cluster}
BuildRequires: corosynclib-devel >= %{corosync_version}
-%if %{enable_openais}
-BuildRequires: openaislib-devel >= %{openais_version}
-BuildRequires: clusterlib-devel >= %{clusterlib_version}
-%else
BuildRequires: dlm-devel >= %{dlm_version}
%endif
-%endif
BuildRequires: module-init-tools
BuildRequires: pkgconfig
%if %{enable_udev}
@@ -147,13 +101,13 @@ or more physical volumes and creating one or more logical volumes
%prep
%setup -q -n LVM2.%{version}
-%patch0 -p1 -b preferred_names
+%patch0 -p1 -b .preferred_names
+%patch1 -p1 -b .upstream
%build
-%define _exec_prefix ""
-%define _bindir /bin
-%define _sbindir /sbin
-%define _libdir /%{_lib}
+%define _default_dm_run_dir /run
+%define _default_run_dir /run/lvm
+%define _default_locking_dir /run/lock/lvm
%if %{enable_udev}
%define _udevbasedir /lib/udev
@@ -169,7 +123,7 @@ or more physical volumes and creating one or more logical volumes
%define configure_lvmetad --enable-lvmetad
%endif
-%configure --enable-lvm1_fallback --enable-fsadm --with-pool=internal --with-user= --with-group= --with-usrlibdir=/usr/%{_lib} --with-usrsbindir=/usr/sbin --with-device-uid=0 --with-device-gid=6 --with-device-mode=0660 --enable-pkgconfig --enable-applib --enable-cmdlib --enable-dmeventd %{configure_cluster} %{configure_cmirror} %{?configure_udev} %{?configure_default_data_alignment} %{?configure_thin} %{?configure_lvmetad}
+%configure --with-default-dm-run-dir=%{_default_dm_run_dir} --with-default-run-dir=%{_default_run_dir} --with-default-locking-dir=%{_default_locking_dir} --with-usrlibdir=%{_libdir} --enable-lvm1_fallback --enable-fsadm --with-pool=internal --with-user= --with-group= --with-device-uid=0 --with-device-gid=6 --with-device-mode=0660 --enable-pkgconfig --enable-applib --enable-cmdlib --enable-dmeventd %{configure_cluster} %{configure_cmirror} %{?configure_udev} %{?configure_default_data_alignment} %{?configure_thin} %{?configure_lvmetad}
make %{?_smp_mflags}
@@ -341,6 +295,7 @@ fi
%if %{enable_udev}
%{_udevdir}/11-dm-lvm.rules
%if %{enable_lvmetad}
+%{_mandir}/man8/lvmetad.8.gz
%{_udevdir}/69-dm-lvm-metad.rules
%endif
%endif
@@ -350,8 +305,8 @@ fi
%dir %{_sysconfdir}/lvm/backup
%dir %{_sysconfdir}/lvm/cache
%dir %{_sysconfdir}/lvm/archive
-%dir %{_localstatedir}/lock/lvm
-%dir %{_localstatedir}/run/lvm
+%dir %{_default_locking_dir}
+%dir %{_default_run_dir}
%if %{enable_systemd}
%config(noreplace) %{_sysconfdir}/tmpfiles.d/%{name}.conf
%{_unitdir}/lvm2-monitor.service
@@ -384,12 +339,12 @@ the lvm2 libraries.
%files devel
%defattr(-,root,root,-)
-/usr%{_libdir}/liblvm2app.so
-/usr%{_libdir}/liblvm2cmd.so
+%{_libdir}/liblvm2app.so
+%{_libdir}/liblvm2cmd.so
%{_includedir}/lvm2app.h
%{_includedir}/lvm2cmd.h
-/usr%{_libdir}/pkgconfig/lvm2app.pc
-/usr%{_libdir}/libdevmapper-event-lvm2.so
+%{_libdir}/pkgconfig/lvm2app.pc
+%{_libdir}/libdevmapper-event-lvm2.so
%package libs
Summary: Shared libraries for lvm2
@@ -437,12 +392,7 @@ Requires(preun): chkconfig
Requires(preun): device-mapper >= %{device_mapper_version}
Requires(preun): lvm2 >= 2.02
Requires: corosync >= %{corosync_version}
-%if %{enable_openais}
-Requires: openais >= %{openais_version}
-Requires: cman >= %{clusterlib_version}
-%else
Requires: dlm >= %{dlm_version}
-%endif
%description cluster
@@ -483,9 +433,6 @@ Group: System Environment/Base
Requires(post): chkconfig
Requires(preun): chkconfig
Requires: corosync >= %{corosync_version}
-%if %{enable_openais}
-Requires: openais >= %{openais_version}
-%endif
Requires: device-mapper >= %{device_mapper_version}-%{release}
%description -n cmirror
@@ -558,7 +505,7 @@ for the kernel device-mapper.
%files -n device-mapper
%defattr(-,root,root,-)
%doc COPYING COPYING.LIB WHATS_NEW_DM VERSION_DM README INSTALL
-%attr(755,root,root) /sbin/dmsetup
+%attr(755,root,root) %{_sbindir}/dmsetup
%{_mandir}/man8/dmsetup.8.gz
%if %{enable_udev}
%doc udev/12-dm-permissions.rules
@@ -584,9 +531,9 @@ the device-mapper libraries.
%files -n device-mapper-devel
%defattr(-,root,root,-)
-/usr%{_libdir}/libdevmapper.so
+%{_libdir}/libdevmapper.so
%{_includedir}/libdevmapper.h
-/usr%{_libdir}/pkgconfig/devmapper.pc
+%{_libdir}/pkgconfig/devmapper.pc
%package -n device-mapper-libs
Summary: Device-mapper shared library
@@ -690,11 +637,29 @@ the device-mapper event library.
%files -n device-mapper-event-devel
%defattr(-,root,root,-)
-/usr%{_libdir}/libdevmapper-event.so
+%{_libdir}/libdevmapper-event.so
%{_includedir}/libdevmapper-event.h
-/usr%{_libdir}/pkgconfig/devmapper-event.pc
+%{_libdir}/pkgconfig/devmapper-event.pc
%changelog
+* Mon Jul 02 2012 Peter Rajnoha <prajnoha at redhat.com> - 2.02.96-2
+- Compile with lvmetad support enabled.
+- Add support for volume autoactivation using lvmetad.
+- Update man pages with --activate ay option and auto_activation_volume_list.
+- Use vgchange -aay instead of vgchange -ay in clmvd init script.
+- Add activation/auto_activation_volume_list to lvm.conf.
+- Add --activate ay to lvcreate, lvchange, pvscan and vgchange.
+- Add --activate synonym for --available arg and prefer --activate.
+- Open device read-only to obtain readahead value.
+- Add configure --enable-udev-rule-exec-detection to detect exec path in rules.
+- Use sbindir in udev rules by default and remove executable path detection.
+- Remove hard-coded paths for dmeventd fifos and use default-dm-run-dir.
+- Add configure --with-lvmetad-pidfile to remove hard-coded value.
+- Add configure --with-default-pid-dir for common directory with pid files.
+- Add configure --with-default-dm-run-dir to set run directory for dm tools.
+- Add documentation references in systemd units.
+- Clean up spec file and keep support only for Fedora 17 upwards.
+
* Mon Jun 18 2012 Alasdair Kergon <agk at redhat.com> - 2.02.96-1
- Require device-mapper-persistent-data package for thin provisioning.
- Set delay_resume_if_new on deptree snapshot origin.
More information about the scm-commits
mailing list