diff --git a/WHATS_NEW b/WHATS_NEW index fb3279ef7..481e8e3e3 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.97 - =============================== + Add --activate ay to pvscan. Add --activate ay to vgchange. Add support for volume autoactivation using lvmetad. Add --activate synonym for --available arg and prefer --activate. diff --git a/tools/commands.h b/tools/commands.h index 8bec09290..21791f77b 100644 --- a/tools/commands.h +++ b/tools/commands.h @@ -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, diff --git a/tools/pvscan.c b/tools/pvscan.c index beba17433..a0408998c 100644 --- a/tools/pvscan.c +++ b/tools/pvscan.c @@ -97,6 +97,20 @@ static void _pvscan_display_single(struct cmd_context *cmd, pv_pe_size(pv))); } +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; @@ -136,6 +150,14 @@ static int _pvscan_lvmetad(struct cmd_context *cmd, int argc, char **argv) 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; @@ -241,6 +263,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/udev/69-dm-lvm-metad.rules.in b/udev/69-dm-lvm-metad.rules.in index 26309deba..706c03b44 100644 --- a/udev/69-dm-lvm-metad.rules.in +++ b/udev/69-dm-lvm-metad.rules.in @@ -21,6 +21,6 @@ SUBSYSTEM!="block", GOTO="lvm_end" 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 --major $major --minor $minor" +ENV{ID_FS_TYPE}=="LVM2_member|LVM1_member", RUN+="(LVM_EXEC)/lvm pvscan --cache --activate ay --major $major --minor $minor" LABEL="lvm_end"