[lvm-devel] master - snapshot: move code of old snapshot merge
Zdenek Kabelac
zkabelac at fedoraproject.org
Thu Nov 28 11:48:49 UTC 2013
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=8724c0fcebcc35df980e6819e5c531f213fe2767
Commit: 8724c0fcebcc35df980e6819e5c531f213fe2767
Parent: b3679590dfb9839196c36ac74b86377ae2a10f8e
Author: Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate: Tue Nov 26 12:09:41 2013 +0100
Committer: Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Thu Nov 28 12:45:28 2013 +0100
snapshot: move code of old snapshot merge
Move code for merging old snapshot into its own function.
---
tools/lvconvert.c | 68 ++++++++++++++++++++++++++++------------------------
1 files changed, 37 insertions(+), 31 deletions(-)
diff --git a/tools/lvconvert.c b/tools/lvconvert.c
index 051463b..34c8de2 100644
--- a/tools/lvconvert.c
+++ b/tools/lvconvert.c
@@ -1884,31 +1884,59 @@ static int lvconvert_snapshot(struct cmd_context *cmd,
return 1;
}
-static int lvconvert_merge(struct cmd_context *cmd,
- struct logical_volume *lv,
- struct lvconvert_params *lp)
+static int _lvconvert_merge_old_snapshot(struct cmd_context *cmd,
+ struct logical_volume *lv,
+ struct lvconvert_params *lp)
{
int r = 0;
int merge_on_activate = 0;
struct logical_volume *origin = origin_from_cow(lv);
struct lv_segment *snap_seg = find_snapshot(lv);
struct lvinfo info;
+ percent_t snap_percent;
/* Check if merge is possible */
+ if (!lv_is_cow(lv)) {
+ log_error("\"%s\" is not a mergeable logical volume.",
+ lv->name);
+ return 0;
+ }
+
if (lv_is_merging_cow(lv)) {
- log_error("Snapshot %s is already merging", lv->name);
+ log_error("Snapshot %s is already merging.", lv->name);
return 0;
}
+
if (lv_is_merging_origin(origin)) {
log_error("Snapshot %s is already merging into the origin.",
find_snapshot(origin)->cow->name);
return 0;
}
+
if (lv_is_virtual_origin(origin)) {
log_error("Snapshot %s has virtual origin.", lv->name);
return 0;
}
+ if (lv_is_external_origin(origin_from_cow(lv))) {
+ log_error("Cannot merge snapshot \"%s\" into "
+ "the read-only external origin \"%s\".",
+ lv->name, origin_from_cow(lv)->name);
+ return 0;
+ }
+
+ 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 0;
+ }
+
+ if (!archive(lv->vg))
+ return_0;
+
/*
* Prevent merge with open device(s) as it would likely lead
* to application/filesystem failure. Merge on origin's next
@@ -1955,7 +1983,7 @@ static int lvconvert_merge(struct cmd_context *cmd,
/* Perform merge */
if (!suspend_lv(cmd, origin)) {
- log_error("Failed to suspend origin %s", origin->name);
+ log_error("Failed to suspend origin %s.", origin->name);
vg_revert(lv->vg);
goto out;
}
@@ -1967,7 +1995,7 @@ static int lvconvert_merge(struct cmd_context *cmd,
}
if (!resume_lv(cmd, origin)) {
- log_error("Failed to reactivate origin %s", origin->name);
+ log_error("Failed to reactivate origin %s.", origin->name);
goto out;
}
@@ -1978,6 +2006,7 @@ static int lvconvert_merge(struct cmd_context *cmd,
log_print_unless_silent("Merging of volume %s started.", lv->name);
out:
backup(lv->vg);
+
return r;
}
@@ -2588,8 +2617,6 @@ 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);
@@ -2634,29 +2661,8 @@ static int _lvconvert_single(struct cmd_context *cmd, struct logical_volume *lv,
}
}
if (lp->merge) {
- if (!lv_is_cow(lv)) {
- log_error("\"%s\" is not a mergeable logical volume",
- lv->name);
- return ECMD_FAILED;
- }
- if (lv_is_external_origin(origin_from_cow(lv))) {
- log_error("Cannot merge snapshot \"%s\" into "
- "the read-only external origin \"%s\".",
- lv->name, origin_from_cow(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))
- return_ECMD_FAILED;
-
- if (!lvconvert_merge(cmd, lv, lp)) {
- log_error("Unable to merge LV \"%s\" into its origin.", lv->name);
+ if (!_lvconvert_merge_old_snapshot(cmd, lv, lp)) {
+ log_print_unless_silent("Unable to merge LV \"%s\" into its origin.", lv->name);
return ECMD_FAILED;
}
} else if (lp->snapshot) {
More information about the lvm-devel
mailing list