From d4897294ded98291a1cbf3a5534fccd188140a96 Mon Sep 17 00:00:00 2001 From: Peter Rajnoha Date: Oct 16 2012 10:02:19 +0000 Subject: New upstream release and spec file cleanup. --- diff --git a/.gitignore b/.gitignore index e1fb330..510e3f5 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ /LVM2.2.02.95.tgz /LVM2.2.02.96.tgz /LVM2.2.02.97.tgz +/LVM2.2.02.98.tgz diff --git a/LVM2.2.02.97.tgz.asc b/LVM2.2.02.97.tgz.asc deleted file mode 100644 index c5d407e..0000000 --- a/LVM2.2.02.97.tgz.asc +++ /dev/null @@ -1,7 +0,0 @@ ------BEGIN PGP SIGNATURE----- -Version: GnuPG v1.4.11 (GNU/Linux) - -iEYEABECAAYFAlAhg2QACgkQIoGRwVZ+LBev4ACfauywNUSNBliHYwYOeWxE8ioF -GmsAoKnovFlDDkslz1vy8M9tF/o+4neH -=PKjV ------END PGP SIGNATURE----- diff --git a/LVM2.2.02.98.tgz.asc b/LVM2.2.02.98.tgz.asc new file mode 100644 index 0000000..b9da58e --- /dev/null +++ b/LVM2.2.02.98.tgz.asc @@ -0,0 +1,7 @@ +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.11 (GNU/Linux) + +iEYEABECAAYFAlB8HicACgkQIoGRwVZ+LBd+mwCg2X9MFz3iFlnARwxVgNBCWgYY +KHYAn1fgrjMIeoQaKUEDjMrhvapj9wOK +=/QEd +-----END PGP SIGNATURE----- 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 deleted file mode 100644 index 3b585a8..0000000 --- a/lvm2-2_02_97-composite-patch-for-udev-systemd-lvmetad-upstream-changes.patch +++ /dev/null @@ -1,2053 +0,0 @@ - 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", ""); -+ 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)/$(= 1.30.19-4, libsepol-devel +BuildRequires: libselinux-devel >= %{libselinux_version}, libsepol-devel BuildRequires: ncurses-devel BuildRequires: readline-devel %if %{enable_cluster} @@ -68,25 +53,13 @@ BuildRequires: dlm-devel >= %{dlm_version} %endif BuildRequires: module-init-tools BuildRequires: pkgconfig -%if %{enable_udev} -%if %{udev_systemd_merge} BuildRequires: systemd-devel -%else -BuildRequires: libudev-devel -%endif -%endif -%if %{enable_systemd} BuildRequires: systemd-units -%endif Requires: %{name}-libs = %{version}-%{release} -%if %{enable_systemd} -Requires(post): systemd-units systemd-sysv -Requires(preun): systemd-units -Requires(postun): systemd-units -%else -Requires(post): chkconfig -Requires(preun): chkconfig -%endif +Requires: bash >= %{bash_version} +Requires(post): systemd-units >= %{systemd_version}, systemd-sysv +Requires(preun): systemd-units >= %{systemd_version} +Requires(postun): systemd-units >= %{systemd_version} Requires: module-init-tools %if %{enable_thin} Requires: device-mapper-persistent-data >= %{persistent_data_version} @@ -110,15 +83,11 @@ or more physical volumes and creating one or more logical volumes %define _default_run_dir /run/lvm %define _default_locking_dir /run/lock/lvm -%if %{enable_udev} %define _udevbasedir %{_prefix}/lib/udev %define _udevdir %{_udevbasedir}/rules.d -%define configure_udev --with-udevdir=%{_udevdir} --enable-udev_sync -%endif - -%if %{enable_systemd} %define _tmpfilesdir %{_prefix}/lib/tmpfiles.d -%endif + +%define configure_udev --with-udevdir=%{_udevdir} --enable-udev_sync %if %{enable_thin} %define configure_thin --with-thin=internal --with-thin-check=%{_sbindir}/thin_check @@ -136,57 +105,29 @@ make %{?_smp_mflags} make install DESTDIR=$RPM_BUILD_ROOT make install_system_dirs DESTDIR=$RPM_BUILD_ROOT make install_initscripts DESTDIR=$RPM_BUILD_ROOT -%if %{enable_systemd} make install_systemd_units DESTDIR=$RPM_BUILD_ROOT make install_tmpfiles_configuration DESTDIR=$RPM_BUILD_ROOT -%endif %clean rm -rf $RPM_BUILD_ROOT %post /sbin/ldconfig -%if %{enable_systemd} -/bin/systemctl daemon-reload > /dev/null 2>&1 || : -/bin/systemctl enable lvm2-monitor.service > /dev/null 2>&1 || : +%systemd_post blk-availability.service lvm2-monitor.service %if %{enable_lvmetad} -/bin/systemctl enable lvm2-lvmetad.socket > /dev/null 2>&1 || : -%endif -%else -/sbin/chkconfig --add lvm2-monitor -%if %{enable_lvmetad} -/sbin/chkconfig --add lvm2-lvmetad -%endif +%systemd_post lvm2-lvmetad.socket %endif %preun -%if %{enable_systemd} -if [ "$1" = 0 ]; then - /bin/systemctl --no-reload disable lvm2-monitor.service > /dev/null 2>&1 || : - /bin/systemctl stop lvm2-monitor.service > /dev/null 2>&1 || : - %if %{enable_lvmetad} - /bin/systemctl --no-reload disable lvm2-lvmetad.socket > /dev/null 2>&1 || : - /bin/systemctl stop lvm2-lvmetad.service lvm2-lvmetad.socket > /dev/null 2>&1 || : - %endif -fi -%else -if [ "$1" = 0 ]; then - /sbin/chkconfig --del lvm2-monitor - %if %{enable_lvmetad} - /sbin/chkconfig --del lvm2-lvmetad - %endif -fi +%systemd_preun blk-availability.service lvm2-monitor.service +%if %{enable_lvmetad} +%systemd_preun lvm2-lvmetad.service lvm2-lvmetad.socket %endif %postun -%if %{enable_systemd} -/bin/systemctl daemon-reload > /dev/null 2>&1 || : -if [ $1 -ge 1 ]; then - /bin/systemctl try-restart lvm2-monitor.service > /dev/null 2>&1 || : - %if %{enable_lvmetad} - /bin/systemctl try-restart lvm2-lvmetad.service > /dev/null 2>&1 || : - %endif -fi +%systemd_postun_with_restart lvm2-monitor.service +%if %{enable_lvmetad} +%systemd_postun_with_restart lvm2-lvmetad.service %endif %triggerun -- %{name} < 2.02.86-2 @@ -199,6 +140,7 @@ fi %defattr(-,root,root,-) %doc COPYING COPYING.LIB INSTALL README VERSION WHATS_NEW %doc doc/lvm_fault_handling.txt +%{_sbindir}/blkdeactivate %{_sbindir}/fsadm %{_sbindir}/lvchange %{_sbindir}/lvconvert @@ -250,6 +192,7 @@ fi %{_sbindir}/lvmetad %endif %{_mandir}/man5/lvm.conf.5.gz +%{_mandir}/man8/blkdeactivate.8.gz %{_mandir}/man8/fsadm.8.gz %{_mandir}/man8/lvchange.8.gz %{_mandir}/man8/lvconvert.8.gz @@ -297,13 +240,11 @@ fi %{_mandir}/man8/vgs.8.gz %{_mandir}/man8/vgscan.8.gz %{_mandir}/man8/vgsplit.8.gz -%if %{enable_udev} %{_udevdir}/11-dm-lvm.rules %if %{enable_lvmetad} %{_mandir}/man8/lvmetad.8.gz %{_udevdir}/69-dm-lvm-metad.rules %endif -%endif %dir %{_sysconfdir}/lvm %ghost %{_sysconfdir}/lvm/cache/.cache %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/lvm/lvm.conf @@ -312,19 +253,13 @@ fi %dir %{_sysconfdir}/lvm/archive %dir %{_default_locking_dir} %dir %{_default_run_dir} -%if %{enable_systemd} %{_tmpfilesdir}/%{name}.conf +%{_unitdir}/blk-availability.service %{_unitdir}/lvm2-monitor.service %if %{enable_lvmetad} %{_unitdir}/lvm2-lvmetad.socket %{_unitdir}/lvm2-lvmetad.service %endif -%else -%{_sysconfdir}/rc.d/init.d/lvm2-monitor -%if %{enable_lvmetad} -%{_sysconfdir}/rc.d/init.d/lvm2-lvmetad -%endif -%endif ############################################################################## # Library and Development subpackages @@ -461,8 +396,6 @@ fi ############################################################################## # Legacy SysV init subpackage ############################################################################## -%if %{enable_systemd} - %package sysvinit Summary: SysV style init script for LVM2. Group: System Environment/Base @@ -474,13 +407,12 @@ SysV style init script for LVM2. It needs to be installed only if systemd is not used as the system init process. %files sysvinit +%{_sysconfdir}/rc.d/init.d/blk-availability %{_sysconfdir}/rc.d/init.d/lvm2-monitor %if %{enable_lvmetad} %{_sysconfdir}/rc.d/init.d/lvm2-lvmetad %endif -%endif - ############################################################################## # Device-mapper subpackages ############################################################################## @@ -492,13 +424,11 @@ License: GPLv2 Group: System Environment/Base URL: http://sources.redhat.com/dm Requires: device-mapper-libs = %{device_mapper_version}-%{release} -Requires: util-linux >= 2.15 -%if %{enable_udev} -Requires: udev >= %{udev_version} +Requires: util-linux >= %{util-linux_version} +Requires: systemd >= %{systemd_version} # We need dracut to install required udev rules if udev_sync # feature is turned on so we don't lose required notifications. -Conflicts: dracut < 002-18 -%endif +Conflicts: dracut < %{dracut_version} %description -n device-mapper This package contains the supporting userspace utility, dmsetup, @@ -509,14 +439,12 @@ for the kernel device-mapper. %doc COPYING COPYING.LIB WHATS_NEW_DM VERSION_DM README INSTALL %attr(755,root,root) %{_sbindir}/dmsetup %{_mandir}/man8/dmsetup.8.gz -%if %{enable_udev} %doc udev/12-dm-permissions.rules %dir %{_udevbasedir} %dir %{_udevdir} %{_udevdir}/10-dm.rules %{_udevdir}/13-dm-disk.rules %{_udevdir}/95-dm-notify.rules -%endif %package -n device-mapper-devel Summary: Development libraries and headers for device-mapper @@ -562,46 +490,32 @@ Version: %{device_mapper_version} Release: %{release} Requires: device-mapper = %{device_mapper_version}-%{release} Requires: device-mapper-event-libs = %{device_mapper_version}-%{release} -%if %{enable_systemd} Requires(post): systemd-units Requires(preun): systemd-units Requires(postun): systemd-units -%endif %description -n device-mapper-event This package contains the dmeventd daemon for monitoring the state of device-mapper devices. %post -n device-mapper-event -%if %{enable_systemd} -/bin/systemctl daemon-reload > /dev/null 2>&1 || : -/bin/systemctl enable dm-event.socket > /dev/null 2>&1 || : -%endif +%systemd_post dm-event.socket %preun -n device-mapper-event -%if %{enable_systemd} -if [ "$1" = 0 ]; then - /bin/systemctl --no-reload disable dm-event.service dm-event.socket > /dev/null 2>&1 || : - /bin/systemctl stop dm-event.service dm-event.socket> /dev/null 2>&1 || : -fi -%endif +%systemd_preun dm-event.service dm-event.socket %postun -n device-mapper-event -%if %{enable_systemd} /bin/systemctl daemon-reload > /dev/null 2>&1 || : if [ $1 -ge 1 ]; then /bin/systemctl reload dm-event.service > /dev/null 2>&1 || : fi -%endif %files -n device-mapper-event %defattr(-,root,root,-) %{_sbindir}/dmeventd %{_mandir}/man8/dmeventd.8.gz -%if %{enable_systemd} %{_unitdir}/dm-event.socket %{_unitdir}/dm-event.service -%endif %package -n device-mapper-event-libs Summary: Device-mapper event daemon shared library @@ -641,6 +555,90 @@ the device-mapper event library. %{_libdir}/pkgconfig/devmapper-event.pc %changelog +* Tue Aug 07 2012 Alasdair Kergon - 2.02.98-1 +- Don't try to issue discards to a missing PV to avoid segfault. +- Fix vgchange -aay not to activate non-matching LVs that follow a matching LV. +- Fix lvchange --resync for RAID LVs which had no effect. +- Add RAID10 support (--type raid10). +- Introduce blkdeactivate script to deactivate block devs with dependencies. +- Apply 'dmsetup mangle' for dm UUIDs besides dm names. +- Use -q as short form of --quiet. +- Suppress non-essential stdout with -qq. +- Add log/silent to lvm.conf equivalent to -qq. +- Add (p)artial attribute to lvs. +- Implement devices/global_filter to hide devices from lvmetad. +- Add lvmdump -l, to collect a state dump from lvmetad. +- Add --discards to lvconvert. +- Add support for lvcreate --discards. +- Add --poolmetadata to lvconvert and support thin meta/data dev stacking. +- Support creation of read-only thin volumes (lvcreate -p r). +- Support changes of permissions for thin snapshot volumes. +- Make lvremove ask before discarding data areas. +- Prohibit not yet supported change of thin-pool to read-only. +- Using autoextend percent 0 for thin pool fails 'lvextend --use-policies'. +- Make vgscan --cache an alias for pvscan --cache. +- Clear lvmetad metadata/PV cache before a rescan. +- Fix a segmentation fault upon receiving a corrupt lvmetad response. +- Give inconsistent metadata warnings in pvscan --cache. +- Avoid overlapping locks that could cause a deadlock in lvmetad. +- Fix memory leaks in libdaemon and lvmetad. +- Optimize libdaemon logging for a fast no-output path. +- Only create lvmetad pidfile when running as a daemon (no -f). +- Warn if lvmetad is running but disabled. +- Warn about running lvmetad with use_lvmetad = 0 in example.conf. +- Update lvmetad help output (flags and their meaning). +- Make pvscan --cache read metadata from LVM1 PVs. +- Make libdaemon buffer handling asymptotically more efficient. +- Make --sysinit suppress lvmetad connection failure warnings. +- Prohibit usage of lvcreate --thinpool with --mirrors. +- Fix lvm2api origin reporting for thin snapshot volume. +- Add implementation of lvm2api function lvm_percent_to_float. +- Allow non power of 2 thin chunk sizes if thin pool driver supports that. +- Allow limited metadata changes when PVs are missing via [vg|lv]change. +- Do not start dmeventd for lvchange --resync when monitoring is off. +- Remove pvscan --cache from lvm2-lvmetad init script. +- Remove ExecStartPost with pvscan --cache from lvm2-lvmetad.service. +- Report invalid percentage for property snap_percent of non-snaphot LVs. +- Disallow conversion of thin LVs to mirrors. +- Fix lvm2api data_percent reporting for thin volumes. +- Do not allow RAID LVs in a clustered volume group. +- Enhance insert_layer_for_lv() with recursive rename for _tdata LVs. +- Skip building dm tree for thin pool when called with origin_only flag. +- Ensure descriptors 0,1,2 are always available, using /dev/null if necessary. +- Use /proc/self/fd when available for closing opened descriptors efficiently. +- Fix inability to create, extend or convert to a large (> 1TiB) RAID LV. +- Update lvmetad communications to cope with clients using different filters. +- Clear LV_NOSYNCED flag when a RAID1 LV is converted to a linear LV. +- Disallow RAID1 upconvert if the LV was created with --nosync. +- Depend on systemd-udev-settle in units generated by activation generator. +- Disallow addition of RAID images until the array is in-sync. +- Fix RAID LV creation with '--test' so valid commands do not fail. +- Add lvm_lv_rename() to lvm2api. +- Fix setvbuf code by closing and reopening stream before changing buffer. +- Disable private buffering when using liblvm. +- When private stdin/stdout buffering is not used always use silent mode. +- Fix 32-bit device size arithmetic needing 64-bit casting throughout tree. +- Fix dereference of NULL in lvmetad error path logging. +- Fix buffer memory leak in lvmetad logging. +- Correct the discards field in the lvs manpage (2.02.97). +- Use proper condition to check for discards settings unsupported by kernel. +- Reinstate correct default to ignore discards for thin metadata from old tools. +- Issue error message when -i and -m args do not match specified RAID type. +- Change lvmetad logging syntax from -ddd to -l {all|wire|debug}. +- Add new libdaemon logging infrastructure. +- Support unmount of thin volumes from pool above thin pool threshold. +- Update man page to reflect that dm UUIDs are being mangled as well. +- Add 'mangled_uuid' and 'unmangled_uuid' fields to dmsetup info -c -o. +- Mangle device UUID on dm_task_set_uuid/newuuid call if necessary. +- Add dm_task_get_uuid_mangled/unmangled to libdevmapper. +- Always reset delay_resume_if_new flag when stacking thin pool over anything. +- Don't create value for dm_config_node and require dm_config_create_value call. +- Check for existing new_name for dmsetup rename. +- Fix memory leak in dmsetup _get_split_name() error path. +- Clean up spec file and keep support only for Fedora 18 upwards. +- Use systemd macros in rpm scriptlets to set up systemd units. +- Add Requires: bash >= 4.0 for blkdeactivate script. + * Tue Aug 07 2012 Alasdair Kergon - 2.02.97-1 - Improve documention of allocation policies in lvm.8. - Increase limit for major:minor to 4095:1048575 when using -My option. diff --git a/sources b/sources index 2ed2676..9ac0417 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -d18bd01334309db1c422b9bf6b181057 LVM2.2.02.97.tgz +1ce5b7f9981e1d02dfd1d3857c8d9fbe LVM2.2.02.98.tgz diff --git a/upstream b/upstream index 0a89a80..d3455b4 100644 --- a/upstream +++ b/upstream @@ -1 +1 @@ -LVM2.2.02.97.tgz +LVM2.2.02.98.tgz