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)/$(