return rem.err;
}
-/*
- * The caller must hold a lock the vm.
+
+/**
+ * qemuDomainRemoveInactive:
+ *
+ * The caller must hold a lock to the vm.
*/
void
qemuDomainRemoveInactive(virQEMUDriverPtr driver,
virDomainObjPtr vm)
{
- bool haveJob = true;
char *snapDir;
virQEMUDriverConfigPtr cfg;
cfg = virQEMUDriverGetConfig(driver);
- if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0)
- haveJob = false;
-
/* Remove any snapshot metadata prior to removing the domain */
if (qemuDomainSnapshotDiscardAllMetadata(driver, vm) < 0) {
VIR_WARN("unable to remove all snapshots for domain %s",
*/
virObjectLock(vm);
virObjectUnref(cfg);
+ virObjectUnref(vm);
+}
+
+
+/**
+ * qemuDomainRemoveInactiveJob:
+ *
+ * Just like qemuDomainRemoveInactive but it tries to grab a
+ * QEMU_JOB_MODIFY first. Even though it doesn't succeed in
+ * grabbing the job the control carries with
+ * qemuDomainRemoveInactive call.
+ */
+void
+qemuDomainRemoveInactiveJob(virQEMUDriverPtr driver,
+ virDomainObjPtr vm)
+{
+ bool haveJob;
+
+ haveJob = qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) >= 0;
+
+ qemuDomainRemoveInactive(driver, vm);
if (haveJob)
qemuDomainObjEndJob(driver, vm);
-
- virObjectUnref(vm);
}
+
void
qemuDomainSetFakeReboot(virQEMUDriverPtr driver,
virDomainObjPtr vm,
void qemuDomainRemoveInactive(virQEMUDriverPtr driver,
virDomainObjPtr vm);
+void qemuDomainRemoveInactiveJob(virQEMUDriverPtr driver,
+ virDomainObjPtr vm);
+
void qemuDomainSetFakeReboot(virQEMUDriverPtr driver,
virDomainObjPtr vm,
bool value);
def = NULL;
if (qemuProcessBeginJob(driver, vm, VIR_DOMAIN_JOB_OPERATION_START) < 0) {
- qemuDomainRemoveInactive(driver, vm);
+ qemuDomainRemoveInactiveJob(driver, vm);
goto cleanup;
}
VIR_NETDEV_VPORT_PROFILE_OP_CREATE,
start_flags) < 0) {
virDomainAuditStart(vm, "booted", false);
- qemuProcessEndJob(driver, vm);
qemuDomainRemoveInactive(driver, vm);
+ qemuProcessEndJob(driver, vm);
goto cleanup;
}
ret = 0;
endjob:
- qemuDomainObjEndJob(driver, vm);
if (ret == 0)
qemuDomainRemoveInactive(driver, vm);
+ qemuDomainObjEndJob(driver, vm);
cleanup:
virDomainObjEndAPI(&vm);
}
qemuDomainObjEndAsyncJob(driver, vm);
if (ret == 0)
- qemuDomainRemoveInactive(driver, vm);
+ qemuDomainRemoveInactiveJob(driver, vm);
cleanup:
virObjectUnref(cookie);
qemuDomainObjEndAsyncJob(driver, vm);
if (ret == 0 && flags & VIR_DUMP_CRASH)
- qemuDomainRemoveInactive(driver, vm);
+ qemuDomainRemoveInactiveJob(driver, vm);
cleanup:
virDomainObjEndAPI(&vm);
endjob:
qemuDomainObjEndAsyncJob(driver, vm);
if (removeInactive)
- qemuDomainRemoveInactive(driver, vm);
+ qemuDomainRemoveInactiveJob(driver, vm);
cleanup:
virObjectUnref(cfg);
qemuDomainEventQueue(driver, event);
endjob:
- qemuDomainObjEndJob(driver, vm);
qemuDomainRemoveInactive(driver, vm);
+ qemuDomainObjEndJob(driver, vm);
}
VIR_FREE(xmlout);
virFileWrapperFdFree(wrapperFd);
if (vm && ret < 0)
- qemuDomainRemoveInactive(driver, vm);
+ qemuDomainRemoveInactiveJob(driver, vm);
virDomainObjEndAPI(&vm);
virNWFilterUnlockFilterUpdates();
return ret;
/* Brand new domain. Remove it */
VIR_INFO("Deleting domain '%s'", vm->def->name);
vm->persistent = 0;
- qemuDomainRemoveInactive(driver, vm);
+ qemuDomainRemoveInactiveJob(driver, vm);
}
goto cleanup;
}
*/
vm->persistent = 0;
if (!virDomainObjIsActive(vm))
- qemuDomainRemoveInactive(driver, vm);
+ qemuDomainRemoveInactiveJob(driver, vm);
ret = 0;
}
if (qemuDomainSnapshotRevertInactive(driver, vm, snap) < 0) {
- qemuProcessEndJob(driver, vm);
qemuDomainRemoveInactive(driver, vm);
+ qemuProcessEndJob(driver, vm);
goto cleanup;
}
if (config)
start_flags);
virDomainAuditStart(vm, "from-snapshot", rc >= 0);
if (rc < 0) {
- qemuProcessEndJob(driver, vm);
qemuDomainRemoveInactive(driver, vm);
+ qemuProcessEndJob(driver, vm);
goto cleanup;
}
detail = VIR_DOMAIN_EVENT_STARTED_FROM_SNAPSHOT;
if (qemuProcessAttach(conn, driver, vm, pid,
pidfile, monConfig, monJSON) < 0) {
monConfig = NULL;
- qemuDomainObjEndJob(driver, vm);
qemuDomainRemoveInactive(driver, vm);
+ qemuDomainObjEndJob(driver, vm);
goto cleanup;
}
virPortAllocatorRelease(driver->migrationPorts, priv->nbdPort);
priv->nbdPort = 0;
virDomainObjRemoveTransientDef(vm);
- qemuDomainRemoveInactive(driver, vm);
+ qemuDomainRemoveInactiveJob(driver, vm);
}
qemuMigrationParamsClear(&migParams);
virDomainObjEndAPI(&vm);
virDomainDeleteConfig(cfg->configDir, cfg->autostartDir, vm);
vm->persistent = 0;
}
- qemuDomainRemoveInactive(driver, vm);
+ qemuDomainRemoveInactiveJob(driver, vm);
}
cleanup:
virDomainDeleteConfig(cfg->configDir, cfg->autostartDir, vm);
vm->persistent = 0;
}
- qemuDomainRemoveInactive(driver, vm);
+ qemuDomainRemoveInactiveJob(driver, vm);
}
if (orig_err) {
}
if (!virDomainObjIsActive(vm))
- qemuDomainRemoveInactive(driver, vm);
+ qemuDomainRemoveInactiveJob(driver, vm);
cleanup:
virDomainObjEndAPI(&vm);
qemuMigrationJobFinish(driver, vm);
if (!virDomainObjIsActive(vm))
- qemuDomainRemoveInactive(driver, vm);
+ qemuDomainRemoveInactiveJob(driver, vm);
cleanup:
VIR_FREE(jobInfo);
VIR_DOMAIN_EVENT_STOPPED,
VIR_DOMAIN_EVENT_STOPPED_DESTROYED);
- qemuDomainObjEndJob(driver, dom);
-
qemuDomainRemoveInactive(driver, dom);
+ qemuDomainObjEndJob(driver, dom);
+
qemuDomainEventQueue(driver, event);
cleanup:
driver->inhibitCallback(true, driver->inhibitOpaque);
cleanup:
- if (jobStarted)
+ if (jobStarted) {
+ if (!virDomainObjIsActive(obj))
+ qemuDomainRemoveInactive(driver, obj);
qemuDomainObjEndJob(driver, obj);
- if (!virDomainObjIsActive(obj))
- qemuDomainRemoveInactive(driver, obj);
+ } else {
+ if (!virDomainObjIsActive(obj))
+ qemuDomainRemoveInactiveJob(driver, obj);
+ }
virDomainObjEndAPI(&obj);
virObjectUnref(conn);
virObjectUnref(cfg);
*/
qemuProcessStop(src->driver, obj, VIR_DOMAIN_SHUTOFF_FAILED,
QEMU_ASYNC_JOB_NONE, 0);
- qemuDomainRemoveInactive(src->driver, obj);
+ qemuDomainRemoveInactiveJob(src->driver, obj);
virDomainObjEndAPI(&obj);
virNWFilterUnlockFilterUpdates();