diff --git a/src/qemu/THREADS.txt b/src/qemu/THREADS.txt index 50a0cf9e5f..add2a35508 100644 --- a/src/qemu/THREADS.txt +++ b/src/qemu/THREADS.txt @@ -26,12 +26,20 @@ There are a number of locks on various objects * virDomainObjPtr Will be locked after calling any of the virDomainFindBy{ID,Name,UUID} - methods. + methods. However, preferred method is qemuDomObjFromDomain() that uses + virDomainFindByUUIDRef() which also increases the reference counter and + finds the domain in the domain list without blocking all other lookups. + When the domain is locked and the reference increased, the prefered way of + decrementing the reference counter and unlocking the domain is using the + qemuDomObjEndAPI() function. Lock must be held when changing/reading any variable in the virDomainObjPtr If the lock needs to be dropped & then re-acquired for a short period of time, the reference count must be incremented first using virDomainObjRef(). + There is no need to increase the reference count if qemuDomObjFromDomain() + was used for looking up the domain. In this case there is one reference + already added by that function. This lock must not be held for anything which sleeps/waits (i.e. monitor commands). @@ -109,7 +117,6 @@ To lock the virDomainObjPtr To acquire the normal job condition qemuDomainObjBeginJob() - - Increments ref count on virDomainObjPtr - Waits until the job is compatible with current async job or no async job is running - Waits for job.cond condition 'job.active != 0' using virDomainObjPtr @@ -122,14 +129,12 @@ To acquire the normal job condition qemuDomainObjEndJob() - Sets job.active to 0 - Signals on job.cond condition - - Decrements ref count on virDomainObjPtr To acquire the asynchronous job condition qemuDomainObjBeginAsyncJob() - - Increments ref count on virDomainObjPtr - Waits until no async job is running - Waits for job.cond condition 'job.active != 0' using virDomainObjPtr mutex @@ -141,7 +146,6 @@ To acquire the asynchronous job condition qemuDomainObjEndAsyncJob() - Sets job.asyncJob to 0 - Broadcasts on job.asyncCond condition - - Decrements ref count on virDomainObjPtr @@ -179,12 +183,10 @@ To acquire the QEMU monitor lock as part of an asynchronous job To keep a domain alive while waiting on a remote command qemuDomainObjEnterRemote() - - Increments ref count on virDomainObjPtr - Releases the virDomainObjPtr lock qemuDomainObjExitRemote() - Acquires the virDomainObjPtr lock - - Decrements ref count on virDomainObjPtr Design patterns @@ -195,18 +197,18 @@ Design patterns virDomainObjPtr obj; - obj = virDomainFindByUUID(driver->domains, dom->uuid); + obj = qemuDomObjFromDomain(dom); ...do work... - virDomainObjUnlock(obj); + qemuDomObjEndAPI(&obj); * Updating something directly to do with a virDomainObjPtr virDomainObjPtr obj; - obj = virDomainFindByUUID(driver->domains, dom->uuid); + obj = qemuDomObjFromDomain(dom); qemuDomainObjBeginJob(obj, QEMU_JOB_TYPE); @@ -214,18 +216,15 @@ Design patterns qemuDomainObjEndJob(obj); - virDomainObjUnlock(obj); - - + qemuDomObjEndAPI(&obj); * Invoking a monitor command on a virDomainObjPtr - virDomainObjPtr obj; qemuDomainObjPrivatePtr priv; - obj = virDomainFindByUUID(driver->domains, dom->uuid); + obj = qemuDomObjFromDomain(dom); qemuDomainObjBeginJob(obj, QEMU_JOB_TYPE); @@ -240,8 +239,7 @@ Design patterns ...do final work... qemuDomainObjEndJob(obj); - virDomainObjUnlock(obj); - + qemuDomObjEndAPI(&obj); * Running asynchronous job @@ -249,7 +247,7 @@ Design patterns virDomainObjPtr obj; qemuDomainObjPrivatePtr priv; - obj = virDomainFindByUUID(driver->domains, dom->uuid); + obj = qemuDomObjFromDomain(dom); qemuDomainObjBeginAsyncJob(obj, QEMU_ASYNC_JOB_TYPE); qemuDomainObjSetAsyncJobMask(obj, allowedJobs); @@ -281,7 +279,7 @@ Design patterns ...do final work... qemuDomainObjEndAsyncJob(obj); - virDomainObjUnlock(obj); + qemuDomObjEndAPI(&obj); * Coordinating with a remote server for migration @@ -289,7 +287,7 @@ Design patterns virDomainObjPtr obj; qemuDomainObjPrivatePtr priv; - obj = virDomainFindByUUID(driver->domains, dom->uuid); + obj = qemuDomObjFromDomain(dom); qemuDomainObjBeginAsyncJob(obj, QEMU_ASYNC_JOB_TYPE); @@ -309,4 +307,4 @@ Design patterns ...do final work... qemuDomainObjEndAsyncJob(obj); - virDomainObjUnlock(obj); + qemuDomObjEndAPI(&obj); diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index ee3b52067f..bd64409edc 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -1319,8 +1319,6 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr driver, priv->jobs_queued++; then = now + QEMU_JOB_WAIT_TIME; - virObjectRef(obj); - retry: if (cfg->maxQueuedJobs && priv->jobs_queued > cfg->maxQueuedJobs) { @@ -1399,7 +1397,6 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr driver, cleanup: priv->jobs_queued--; - virObjectUnref(obj); virObjectUnref(cfg); return ret; } @@ -1410,8 +1407,7 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr driver, * This must be called by anything that will change the VM state * in any way, or anything that will use the QEMU monitor. * - * Upon successful return, the object will have its ref count increased, - * successful calls must be followed by EndJob eventually + * Successful calls must be followed by EndJob eventually */ int qemuDomainObjBeginJob(virQEMUDriverPtr driver, virDomainObjPtr obj, @@ -1460,15 +1456,13 @@ qemuDomainObjBeginNestedJob(virQEMUDriverPtr driver, /* - * obj must be locked before calling + * obj must be locked and have a reference before calling * * To be called after completing the work associated with the * earlier qemuDomainBeginJob() call - * - * Returns true if @obj was still referenced, false if it was - * disposed of. */ -bool qemuDomainObjEndJob(virQEMUDriverPtr driver, virDomainObjPtr obj) +void +qemuDomainObjEndJob(virQEMUDriverPtr driver, virDomainObjPtr obj) { qemuDomainObjPrivatePtr priv = obj->privateData; qemuDomainJob job = priv->job.active; @@ -1484,11 +1478,9 @@ bool qemuDomainObjEndJob(virQEMUDriverPtr driver, virDomainObjPtr obj) if (qemuDomainTrackJob(job)) qemuDomainObjSaveJob(driver, obj); virCondSignal(&priv->job.cond); - - return virObjectUnref(obj); } -bool +void qemuDomainObjEndAsyncJob(virQEMUDriverPtr driver, virDomainObjPtr obj) { qemuDomainObjPrivatePtr priv = obj->privateData; @@ -1502,8 +1494,6 @@ qemuDomainObjEndAsyncJob(virQEMUDriverPtr driver, virDomainObjPtr obj) qemuDomainObjResetAsyncJob(priv); qemuDomainObjSaveJob(driver, obj); virCondBroadcast(&priv->job.asyncCond); - - return virObjectUnref(obj); } void @@ -1541,8 +1531,7 @@ qemuDomainObjEnterMonitorInternal(virQEMUDriverPtr driver, if (!virDomainObjIsActive(obj)) { virReportError(VIR_ERR_OPERATION_FAILED, "%s", _("domain is no longer running")); - /* Still referenced by the containing async job. */ - ignore_value(qemuDomainObjEndJob(driver, obj)); + qemuDomainObjEndJob(driver, obj); return -1; } } else if (priv->job.asyncOwner == virThreadSelfID()) { @@ -1681,7 +1670,6 @@ void qemuDomainObjEnterRemote(virDomainObjPtr obj) { VIR_DEBUG("Entering remote (vm=%p name=%s)", obj, obj->def->name); - virObjectRef(obj); virObjectUnlock(obj); } @@ -1690,7 +1678,6 @@ void qemuDomainObjExitRemote(virDomainObjPtr obj) virObjectLock(obj); VIR_DEBUG("Exited remote (vm=%p name=%s)", obj, obj->def->name); - virObjectUnref(obj); } @@ -2391,8 +2378,7 @@ qemuDomainSnapshotDiscardAllMetadata(virQEMUDriverPtr driver, } /* - * The caller must hold a lock the vm and there must - * be no remaining references to vm. + * The caller must hold a lock the vm. */ void qemuDomainRemoveInactive(virQEMUDriverPtr driver, @@ -2423,7 +2409,7 @@ qemuDomainRemoveInactive(virQEMUDriverPtr driver, virObjectUnref(cfg); if (haveJob) - ignore_value(qemuDomainObjEndJob(driver, vm)); + qemuDomainObjEndJob(driver, vm); } void @@ -2812,3 +2798,22 @@ qemuDomainAgentAvailable(qemuDomainObjPrivatePtr priv, } return true; } + +/* + * Finish working with a domain object in an API. This function + * clears whatever was left of a domain that was gathered using + * qemuDomObjFromDomain(). Currently that means only unlocking and + * decrementing the reference counter of that domain. And in order to + * make sure the caller does not access the domain, the pointer is + * cleared. + */ +void +qemuDomObjEndAPI(virDomainObjPtr *vm) +{ + if (!*vm) + return; + + virObjectUnlock(*vm); + virObjectUnref(*vm); + *vm = NULL; +} diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index d77d486ef7..6b52f03522 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -226,12 +226,10 @@ int qemuDomainObjBeginAsyncJob(virQEMUDriverPtr driver, qemuDomainAsyncJob asyncJob) ATTRIBUTE_RETURN_CHECK; -bool qemuDomainObjEndJob(virQEMUDriverPtr driver, - virDomainObjPtr obj) - ATTRIBUTE_RETURN_CHECK; -bool qemuDomainObjEndAsyncJob(virQEMUDriverPtr driver, - virDomainObjPtr obj) - ATTRIBUTE_RETURN_CHECK; +void qemuDomainObjEndJob(virQEMUDriverPtr driver, + virDomainObjPtr obj); +void qemuDomainObjEndAsyncJob(virQEMUDriverPtr driver, + virDomainObjPtr obj); void qemuDomainObjAbortAsyncJob(virDomainObjPtr obj); void qemuDomainObjSetJobPhase(virQEMUDriverPtr driver, virDomainObjPtr obj, @@ -413,4 +411,6 @@ int qemuDomainJobInfoToParams(qemuDomainJobInfoPtr jobInfo, ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4); +void qemuDomObjEndAPI(virDomainObjPtr *vm); + #endif /* __QEMU_DOMAIN_H__ */ diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index ebbb656328..673d8a68c4 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -206,11 +206,11 @@ struct qemuAutostartData { * qemuDomObjFromDomain: * @domain: Domain pointer that has to be looked up * - * This function looks up @domain and returns the appropriate - * virDomainObjPtr. + * This function looks up @domain and returns the appropriate virDomainObjPtr + * that has to be released by calling qemuDomObjEndAPI(). * - * Returns the domain object which is locked on success, NULL - * otherwise. + * Returns the domain object with incremented reference counter which is locked + * on success, NULL otherwise. */ static virDomainObjPtr qemuDomObjFromDomain(virDomainPtr domain) @@ -219,7 +219,7 @@ qemuDomObjFromDomain(virDomainPtr domain) virQEMUDriverPtr driver = domain->conn->privateData; char uuidstr[VIR_UUID_STRING_BUFLEN]; - vm = virDomainObjListFindByUUID(driver->domains, domain->uuid); + vm = virDomainObjListFindByUUIDRef(driver->domains, domain->uuid); if (!vm) { virUUIDFormat(domain->uuid, uuidstr); virReportError(VIR_ERR_NO_DOMAIN, @@ -231,9 +231,9 @@ qemuDomObjFromDomain(virDomainPtr domain) return vm; } -/* Looks up the domain object from snapshot and unlocks the driver. The - * returned domain object is locked and the caller is responsible for - * unlocking it */ +/* Looks up the domain object from snapshot and unlocks the + * driver. The returned domain object is locked and ref'd and the + * caller must call qemuDomObjEndAPI() on it. */ static virDomainObjPtr qemuDomObjFromSnapshot(virDomainSnapshotPtr snapshot) { @@ -279,6 +279,7 @@ qemuAutostartDomain(virDomainObjPtr vm, flags |= VIR_DOMAIN_START_BYPASS_CACHE; virObjectLock(vm); + virObjectRef(vm); virResetLastError(); if (vm->autostart && !virDomainObjIsActive(vm)) { @@ -298,14 +299,12 @@ qemuAutostartDomain(virDomainObjPtr vm, err ? err->message : _("unknown error")); } - if (!qemuDomainObjEndJob(data->driver, vm)) - vm = NULL; + qemuDomainObjEndJob(data->driver, vm); } ret = 0; cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(cfg); return ret; } @@ -1474,7 +1473,7 @@ static virDomainPtr qemuDomainLookupByUUID(virConnectPtr conn, virDomainObjPtr vm; virDomainPtr dom = NULL; - vm = virDomainObjListFindByUUID(driver->domains, uuid); + vm = virDomainObjListFindByUUIDRef(driver->domains, uuid); if (!vm) { char uuidstr[VIR_UUID_STRING_BUFLEN]; @@ -1491,8 +1490,7 @@ static virDomainPtr qemuDomainLookupByUUID(virConnectPtr conn, if (dom) dom->id = vm->def->id; cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return dom; } @@ -1518,8 +1516,7 @@ static virDomainPtr qemuDomainLookupByName(virConnectPtr conn, if (dom) dom->id = vm->def->id; cleanup: - if (vm) - virObjectUnlock(vm); + virObjectUnlock(vm); return dom; } @@ -1538,8 +1535,7 @@ static int qemuDomainIsActive(virDomainPtr dom) ret = virDomainObjIsActive(obj); cleanup: - if (obj) - virObjectUnlock(obj); + qemuDomObjEndAPI(&obj); return ret; } @@ -1557,8 +1553,7 @@ static int qemuDomainIsPersistent(virDomainPtr dom) ret = obj->persistent; cleanup: - if (obj) - virObjectUnlock(obj); + qemuDomObjEndAPI(&obj); return ret; } @@ -1576,8 +1571,7 @@ static int qemuDomainIsUpdated(virDomainPtr dom) ret = obj->updated; cleanup: - if (obj) - virObjectUnlock(obj); + qemuDomObjEndAPI(&obj); return ret; } @@ -1718,12 +1712,11 @@ static virDomainPtr qemuDomainCreateXML(virConnectPtr conn, VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, NULL))) goto cleanup; - + virObjectRef(vm); def = NULL; if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0) { qemuDomainRemoveInactive(driver, vm); - vm = NULL; goto cleanup; } @@ -1732,9 +1725,8 @@ static virDomainPtr qemuDomainCreateXML(virConnectPtr conn, VIR_NETDEV_VPORT_PROFILE_OP_CREATE, start_flags) < 0) { virDomainAuditStart(vm, "booted", false); - if (qemuDomainObjEndJob(driver, vm)) - qemuDomainRemoveInactive(driver, vm); - vm = NULL; + qemuDomainObjEndJob(driver, vm); + qemuDomainRemoveInactive(driver, vm); goto cleanup; } @@ -1757,13 +1749,11 @@ static virDomainPtr qemuDomainCreateXML(virConnectPtr conn, if (dom) dom->id = vm->def->id; - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: virDomainDefFree(def); - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); if (event) { qemuDomainEventQueue(driver, event); if (event2) @@ -1843,12 +1833,10 @@ static int qemuDomainSuspend(virDomainPtr dom) ret = 0; endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); if (event) qemuDomainEventQueue(driver, event); @@ -1906,12 +1894,10 @@ static int qemuDomainResume(virDomainPtr dom) ret = 0; endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); if (event) qemuDomainEventQueue(driver, event); virObjectUnref(cfg); @@ -1995,12 +1981,10 @@ static int qemuDomainShutdownFlags(virDomainPtr dom, unsigned int flags) } endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -2095,12 +2079,10 @@ qemuDomainReboot(virDomainPtr dom, unsigned int flags) } endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -2138,12 +2120,10 @@ qemuDomainReset(virDomainPtr dom, unsigned int flags) priv->fakeReboot = false; endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -2223,20 +2203,14 @@ qemuDomainDestroyFlags(virDomainPtr dom, VIR_DOMAIN_EVENT_STOPPED_DESTROYED); virDomainAuditStop(vm, "destroyed"); - if (!vm->persistent) { - if (qemuDomainObjEndJob(driver, vm)) - qemuDomainRemoveInactive(driver, vm); - vm = NULL; - } ret = 0; - endjob: - if (vm && !qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); + if (ret == 0 && !vm->persistent) + qemuDomainRemoveInactive(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); if (event) qemuDomainEventQueue(driver, event); return ret; @@ -2261,8 +2235,7 @@ static char *qemuDomainGetOSType(virDomainPtr dom) { ignore_value(VIR_STRDUP(type, vm->def->os.type)); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return type; } @@ -2282,8 +2255,7 @@ qemuDomainGetMaxMemory(virDomainPtr dom) ret = vm->def->mem.max_balloon; cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -2385,12 +2357,10 @@ static int qemuDomainSetMemoryFlags(virDomainPtr dom, unsigned long newmem, ret = 0; endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(caps); virObjectUnref(cfg); return ret; @@ -2465,12 +2435,10 @@ static int qemuDomainSetMemoryStatsPeriod(virDomainPtr dom, int period, ret = 0; endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(caps); virObjectUnref(cfg); return ret; @@ -2513,12 +2481,10 @@ static int qemuDomainInjectNMI(virDomainPtr domain, unsigned int flags) qemuDomainObjExitMonitor(driver, vm); endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -2577,12 +2543,10 @@ static int qemuDomainSendKey(virDomainPtr domain, qemuDomainObjExitMonitor(driver, vm); endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -2633,10 +2597,7 @@ static int qemuDomainGetInfo(virDomainPtr dom, err = qemuMonitorGetBalloonInfo(priv->mon, &balloon); qemuDomainObjExitMonitor(driver, vm); } - if (!qemuDomainObjEndJob(driver, vm)) { - vm = NULL; - goto cleanup; - } + qemuDomainObjEndJob(driver, vm); if (err < 0) { /* We couldn't get current memory allocation but that's not @@ -2661,8 +2622,7 @@ static int qemuDomainGetInfo(virDomainPtr dom, ret = 0; cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -2687,8 +2647,7 @@ qemuDomainGetState(virDomainPtr dom, ret = 0; cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -2738,8 +2697,7 @@ qemuDomainGetControlInfo(virDomainPtr dom, ret = 0; cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -3234,37 +3192,28 @@ qemuDomainSaveInternal(virQEMUDriverPtr driver, virDomainPtr dom, event = virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED, VIR_DOMAIN_EVENT_STOPPED_SAVED); - if (!vm->persistent) { - if (qemuDomainObjEndAsyncJob(driver, vm) > 0) - qemuDomainRemoveInactive(driver, vm); - vm = NULL; - } - endjob: - if (vm) { - if (ret != 0) { - if (was_running && virDomainObjIsActive(vm)) { - rc = qemuProcessStartCPUs(driver, vm, dom->conn, - VIR_DOMAIN_RUNNING_SAVE_CANCELED, - QEMU_ASYNC_JOB_SAVE); - if (rc < 0) { - VIR_WARN("Unable to resume guest CPUs after save failure"); - event = virDomainEventLifecycleNewFromObj(vm, - VIR_DOMAIN_EVENT_SUSPENDED, - VIR_DOMAIN_EVENT_SUSPENDED_API_ERROR); - } + qemuDomainObjEndAsyncJob(driver, vm); + if (ret != 0) { + if (was_running && virDomainObjIsActive(vm)) { + rc = qemuProcessStartCPUs(driver, vm, dom->conn, + VIR_DOMAIN_RUNNING_SAVE_CANCELED, + QEMU_ASYNC_JOB_SAVE); + if (rc < 0) { + VIR_WARN("Unable to resume guest CPUs after save failure"); + event = virDomainEventLifecycleNewFromObj(vm, + VIR_DOMAIN_EVENT_SUSPENDED, + VIR_DOMAIN_EVENT_SUSPENDED_API_ERROR); } } - if (qemuDomainObjEndAsyncJob(driver, vm) == 0) - vm = NULL; + } else if (!vm->persistent) { + qemuDomainRemoveInactive(driver, vm); } cleanup: VIR_FREE(xml); if (event) qemuDomainEventQueue(driver, event); - if (vm) - virObjectUnlock(vm); virObjectUnref(caps); return ret; } @@ -3330,11 +3279,9 @@ qemuDomainSaveFlags(virDomainPtr dom, const char *path, const char *dxml, ret = qemuDomainSaveInternal(driver, dom, vm, path, compressed, dxml, flags); - vm = NULL; cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(cfg); return ret; } @@ -3413,15 +3360,13 @@ qemuDomainManagedSave(virDomainPtr dom, unsigned int flags) VIR_INFO("Saving state of domain '%s' to '%s'", vm->def->name, name); - if ((ret = qemuDomainSaveInternal(driver, dom, vm, name, compressed, - NULL, flags)) == 0) + ret = qemuDomainSaveInternal(driver, dom, vm, name, + compressed, NULL, flags); + if (ret == 0) vm->hasManagedSave = true; - vm = NULL; - cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); VIR_FREE(name); virObjectUnref(cfg); @@ -3468,7 +3413,7 @@ qemuDomainHasManagedSaveImage(virDomainPtr dom, unsigned int flags) ret = vm->hasManagedSave; cleanup: - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -3503,7 +3448,7 @@ qemuDomainManagedSaveRemove(virDomainPtr dom, unsigned int flags) cleanup: VIR_FREE(name); - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -3762,16 +3707,12 @@ qemuDomainCoreDumpWithFormat(virDomainPtr dom, } } - if (qemuDomainObjEndAsyncJob(driver, vm) == 0) { - vm = NULL; - } else if ((ret == 0) && (flags & VIR_DUMP_CRASH) && !vm->persistent) { + qemuDomainObjEndAsyncJob(driver, vm); + if (ret == 0 && flags & VIR_DUMP_CRASH && !vm->persistent) qemuDomainRemoveInactive(driver, vm); - vm = NULL; - } cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); if (event) qemuDomainEventQueue(driver, event); return ret; @@ -3870,12 +3811,10 @@ qemuDomainScreenshot(virDomainPtr dom, unlink(tmp); VIR_FREE(tmp); - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(cfg); return ret; } @@ -3934,10 +3873,7 @@ static void processWatchdogEvent(virQEMUDriverPtr driver, virDomainObjPtr vm, in } endjob: - /* Safe to ignore value since ref count was incremented in - * qemuProcessHandleWatchdog(). - */ - ignore_value(qemuDomainObjEndAsyncJob(driver, vm)); + qemuDomainObjEndAsyncJob(driver, vm); cleanup: virObjectUnref(cfg); @@ -3984,10 +3920,7 @@ doCoreDumpToAutoDumpPath(virQEMUDriverPtr driver, "%s", _("Dump failed")); endjob: - /* Safe to ignore value since ref count was incremented in - * qemuProcessHandleGuestPanic(). - */ - ignore_value(qemuDomainObjEndAsyncJob(driver, vm)); + qemuDomainObjEndAsyncJob(driver, vm); cleanup: VIR_FREE(dumpfile); @@ -4117,10 +4050,7 @@ processDeviceDeletedEvent(virQEMUDriverPtr driver, devAlias); endjob: - /* We had an extra reference to vm before starting a new job so ending the - * job is guaranteed not to remove the last reference. - */ - ignore_value(qemuDomainObjEndJob(driver, vm)); + qemuDomainObjEndJob(driver, vm); cleanup: VIR_FREE(devAlias); @@ -4307,10 +4237,7 @@ processNicRxFilterChangedEvent(virQEMUDriverPtr driver, } endjob: - /* We had an extra reference to vm before starting a new job so ending the - * job is guaranteed not to remove the last reference. - */ - ignore_value(qemuDomainObjEndJob(driver, vm)); + qemuDomainObjEndJob(driver, vm); cleanup: virNetDevRxFilterFree(hostFilter); @@ -4368,10 +4295,7 @@ processSerialChangedEvent(virQEMUDriverPtr driver, "channel %s", vm->def->name, devAlias); endjob: - /* We had an extra reference to vm before starting a new job so ending the - * job is guaranteed not to remove the last reference. - */ - ignore_value(qemuDomainObjEndJob(driver, vm)); + qemuDomainObjEndJob(driver, vm); cleanup: VIR_FREE(devAlias); @@ -4410,8 +4334,7 @@ static void qemuProcessEventHandler(void *data, void *opaque) break; } - if (virObjectUnref(vm)) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); VIR_FREE(processEvent); } @@ -4784,12 +4707,10 @@ qemuDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, virFreeError(err); } - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(caps); VIR_FREE(cpuinfo); VIR_FREE(mem_mask); @@ -4985,8 +4906,7 @@ qemuDomainPinVcpuFlags(virDomainPtr dom, cleanup: if (cgroup_vcpu) virCgroupFree(&cgroup_vcpu); - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); if (event) qemuDomainEventQueue(driver, event); VIR_FREE(str); @@ -5087,8 +5007,7 @@ qemuDomainGetVcpuPinInfo(virDomainPtr dom, ret = ncpumaps; cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(caps); return ret; } @@ -5266,8 +5185,7 @@ qemuDomainPinEmulator(virDomainPtr dom, VIR_FREE(str); virBitmapFree(pcpumap); virObjectUnref(caps); - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(cfg); return ret; } @@ -5340,8 +5258,7 @@ qemuDomainGetEmulatorPinInfo(virDomainPtr dom, ret = 1; cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(caps); return ret; } @@ -5372,8 +5289,7 @@ qemuDomainGetVcpus(virDomainPtr dom, ret = qemuDomainHelperGetVcpus(vm, info, maxinfo, cpumaps, maplen); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -5439,8 +5355,7 @@ qemuDomainGetVcpusFlags(virDomainPtr dom, unsigned int flags) qemuDomainObjExitAgent(vm); endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); if (ncpuinfo < 0) goto cleanup; @@ -5465,8 +5380,7 @@ qemuDomainGetVcpusFlags(virDomainPtr dom, unsigned int flags) cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(caps); VIR_FREE(cpuinfo); return ret; @@ -5526,8 +5440,7 @@ static int qemuDomainGetSecurityLabel(virDomainPtr dom, virSecurityLabelPtr secl ret = 0; cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -5592,8 +5505,7 @@ static int qemuDomainGetSecurityLabelList(virDomainPtr dom, } cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -6030,6 +5942,7 @@ qemuDomainRestoreFlags(virConnectPtr conn, VIR_DOMAIN_OBJ_LIST_ADD_CHECK_LIVE, NULL))) goto cleanup; + virObjectRef(vm); def = NULL; if (flags & VIR_DOMAIN_SAVE_RUNNING) @@ -6050,12 +5963,9 @@ qemuDomainRestoreFlags(virConnectPtr conn, if (virFileWrapperFdClose(wrapperFd) < 0) VIR_WARN("Failed to close %s", path); - if (!qemuDomainObjEndJob(driver, vm)) { - vm = NULL; - } else if (ret < 0 && !vm->persistent) { + qemuDomainObjEndJob(driver, vm); + if (ret < 0 && !vm->persistent) qemuDomainRemoveInactive(driver, vm); - vm = NULL; - } cleanup: virDomainDefFree(def); @@ -6063,8 +5973,7 @@ qemuDomainRestoreFlags(virConnectPtr conn, VIR_FREE(xml); VIR_FREE(xmlout); virFileWrapperFdFree(wrapperFd); - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virNWFilterUnlockFilterUpdates(); return ret; } @@ -6313,10 +6222,7 @@ static char *qemuDomainGetXMLDesc(virDomainPtr dom, qemuDomainObjExitMonitor(driver, vm); endjob: - if (!qemuDomainObjEndJob(driver, vm)) { - vm = NULL; - goto cleanup; - } + qemuDomainObjEndJob(driver, vm); if (err < 0) goto cleanup; if (err > 0) @@ -6331,8 +6237,7 @@ static char *qemuDomainGetXMLDesc(virDomainPtr dom, ret = qemuDomainFormatXML(driver, vm, flags); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -6727,12 +6632,10 @@ qemuDomainCreateWithFlags(virDomainPtr dom, unsigned int flags) ret = 0; endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virNWFilterUnlockFilterUpdates(); return ret; } @@ -6785,6 +6688,7 @@ static virDomainPtr qemuDomainDefineXML(virConnectPtr conn, const char *xml) 0, &oldDef))) goto cleanup; + virObjectRef(vm); def = NULL; if (virDomainHasDiskMirror(vm)) { virReportError(VIR_ERR_BLOCK_COPY_ACTIVE, "%s", @@ -6809,7 +6713,6 @@ static virDomainPtr qemuDomainDefineXML(virConnectPtr conn, const char *xml) /* Brand new domain. Remove it */ VIR_INFO("Deleting domain '%s'", vm->def->name); qemuDomainRemoveInactive(driver, vm); - vm = NULL; } goto cleanup; } @@ -6827,8 +6730,7 @@ static virDomainPtr qemuDomainDefineXML(virConnectPtr conn, const char *xml) cleanup: virDomainDefFree(oldDef); virDomainDefFree(def); - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); if (event) qemuDomainEventQueue(driver, event); virObjectUnref(qemuCaps); @@ -6934,15 +6836,13 @@ qemuDomainUndefineFlags(virDomainPtr dom, vm->persistent = 0; } else { qemuDomainRemoveInactive(driver, vm); - vm = NULL; } ret = 0; cleanup: VIR_FREE(name); - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); if (event) qemuDomainEventQueue(driver, event); virObjectUnref(cfg); @@ -7719,8 +7619,7 @@ static int qemuDomainAttachDeviceFlags(virDomainPtr dom, const char *xml, } endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: virObjectUnref(qemuCaps); @@ -7728,8 +7627,7 @@ static int qemuDomainAttachDeviceFlags(virDomainPtr dom, const char *xml, if (dev != dev_copy) virDomainDeviceDefFree(dev_copy); virDomainDeviceDefFree(dev); - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(caps); virObjectUnref(cfg); virNWFilterUnlockFilterUpdates(); @@ -7868,8 +7766,7 @@ static int qemuDomainUpdateDeviceFlags(virDomainPtr dom, } endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: virObjectUnref(qemuCaps); @@ -7877,8 +7774,7 @@ static int qemuDomainUpdateDeviceFlags(virDomainPtr dom, if (dev != dev_copy) virDomainDeviceDefFree(dev_copy); virDomainDeviceDefFree(dev); - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(caps); virObjectUnref(cfg); virNWFilterUnlockFilterUpdates(); @@ -8010,8 +7906,7 @@ static int qemuDomainDetachDeviceFlags(virDomainPtr dom, const char *xml, } endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: virObjectUnref(qemuCaps); @@ -8019,8 +7914,7 @@ static int qemuDomainDetachDeviceFlags(virDomainPtr dom, const char *xml, if (dev != dev_copy) virDomainDeviceDefFree(dev_copy); virDomainDeviceDefFree(dev); - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(caps); virObjectUnref(cfg); return ret; @@ -8048,8 +7942,7 @@ static int qemuDomainGetAutostart(virDomainPtr dom, ret = 0; cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -8114,8 +8007,7 @@ static int qemuDomainSetAutostart(virDomainPtr dom, cleanup: VIR_FREE(configFile); VIR_FREE(autostartLink); - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(cfg); return ret; } @@ -8169,8 +8061,7 @@ static char *qemuDomainGetSchedulerType(virDomainPtr dom, ignore_value(VIR_STRDUP(ret, "posix")); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(cfg); return ret; } @@ -8554,12 +8445,10 @@ qemuDomainSetBlkioParameters(virDomainPtr dom, } endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(caps); virObjectUnref(cfg); return ret; @@ -8972,8 +8861,7 @@ qemuDomainGetBlkioParameters(virDomainPtr dom, ret = 0; cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(caps); virObjectUnref(cfg); return ret; @@ -9117,7 +9005,7 @@ qemuDomainSetMemoryParameters(virDomainPtr dom, ret = 0; cleanup: - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(caps); virObjectUnref(cfg); return ret; @@ -9270,8 +9158,7 @@ qemuDomainGetMemoryParameters(virDomainPtr dom, ret = 0; cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(caps); virObjectUnref(cfg); return ret; @@ -9450,13 +9337,11 @@ qemuDomainSetNumaParameters(virDomainPtr dom, ret = 0; endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: virBitmapFree(nodeset); - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(caps); virObjectUnref(cfg); return ret; @@ -9560,8 +9445,7 @@ qemuDomainGetNumaParameters(virDomainPtr dom, cleanup: VIR_FREE(nodeset); - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(caps); return ret; } @@ -9848,8 +9732,7 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr dom, cleanup: virDomainDefFree(vmdef); - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); if (eventNparams) virTypedParamsFree(eventParams, eventNparams); virObjectUnref(caps); @@ -10086,8 +9969,7 @@ qemuDomainGetSchedulerParametersFlags(virDomainPtr dom, ret = 0; cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(caps); virObjectUnref(cfg); return ret; @@ -10185,13 +10067,11 @@ qemuDomainBlockResize(virDomainPtr dom, ret = 0; endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: VIR_FREE(device); - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -10262,12 +10142,10 @@ qemuDomainBlockStats(virDomainPtr dom, qemuDomainObjExitMonitor(driver, vm); endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -10437,12 +10315,10 @@ qemuDomainBlockStatsFlags(virDomainPtr dom, *nparams = tmp; endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -10483,8 +10359,7 @@ qemuDomainInterfaceStats(virDomainPtr dom, _("invalid path, '%s' is not a known interface"), path); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -10668,14 +10543,12 @@ qemuDomainSetInterfaceParameters(virDomainPtr dom, ret = 0; endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: virNetDevBandwidthFree(bandwidth); virNetDevBandwidthFree(newBandwidth); - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(caps); virObjectUnref(cfg); return ret; @@ -10795,8 +10668,7 @@ qemuDomainGetInterfaceParameters(virDomainPtr dom, ret = 0; cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(caps); return ret; } @@ -10845,12 +10717,10 @@ qemuDomainMemoryStats(virDomainPtr dom, } } - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -10907,8 +10777,7 @@ qemuDomainBlockPeek(virDomainPtr dom, cleanup: VIR_FORCE_CLOSE(fd); - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -10988,16 +10857,14 @@ qemuDomainMemoryPeek(virDomainPtr dom, ret = 0; endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: VIR_FORCE_CLOSE(fd); if (tmp) unlink(tmp); VIR_FREE(tmp); - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(cfg); return ret; } @@ -11225,8 +11092,7 @@ qemuDomainGetBlockInfo(virDomainPtr dom, } endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: /* If we failed to get data from a domain because it's inactive and * it's not a persistent domain, then force failure. @@ -11236,8 +11102,7 @@ qemuDomainGetBlockInfo(virDomainPtr dom, _("domain is not running")); ret = -1; } - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(cfg); return ret; } @@ -11478,7 +11343,7 @@ qemuDomainMigratePerform(virDomainPtr dom, goto cleanup; if (virDomainMigratePerformEnsureACL(dom->conn, vm->def) < 0) { - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); goto cleanup; } @@ -11532,6 +11397,7 @@ qemuDomainMigrateFinish2(virConnectPtr dconn, goto cleanup; } + virObjectRef(vm); /* Do not use cookies in v2 protocol, since the cookie * length was not sufficiently large, causing failures * migrating between old & new libvirtd @@ -11566,7 +11432,7 @@ qemuDomainMigrateBegin3(virDomainPtr domain, return NULL; if (virDomainMigrateBegin3EnsureACL(domain->conn, vm->def) < 0) { - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return NULL; } @@ -11602,7 +11468,7 @@ qemuDomainMigrateBegin3Params(virDomainPtr domain, return NULL; if (virDomainMigrateBegin3ParamsEnsureACL(domain->conn, vm->def) < 0) { - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return NULL; } @@ -11846,7 +11712,7 @@ qemuDomainMigratePerform3(virDomainPtr dom, return -1; if (virDomainMigratePerform3EnsureACL(dom->conn, vm->def) < 0) { - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return -1; } @@ -11905,7 +11771,7 @@ qemuDomainMigratePerform3Params(virDomainPtr dom, return -1; if (virDomainMigratePerform3ParamsEnsureACL(dom->conn, vm->def) < 0) { - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return -1; } @@ -11946,6 +11812,8 @@ qemuDomainMigrateFinish3(virConnectPtr dconn, return NULL; } + virObjectRef(vm); + return qemuMigrationFinish(driver, dconn, vm, cookiein, cookieinlen, cookieout, cookieoutlen, @@ -11989,6 +11857,8 @@ qemuDomainMigrateFinish3Params(virConnectPtr dconn, return NULL; } + virObjectRef(vm); + return qemuMigrationFinish(driver, dconn, vm, cookiein, cookieinlen, cookieout, cookieoutlen, @@ -12011,7 +11881,7 @@ qemuDomainMigrateConfirm3(virDomainPtr domain, return -1; if (virDomainMigrateConfirm3EnsureACL(domain->conn, vm->def) < 0) { - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return -1; } @@ -12039,7 +11909,7 @@ qemuDomainMigrateConfirm3Params(virDomainPtr domain, return -1; if (virDomainMigrateConfirm3ParamsEnsureACL(domain->conn, vm->def) < 0) { - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return -1; } @@ -12342,8 +12212,7 @@ static int qemuDomainGetJobInfo(virDomainPtr dom, ret = 0; cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -12409,8 +12278,7 @@ qemuDomainGetJobStats(virDomainPtr dom, ret = 0; cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -12457,12 +12325,10 @@ static int qemuDomainAbortJob(virDomainPtr dom) qemuDomainObjExitMonitor(driver, vm); endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -12502,12 +12368,10 @@ qemuDomainMigrateSetMaxDowntime(virDomainPtr dom, qemuDomainObjExitMonitor(driver, vm); endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -12557,12 +12421,10 @@ qemuDomainMigrateGetCompressionCache(virDomainPtr dom, qemuDomainObjExitMonitor(driver, vm); endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -12613,12 +12475,10 @@ qemuDomainMigrateSetCompressionCache(virDomainPtr dom, qemuDomainObjExitMonitor(driver, vm); endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -12668,16 +12528,14 @@ qemuDomainMigrateSetMaxSpeed(virDomainPtr dom, priv->migMaxBandwidth = bandwidth; endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); } else { priv->migMaxBandwidth = bandwidth; ret = 0; } cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -12704,8 +12562,7 @@ qemuDomainMigrateGetMaxSpeed(virDomainPtr dom, ret = 0; cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -14168,12 +14025,10 @@ qemuDomainSnapshotCreateXML(virDomainPtr domain, virDomainSnapshotObjListRemove(vm->snapshots, snap); } - if (!qemuDomainObjEndAsyncJob(driver, vm)) - vm = NULL; + qemuDomainObjEndAsyncJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virDomainSnapshotDefFree(def); VIR_FREE(xml); virObjectUnref(caps); @@ -14204,7 +14059,7 @@ qemuDomainSnapshotListNames(virDomainPtr domain, flags); cleanup: - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return n; } @@ -14228,7 +14083,7 @@ qemuDomainSnapshotNum(virDomainPtr domain, n = virDomainSnapshotObjListNum(vm->snapshots, NULL, flags); cleanup: - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return n; } @@ -14253,7 +14108,7 @@ qemuDomainListAllSnapshots(virDomainPtr domain, n = virDomainListSnapshots(vm->snapshots, NULL, domain, snaps, flags); cleanup: - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return n; } @@ -14284,7 +14139,7 @@ qemuDomainSnapshotListChildrenNames(virDomainSnapshotPtr snapshot, flags); cleanup: - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return n; } @@ -14312,7 +14167,7 @@ qemuDomainSnapshotNumChildren(virDomainSnapshotPtr snapshot, n = virDomainSnapshotObjListNum(vm->snapshots, snap, flags); cleanup: - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return n; } @@ -14342,7 +14197,7 @@ qemuDomainSnapshotListAllChildren(virDomainSnapshotPtr snapshot, flags); cleanup: - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return n; } @@ -14370,7 +14225,7 @@ qemuDomainSnapshotLookupByName(virDomainPtr domain, snapshot = virGetDomainSnapshot(domain, snap->def->name); cleanup: - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return snapshot; } @@ -14393,7 +14248,7 @@ qemuDomainHasCurrentSnapshot(virDomainPtr domain, ret = (vm->current_snapshot != NULL); cleanup: - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -14427,7 +14282,7 @@ qemuDomainSnapshotGetParent(virDomainSnapshotPtr snapshot, parent = virGetDomainSnapshot(snapshot->domain, snap->def->parent); cleanup: - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return parent; } @@ -14456,7 +14311,7 @@ qemuDomainSnapshotCurrent(virDomainPtr domain, snapshot = virGetDomainSnapshot(domain, vm->current_snapshot->def->name); cleanup: - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return snapshot; } @@ -14486,7 +14341,7 @@ qemuDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snapshot, xml = virDomainSnapshotDefFormat(uuidstr, snap->def, flags, 0); cleanup: - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return xml; } @@ -14514,7 +14369,7 @@ qemuDomainSnapshotIsCurrent(virDomainSnapshotPtr snapshot, STREQ(snapshot->name, vm->current_snapshot->def->name)); cleanup: - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -14544,7 +14399,7 @@ qemuDomainSnapshotHasMetadata(virDomainSnapshotPtr snapshot, ret = 1; cleanup: - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -14833,9 +14688,8 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, if (qemuDomainSnapshotRevertInactive(driver, vm, snap) < 0) { if (!vm->persistent) { - if (qemuDomainObjEndJob(driver, vm)) - qemuDomainRemoveInactive(driver, vm); - vm = NULL; + qemuDomainObjEndJob(driver, vm); + qemuDomainRemoveInactive(driver, vm); goto cleanup; } goto endjob; @@ -14860,9 +14714,8 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, virDomainAuditStart(vm, "from-snapshot", rc >= 0); if (rc < 0) { if (!vm->persistent) { - if (qemuDomainObjEndJob(driver, vm)) - qemuDomainRemoveInactive(driver, vm); - vm = NULL; + qemuDomainObjEndJob(driver, vm); + qemuDomainRemoveInactive(driver, vm); goto cleanup; } goto endjob; @@ -14899,11 +14752,10 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, ret = 0; endjob: - if (vm && !qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm && ret == 0) { + if (ret == 0) { if (qemuDomainSnapshotWriteMetadata(vm, snap, cfg->snapshotDir) < 0) ret = -1; @@ -14917,8 +14769,7 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, if (event2) qemuDomainEventQueue(driver, event2); } - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(caps); virObjectUnref(cfg); virNWFilterUnlockFilterUpdates(); @@ -15068,12 +14919,10 @@ qemuDomainSnapshotDelete(virDomainSnapshotPtr snapshot, } endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(cfg); return ret; } @@ -15121,12 +14970,10 @@ static int qemuDomainQemuMonitorCommand(virDomainPtr domain, const char *cmd, qemuDomainObjExitMonitor(driver, vm); endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -15195,20 +15042,19 @@ static virDomainPtr qemuDomainQemuAttach(virConnectPtr conn, NULL))) goto cleanup; + virObjectRef(vm); def = NULL; if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0) { qemuDomainRemoveInactive(driver, vm); - vm = NULL; goto cleanup; } if (qemuProcessAttach(conn, driver, vm, pid, pidfile, monConfig, monJSON) < 0) { - if (qemuDomainObjEndJob(driver, vm)) - qemuDomainRemoveInactive(driver, vm); - vm = NULL; monConfig = NULL; + qemuDomainObjEndJob(driver, vm); + qemuDomainRemoveInactive(driver, vm); goto cleanup; } @@ -15218,14 +15064,12 @@ static virDomainPtr qemuDomainQemuAttach(virConnectPtr conn, if (dom) dom->id = vm->def->id; - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: virDomainDefFree(def); virDomainChrSourceDefFree(monConfig); - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); VIR_FREE(pidfile); virObjectUnref(caps); virObjectUnref(qemuCaps); @@ -15310,8 +15154,7 @@ qemuDomainOpenConsole(virDomainPtr dom, } cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -15385,8 +15228,7 @@ qemuDomainOpenChannel(virDomainPtr dom, } cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -15801,18 +15643,14 @@ qemuDomainBlockJobImpl(virDomainObjPtr vm, } endjob: - if (!qemuDomainObjEndJob(driver, vm)) { - vm = NULL; - goto cleanup; - } + qemuDomainObjEndJob(driver, vm); cleanup: virObjectUnref(cfg); VIR_FREE(basePath); VIR_FREE(backingPath); VIR_FREE(device); - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); if (event) qemuDomainEventQueue(driver, event); if (event2) @@ -15832,7 +15670,7 @@ qemuDomainBlockJobAbort(virDomainPtr dom, const char *path, unsigned int flags) return -1; if (virDomainBlockJobAbortEnsureACL(dom->conn, vm->def) < 0) { - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return -1; } @@ -15859,7 +15697,7 @@ qemuDomainGetBlockJobInfo(virDomainPtr dom, const char *path, return -1; if (virDomainGetBlockJobInfoEnsureACL(dom->conn, vm->def) < 0) { - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return -1; } @@ -15920,12 +15758,10 @@ qemuDomainGetBlockJobInfo(virDomainPtr dom, const char *path, virObjectUnref(cfg); } endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -15940,7 +15776,7 @@ qemuDomainBlockJobSetSpeed(virDomainPtr dom, const char *path, return -1; if (virDomainBlockJobSetSpeedEnsureACL(dom->conn, vm->def) < 0) { - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return -1; } @@ -15950,8 +15786,7 @@ qemuDomainBlockJobSetSpeed(virDomainPtr dom, const char *path, /* bandwidth in bytes/s. Caller must lock vm beforehand, and not - * access it afterwards; likewise, caller must not access mirror - * afterwards. */ + * access mirror afterwards. */ static int qemuDomainBlockCopyCommon(virDomainObjPtr vm, virConnectPtr conn, @@ -16129,13 +15964,10 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm, if (need_unlink && unlink(mirror->path)) VIR_WARN("unable to unlink just-created %s", mirror->path); virStorageSourceFree(mirror); - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: VIR_FREE(device); - if (vm) - virObjectUnlock(vm); virObjectUnref(cfg); return ret; } @@ -16206,12 +16038,10 @@ qemuDomainBlockRebase(virDomainPtr dom, const char *path, const char *base, VIR_DOMAIN_BLOCK_REBASE_REUSE_EXT); ret = qemuDomainBlockCopyCommon(vm, dom->conn, path, dest, bandwidth, 0, 0, flags, true); - vm = NULL; dest = NULL; cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virStorageSourceFree(dest); return ret; } @@ -16280,11 +16110,9 @@ qemuDomainBlockCopy(virDomainPtr dom, const char *disk, const char *destxml, ret = qemuDomainBlockCopyCommon(vm, dom->conn, disk, dest, bandwidth, granularity, buf_size, flags, false); - vm = NULL; cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -16300,7 +16128,7 @@ qemuDomainBlockPull(virDomainPtr dom, const char *path, unsigned long bandwidth, return -1; if (virDomainBlockPullEnsureACL(dom->conn, vm->def) < 0) { - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return -1; } @@ -16539,16 +16367,14 @@ qemuDomainBlockCommit(virDomainPtr dom, VIR_DISK_CHAIN_READ_ONLY); } virStorageSourceFree(mirror); - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: VIR_FREE(topPath); VIR_FREE(basePath); VIR_FREE(backingPath); VIR_FREE(device); - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -16609,12 +16435,10 @@ qemuDomainOpenGraphics(virDomainPtr dom, ret = qemuMonitorOpenGraphics(priv->mon, protocol, fd, "graphicsfd", (flags & VIR_DOMAIN_OPEN_GRAPHICS_SKIPAUTH) != 0); qemuDomainObjExitMonitor(driver, vm); - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -16680,8 +16504,7 @@ qemuDomainOpenGraphicsFD(virDomainPtr dom, ret = qemuMonitorOpenGraphics(priv->mon, protocol, pair[1], "graphicsfd", (flags & VIR_DOMAIN_OPEN_GRAPHICS_SKIPAUTH)); qemuDomainObjExitMonitor(driver, vm); - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); if (ret < 0) goto cleanup; @@ -16691,8 +16514,7 @@ qemuDomainOpenGraphicsFD(virDomainPtr dom, cleanup: VIR_FORCE_CLOSE(pair[0]); VIR_FORCE_CLOSE(pair[1]); - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -17046,14 +16868,11 @@ qemuDomainSetBlockIoTune(virDomainPtr dom, } endjob: - - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: VIR_FREE(device); - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); if (eventNparams) virTypedParamsFree(eventParams, eventNparams); virObjectUnref(caps); @@ -17249,13 +17068,11 @@ qemuDomainGetBlockIoTune(virDomainPtr dom, ret = 0; endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: VIR_FREE(device); - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(caps); return ret; } @@ -17323,12 +17140,10 @@ qemuDomainGetDiskErrors(virDomainPtr dom, ret = n; endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virHashFree(table); if (ret < 0) { for (i = 0; i < n; i++) @@ -17370,7 +17185,7 @@ qemuDomainSetMetadata(virDomainPtr dom, cfg->configDir, flags); cleanup: - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(caps); virObjectUnref(cfg); return ret; @@ -17399,7 +17214,7 @@ qemuDomainGetMetadata(virDomainPtr dom, ret = virDomainObjGetMetadata(vm, type, uri, caps, driver->xmlopt, flags); cleanup: - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(caps); return ret; } @@ -17448,8 +17263,7 @@ qemuDomainGetCPUStats(virDomainPtr domain, ret = virCgroupGetPercpuStats(priv->cgroup, params, nparams, start_cpu, ncpus, priv->nvcpupids); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -17538,12 +17352,10 @@ qemuDomainPMSuspendForDuration(virDomainPtr dom, qemuDomainObjExitAgent(vm); endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -17587,12 +17399,10 @@ qemuDomainPMWakeup(virDomainPtr dom, qemuDomainObjExitMonitor(driver, vm); endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -17663,12 +17473,10 @@ qemuDomainQemuAgentCommand(virDomainPtr domain, VIR_FREE(result); endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return result; } @@ -17772,12 +17580,10 @@ qemuDomainFSTrim(virDomainPtr dom, qemuDomainObjExitAgent(vm); endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -17957,12 +17763,10 @@ qemuDomainGetTime(virDomainPtr dom, ret = 0; endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -18031,12 +17835,10 @@ qemuDomainSetTime(virDomainPtr dom, ret = 0; endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -18071,12 +17873,10 @@ qemuDomainFSFreeze(virDomainPtr dom, ret = qemuDomainSnapshotFSFreeze(driver, vm, mountpoints, nmountpoints); endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -18117,12 +17917,10 @@ qemuDomainFSThaw(virDomainPtr dom, ret = qemuDomainSnapshotFSThaw(driver, vm, true); endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } @@ -18894,8 +18692,7 @@ qemuConnectGetAllDomainStats(virConnectPtr conn, if (doms != domlist && !virConnectGetAllDomainStatsCheckACL(conn, dom->def)) { - virObjectUnlock(dom); - dom = NULL; + qemuDomObjEndAPI(&dom); continue; } @@ -18912,16 +18709,10 @@ qemuConnectGetAllDomainStats(virConnectPtr conn, if (tmp) tmpstats[nstats++] = tmp; - if (HAVE_JOB(domflags)) { - domflags = 0; - if (!qemuDomainObjEndJob(driver, dom)) { - dom = NULL; - continue; - } - } + if (HAVE_JOB(domflags)) + qemuDomainObjEndJob(driver, dom); - virObjectUnlock(dom); - dom = NULL; + qemuDomObjEndAPI(&dom); } *retStats = tmpstats; @@ -18931,12 +18722,10 @@ qemuConnectGetAllDomainStats(virConnectPtr conn, endjob: if (HAVE_JOB(domflags) && dom) - if (!qemuDomainObjEndJob(driver, dom)) - dom = NULL; + qemuDomainObjEndJob(driver, dom); cleanup: - if (dom) - virObjectUnlock(dom); + qemuDomObjEndAPI(&dom); virDomainStatsRecordListFree(tmpstats); virDomainListFree(domlist); @@ -19003,12 +18792,10 @@ qemuDomainGetFSInfo(virDomainPtr dom, qemuDomainObjExitAgent(vm); endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return ret; } diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 834093df29..1db6630db7 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -2737,31 +2737,20 @@ qemuMigrationBegin(virConnectPtr conn, if (virCloseCallbacksSet(driver->closeCallbacks, vm, conn, qemuMigrationCleanup) < 0) goto endjob; - if (qemuMigrationJobContinue(vm) == 0) { - vm = NULL; - virReportError(VIR_ERR_OPERATION_FAILED, - "%s", _("domain disappeared")); - VIR_FREE(xml); - if (cookieout) - VIR_FREE(*cookieout); - } + qemuMigrationJobContinue(vm); } else { goto endjob; } cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); return xml; endjob: - if ((flags & VIR_MIGRATE_CHANGE_PROTECTION)) { - if (qemuMigrationJobFinish(driver, vm) == 0) - vm = NULL; - } else { - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; - } + if (flags & VIR_MIGRATE_CHANGE_PROTECTION) + qemuMigrationJobFinish(driver, vm); + else + qemuDomainObjEndJob(driver, vm); goto cleanup; } @@ -2974,6 +2963,7 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver, NULL))) goto cleanup; + virObjectRef(vm); *def = NULL; priv = vm->privateData; if (VIR_STRDUP(priv->origname, origname) < 0) @@ -3100,12 +3090,7 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver, * This prevents any other APIs being invoked while incoming * migration is taking place. */ - if (!qemuMigrationJobContinue(vm)) { - vm = NULL; - virReportError(VIR_ERR_OPERATION_FAILED, - "%s", _("domain disappeared")); - goto cleanup; - } + qemuMigrationJobContinue(vm); if (autoPort) priv->migrationPort = port; @@ -3116,16 +3101,12 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver, VIR_FREE(xmlout); VIR_FORCE_CLOSE(dataFD[0]); VIR_FORCE_CLOSE(dataFD[1]); - if (vm) { - if (ret < 0) { - virPortAllocatorRelease(driver->migrationPorts, priv->nbdPort); - priv->nbdPort = 0; - } - if (ret >= 0 || vm->persistent) - virObjectUnlock(vm); - else - qemuDomainRemoveInactive(driver, vm); + if (ret < 0) { + virPortAllocatorRelease(driver->migrationPorts, priv->nbdPort); + priv->nbdPort = 0; + qemuDomainRemoveInactive(driver, vm); } + qemuDomObjEndAPI(&vm); if (event) qemuDomainEventQueue(driver, event); qemuMigrationCookieFree(mig); @@ -3138,8 +3119,7 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver, qemuProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED, 0); endjob: - if (!qemuMigrationJobFinish(driver, vm)) - vm = NULL; + qemuMigrationJobFinish(driver, vm); goto cleanup; } @@ -3508,19 +3488,16 @@ qemuMigrationConfirm(virConnectPtr conn, cookiein, cookieinlen, flags, cancelled); - if (qemuMigrationJobFinish(driver, vm) == 0) { - vm = NULL; - } else if (!virDomainObjIsActive(vm) && - (!vm->persistent || (flags & VIR_MIGRATE_UNDEFINE_SOURCE))) { + qemuMigrationJobFinish(driver, vm); + if (!virDomainObjIsActive(vm) && + (!vm->persistent || (flags & VIR_MIGRATE_UNDEFINE_SOURCE))) { if (flags & VIR_MIGRATE_UNDEFINE_SOURCE) virDomainDeleteConfig(cfg->configDir, cfg->autostartDir, vm); qemuDomainRemoveInactive(driver, vm); - vm = NULL; } cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); virObjectUnref(cfg); return ret; } @@ -4878,15 +4855,13 @@ qemuMigrationPerformJob(virQEMUDriverPtr driver, VIR_DOMAIN_EVENT_RESUMED_MIGRATED); } - if (!qemuMigrationJobFinish(driver, vm)) { - vm = NULL; - } else if (!virDomainObjIsActive(vm) && - (!vm->persistent || - (ret == 0 && (flags & VIR_MIGRATE_UNDEFINE_SOURCE)))) { + qemuMigrationJobFinish(driver, vm); + if (!virDomainObjIsActive(vm) && + (!vm->persistent || + (ret == 0 && (flags & VIR_MIGRATE_UNDEFINE_SOURCE)))) { if (flags & VIR_MIGRATE_UNDEFINE_SOURCE) virDomainDeleteConfig(cfg->configDir, cfg->autostartDir, vm); qemuDomainRemoveInactive(driver, vm); - vm = NULL; } if (orig_err) { @@ -4895,8 +4870,7 @@ qemuMigrationPerformJob(virQEMUDriverPtr driver, } cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); if (event) qemuDomainEventQueue(driver, event); virObjectUnref(cfg); @@ -4921,7 +4895,6 @@ qemuMigrationPerformPhase(virQEMUDriverPtr driver, { virObjectEventPtr event = NULL; int ret = -1; - bool hasrefs; /* If we didn't start the job in the begin phase, start it now. */ if (!(flags & VIR_MIGRATE_CHANGE_PROTECTION)) { @@ -4956,19 +4929,14 @@ qemuMigrationPerformPhase(virQEMUDriverPtr driver, endjob: if (ret < 0) - hasrefs = qemuMigrationJobFinish(driver, vm); + qemuMigrationJobFinish(driver, vm); else - hasrefs = qemuMigrationJobContinue(vm); - if (!hasrefs) { - vm = NULL; - } else if (!virDomainObjIsActive(vm) && !vm->persistent) { + qemuMigrationJobContinue(vm); + if (!virDomainObjIsActive(vm) && !vm->persistent) qemuDomainRemoveInactive(driver, vm); - vm = NULL; - } cleanup: - if (vm) - virObjectUnlock(vm); + qemuDomObjEndAPI(&vm); if (event) qemuDomainEventQueue(driver, event); return ret; @@ -5302,21 +5270,16 @@ qemuMigrationFinish(virQEMUDriverPtr driver, VIR_WARN("Unable to encode migration cookie"); endjob: - if (qemuMigrationJobFinish(driver, vm) == 0) { - vm = NULL; - } else if (!vm->persistent && !virDomainObjIsActive(vm)) { + qemuMigrationJobFinish(driver, vm); + if (!vm->persistent && !virDomainObjIsActive(vm)) qemuDomainRemoveInactive(driver, vm); - vm = NULL; - } cleanup: virPortAllocatorRelease(driver->migrationPorts, port); - if (vm) { - if (priv->mon) - qemuMonitorSetDomainLog(priv->mon, -1); - VIR_FREE(priv->origname); - virObjectUnlock(vm); - } + if (priv->mon) + qemuMonitorSetDomainLog(priv->mon, -1); + VIR_FREE(priv->origname); + qemuDomObjEndAPI(&vm); if (event) qemuDomainEventQueue(driver, event); qemuMigrationCookieFree(mig); @@ -5564,15 +5527,13 @@ qemuMigrationJobStartPhase(virQEMUDriverPtr driver, virDomainObjPtr vm, qemuMigrationJobPhase phase) { - virObjectRef(vm); qemuMigrationJobSetPhase(driver, vm, phase); } -bool +void qemuMigrationJobContinue(virDomainObjPtr vm) { qemuDomainObjReleaseAsyncJob(vm); - return virObjectUnref(vm); } bool @@ -5595,8 +5556,8 @@ qemuMigrationJobIsActive(virDomainObjPtr vm, return true; } -bool +void qemuMigrationJobFinish(virQEMUDriverPtr driver, virDomainObjPtr vm) { - return qemuDomainObjEndAsyncJob(driver, vm); + qemuDomainObjEndAsyncJob(driver, vm); } diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h index e7a90c3828..1726455a37 100644 --- a/src/qemu/qemu_migration.h +++ b/src/qemu/qemu_migration.h @@ -1,7 +1,7 @@ /* * qemu_migration.h: QEMU migration handling * - * Copyright (C) 2006-2011 Red Hat, Inc. + * Copyright (C) 2006-2011, 2014 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -82,13 +82,13 @@ void qemuMigrationJobStartPhase(virQEMUDriverPtr driver, virDomainObjPtr vm, qemuMigrationJobPhase phase) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); -bool qemuMigrationJobContinue(virDomainObjPtr obj) - ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK; +void qemuMigrationJobContinue(virDomainObjPtr obj) + ATTRIBUTE_NONNULL(1); bool qemuMigrationJobIsActive(virDomainObjPtr vm, qemuDomainAsyncJob job) ATTRIBUTE_NONNULL(1); -bool qemuMigrationJobFinish(virQEMUDriverPtr driver, virDomainObjPtr obj) - ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK; +void qemuMigrationJobFinish(virQEMUDriverPtr driver, virDomainObjPtr obj) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2); int qemuMigrationSetOffline(virQEMUDriverPtr driver, virDomainObjPtr vm); diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index e2ccc4e568..c18204b1e8 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -572,6 +572,7 @@ qemuProcessFakeReboot(void *opaque) virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virDomainRunningReason reason = VIR_DOMAIN_RUNNING_BOOTED; int ret = -1; + VIR_DEBUG("vm=%p", vm); virObjectLock(vm); if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0) @@ -620,16 +621,12 @@ qemuProcessFakeReboot(void *opaque) ret = 0; endjob: - if (!qemuDomainObjEndJob(driver, vm)) - vm = NULL; + qemuDomainObjEndJob(driver, vm); cleanup: - if (vm) { - if (ret == -1) - ignore_value(qemuProcessKill(vm, VIR_QEMU_PROCESS_KILL_FORCE)); - if (virObjectUnref(vm)) - virObjectUnlock(vm); - } + if (ret == -1) + ignore_value(qemuProcessKill(vm, VIR_QEMU_PROCESS_KILL_FORCE)); + qemuDomObjEndAPI(&vm); if (event) qemuDomainEventQueue(driver, event); virObjectUnref(cfg); @@ -1447,7 +1444,7 @@ qemuProcessHandleGuestPanic(qemuMonitorPtr mon ATTRIBUTE_UNUSED, cleanup: if (vm) - virObjectUnlock(vm); + virObjectUnlock(vm); return 0; } @@ -3575,7 +3572,7 @@ struct qemuProcessReconnectData { * this thread function has increased the reference counter to it * so that we now have to close it. * - * This function also inherits a locked domain object. + * This function also inherits a locked and ref'd domain object. * * This function needs to: * 1. Enter job @@ -3608,10 +3605,6 @@ qemuProcessReconnect(void *opaque) qemuDomainObjRestoreJob(obj, &oldjob); - /* Hold an extra reference because we can't allow 'vm' to be - * deleted if qemuConnectMonitor() failed */ - virObjectRef(obj); - cfg = virQEMUDriverGetConfig(driver); priv = obj->privateData; @@ -3700,7 +3693,8 @@ qemuProcessReconnect(void *opaque) VIR_DEBUG("Finishing shutdown sequence for domain %s", obj->def->name); qemuProcessShutdownOrReboot(driver, obj); - goto endjob; + qemuDomainObjEndJob(driver, obj); + goto cleanup; } if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE)) @@ -3752,23 +3746,11 @@ qemuProcessReconnect(void *opaque) if (virAtomicIntInc(&driver->nactive) == 1 && driver->inhibitCallback) driver->inhibitCallback(true, driver->inhibitOpaque); - endjob: - /* we hold an extra reference, so this will never fail */ - ignore_value(qemuDomainObjEndJob(driver, obj)); - - if (virObjectUnref(obj)) - virObjectUnlock(obj); - - virObjectUnref(conn); - virObjectUnref(cfg); - virNWFilterUnlockFilterUpdates(); - - return; + qemuDomainObjEndJob(driver, obj); + goto cleanup; error: - /* we hold an extra reference, so this will never fail */ - ignore_value(qemuDomainObjEndJob(driver, obj)); - + qemuDomainObjEndJob(driver, obj); killvm: if (virDomainObjIsActive(obj)) { /* We can't get the monitor back, so must kill the VM @@ -3788,13 +3770,11 @@ qemuProcessReconnect(void *opaque) qemuProcessStop(driver, obj, state, 0); } - if (virObjectUnref(obj)) { - if (!obj->persistent) - qemuDomainRemoveInactive(driver, obj); - else - virObjectUnlock(obj); - } + if (!obj->persistent) + qemuDomainRemoveInactive(driver, obj); + cleanup: + qemuDomObjEndAPI(&obj); virObjectUnref(conn); virObjectUnref(cfg); virNWFilterUnlockFilterUpdates(); @@ -3818,9 +3798,10 @@ qemuProcessReconnectHelper(virDomainObjPtr obj, memcpy(data, src, sizeof(*data)); data->obj = obj; - /* this lock will be eventually transferred to the thread that handles the - * reconnect */ + /* this lock and reference will be eventually transferred to the thread + * that handles the reconnect */ virObjectLock(obj); + virObjectRef(obj); /* Since we close the connection later on, we have to make sure that the * threads we start see a valid connection throughout their lifetime. We @@ -3836,9 +3817,8 @@ qemuProcessReconnectHelper(virDomainObjPtr obj, qemuProcessStop(src->driver, obj, VIR_DOMAIN_SHUTOFF_FAILED, 0); if (!obj->persistent) qemuDomainRemoveInactive(src->driver, obj); - else - virObjectUnlock(obj); + qemuDomObjEndAPI(&obj); virObjectUnref(data->conn); VIR_FREE(data); return -1; @@ -5505,12 +5485,11 @@ qemuProcessAutoDestroy(virDomainObjPtr dom, VIR_DOMAIN_EVENT_STOPPED, VIR_DOMAIN_EVENT_STOPPED_DESTROYED); - if (!qemuDomainObjEndJob(driver, dom)) - dom = NULL; - if (dom && !dom->persistent) { + qemuDomainObjEndJob(driver, dom); + + if (!dom->persistent) qemuDomainRemoveInactive(driver, dom); - dom = NULL; - } + if (event) qemuDomainEventQueue(driver, event); @@ -5530,9 +5509,11 @@ int qemuProcessAutoDestroyAdd(virQEMUDriverPtr driver, int qemuProcessAutoDestroyRemove(virQEMUDriverPtr driver, virDomainObjPtr vm) { + int ret; VIR_DEBUG("vm=%s", vm->def->name); - return virCloseCallbacksUnset(driver->closeCallbacks, vm, - qemuProcessAutoDestroy); + ret = virCloseCallbacksUnset(driver->closeCallbacks, vm, + qemuProcessAutoDestroy); + return ret; } bool qemuProcessAutoDestroyActive(virQEMUDriverPtr driver, diff --git a/src/util/virclosecallbacks.c b/src/util/virclosecallbacks.c index 4f261728c4..4128057c5e 100644 --- a/src/util/virclosecallbacks.c +++ b/src/util/virclosecallbacks.c @@ -138,6 +138,7 @@ virCloseCallbacksSet(virCloseCallbacksPtr closeCallbacks, VIR_FREE(closeDef); goto cleanup; } + virObjectRef(vm); } ret = 0; @@ -172,7 +173,11 @@ virCloseCallbacksUnset(virCloseCallbacksPtr closeCallbacks, goto cleanup; } - ret = virHashRemoveEntry(closeCallbacks->list, uuidstr); + if (virHashRemoveEntry(closeCallbacks->list, uuidstr) < 0) + goto cleanup; + + virObjectUnref(vm); + ret = 0; cleanup: virObjectUnlock(closeCallbacks); return ret;