diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 69d9e6e6db..da1f57fef4 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -183,6 +183,12 @@ qemuDomainObjFreeJob(qemuDomainObjPrivatePtr priv) ignore_value(virCondDestroy(&priv->job.asyncCond)); } +static bool +qemuDomainTrackJob(enum qemuDomainJob job) +{ + return (QEMU_DOMAIN_TRACK_JOBS & JOB_MASK(job)) != 0; +} + static void *qemuDomainObjPrivateAlloc(void) { @@ -239,6 +245,7 @@ static int qemuDomainObjPrivateXMLFormat(virBufferPtr buf, void *data) { qemuDomainObjPrivatePtr priv = data; const char *monitorpath; + enum qemuDomainJob job; /* priv->monitor_chr is set only for qemu */ if (priv->monConfig) { @@ -284,6 +291,10 @@ static int qemuDomainObjPrivateXMLFormat(virBufferPtr buf, void *data) if (priv->lockState) virBufferAsprintf(buf, " %s\n", priv->lockState); + job = priv->job.active; + if (!qemuDomainTrackJob(job)) + priv->job.active = QEMU_JOB_NONE; + if (priv->job.active || priv->job.asyncJob) { virBufferAsprintf(buf, " job.active), @@ -295,6 +306,7 @@ static int qemuDomainObjPrivateXMLFormat(virBufferPtr buf, void *data) } virBufferAddLit(buf, "/>\n"); } + priv->job.active = job; if (priv->fakeReboot) virBufferAsprintf(buf, " \n"); @@ -766,7 +778,8 @@ retry: virDomainObjLock(obj); } - qemuDomainObjSaveJob(driver, obj); + if (qemuDomainTrackJob(job)) + qemuDomainObjSaveJob(driver, obj); return 0; @@ -862,15 +875,17 @@ int qemuDomainObjBeginAsyncJobWithDriver(struct qemud_driver *driver, int qemuDomainObjEndJob(struct qemud_driver *driver, virDomainObjPtr obj) { qemuDomainObjPrivatePtr priv = obj->privateData; + enum qemuDomainJob job = priv->job.active; priv->jobs_queued--; VIR_DEBUG("Stopping job: %s (async=%s)", - qemuDomainJobTypeToString(priv->job.active), + qemuDomainJobTypeToString(job), qemuDomainAsyncJobTypeToString(priv->job.asyncJob)); qemuDomainObjResetJob(priv); - qemuDomainObjSaveJob(driver, obj); + if (qemuDomainTrackJob(job)) + qemuDomainObjSaveJob(driver, obj); virCondSignal(&priv->job.cond); return virDomainObjUnref(obj); diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index adccfedb06..b3eecd38b4 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -53,6 +53,11 @@ JOB_MASK(QEMU_JOB_DESTROY) | \ JOB_MASK(QEMU_JOB_ABORT)) +/* Jobs which have to be tracked in domain state XML. */ +# define QEMU_DOMAIN_TRACK_JOBS \ + (JOB_MASK(QEMU_JOB_DESTROY) | \ + JOB_MASK(QEMU_JOB_ASYNC)) + /* Only 1 job is allowed at any time * A job includes *all* monitor commands, even those just querying * information, not merely actions */ diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 481b4f3db0..96f39e8800 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -2963,6 +2963,10 @@ qemuProcessRecoverJob(struct qemud_driver *driver, if (!virDomainObjIsActive(vm)) return -1; + /* In case any special handling is added for job type that has been ignored + * before, QEMU_DOMAIN_TRACK_JOBS (from qemu_domain.h) needs to be updated + * for the job to be properly tracked in domain state XML. + */ switch (job->active) { case QEMU_JOB_QUERY: /* harmless */