1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-01-02 01:18:26 +03:00

Allow removal of an invalid snapshot that was to be merged on next activation.

Don't allow a user to merge an invalid snapshot.
This commit is contained in:
Mike Snitzer 2012-01-20 22:03:48 +00:00
parent d658922f36
commit 27e21a4adc
3 changed files with 27 additions and 4 deletions

View File

@ -1,5 +1,7 @@
Version 2.02.89 - Version 2.02.89 -
================================== ==================================
Allow removal of an invalid snapshot that was to be merged on next activation.
Don't allow a user to merge an invalid snapshot.
Use m and M lv_attr to indicate that a snapshot merge failed in lvs. Use m and M lv_attr to indicate that a snapshot merge failed in lvs.
Differentiate between snapshot status of "Invalid" and "Merge failed". Differentiate between snapshot status of "Invalid" and "Merge failed".
Lookup snapshot usage percent of origin volume when a snapshot is merging. Lookup snapshot usage percent of origin volume when a snapshot is merging.

View File

@ -3263,15 +3263,27 @@ int lv_remove_single(struct cmd_context *cmd, struct logical_volume *lv,
int lv_remove_with_dependencies(struct cmd_context *cmd, struct logical_volume *lv, int lv_remove_with_dependencies(struct cmd_context *cmd, struct logical_volume *lv,
const force_t force, unsigned level) const force_t force, unsigned level)
{ {
percent_t snap_percent;
struct dm_list *snh, *snht; struct dm_list *snh, *snht;
struct seg_list *sl, *tsl; struct seg_list *sl, *tsl;
struct lvinfo info;
if (lv_is_cow(lv)) { if (lv_is_cow(lv)) {
/* A merging snapshot cannot be removed directly */ /*
* A merging snapshot cannot be removed directly unless
* it has been invalidated.
*/
if (lv_is_merging_cow(lv) && !level) { if (lv_is_merging_cow(lv) && !level) {
log_error("Can't remove merging snapshot logical volume \"%s\"", if (lv_info(lv->vg->cmd, lv, 0, &info, 1, 0) &&
lv->name); info.exists && info.live_table) {
return 0; if (lv_snapshot_percent(lv, &snap_percent) &&
((snap_percent != PERCENT_INVALID) &&
(snap_percent != PERCENT_MERGE_FAILED))) {
log_error("Can't remove merging snapshot logical volume \"%s\"",
lv->name);
return 0;
}
}
} }
} }

View File

@ -1709,6 +1709,8 @@ static int _lvconvert_single(struct cmd_context *cmd, struct logical_volume *lv,
{ {
struct lvconvert_params *lp = handle; struct lvconvert_params *lp = handle;
struct dm_list *failed_pvs; struct dm_list *failed_pvs;
struct lvinfo info;
percent_t snap_percent;
if (lv->status & LOCKED) { if (lv->status & LOCKED) {
log_error("Cannot convert locked LV %s", lv->name); log_error("Cannot convert locked LV %s", lv->name);
@ -1742,6 +1744,13 @@ static int _lvconvert_single(struct cmd_context *cmd, struct logical_volume *lv,
lv->name); lv->name);
return ECMD_FAILED; return ECMD_FAILED;
} }
if (lv_info(lv->vg->cmd, lv, 0, &info, 1, 0)
&& info.exists && info.live_table &&
(!lv_snapshot_percent(lv, &snap_percent) ||
snap_percent == PERCENT_INVALID)) {
log_error("Unable to merge invalidated snapshot LV \"%s\"", lv->name);
return ECMD_FAILED;
}
if (!archive(lv->vg)) { if (!archive(lv->vg)) {
stack; stack;
return ECMD_FAILED; return ECMD_FAILED;