+Tue May 19 12:04:22 BST 2009 Daniel P. Berrange <berrange@redhat.com>
+
+ Fix misc locking bugs identified by lock checker
+ * src/test.c: Add missing driver lock calls in testOpen()
+ * src/uml_driver.c: Remove bogus driver unlock call in
+ umlDomainStart. Ensure driver lock is held for the duration
+ of umlDomainSetAutostart.
+ * src/network_driver.c: Ensure driver lock is held for the
+ duration of networkStart, networkDestroy and networkSetAutostart
+ * src/storage_driver.c: Ensure driver lock is held for the
+ duration of storagePoolRefresh, and storagePoolSetAutostart.
+ Ensure driver is locked before re-obtaining pool lock in
+ storageVolumeCreateXML.
+ * src/qemu_driver.c: Ensure lock is held when removing domain
+ event callbacks in qemudClose(). Drop driver lock before calling
+ qemudAutostartConfigs, since that will obtain a lock when calling
+ virConnectClose. Hold lock across duration of suspend, resume,
+ start, get security label, device attach and device detach
+ operations.
+
Tue May 19 11:10:22 BST 2009 Daniel P. Berrange <berrange@redhat.com>
Add an optional OCaml+CIL mutex lock checker
networkDriverLock(driver);
network = virNetworkFindByUUID(&driver->networks, net->uuid);
- networkDriverUnlock(driver);
if (!network) {
networkReportError(net->conn, NULL, net, VIR_ERR_INVALID_NETWORK,
cleanup:
if (network)
virNetworkObjUnlock(network);
+ networkDriverUnlock(driver);
return ret;
}
networkDriverLock(driver);
network = virNetworkFindByUUID(&driver->networks, net->uuid);
- networkDriverUnlock(driver);
if (!network) {
networkReportError(net->conn, NULL, net, VIR_ERR_INVALID_NETWORK,
cleanup:
if (network)
virNetworkObjUnlock(network);
+ networkDriverUnlock(driver);
return ret;
}
networkDriverLock(driver);
network = virNetworkFindByUUID(&driver->networks, net->uuid);
- networkDriverUnlock(driver);
if (!network) {
networkReportError(net->conn, NULL, net, VIR_ERR_INVALID_NETWORK,
VIR_FREE(autostartLink);
if (network)
virNetworkObjUnlock(network);
+ networkDriverUnlock(driver);
return ret;
}
"qemu:///system");
/* Ignoring NULL conn which is mostly harmless here */
+ qemuDriverLock(driver);
for (i = 0 ; i < driver->domains.count ; i++) {
virDomainObjPtr vm = driver->domains.objs[i];
virDomainObjLock(vm);
}
virDomainObjUnlock(vm);
}
+ qemuDriverUnlock(driver);
if (conn)
virConnectClose(conn);
NULL, NULL) < 0)
goto error;
qemudReconnectVMs(qemu_driver);
+ qemuDriverUnlock(qemu_driver);
+
qemudAutostartConfigs(qemu_driver);
- qemuDriverUnlock(qemu_driver);
return 0;
qemu_driver->configDir,
qemu_driver->autostartDir,
qemudNotifyLoadDomain, qemu_driver);
+ qemuDriverUnlock(qemu_driver);
qemudAutostartConfigs(qemu_driver);
- qemuDriverUnlock(qemu_driver);
return 0;
}
struct qemud_driver *driver = conn->privateData;
/* Get rid of callbacks registered for this conn */
+ qemuDriverLock(driver);
virDomainEventCallbackListRemoveConn(conn, driver->domainEventCallbacks);
+ qemuDriverUnlock(driver);
conn->privateData = NULL;
qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
- qemuDriverUnlock(driver);
if (!vm) {
char uuidstr[VIR_UUID_STRING_BUFLEN];
if (vm)
virDomainObjUnlock(vm);
- if (event) {
- qemuDriverLock(driver);
+ if (event)
qemuDomainEventQueue(driver, event);
- qemuDriverUnlock(driver);
- }
+ qemuDriverUnlock(driver);
return ret;
}
qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
- qemuDriverUnlock(driver);
if (!vm) {
char uuidstr[VIR_UUID_STRING_BUFLEN];
cleanup:
if (vm)
virDomainObjUnlock(vm);
- if (event) {
- qemuDriverLock(driver);
+ if (event)
qemuDomainEventQueue(driver, event);
- qemuDriverUnlock(driver);
- }
+ qemuDriverUnlock(driver);
return ret;
}
qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
- qemuDriverUnlock(driver);
if (!vm) {
char uuidstr[VIR_UUID_STRING_BUFLEN];
cleanup:
if (vm)
virDomainObjUnlock(vm);
+ qemuDriverUnlock(driver);
return ret;
}
qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
- qemuDriverUnlock(driver);
if (!vm) {
char uuidstr[VIR_UUID_STRING_BUFLEN];
cleanup:
if (vm)
virDomainObjUnlock(vm);
- if (event) {
- qemuDriverLock(driver);
+ if (event)
qemuDomainEventQueue(driver, event);
- qemuDriverUnlock(driver);
- }
+ qemuDriverUnlock(driver);
return ret;
}
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
if (!vm) {
char uuidstr[VIR_UUID_STRING_BUFLEN];
- qemuDriverUnlock(driver);
virUUIDFormat(dom->uuid, uuidstr);
qemudReportError(dom->conn, dom, NULL, VIR_ERR_NO_DOMAIN,
_("no domain with matching uuid '%s'"), uuidstr);
}
if (!virDomainIsActive(vm)) {
- qemuDriverUnlock(driver);
qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_INVALID,
"%s", _("cannot attach device on inactive domain"));
goto cleanup;
dev = virDomainDeviceDefParse(dom->conn, driver->caps, vm->def, xml,
VIR_DOMAIN_XML_INACTIVE);
- qemuDriverUnlock(driver);
if (dev == NULL)
goto cleanup;
virDomainDeviceDefFree(dev);
if (vm)
virDomainObjUnlock(vm);
+ qemuDriverUnlock(driver);
return ret;
}
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
if (!vm) {
char uuidstr[VIR_UUID_STRING_BUFLEN];
- qemuDriverUnlock(driver);
virUUIDFormat(dom->uuid, uuidstr);
qemudReportError(dom->conn, dom, NULL, VIR_ERR_NO_DOMAIN,
_("no domain with matching uuid '%s'"), uuidstr);
}
if (!virDomainIsActive(vm)) {
- qemuDriverUnlock(driver);
qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_INVALID,
"%s", _("cannot detach device on inactive domain"));
goto cleanup;
dev = virDomainDeviceDefParse(dom->conn, driver->caps, vm->def, xml,
VIR_DOMAIN_XML_INACTIVE);
- qemuDriverUnlock(driver);
if (dev == NULL)
goto cleanup;
virDomainDeviceDefFree(dev);
if (vm)
virDomainObjUnlock(vm);
+ qemuDriverUnlock(driver);
return ret;
}
qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
- qemuDriverUnlock(driver);
if (!vm) {
char uuidstr[VIR_UUID_STRING_BUFLEN];
VIR_FREE(autostartLink);
if (vm)
virDomainObjUnlock(vm);
+ qemuDriverUnlock(driver);
return ret;
}
storageDriverLock(driver);
pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
- storageDriverUnlock(driver);
if (!pool) {
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
cleanup:
if (pool)
virStoragePoolObjUnlock(pool);
+ storageDriverUnlock(driver);
return ret;
}
storageDriverLock(driver);
pool = virStoragePoolObjFindByUUID(&driver->pools, obj->uuid);
- storageDriverUnlock(driver);
if (!pool) {
virStorageReportError(obj->conn, VIR_ERR_INVALID_STORAGE_POOL,
cleanup:
if (pool)
virStoragePoolObjUnlock(pool);
+ storageDriverUnlock(driver);
return ret;
}
buildret = backend->buildVol(obj->conn, buildvoldef);
+ storageDriverLock(driver);
virStoragePoolObjLock(pool);
+ storageDriverUnlock(driver);
+
voldef->building = 0;
pool->asyncjobs--;