virLXCProcessAutostartDomain: Refactor control flow and variable use

Use automatic unlocking of the 'vm' object, so that we can return early
when no autostart is needed and avoid passing of the 'driver' object
which is already present in 'vm's' private data.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Tim Wiederhake <twiederh@redhat.com>
This commit is contained in:
Peter Krempa 2022-06-28 16:52:38 +02:00
parent 5cd1656463
commit 6d155a5a8e

View File

@ -1538,48 +1538,43 @@ int virLXCProcessStart(virLXCDriver * driver,
return rc; return rc;
} }
struct virLXCProcessAutostartData {
virLXCDriver *driver;
};
static int static int
virLXCProcessAutostartDomain(virDomainObj *vm, virLXCProcessAutostartDomain(virDomainObj *vm,
void *opaque) void *opaque G_GNUC_UNUSED)
{ {
const struct virLXCProcessAutostartData *data = opaque; VIR_LOCK_GUARD lock = virObjectLockGuard(vm);
int ret = 0; virLXCDomainObjPrivate *priv = vm->privateData;
virObjectEvent *event;
int rc = 0;
virObjectLock(vm); if (!vm->autostart ||
if (vm->autostart && virDomainObjIsActive(vm))
!virDomainObjIsActive(vm)) { return 0;
ret = virLXCProcessStart(data->driver, vm, 0, NULL, NULL,
VIR_DOMAIN_RUNNING_BOOTED); rc = virLXCProcessStart(priv->driver, vm, 0, NULL, NULL, VIR_DOMAIN_RUNNING_BOOTED);
virDomainAuditStart(vm, "booted", ret >= 0); virDomainAuditStart(vm, "booted", rc >= 0);
if (ret < 0) {
VIR_ERROR(_("Failed to autostart VM '%s': %s"), if (rc < 0) {
vm->def->name, VIR_ERROR(_("Failed to autostart VM '%s': %s"),
virGetLastErrorMessage()); vm->def->name,
} else { virGetLastErrorMessage());
virObjectEvent *event = return -1;
virDomainEventLifecycleNewFromObj(vm,
VIR_DOMAIN_EVENT_STARTED,
VIR_DOMAIN_EVENT_STARTED_BOOTED);
virObjectEventStateQueue(data->driver->domainEventState, event);
}
} }
virObjectUnlock(vm);
return ret; event = virDomainEventLifecycleNewFromObj(vm,
VIR_DOMAIN_EVENT_STARTED,
VIR_DOMAIN_EVENT_STARTED_BOOTED);
virObjectEventStateQueue(priv->driver->domainEventState, event);
return 0;
} }
void void
virLXCProcessAutostartAll(virLXCDriver *driver) virLXCProcessAutostartAll(virLXCDriver *driver)
{ {
struct virLXCProcessAutostartData data = { driver }; virDomainObjListForEach(driver->domains, false, virLXCProcessAutostartDomain, NULL);
virDomainObjListForEach(driver->domains, false,
virLXCProcessAutostartDomain,
&data);
} }