int
virDomainCheckpointRedefinePrep(virDomainObjPtr vm,
- virDomainCheckpointDefPtr *defptr,
- virDomainMomentObjPtr *chk,
- virDomainXMLOptionPtr xmlopt,
+ virDomainCheckpointDefPtr def,
bool *update_current)
{
- virDomainCheckpointDefPtr def = *defptr;
char uuidstr[VIR_UUID_STRING_BUFLEN];
virDomainMomentObjPtr parent = NULL;
- virDomainMomentObjPtr other = NULL;
- virDomainCheckpointDefPtr otherdef = NULL;
virUUIDFormat(vm->def->uuid, uuidstr);
if (virDomainCheckpointGetCurrent(vm->checkpoints) == NULL)
*update_current = true;
+ return 0;
+}
+
+
+virDomainMomentObjPtr
+virDomainCheckpointRedefineCommit(virDomainObjPtr vm,
+ virDomainCheckpointDefPtr *defptr,
+ virDomainXMLOptionPtr xmlopt)
+{
+ virDomainCheckpointDefPtr def = *defptr;
+ virDomainMomentObjPtr other = NULL;
+ virDomainCheckpointDefPtr otherdef = NULL;
+ virDomainMomentObjPtr chk = NULL;
+
other = virDomainCheckpointFindByName(vm->checkpoints, def->parent.name);
if (other) {
otherdef = virDomainCheckpointObjGetDef(other);
if (!virDomainDefCheckABIStability(otherdef->parent.dom,
def->parent.dom, xmlopt))
- return -1;
+ return NULL;
/* Drop and rebuild the parent relationship, but keep all
* child relations by reusing chk. */
virObjectUnref(otherdef);
other->def = &(*defptr)->parent;
*defptr = NULL;
- *chk = other;
+ chk = other;
+ } else {
+ chk = virDomainCheckpointAssignDef(vm->checkpoints, def);
+ *defptr = NULL;
}
- return 0;
+ return chk;
}
int
virDomainCheckpointAlignDisks(virDomainCheckpointDefPtr checkpoint);
-int virDomainCheckpointRedefinePrep(virDomainObjPtr vm,
- virDomainCheckpointDefPtr *def,
- virDomainMomentObjPtr *checkpoint,
- virDomainXMLOptionPtr xmlopt,
- bool *update_current);
+int
+virDomainCheckpointRedefinePrep(virDomainObjPtr vm,
+ virDomainCheckpointDefPtr def,
+ bool *update_current);
+
+virDomainMomentObjPtr
+virDomainCheckpointRedefineCommit(virDomainObjPtr vm,
+ virDomainCheckpointDefPtr *defptr,
+ virDomainXMLOptionPtr xmlopt);
VIR_ENUM_DECL(virDomainCheckpoint);
virDomainCheckpointDefNew;
virDomainCheckpointDefParseString;
virDomainCheckpointFormatConvertXMLFlags;
+virDomainCheckpointRedefineCommit;
virDomainCheckpointRedefinePrep;
virDomainCheckpointTypeFromString;
virDomainCheckpointTypeToString;
virDomainCheckpointDefPtr *def,
bool *update_current)
{
- virDomainMomentObjPtr chk = NULL;
-
- if (virDomainCheckpointRedefinePrep(vm, def, &chk, driver->xmlopt,
- update_current) < 0)
+ if (virDomainCheckpointRedefinePrep(vm, *def, update_current) < 0)
return NULL;
/* XXX Should we validate that the redefined checkpoint even
* makes sense, such as checking that qemu-img recognizes the
* checkpoint bitmap name in at least one of the domain's disks? */
- if (chk)
- return chk;
-
- chk = virDomainCheckpointAssignDef(vm->checkpoints, *def);
- *def = NULL;
- return chk;
+ return virDomainCheckpointRedefineCommit(vm, def, driver->xmlopt);
}
goto cleanup;
if (redefine) {
- if (virDomainCheckpointRedefinePrep(vm, &def, &chk,
- privconn->xmlopt,
- &update_current) < 0)
+ if (virDomainCheckpointRedefinePrep(vm, def, &update_current) < 0)
+ goto cleanup;
+
+ if (!(chk = virDomainCheckpointRedefineCommit(vm, &def, privconn->xmlopt)))
goto cleanup;
} else {
if (!(def->parent.dom = virDomainDefCopy(vm->def,
if (virDomainCheckpointAlignDisks(def) < 0)
goto cleanup;
- }
- if (!chk) {
if (!(chk = virDomainCheckpointAssignDef(vm->checkpoints, def)))
goto cleanup;