qemuDomainSnapshotCreateSingleDiskActive(struct qemud_driver *driver,
virDomainObjPtr vm,
virDomainSnapshotDiskDefPtr snap,
- virDomainDiskDefPtr disk)
+ virDomainDiskDefPtr disk,
+ virDomainDiskDefPtr persistDisk)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
char *device = NULL;
char *source = NULL;
char *driverType = NULL;
+ char *persistSource = NULL;
+ char *persistDriverType = NULL;
int ret = -1;
int fd = -1;
char *origsrc = NULL;
if (virAsprintf(&device, "drive-%s", disk->info.alias) < 0 ||
!(source = strdup(snap->file)) ||
(STRNEQ_NULLABLE(disk->driverType, "qcow2") &&
- !(driverType = strdup("qcow2")))) {
+ !(driverType = strdup("qcow2"))) ||
+ (persistDisk &&
+ (!(persistSource = strdup(source)) ||
+ (STRNEQ_NULLABLE(persistDisk->driverType, "qcow2") &&
+ !(persistDriverType = strdup("qcow2")))))) {
virReportOOMError();
goto cleanup;
}
disk->driverType = driverType;
driverType = NULL;
}
-
- /* XXX Do we also need to update vm->newDef if there are pending
- * configuration changes awaiting the next boot? */
+ if (persistDisk) {
+ VIR_FREE(persistDisk->src);
+ persistDisk->src = persistSource;
+ persistSource = NULL;
+ if (persistDriverType) {
+ VIR_FREE(persistDisk->driverType);
+ persistDisk->driverType = persistDriverType;
+ persistDriverType = NULL;
+ }
+ }
cleanup:
if (origsrc) {
VIR_FREE(device);
VIR_FREE(source);
VIR_FREE(driverType);
+ VIR_FREE(persistSource);
+ VIR_FREE(persistDriverType);
return ret;
}
bool resume = false;
int ret = -1;
int i;
+ bool persist = false;
if (qemuDomainObjBeginJobWithDriver(driver, vm, QEMU_JOB_MODIFY) < 0)
return -1;
* SNAPSHOT_EXTERNAL with a valid file name and qcow2 format. */
qemuDomainObjEnterMonitorWithDriver(driver, vm);
for (i = 0; i < snap->def->ndisks; i++) {
+ virDomainDiskDefPtr persistDisk = NULL;
+
if (snap->def->disks[i].snapshot == VIR_DOMAIN_DISK_SNAPSHOT_NO)
continue;
+ if (vm->newDef) {
+ int indx = virDomainDiskIndexByName(vm->newDef,
+ vm->def->disks[i]->dst,
+ false);
+ if (indx >= 0) {
+ persistDisk = vm->newDef->disks[indx];
+ persist = true;
+ }
+ }
ret = qemuDomainSnapshotCreateSingleDiskActive(driver, vm,
&snap->def->disks[i],
- vm->def->disks[i]);
+ vm->def->disks[i],
+ persistDisk);
if (ret < 0)
break;
}
}
if (vm) {
- if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0)
+ if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0 ||
+ (persist &&
+ virDomainSaveConfig(driver->configDir, vm->newDef) < 0))
ret = -1;
if (qemuDomainObjEndJob(driver, vm) == 0) {
/* Only possible if a transient vm quit while our locks were down,