VIR_FREE(job->current);
qemuMigrationParamsFree(job->migParams);
job->migParams = NULL;
+ job->apiFlags = 0;
}
void
job->asyncOwner = priv->job.asyncOwner;
job->phase = priv->job.phase;
VIR_STEAL_PTR(job->migParams, priv->job.migParams);
+ job->apiFlags = priv->job.apiFlags;
qemuDomainObjResetJob(priv);
qemuDomainObjResetAsyncJob(priv);
asyncDuration = now - priv->job.asyncStarted;
VIR_WARN("Cannot start job (%s, %s) for domain %s; "
- "current job is (%s, %s) owned by (%llu %s, %llu %s) "
+ "current job is (%s, %s) "
+ "owned by (%llu %s, %llu %s (flags=0x%lx)) "
"for (%llus, %llus)",
qemuDomainJobTypeToString(job),
qemuDomainAsyncJobTypeToString(asyncJob),
qemuDomainAsyncJobTypeToString(priv->job.asyncJob),
priv->job.owner, NULLSTR(priv->job.ownerAPI),
priv->job.asyncOwner, NULLSTR(priv->job.asyncOwnerAPI),
+ priv->job.apiFlags,
duration / 1000, asyncDuration / 1000);
if (nested || qemuDomainNestedJobAllowed(priv, job))
int qemuDomainObjBeginAsyncJob(virQEMUDriverPtr driver,
virDomainObjPtr obj,
qemuDomainAsyncJob asyncJob,
- virDomainJobOperation operation)
+ virDomainJobOperation operation,
+ unsigned long apiFlags)
{
qemuDomainObjPrivatePtr priv;
priv = obj->privateData;
priv->job.current->operation = operation;
+ priv->job.apiFlags = apiFlags;
return 0;
}
bool dumpCompleted; /* dump completed */
qemuMigrationParamsPtr migParams;
+ unsigned long apiFlags; /* flags passed to the API which started the async job */
};
typedef void (*qemuDomainCleanupCallback)(virQEMUDriverPtr driver,
int qemuDomainObjBeginAsyncJob(virQEMUDriverPtr driver,
virDomainObjPtr obj,
qemuDomainAsyncJob asyncJob,
- virDomainJobOperation operation)
+ virDomainJobOperation operation,
+ unsigned long apiFlags)
ATTRIBUTE_RETURN_CHECK;
int qemuDomainObjBeginNestedJob(virQEMUDriverPtr driver,
virDomainObjPtr obj,
if (vm->autostart &&
!virDomainObjIsActive(vm)) {
if (qemuProcessBeginJob(driver, vm,
- VIR_DOMAIN_JOB_OPERATION_START) < 0) {
+ VIR_DOMAIN_JOB_OPERATION_START, flags) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to start job on VM '%s': %s"),
vm->def->name, virGetLastErrorMessage());
virObjectRef(vm);
def = NULL;
- if (qemuProcessBeginJob(driver, vm, VIR_DOMAIN_JOB_OPERATION_START) < 0) {
+ if (qemuProcessBeginJob(driver, vm, VIR_DOMAIN_JOB_OPERATION_START,
+ flags) < 0) {
qemuDomainRemoveInactiveJob(driver, vm);
goto cleanup;
}
goto cleanup;
if (qemuDomainObjBeginAsyncJob(driver, vm, QEMU_ASYNC_JOB_SAVE,
- VIR_DOMAIN_JOB_OPERATION_SAVE) < 0)
+ VIR_DOMAIN_JOB_OPERATION_SAVE, flags) < 0)
goto cleanup;
if (!virDomainObjIsActive(vm)) {
if (qemuDomainObjBeginAsyncJob(driver, vm,
QEMU_ASYNC_JOB_DUMP,
- VIR_DOMAIN_JOB_OPERATION_DUMP) < 0)
+ VIR_DOMAIN_JOB_OPERATION_DUMP,
+ flags) < 0)
goto cleanup;
if (!virDomainObjIsActive(vm)) {
case VIR_DOMAIN_WATCHDOG_ACTION_DUMP:
if (qemuDomainObjBeginAsyncJob(driver, vm,
QEMU_ASYNC_JOB_DUMP,
- VIR_DOMAIN_JOB_OPERATION_DUMP) < 0) {
+ VIR_DOMAIN_JOB_OPERATION_DUMP,
+ flags) < 0) {
goto cleanup;
}
virObjectEventPtr event = NULL;
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
bool removeInactive = false;
+ unsigned long flags = VIR_DUMP_MEMORY_ONLY;
if (qemuDomainObjBeginAsyncJob(driver, vm, QEMU_ASYNC_JOB_DUMP,
- VIR_DOMAIN_JOB_OPERATION_DUMP) < 0)
+ VIR_DOMAIN_JOB_OPERATION_DUMP, flags) < 0)
goto cleanup;
if (!virDomainObjIsActive(vm)) {
switch (action) {
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
- if (doCoreDumpToAutoDumpPath(driver, vm, VIR_DUMP_MEMORY_ONLY) < 0)
+ if (doCoreDumpToAutoDumpPath(driver, vm, flags) < 0)
goto endjob;
ATTRIBUTE_FALLTHROUGH;
break;
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
- if (doCoreDumpToAutoDumpPath(driver, vm, VIR_DUMP_MEMORY_ONLY) < 0)
+ if (doCoreDumpToAutoDumpPath(driver, vm, flags) < 0)
goto endjob;
ATTRIBUTE_FALLTHROUGH;
priv->hookRun = true;
}
- if (qemuProcessBeginJob(driver, vm, VIR_DOMAIN_JOB_OPERATION_RESTORE) < 0)
+ if (qemuProcessBeginJob(driver, vm, VIR_DOMAIN_JOB_OPERATION_RESTORE,
+ flags) < 0)
goto cleanup;
ret = qemuDomainSaveImageStartVM(conn, driver, vm, &fd, data, path,
if (virDomainCreateWithFlagsEnsureACL(dom->conn, vm->def) < 0)
goto cleanup;
- if (qemuProcessBeginJob(driver, vm, VIR_DOMAIN_JOB_OPERATION_START) < 0)
+ if (qemuProcessBeginJob(driver, vm, VIR_DOMAIN_JOB_OPERATION_START,
+ flags) < 0)
goto cleanup;
if (virDomainObjIsActive(vm)) {
* 'savevm' blocks the monitor. External snapshot will then modify the
* job mask appropriately. */
if (qemuDomainObjBeginAsyncJob(driver, vm, QEMU_ASYNC_JOB_SNAPSHOT,
- VIR_DOMAIN_JOB_OPERATION_SNAPSHOT) < 0)
+ VIR_DOMAIN_JOB_OPERATION_SNAPSHOT, flags) < 0)
goto cleanup;
qemuDomainObjSetAsyncJobMask(vm, QEMU_JOB_NONE);
}
if (qemuProcessBeginJob(driver, vm,
- VIR_DOMAIN_JOB_OPERATION_SNAPSHOT_REVERT) < 0)
+ VIR_DOMAIN_JOB_OPERATION_SNAPSHOT_REVERT,
+ flags) < 0)
goto cleanup;
if (!(snap = qemuSnapObjFromSnapshot(vm, snapshot)))
static int
qemuMigrationJobStart(virQEMUDriverPtr driver,
virDomainObjPtr vm,
- qemuDomainAsyncJob job)
+ qemuDomainAsyncJob job,
+ unsigned long apiFlags)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
static void
qemuDomainAsyncJob asyncJob;
if ((flags & VIR_MIGRATE_CHANGE_PROTECTION)) {
- if (qemuMigrationJobStart(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
+ if (qemuMigrationJobStart(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
+ flags) < 0)
goto cleanup;
asyncJob = QEMU_ASYNC_JOB_MIGRATION_OUT;
} else {
!!(flags & VIR_MIGRATE_NON_SHARED_INC)) < 0)
goto cleanup;
- if (qemuMigrationJobStart(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN) < 0)
+ if (qemuMigrationJobStart(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN,
+ flags) < 0)
goto cleanup;
qemuMigrationJobSetPhase(driver, vm, QEMU_MIGRATION_PHASE_PREPARE);
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
qemuDomainObjPrivatePtr priv = vm->privateData;
- if (qemuMigrationJobStart(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
+ if (qemuMigrationJobStart(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
+ flags) < 0)
goto cleanup;
if (!virDomainObjIsActive(vm) && !(flags & VIR_MIGRATE_OFFLINE)) {
/* If we didn't start the job in the begin phase, start it now. */
if (!(flags & VIR_MIGRATE_CHANGE_PROTECTION)) {
- if (qemuMigrationJobStart(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
+ if (qemuMigrationJobStart(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
+ flags) < 0)
goto cleanup;
} else if (!qemuMigrationJobIsActive(vm, QEMU_ASYNC_JOB_MIGRATION_OUT)) {
goto cleanup;
static int
qemuMigrationJobStart(virQEMUDriverPtr driver,
virDomainObjPtr vm,
- qemuDomainAsyncJob job)
+ qemuDomainAsyncJob job,
+ unsigned long apiFlags)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
virDomainJobOperation op;
JOB_MASK(QEMU_JOB_MIGRATION_OP);
}
- if (qemuDomainObjBeginAsyncJob(driver, vm, job, op) < 0)
+ if (qemuDomainObjBeginAsyncJob(driver, vm, job, op, apiFlags) < 0)
return -1;
priv->job.current->statsType = QEMU_DOMAIN_JOB_STATS_TYPE_MIGRATION;
int
qemuProcessBeginJob(virQEMUDriverPtr driver,
virDomainObjPtr vm,
- virDomainJobOperation operation)
+ virDomainJobOperation operation,
+ unsigned long apiFlags)
{
if (qemuDomainObjBeginAsyncJob(driver, vm, QEMU_ASYNC_JOB_START,
- operation) < 0)
+ operation, apiFlags) < 0)
return -1;
qemuDomainObjSetAsyncJobMask(vm, QEMU_JOB_NONE);
int qemuProcessBeginJob(virQEMUDriverPtr driver,
virDomainObjPtr vm,
- virDomainJobOperation operation);
+ virDomainJobOperation operation,
+ unsigned long apiFlags);
void qemuProcessEndJob(virQEMUDriverPtr driver,
virDomainObjPtr vm);