}
+static void
+qemuProcessAbortSnapshotDelete(virDomainObj *vm,
+ virDomainJobObj *job)
+{
+ size_t i;
+ qemuDomainObjPrivate *priv = vm->privateData;
+ qemuDomainJobPrivate *jobPriv = job->privateData;
+
+ if (!jobPriv->snapshotDelete)
+ return;
+
+ for (i = 0; i < vm->def->ndisks; i++) {
+ virDomainDiskDef *disk = vm->def->disks[i];
+ g_autoptr(qemuBlockJobData) diskJob = qemuBlockJobDiskGetJob(disk);
+
+ if (!diskJob)
+ continue;
+
+ if (diskJob->type != QEMU_BLOCKJOB_TYPE_COMMIT &&
+ diskJob->type != QEMU_BLOCKJOB_TYPE_ACTIVE_COMMIT) {
+ continue;
+ }
+
+ qemuBlockJobSyncBegin(diskJob);
+
+ qemuDomainObjEnterMonitor(vm);
+ ignore_value(qemuMonitorBlockJobCancel(priv->mon, diskJob->name, false));
+ qemuDomainObjExitMonitor(vm);
+
+ diskJob->state = QEMU_BLOCKJOB_STATE_ABORTING;
+
+ qemuBlockJobSyncEnd(vm, diskJob, VIR_ASYNC_JOB_NONE);
+ }
+}
+
+
static int
qemuProcessRecoverJob(virQEMUDriver *driver,
virDomainObj *vm,
vm->def->name);
}
}
+ qemuProcessAbortSnapshotDelete(vm, job);
break;
case VIR_ASYNC_JOB_START:
}
}
+ if (virDomainSnapshotIsExternal(snap) &&
+ qemuDomainHasBlockjob(vm, false)) {
+ virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
+ _("cannot delete external snapshots when there is another active block job"));
+ return -1;
+ }
+
if (virDomainSnapshotIsExternal(snap) &&
!(flags & VIR_DOMAIN_SNAPSHOT_DELETE_CHILDREN_ONLY)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
* running to get everything we need. */
delData = g_steal_pointer(&externalData);
externalData = qemuSnapshotDeleteExternalPrepare(vm, snap);
+ } else {
+ qemuDomainJobPrivate *jobPriv = vm->job->privateData;
+
+ /* If the VM is running we need to indicate that the async snapshot
+ * job is snapshot delete job. */
+ jobPriv->snapshotDelete = true;
+
+ qemuDomainSaveStatus(vm);
}
if (!externalData)