summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Teigland <teigland@redhat.com>2017-08-29 13:16:45 -0500
committerDavid Teigland <teigland@redhat.com>2017-08-29 13:16:45 -0500
commit4181b482a6c914f95b327bab52446a7569a2db4b (patch)
treea32e08a60e7c8e415c52b4ed2e10e829b39669ff
parent550c952c031d3942bc44a79733408858e95432d5 (diff)
downloadlvm2-dev-dct-maintenance.tar.gz
lvchange: prevent activation in maintance mode without maintenance optiondev-dct-maintenance
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.
-rw-r--r--lib/metadata/lv_manip.c13
-rw-r--r--lib/metadata/metadata-exported.h3
-rw-r--r--tools/args.h3
-rw-r--r--tools/command-lines.in4
-rw-r--r--tools/lvchange.c3
-rw-r--r--tools/vgchange.c3
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;