summaryrefslogtreecommitdiffstats
path: root/tools/vgsplit.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/vgsplit.c')
-rw-r--r--tools/vgsplit.c48
1 files changed, 31 insertions, 17 deletions
diff --git a/tools/vgsplit.c b/tools/vgsplit.c
index 7fe39e92..d4a7eed1 100644
--- a/tools/vgsplit.c
+++ b/tools/vgsplit.c
@@ -314,26 +314,40 @@ int vgsplit(struct cmd_context *cmd, int argc, char **argv)
return ECMD_FAILED;
}
- vg_from = _vgsplit_from(cmd, vg_name_from);
- if (!vg_from) {
- if (!lock_vg_from_first)
+ if (lock_vg_from_first) {
+ vg_from = _vgsplit_from(cmd, vg_name_from);
+ if (!vg_from)
+ return ECMD_FAILED;
+ /*
+ * Set metadata format of original VG.
+ * NOTE: We must set the format before calling vg_create()
+ * since vg_create() calls the per-format constructor.
+ */
+ cmd->fmt = vg_from->fid->fmt;
+
+ vg_to = _vgsplit_to(cmd, vg_name_to, &existing_vg);
+ if (!vg_to) {
+ unlock_and_release_vg(cmd, vg_from, vg_name_from);
+ return ECMD_FAILED;
+ }
+ } else {
+ vg_to = _vgsplit_to(cmd, vg_name_to, &existing_vg);
+ if (!vg_to)
+ return ECMD_FAILED;
+ vg_from = _vgsplit_from(cmd, vg_name_from);
+ if (!vg_from) {
unlock_and_release_vg(cmd, vg_to, vg_name_to);
- return ECMD_FAILED;
- }
-
- /*
- * Set metadata format of original VG.
- * NOTE: We must set the format before calling vg_create()
- * since vg_create() calls the per-format constructor.
- */
- cmd->fmt = vg_from->fid->fmt;
+ return ECMD_FAILED;
+ }
- vg_to = _vgsplit_to(cmd, vg_name_to, &existing_vg);
- if (!vg_to) {
- if (lock_vg_from_first)
- unlock_and_release_vg(cmd, vg_from, vg_name_from);
- return ECMD_FAILED;
+ if (cmd->fmt != vg_from->fid->fmt) {
+ /* In this case we don't know the vg_from->fid->fmt */
+ log_error("Unable to set new VG metadata type based on "
+ "source VG format - use -M option.");
+ goto bad;
+ }
}
+
if (existing_vg) {
if (new_vg_option_specified(cmd)) {
log_error("Volume group \"%s\" exists, but new VG "