mirror of
git://sourceware.org/git/lvm2.git
synced 2024-12-21 13:34:40 +03:00
Modify lvremove to prompt for removal if LV active on other cluster nodes.
Add '-f' to vgremove to force removal of VG even if LVs exist. Update vgremove man page for '-f'.
This commit is contained in:
parent
e4e02000ba
commit
f603fe64bd
@ -1,5 +1,7 @@
|
||||
Version 2.02.29 -
|
||||
==================================
|
||||
Modify lvremove to prompt for removal if LV active on other cluster nodes.
|
||||
Add '-f' to vgremove to force removal of VG even if LVs exist.
|
||||
|
||||
Version 2.02.28 - 24th August 2007
|
||||
==================================
|
||||
|
@ -1839,14 +1839,36 @@ int lv_remove_single(struct cmd_context *cmd, struct logical_volume *lv,
|
||||
|
||||
/* FIXME Ensure not referred to by another existing LVs */
|
||||
|
||||
if (lv_info(cmd, lv, &info, 1)) {
|
||||
/*
|
||||
* If we can't get information about the LV from the kernel, or
|
||||
* someone has the LV device open, fail.
|
||||
*/
|
||||
if (!lv_info(cmd, lv, &info, 1)) {
|
||||
log_error("Unable to obtain status for logical volume \"%s\"",
|
||||
lv->name);
|
||||
return 0;
|
||||
}
|
||||
if (info.open_count) {
|
||||
log_error("Can't remove open logical volume \"%s\"",
|
||||
lv->name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (info.exists && (force == PROMPT)) {
|
||||
/*
|
||||
* Check for confirmation prompts in the following cases:
|
||||
* 1) Clustered VG, and some remote nodes have the LV active
|
||||
* 2) Non-clustered VG, but LV active locally
|
||||
*/
|
||||
if ((vg_status(vg) & CLUSTERED) && !activate_lv_excl(cmd, lv) &&
|
||||
(force == PROMPT)) {
|
||||
if (yes_no_prompt("Logical volume \"%s\" is active on other "
|
||||
"cluster nodes. Really remove? [y/n]: ",
|
||||
lv->name) == 'n') {
|
||||
log_print("Logical volume \"%s\" not removed",
|
||||
lv->name);
|
||||
return 0;
|
||||
}
|
||||
} else if (info.exists && (force == PROMPT)) {
|
||||
if (yes_no_prompt("Do you really want to remove active "
|
||||
"logical volume \"%s\"? [y/n]: ",
|
||||
lv->name) == 'n') {
|
||||
@ -1855,21 +1877,11 @@ int lv_remove_single(struct cmd_context *cmd, struct logical_volume *lv,
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!archive(vg))
|
||||
return 0;
|
||||
|
||||
/* If the VG is clustered then make sure no-one else is using the LV
|
||||
we are about to remove */
|
||||
if (vg_status(vg) & CLUSTERED) {
|
||||
if (!activate_lv_excl(cmd, lv)) {
|
||||
log_error("Can't get exclusive access to volume \"%s\"",
|
||||
lv->name);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* FIXME Snapshot commit out of sequence if it fails after here? */
|
||||
if (!deactivate_lv(cmd, lv)) {
|
||||
log_error("Unable to deactivate logical volume \"%s\"",
|
||||
|
@ -249,6 +249,20 @@ int vg_rename(struct cmd_context *cmd, struct volume_group *vg,
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int remove_lvs_in_vg(struct cmd_context *cmd,
|
||||
struct volume_group *vg,
|
||||
force_t force)
|
||||
{
|
||||
struct lv_list *lvl;
|
||||
|
||||
list_iterate_items(lvl, &vg->lvs)
|
||||
if (!lv_remove_single(cmd, lvl->lv, force))
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* FIXME: remove redundant vg_name */
|
||||
int vg_remove_single(struct cmd_context *cmd, const char *vg_name,
|
||||
struct volume_group *vg, int consistent,
|
||||
force_t force __attribute((unused)))
|
||||
@ -268,6 +282,19 @@ int vg_remove_single(struct cmd_context *cmd, const char *vg_name,
|
||||
if (!vg_check_status(vg, EXPORTED_VG))
|
||||
return 0;
|
||||
|
||||
if (vg->lv_count) {
|
||||
if ((force == PROMPT) &&
|
||||
(yes_no_prompt("Do you really want to remove volume "
|
||||
"group \"%s\" containing %d "
|
||||
"logical volumes? [y/n]: ",
|
||||
vg_name, vg->lv_count) == 'n')) {
|
||||
log_print("Volume group \"%s\" not removed", vg_name);
|
||||
return 0;
|
||||
}
|
||||
if (!remove_lvs_in_vg(cmd, vg, force))
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (vg->lv_count) {
|
||||
log_error("Volume group \"%s\" still contains %d "
|
||||
"logical volume(s)", vg_name, vg->lv_count);
|
||||
|
@ -3,17 +3,24 @@
|
||||
vgremove \- remove a volume group
|
||||
.SH SYNOPSIS
|
||||
.B vgremove
|
||||
[\-d/\-\-debug] [\-h/\-?/\-\-help] [\-t/\-\-test] [\-v/\-\-verbose]
|
||||
[\-d/\-\-debug] [\-f/\-\-force] [\-h/\-?/\-\-help]
|
||||
[\-t/\-\-test] [\-v/\-\-verbose]
|
||||
VolumeGroupName [VolumeGroupName...]
|
||||
.SH DESCRIPTION
|
||||
vgremove allows you to remove one or more volume groups.
|
||||
The volume group(s) must not have any logical volumes allocated:
|
||||
Remove them first with \fBlvremove\fP. If one or more physical
|
||||
volumes in the volume group are lost, consider
|
||||
\fBvgreduce --removemissing\fP to make the volume group
|
||||
If one or more physical volumes in the volume group are lost,
|
||||
consider \fBvgreduce --removemissing\fP to make the volume group
|
||||
metadata consistent again.
|
||||
.sp
|
||||
If there are logical volumes that exist in the volume group,
|
||||
a prompt will be given to confirm removal. You can override
|
||||
the prompt with \fB-f\fP.
|
||||
.SH OPTIONS
|
||||
See \fBlvm\fP for common options.
|
||||
.TP
|
||||
.BR \-f ", " \-\-force
|
||||
Force the removal of any logical volumes on the volume group
|
||||
without confirmation.
|
||||
.SH SEE ALSO
|
||||
.BR lvm (8),
|
||||
.BR lvremove (8),
|
||||
|
@ -807,13 +807,14 @@ xx(vgremove,
|
||||
"Remove volume group(s)",
|
||||
"vgremove\n"
|
||||
"\t[-d|--debug]\n"
|
||||
"\t[-f|--force]\n"
|
||||
"\t[-h|--help]\n"
|
||||
"\t[-t|--test]\n"
|
||||
"\t[-v|--verbose]\n"
|
||||
"\t[--version]" "\n"
|
||||
"\tVolumeGroupName [VolumeGroupName...]\n",
|
||||
|
||||
test_ARG)
|
||||
force_ARG, test_ARG)
|
||||
|
||||
xx(vgrename,
|
||||
"Rename a volume group",
|
||||
|
Loading…
Reference in New Issue
Block a user