From: Mike Snitzer Date: Fri, 20 Jan 2012 22:03:48 +0000 (+0000) Subject: Allow removal of an invalid snapshot that was to be merged on next activation. X-Git-Tag: v2_02_91~120 X-Git-Url: https://sourceware.org/git/?a=commitdiff_plain;h=27e21a4adca23395172dce3b71cfc3ddddfebb2c;p=lvm2.git Allow removal of an invalid snapshot that was to be merged on next activation. Don't allow a user to merge an invalid snapshot. --- diff --git a/WHATS_NEW b/WHATS_NEW index 9a27a30d1..8db135f17 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,7 @@ 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. Differentiate between snapshot status of "Invalid" and "Merge failed". Lookup snapshot usage percent of origin volume when a snapshot is merging. diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c index f48919df6..b0a43de00 100644 --- a/lib/metadata/lv_manip.c +++ b/lib/metadata/lv_manip.c @@ -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, const force_t force, unsigned level) { + percent_t snap_percent; struct dm_list *snh, *snht; struct seg_list *sl, *tsl; + struct lvinfo info; 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) { - log_error("Can't remove merging snapshot logical volume \"%s\"", - lv->name); - return 0; + if (lv_info(lv->vg->cmd, lv, 0, &info, 1, 0) && + info.exists && info.live_table) { + 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; + } + } } } diff --git a/tools/lvconvert.c b/tools/lvconvert.c index 66a25bd4c..e6c51cb18 100644 --- a/tools/lvconvert.c +++ b/tools/lvconvert.c @@ -1709,6 +1709,8 @@ static int _lvconvert_single(struct cmd_context *cmd, struct logical_volume *lv, { struct lvconvert_params *lp = handle; struct dm_list *failed_pvs; + struct lvinfo info; + percent_t snap_percent; if (lv->status & LOCKED) { 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); 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)) { stack; return ECMD_FAILED;