virQEMUDriverConfig *cfg,
unsigned int flags)
{
-
+ g_autoptr(virDomainMomentObj) tmpsnap = NULL;
virDomainMomentObj *snap = NULL;
virDomainMomentObj *current = NULL;
virDomainSnapshotPtr ret = NULL;
if (qemuSnapshotPrepare(vm, def, &flags) < 0)
return NULL;
- if (!(snap = virDomainSnapshotAssignDef(vm->snapshots, def)))
- return NULL;
-
- virObjectRef(def);
+ if (flags & VIR_DOMAIN_SNAPSHOT_CREATE_NO_METADATA) {
+ snap = tmpsnap = virDomainMomentObjNew();
+ snap->def = &def->parent;
+ } else {
+ if (!(snap = virDomainSnapshotAssignDef(vm->snapshots, def)))
+ return NULL;
- current = virDomainSnapshotGetCurrent(vm->snapshots);
- if (current) {
- snap->def->parent_name = g_strdup(current->def->name);
+ if ((current = virDomainSnapshotGetCurrent(vm->snapshots))) {
+ snap->def->parent_name = g_strdup(current->def->name);
+ }
}
+ virObjectRef(def);
+
/* actually do the snapshot */
if (virDomainObjIsActive(vm)) {
if (flags & VIR_DOMAIN_SNAPSHOT_CREATE_DISK_ONLY ||
}
}
- if (!(flags & VIR_DOMAIN_SNAPSHOT_CREATE_NO_METADATA)) {
+ if (!tmpsnap) {
qemuSnapshotSetCurrent(vm, snap);
if (qemuSnapshotCreateWriteMetadata(vm, snap, driver, cfg) < 0)
return ret;
error:
- virDomainSnapshotObjListRemove(vm->snapshots, snap);
+ if (!tmpsnap)
+ virDomainSnapshotObjListRemove(vm->snapshots, snap);
return NULL;
}