test_expect_success \
'vgsplit accepts new vg as destination of split' \
'vgcreate $vg1 $d1 $d2 &&
- vgsplit $vg1 $vg2 $d1 &&
+ vgsplit $vg1 $vg2 $d1 1>err;
+ status=$?; echo status=$?; test $status = 0 &&
+ grep "New volume group \"$vg2\" successfully split from \"$vg1\"" err &&
vgremove $vg1 &&
vgremove $vg2'
'vgsplit accepts existing vg as destination of split' \
'vgcreate $vg1 $d1 $d2 &&
vgcreate $vg2 $d3 $d4 &&
- vgsplit $vg1 $vg2 $d1 &&
+ vgsplit $vg1 $vg2 $d1 1>err;
+ status=$?; echo status=$?; test $status = 0 &&
+ grep "Existing volume group \"$vg2\" successfully split from \"$vg1\"" err &&
vgremove $vg1 &&
vgremove $vg2'
struct volume_group *vg_to, *vg_from;
int opt;
int active;
+ int existing_vg;
if (argc < 3) {
log_error("Existing VG, new VG and physical volumes required.");
if ((vg_to = vg_lock_and_read(cmd, vg_name_to, NULL,
LCK_VG_WRITE | LCK_NONBLOCK,
0, 0))) {
+ existing_vg = 1;
if (new_vg_option_specified(cmd)) {
log_error("Volume group \"%s\" exists, but new VG "
"option specified", vg_name_to);
if (!vgs_are_compatible(cmd, vg_from,vg_to))
goto error;
} else {
+ existing_vg = 0;
/* Set metadata format of original VG */
/* FIXME: need some common logic */
vp_def.alloc = vg_from->alloc;
vp_def.clustered = 0;
- if (fill_vg_create_params(cmd, vg_name_to, &vp_new, &vp_def))
+ if (fill_vg_create_params(cmd, vg_name_to, &vp_new, &vp_def)) {
+ unlock_vg(cmd, vg_name_from);
return EINVALID_CMD_LINE;
+ }
- if (validate_vg_create_params(cmd, &vp_new))
+ if (validate_vg_create_params(cmd, &vp_new)) {
+ unlock_vg(cmd, vg_name_from);
return EINVALID_CMD_LINE;
+ }
if (!(vg_to = vg_create(cmd, vg_name_to, vp_new.extent_size,
vp_new.max_pv, vp_new.max_lv,
unlock_vg(cmd, vg_name_from);
unlock_vg(cmd, vg_name_to);
- log_print("Volume group \"%s\" successfully split from \"%s\"",
+ log_print("%s volume group \"%s\" successfully split from \"%s\"",
+ existing_vg ? "Existing" : "New",
vg_to->name, vg_from->name);
return ECMD_PROCESSED;