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:
parent
d658922f36
commit
27e21a4adc
@ -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.
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user