1
0
mirror of git://sourceware.org/git/lvm2.git synced 2025-03-28 02:50:41 +03:00

Allow vgsplit into existing vg.

Add vgsplit tests to validate operation for new and existing vg destinations.
This commit is contained in:
Dave Wysochanski 2008-01-11 21:43:16 +00:00
parent 746a2cdbaf
commit 3853d11fc8
3 changed files with 81 additions and 25 deletions

View File

@ -10,20 +10,22 @@ vgsplit \- split a volume group into two
[\-M/\-\-metadatatype 1/2]
[\-t/\-\-test]
[\-v/\-\-verbose]
ExistingVolumeGroupName NewVolumeGroupName
SourceVolumeGroupName DestinationVolumeGroupName
PhysicalVolumePath [PhysicalVolumePath...]
.SH DESCRIPTION
.B vgsplit
creates
.I NewVolumeGroupName
and moves
moves
.IR PhysicalVolumePath (s)
from
.I ExistingVolumeGroupName
into it.
.I SourceVolumeGroupName
into
.I DestinationVolumeGroupName\fP.
If
.I DestinationVolumeGroupName
does not exist, it will be created.
Logical Volumes cannot be split between Volume Groups.
Each existing Logical Volumes must be entirely on the Physical Volumes forming
either the old or the new Volume Group.
Each existing Logical Volume must be entirely on the Physical Volumes forming
either the source or the destination Volume Group.
.SH OPTIONS
See \fBlvm\fP for common options.
.SH SEE ALSO

54
test/t-vgsplit-operation.sh Executable file
View File

@ -0,0 +1,54 @@
#!/bin/sh
# Copyright (C) 2007 Red Hat, Inc. All rights reserved.
#
# This copyrighted material is made available to anyone wishing to use,
# modify, copy, or redistribute it subject to the terms and conditions
# of the GNU General Public License v.2.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
test_description='Exercise some vgsplit diagnostics'
privileges_required_=1
. ./test-lib.sh
cleanup_()
{
test -n "$d1" && losetup -d "$d1"
test -n "$d2" && losetup -d "$d2"
test -n "$d3" && losetup -d "$d3"
test -n "$d4" && losetup -d "$d4"
rm -f "$f1" "$f2" "$f3" "$f4"
}
test_expect_success \
'set up temp files, loopback devices, PVs, vgnames' \
'f1=$(pwd)/1 && d1=$(loop_setup_ "$f1") &&
f2=$(pwd)/2 && d2=$(loop_setup_ "$f2") &&
f3=$(pwd)/3 && d3=$(loop_setup_ "$f3") &&
f4=$(pwd)/4 && d4=$(loop_setup_ "$f4") &&
vg1=$(this_test_)-test-vg1-$$ &&
vg2=$(this_test_)-test-vg2-$$ &&
pvcreate $d1 $d2 $d3 $d4'
test_expect_success \
'vgsplit accepts new vg as destination of split' \
'vgcreate $vg1 $d1 $d2 &&
vgsplit $vg1 $vg2 $d1 &&
vgremove $vg1 &&
vgremove $vg2'
test_expect_success \
'vgsplit accepts existing vg as destination of split' \
'vgcreate $vg1 $d1 $d2 &&
vgcreate $vg2 $d3 $d4 &&
vgsplit $vg1 $vg2 $d1 &&
vgremove $vg1 &&
vgremove $vg2'
test_done
# Local Variables:
# indent-tabs-mode: nil
# End:

View File

@ -251,25 +251,25 @@ int vgsplit(struct cmd_context *cmd, int argc, char **argv)
if ((vg_to = vg_lock_and_read(cmd, vg_name_to, NULL,
LCK_VG_WRITE | LCK_NONBLOCK,
0, 0))) {
/* FIXME Remove this restriction */
log_error("Volume group \"%s\" already exists", vg_name_to);
unlock_vg(cmd, vg_name_from);
return ECMD_FAILED;
log_warn("Volume group \"%s\" already exists", vg_name_to);
/* FIXME: check compatibility with existing vg, esp attribs */
} else {
/* Set metadata format of original VG */
/* FIXME: need some common logic */
cmd->fmt = vg_from->fid->fmt;
/* Create new VG structure */
/* FIXME: allow user input same params as to vgcreate tool */
if (!(vg_to = vg_create(cmd, vg_name_to, vg_from->extent_size,
vg_from->max_pv, vg_from->max_lv,
vg_from->alloc, 0, NULL)))
goto error;
if (vg_from->status & CLUSTERED)
vg_to->status |= CLUSTERED;
}
/* Set metadata format of original VG */
/* FIXME: need some common logic */
cmd->fmt = vg_from->fid->fmt;
/* Create new VG structure */
if (!(vg_to = vg_create(cmd, vg_name_to, vg_from->extent_size,
vg_from->max_pv, vg_from->max_lv,
vg_from->alloc, 0, NULL)))
goto error;
if (vg_from->status & CLUSTERED)
vg_to->status |= CLUSTERED;
/* Archive vg_from before changing it */
if (!archive(vg_from))
goto error;