From 4181b482a6c914f95b327bab52446a7569a2db4b Mon Sep 17 00:00:00 2001 From: David Teigland Date: Tue, 29 Aug 2017 13:16:45 -0500 Subject: lvchange: prevent activation in maintance mode without maintenance option Prevents activating an LV that is in maintenance mode. Adds --maintenace option that allows lvchange/vgchange to activate an LV that is in maintenance mode. --- lib/metadata/lv_manip.c | 13 +++++++++++++ lib/metadata/metadata-exported.h | 3 +++ tools/args.h | 3 +++ tools/command-lines.in | 4 ++-- tools/lvchange.c | 3 +++ tools/vgchange.c | 3 +++ 6 files changed, 27 insertions(+), 2 deletions(-) diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c index 1851783bf..9a73f6ca6 100644 --- a/lib/metadata/lv_manip.c +++ b/lib/metadata/lv_manip.c @@ -7239,6 +7239,19 @@ int lv_activation_skip(struct logical_volume *lv, activation_change_t activate, return 1; } +int lv_maintenance_skip(struct logical_volume *lv, activation_change_t activate, + int override_maintenance_flag) +{ + if (!(lv->status & LV_MAINTENANCE) || + !is_change_activating(activate) || /* Do not skip deactivation */ + override_maintenance_flag) + return 0; + + log_verbose("MAINTENANCE flag set for LV %s/%s, skipping activation.", + lv->vg->name, lv->name); + return 1; +} + static int _should_wipe_lv(struct lvcreate_params *lp, struct logical_volume *lv, int warn) { diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h index a5294c0b4..2fabcbc05 100644 --- a/lib/metadata/metadata-exported.h +++ b/lib/metadata/metadata-exported.h @@ -1016,6 +1016,9 @@ void lv_set_activation_skip(struct logical_volume *lv, int override_default, int int lv_activation_skip(struct logical_volume *lv, activation_change_t activate, int override_lv_skip_flag); +int lv_maintenance_skip(struct logical_volume *lv, activation_change_t activate, + int override_maintenance_flag); + /* * Functions for layer manipulation */ diff --git a/tools/args.h b/tools/args.h index 2b1d28a3f..089323b7b 100644 --- a/tools/args.h +++ b/tools/args.h @@ -287,6 +287,9 @@ arg(logonly_ARG, '\0', "logonly", 0, 0, 0, arg(longhelp_ARG, '\0', "longhelp", 0, 0, 0, "Display long help text.\n") +arg(maintenance_ARG, '\0', "maintenance", 0, 0, 0, + "Allow command to operate on an LV in maintenance mode.\n") + arg(maxrecoveryrate_ARG, '\0', "maxrecoveryrate", sizekb_VAL, 0, 0, "Sets the maximum recovery rate for a RAID LV. The rate value\n" "is an amount of data per second for each device in the array.\n" diff --git a/tools/command-lines.in b/tools/command-lines.in index 643d9a921..891184525 100644 --- a/tools/command-lines.in +++ b/tools/command-lines.in @@ -276,7 +276,7 @@ RULE: all not LV_raid0 lvchange --activate Active VG|LV|Tag|Select ... OO: --activationmode ActivationMode, --partial, --poll Bool, --monitor Bool, ---ignoreactivationskip, --ignorelockingfailure, --sysinit, OO_LVCHANGE +--ignoreactivationskip, --ignorelockingfailure, --sysinit, --maintenance, OO_LVCHANGE ID: lvchange_activate DESC: Activate or deactivate an LV. @@ -1506,7 +1506,7 @@ DESC: Start or stop processing LV conversions. vgchange --activate Active OO: --activationmode ActivationMode, --ignoreactivationskip, --partial, --sysinit, ---ignorelockingfailure, --monitor Bool, --poll Bool, OO_VGCHANGE +--ignorelockingfailure, --monitor Bool, --poll Bool, --maintenance, OO_VGCHANGE OP: VG|Tag|Select ... ID: vgchange_activate DESC: Activate or deactivate LVs. diff --git a/tools/lvchange.c b/tools/lvchange.c index 243de5a1d..4163d59c9 100644 --- a/tools/lvchange.c +++ b/tools/lvchange.c @@ -215,6 +215,9 @@ static int _lvchange_activate(struct cmd_context *cmd, struct logical_volume *lv if (lv_activation_skip(lv, activate, arg_is_set(cmd, ignoreactivationskip_ARG))) return 1; + if (lv_maintenance_skip(lv, activate, arg_is_set(cmd, maintenance_ARG))) + return 1; + if (lv_is_cow(lv) && !lv_is_virtual_origin(origin_from_cow(lv))) lv = origin_from_cow(lv); diff --git a/tools/vgchange.c b/tools/vgchange.c index 263b5a684..1b726398d 100644 --- a/tools/vgchange.c +++ b/tools/vgchange.c @@ -122,6 +122,9 @@ static int _activate_lvs_in_vg(struct cmd_context *cmd, struct volume_group *vg, if (lv_activation_skip(lv, activate, arg_is_set(cmd, ignoreactivationskip_ARG))) continue; + if (lv_maintenance_skip(lv, activate, arg_is_set(cmd, maintenance_ARG))) + continue; + if ((activate == CHANGE_AAY) && !lv_passes_auto_activation_filter(cmd, lv)) continue; -- cgit v1.2.1