static int qemuDomainObjStart(virConnectPtr conn,
virQEMUDriverPtr driver,
virDomainObjPtr vm,
- unsigned int flags);
+ unsigned int flags,
+ qemuDomainAsyncJob asyncJob);
static int qemuDomainGetMaxVcpus(virDomainPtr dom);
virResetLastError();
if (vm->autostart &&
!virDomainObjIsActive(vm)) {
- if (qemuDomainObjBeginJob(data->driver, vm,
- QEMU_JOB_MODIFY) < 0) {
+ if (qemuProcessBeginJob(data->driver, vm) < 0) {
err = virGetLastError();
VIR_ERROR(_("Failed to start job on VM '%s': %s"),
vm->def->name,
goto cleanup;
}
- if (qemuDomainObjStart(data->conn, data->driver, vm, flags) < 0) {
+ if (qemuDomainObjStart(data->conn, data->driver, vm, flags,
+ QEMU_ASYNC_JOB_START) < 0) {
err = virGetLastError();
VIR_ERROR(_("Failed to autostart VM '%s': %s"),
vm->def->name,
err ? err->message : _("unknown error"));
}
- qemuDomainObjEndJob(data->driver, vm);
+ qemuProcessEndJob(data->driver, vm);
}
ret = 0;
virObjectRef(vm);
def = NULL;
- if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0) {
+ if (qemuProcessBeginJob(driver, vm) < 0) {
qemuDomainRemoveInactive(driver, vm);
goto cleanup;
}
- if (qemuProcessStart(conn, driver, vm, QEMU_ASYNC_JOB_NONE,
+ if (qemuProcessStart(conn, driver, vm, QEMU_ASYNC_JOB_START,
NULL, -1, NULL, NULL,
VIR_NETDEV_VPORT_PROFILE_OP_CREATE,
start_flags) < 0) {
virDomainAuditStart(vm, "booted", false);
- qemuDomainObjEndJob(driver, vm);
+ qemuProcessEndJob(driver, vm);
qemuDomainRemoveInactive(driver, vm);
goto cleanup;
}
if (dom)
dom->id = vm->def->id;
- qemuDomainObjEndJob(driver, vm);
+ qemuProcessEndJob(driver, vm);
cleanup:
virDomainDefFree(def);
int *fd,
const virQEMUSaveHeader *header,
const char *path,
- bool start_paused)
+ bool start_paused,
+ qemuDomainAsyncJob asyncJob)
{
int ret = -1;
virObjectEventPtr event;
}
/* Set the migration source and start it up. */
- ret = qemuProcessStart(conn, driver, vm, QEMU_ASYNC_JOB_NONE,
+ ret = qemuProcessStart(conn, driver, vm, asyncJob,
"stdio", *fd, path, NULL,
VIR_NETDEV_VPORT_PROFILE_OP_RESTORE,
VIR_QEMU_PROCESS_START_PAUSED);
if (header->was_running && !start_paused) {
if (qemuProcessStartCPUs(driver, vm, conn,
VIR_DOMAIN_RUNNING_RESTORED,
- QEMU_ASYNC_JOB_NONE) < 0) {
+ asyncJob) < 0) {
if (virGetLastError() == NULL)
virReportError(VIR_ERR_OPERATION_FAILED,
"%s", _("failed to resume domain"));
priv->hookRun = true;
}
- if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0)
+ if (qemuProcessBeginJob(driver, vm) < 0)
goto cleanup;
ret = qemuDomainSaveImageStartVM(conn, driver, vm, &fd, &header, path,
- false);
+ false, QEMU_ASYNC_JOB_START);
if (virFileWrapperFdClose(wrapperFd) < 0)
VIR_WARN("Failed to close %s", path);
- qemuDomainObjEndJob(driver, vm);
+ qemuProcessEndJob(driver, vm);
cleanup:
virDomainDefFree(def);
virDomainObjPtr vm,
const char *path,
bool start_paused,
- bool bypass_cache)
+ bool bypass_cache,
+ qemuDomainAsyncJob asyncJob)
{
virDomainDefPtr def = NULL;
qemuDomainObjPrivatePtr priv = vm->privateData;
def = NULL;
ret = qemuDomainSaveImageStartVM(conn, driver, vm, &fd, &header, path,
- start_paused);
+ start_paused, asyncJob);
if (virFileWrapperFdClose(wrapperFd) < 0)
VIR_WARN("Failed to close %s", path);
qemuDomainObjStart(virConnectPtr conn,
virQEMUDriverPtr driver,
virDomainObjPtr vm,
- unsigned int flags)
+ unsigned int flags,
+ qemuDomainAsyncJob asyncJob)
{
int ret = -1;
char *managed_save;
vm->hasManagedSave = false;
} else {
ret = qemuDomainObjRestore(conn, driver, vm, managed_save,
- start_paused, bypass_cache);
+ start_paused, bypass_cache, asyncJob);
if (ret == 0) {
if (unlink(managed_save) < 0)
}
}
- ret = qemuProcessStart(conn, driver, vm, QEMU_ASYNC_JOB_NONE,
+ ret = qemuProcessStart(conn, driver, vm, asyncJob,
NULL, -1, NULL, NULL,
VIR_NETDEV_VPORT_PROFILE_OP_CREATE, start_flags);
virDomainAuditStart(vm, "booted", ret >= 0);
if (virDomainCreateWithFlagsEnsureACL(dom->conn, vm->def) < 0)
goto cleanup;
- if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0)
+ if (qemuProcessBeginJob(driver, vm) < 0)
goto cleanup;
if (virDomainObjIsActive(vm)) {
goto endjob;
}
- if (qemuDomainObjStart(dom->conn, driver, vm, flags) < 0)
+ if (qemuDomainObjStart(dom->conn, driver, vm, flags,
+ QEMU_ASYNC_JOB_START) < 0)
goto endjob;
ret = 0;
endjob:
- qemuDomainObjEndJob(driver, vm);
+ qemuProcessEndJob(driver, vm);
cleanup:
virDomainObjEndAPI(&vm);
goto cleanup;
}
- if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0)
+ if (qemuProcessBeginJob(driver, vm) < 0)
goto cleanup;
if (!(snap = qemuSnapObjFromSnapshot(vm, snapshot)))
was_running = true;
if (qemuProcessStopCPUs(driver, vm,
VIR_DOMAIN_PAUSED_FROM_SNAPSHOT,
- QEMU_ASYNC_JOB_NONE) < 0)
+ QEMU_ASYNC_JOB_START) < 0)
goto endjob;
/* Create an event now in case the restore fails, so
* that user will be alerted that they are now paused.
goto endjob;
}
}
- qemuDomainObjEnterMonitor(driver, vm);
+
+ if (qemuDomainObjEnterMonitorAsync(driver, vm,
+ QEMU_ASYNC_JOB_START) < 0)
+ goto endjob;
rc = qemuMonitorLoadSnapshot(priv->mon, snap->def->name);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto endjob;
virDomainObjAssignDef(vm, config, false, NULL);
rc = qemuProcessStart(snapshot->domain->conn, driver, vm,
- QEMU_ASYNC_JOB_NONE, NULL, -1, NULL, snap,
+ QEMU_ASYNC_JOB_START, NULL, -1, NULL, snap,
VIR_NETDEV_VPORT_PROFILE_OP_CREATE,
VIR_QEMU_PROCESS_START_PAUSED);
virDomainAuditStart(vm, "from-snapshot", rc >= 0);
}
rc = qemuProcessStartCPUs(driver, vm, snapshot->domain->conn,
VIR_DOMAIN_RUNNING_FROM_SNAPSHOT,
- QEMU_ASYNC_JOB_NONE);
+ QEMU_ASYNC_JOB_START);
if (rc < 0)
goto endjob;
virObjectUnref(event);
}
if (qemuDomainSnapshotRevertInactive(driver, vm, snap) < 0) {
- qemuDomainObjEndJob(driver, vm);
+ qemuProcessEndJob(driver, vm);
qemuDomainRemoveInactive(driver, vm);
goto cleanup;
}
qemuDomainEventQueue(driver, event);
rc = qemuProcessStart(snapshot->domain->conn, driver, vm,
- QEMU_ASYNC_JOB_NONE, NULL, -1, NULL, NULL,
+ QEMU_ASYNC_JOB_START, NULL, -1, NULL, NULL,
VIR_NETDEV_VPORT_PROFILE_OP_CREATE,
start_flags);
virDomainAuditStart(vm, "from-snapshot", rc >= 0);
if (rc < 0) {
- qemuDomainObjEndJob(driver, vm);
+ qemuProcessEndJob(driver, vm);
qemuDomainRemoveInactive(driver, vm);
goto cleanup;
}
ret = 0;
endjob:
- qemuDomainObjEndJob(driver, vm);
+ qemuProcessEndJob(driver, vm);
cleanup:
if (ret == 0) {