If job queue is full or waiting for a job times out, the function
returns -2 so that it can be handled in a different way by callers.
The change is safe since all existing callers of
qemuDomainObjBeginNestedJob check the return value to be less than zero.
Signed-off-by: Jiri Denemark <jdenemar(a)redhat.com>
---
src/qemu/qemu_domain.c | 29 ++++++++++++++++++++---------
1 file changed, 20 insertions(+), 9 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index d4fb569..3df454f 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -1058,6 +1058,7 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr driver,
unsigned long long then;
bool nested = job == QEMU_JOB_ASYNC_NESTED;
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
+ int ret;
VIR_DEBUG("Starting %s: %s (async=%s vm=%p name=%s)",
job == QEMU_JOB_ASYNC ? "async job" : "job",
@@ -1134,21 +1135,25 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr driver,
qemuDomainAsyncJobTypeToString(priv->job.asyncJob),
priv->job.owner, priv->job.asyncOwner);
- if (errno == ETIMEDOUT)
+ ret = -1;
+ if (errno == ETIMEDOUT) {
virReportError(VIR_ERR_OPERATION_TIMEOUT,
"%s", _("cannot acquire state change lock"));
- else if (cfg->maxQueuedJobs &&
- priv->jobs_queued > cfg->maxQueuedJobs)
+ ret = -2;
+ } else if (cfg->maxQueuedJobs &&
+ priv->jobs_queued > cfg->maxQueuedJobs) {
virReportError(VIR_ERR_OPERATION_FAILED,
"%s", _("cannot acquire state change lock "
"due to max_queued limit"));
- else
+ ret = -2;
+ } else {
virReportSystemError(errno,
"%s", _("cannot acquire job mutex"));
+ }
priv->jobs_queued--;
virObjectUnref(obj);
virObjectUnref(cfg);
- return -1;
+ return ret;
}
/*
@@ -1164,16 +1169,22 @@ int qemuDomainObjBeginJob(virQEMUDriverPtr driver,
virDomainObjPtr obj,
enum qemuDomainJob job)
{
- return qemuDomainObjBeginJobInternal(driver, obj, job,
- QEMU_ASYNC_JOB_NONE);
+ if (qemuDomainObjBeginJobInternal(driver, obj, job,
+ QEMU_ASYNC_JOB_NONE) < 0)
+ return -1;
+ else
+ return 0;
}
int qemuDomainObjBeginAsyncJob(virQEMUDriverPtr driver,
virDomainObjPtr obj,
enum qemuDomainAsyncJob asyncJob)
{
- return qemuDomainObjBeginJobInternal(driver, obj, QEMU_JOB_ASYNC,
- asyncJob);
+ if (qemuDomainObjBeginJobInternal(driver, obj, QEMU_JOB_ASYNC,
+ asyncJob) < 0)
+ return -1;
+ else
+ return 0;
}
static int ATTRIBUTE_RETURN_CHECK
--
1.9.3