1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-10-27 10:25:13 +03:00

Refactor vgsplit - reorder _vgsplit_from and _vgsplit_to based on flag.

Slight functional change.  If we open the destination first, we cannot
know the 'fmt'.  In this case we use the default metadata type unless
the user has specified -M on the cmdline.  If not, in most cases this
is fine since we use the LVM2 default metadata type.  However, if the
user is specifying a non-default metadata type (e.g. lvm1) and the order
of the names is such that we have to open the destination (vg_to) first,
we have a problem.  So in this case, we require the use of -M and vgsplit
will fail with an error if not.  I've updated the man page to recommend
the usage of -M in this case.


Author: Dave Wysochanski <dwysocha@redhat.com>
This commit is contained in:
Dave Wysochanski 2009-09-02 21:27:22 +00:00
parent 392b185173
commit eb7c87e90d
2 changed files with 34 additions and 18 deletions

View File

@ -39,7 +39,9 @@ for the new volume group can be specified with \fB\-\-alloc\fR,
and \fB\-\-maxphysicalvolumes\fR (see \fBvgcreate(8)\fR for a description
of these options). If any of these options are not given, default
attribute(s) are taken from
.I SourceVolumeGroupName\fP.
.I SourceVolumeGroupName\fP. If a non-LVM2 metadata type (e.g. lvm1) is
being used, you should use the -M option to specify the metadata type
directly.
If
.I DestinationVolumeGroupName

View File

@ -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)
unlock_and_release_vg(cmd, vg_to, vg_name_to);
return ECMD_FAILED;
}
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;
/*
* 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) {
if (lock_vg_from_first)
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;
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;
}
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 "