[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