mirror of
git://sourceware.org/git/lvm2.git
synced 2024-10-27 18:55:19 +03:00
Refactor vgsplit - create _vgsplit_to function which creates or opens dest vg.
Move the creating/opening of the destination vg into its own function so later we can reorder the source / destination vg opening based on the alphabetical lock order rule. Should be no functional change but code is a bit tricky. Author: Dave Wysochanski <dwysocha@redhat.com>
This commit is contained in:
parent
ab2d981a97
commit
501fda8056
@ -197,6 +197,52 @@ static int _move_mirrors(struct volume_group *vg_from,
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Create or open the destination of the vgsplit operation.
|
||||
* Returns
|
||||
* - non-NULL: VG handle w/VG lock held
|
||||
* - NULL: no VG lock held
|
||||
*/
|
||||
static struct volume_group *_vgsplit_to(struct cmd_context *cmd,
|
||||
const char *vg_name_to,
|
||||
int *existing_vg)
|
||||
{
|
||||
struct volume_group *vg_to = NULL;
|
||||
|
||||
log_verbose("Checking for new volume group \"%s\"", vg_name_to);
|
||||
/*
|
||||
* First try to create a new VG. If we cannot create it,
|
||||
* and we get FAILED_EXIST (we will not be holding a lock),
|
||||
* a VG must already exist with this name. We then try to
|
||||
* read the existing VG - the vgsplit will be into an existing VG.
|
||||
*
|
||||
* Otherwise, if the lock was successful, it must be the case that
|
||||
* we obtained a WRITE lock and could not find the vgname in the
|
||||
* system. Thus, the split will be into a new VG.
|
||||
*/
|
||||
vg_to = vg_create(cmd, vg_name_to);
|
||||
if (vg_read_error(vg_to) == FAILED_LOCKING) {
|
||||
log_error("Can't get lock for %s", vg_name_to);
|
||||
vg_release(vg_to);
|
||||
return NULL;
|
||||
}
|
||||
if (vg_read_error(vg_to) == FAILED_EXIST) {
|
||||
*existing_vg = 1;
|
||||
vg_release(vg_to);
|
||||
vg_to = vg_read_for_update(cmd, vg_name_to, NULL, 0);
|
||||
|
||||
if (vg_read_error(vg_to)) {
|
||||
vg_release(vg_to);
|
||||
stack;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
} else if (vg_read_error(vg_to) == SUCCESS) {
|
||||
*existing_vg = 0;
|
||||
}
|
||||
return vg_to;
|
||||
}
|
||||
|
||||
/*
|
||||
* Has the user given an option related to a new vg as the split destination?
|
||||
*/
|
||||
@ -262,40 +308,11 @@ int vgsplit(struct cmd_context *cmd, int argc, char **argv)
|
||||
*/
|
||||
cmd->fmt = vg_from->fid->fmt;
|
||||
|
||||
log_verbose("Checking for new volume group \"%s\"", vg_name_to);
|
||||
/*
|
||||
* First try to create a new VG. If we cannot create it,
|
||||
* and we get FAILED_EXIST (we will not be holding a lock),
|
||||
* a VG must already exist with this name. We then try to
|
||||
* read the existing VG - the vgsplit will be into an existing VG.
|
||||
*
|
||||
* Otherwise, if the lock was successful, it must be the case that
|
||||
* we obtained a WRITE lock and could not find the vgname in the
|
||||
* system. Thus, the split will be into a new VG.
|
||||
*/
|
||||
vg_to = vg_create(cmd, vg_name_to);
|
||||
if (vg_read_error(vg_to) == FAILED_LOCKING) {
|
||||
log_error("Can't get lock for %s", vg_name_to);
|
||||
vg_release(vg_to);
|
||||
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;
|
||||
}
|
||||
if (vg_read_error(vg_to) == FAILED_EXIST) {
|
||||
existing_vg = 1;
|
||||
vg_release(vg_to);
|
||||
vg_to = vg_read_for_update(cmd, vg_name_to, NULL, 0);
|
||||
|
||||
if (vg_read_error(vg_to)) {
|
||||
vg_release(vg_to);
|
||||
stack;
|
||||
unlock_and_release_vg(cmd, vg_from, vg_name_from);
|
||||
return ECMD_FAILED;
|
||||
}
|
||||
|
||||
} else if (vg_read_error(vg_to) == SUCCESS) {
|
||||
existing_vg = 0;
|
||||
}
|
||||
|
||||
if (existing_vg) {
|
||||
if (new_vg_option_specified(cmd)) {
|
||||
log_error("Volume group \"%s\" exists, but new VG "
|
||||
|
Loading…
Reference in New Issue
Block a user