virDomainMomentObj *
virDomainSnapshotAssignDef(virDomainSnapshotObjList *snapshots,
- virDomainSnapshotDef *def)
+ virDomainSnapshotDef **snapdefptr)
{
- return virDomainMomentAssignDef(snapshots->base, &def->parent);
+ virDomainSnapshotDef *snapdef = *snapdefptr;
+ virDomainMomentObj *ret = virDomainMomentAssignDef(snapshots->base, &snapdef->parent);
+
+ if (ret)
+ *snapdefptr = NULL;
+
+ return ret;
}
void virDomainSnapshotObjListFree(virDomainSnapshotObjList *snapshots);
virDomainMomentObj *virDomainSnapshotAssignDef(virDomainSnapshotObjList *snapshots,
- virDomainSnapshotDef *def);
+ virDomainSnapshotDef **snapdefptr);
int virDomainSnapshotObjListGetNames(virDomainSnapshotObjList *snapshots,
virDomainMomentObj *from,
continue;
}
- snap = virDomainSnapshotAssignDef(vm->snapshots, snapdef);
- if (snap)
- snapdef = NULL;
+ snap = virDomainSnapshotAssignDef(vm->snapshots, &snapdef);
if (cur && snap) {
if (current)
virReportError(VIR_ERR_INTERNAL_ERROR,
return NULL;
if (!snap) {
- if (!(snap = virDomainSnapshotAssignDef(vm->snapshots, snapdef)))
+ if (!(snap = virDomainSnapshotAssignDef(vm->snapshots, &snapdef)))
return NULL;
- snapdef = NULL;
}
/* XXX Should we validate that the redefined snapshot even
* makes sense, such as checking that qemu-img recognizes the
snap->def = &snapdef->parent;
snapdef = NULL;
} else {
- if (!(snap = virDomainSnapshotAssignDef(vm->snapshots, snapdef)))
+ if (!(snap = virDomainSnapshotAssignDef(vm->snapshots, &snapdef)))
return NULL;
- snapdef = NULL;
if ((current = virDomainSnapshotGetCurrent(vm->snapshots))) {
snap->def->parent_name = g_strdup(current->def->name);
for (i = 0; i < nsdata->num_snap_nodes; i++) {
virDomainMomentObj *snap;
- virDomainSnapshotDef *def;
+ g_autoptr(virDomainSnapshotDef) def = NULL;
xmlNodePtr node = testParseXMLDocFromFile(nodes[i], file,
"domainsnapshot");
if (!node)
if (!def)
return -1;
- if (!(snap = virDomainSnapshotAssignDef(domobj->snapshots, def))) {
- virObjectUnref(def);
+ if (!(snap = virDomainSnapshotAssignDef(domobj->snapshots, &def)))
return -1;
- }
if (cur) {
if (virDomainSnapshotGetCurrent(domobj->snapshots)) {
return NULL;
if (!snap) {
- if (!(snap = virDomainSnapshotAssignDef(vm->snapshots, snapdef)))
+ if (!(snap = virDomainSnapshotAssignDef(vm->snapshots, &snapdef)))
return NULL;
- snapdef = NULL;
}
*snapout = snap;
if (testDomainSnapshotAlignDisks(vm, def, flags) < 0)
goto cleanup;
- if (!(snap = virDomainSnapshotAssignDef(vm->snapshots, def)))
+ if (!(snap = virDomainSnapshotAssignDef(vm->snapshots, &def)))
goto cleanup;
- def = NULL;
snap->def->parent_name = g_strdup(virDomainSnapshotGetCurrentName(vm->snapshots));
}
VIR_FREE(xmlstr);
- if (!(snapshot = virDomainSnapshotAssignDef(snapshots, def)))
+ if (!(snapshot = virDomainSnapshotAssignDef(snapshots, &def)))
goto cleanup;
- def = NULL;
xmlstr = virXPathString("string(./@current)", ctxt);
if (xmlstr && STREQ("yes", xmlstr)) {