#define qemudLog(level, msg...) fprintf(stderr, msg)
+static void qemuDriverLock(struct qemud_driver *driver)
+{
+ pthread_mutex_lock(&driver->lock);
+}
+static void qemuDriverUnlock(struct qemud_driver *driver)
+{
+ pthread_mutex_unlock(&driver->lock);
+}
+
static int qemudSetCloseExec(int fd) {
int flags;
if ((flags = fcntl(fd, F_GETFD)) < 0)
for (i = 0 ; i < driver->domains.count ; i++) {
virDomainObjPtr vm = driver->domains.objs[i];
+ virDomainObjLock(vm);
if (vm->autostart &&
!virDomainIsActive(vm)) {
int ret = qemudStartVMDaemon(NULL, driver, vm, NULL);
VIR_DOMAIN_EVENT_STARTED_BOOTED);
}
}
+ virDomainObjUnlock(vm);
}
}
if (VIR_ALLOC(qemu_driver) < 0)
return -1;
+ pthread_mutex_init(&qemu_driver->lock, NULL);
+ qemuDriverLock(qemu_driver);
+
/* Don't have a dom0 so start from 1 */
qemu_driver->nextvmid = 1;
/* Init callback list */
if(VIR_ALLOC(qemu_driver->domainEventCallbacks) < 0)
- return -1;
+ goto out_of_memory;
if (!uid) {
if (asprintf(&qemu_driver->logDir,
if (!(pw = getpwuid(uid))) {
qemudLog(QEMUD_ERR, _("Failed to find user record for uid '%d': %s\n"),
uid, strerror(errno));
- goto out_nouid;
+ goto error;
}
if (asprintf(&qemu_driver->logDir,
goto out_of_memory;
if (qemudLoadDriverConfig(qemu_driver, driverConf) < 0) {
- qemudShutdown();
- return -1;
+ goto error;
}
if (virDomainLoadAllConfigs(NULL,
&qemu_driver->domains,
qemu_driver->configDir,
qemu_driver->autostartDir,
- NULL, NULL) < 0) {
- qemudShutdown();
- return -1;
- }
+ NULL, NULL) < 0)
+ goto error;
qemudAutostartConfigs(qemu_driver);
+ qemuDriverUnlock(qemu_driver);
+
return 0;
- out_of_memory:
+out_of_memory:
qemudLog (QEMUD_ERR,
"%s", _("qemudStartup: out of memory\n"));
- out_nouid:
+error:
+ if (qemu_driver)
+ qemuDriverUnlock(qemu_driver);
VIR_FREE(base);
- VIR_FREE(qemu_driver);
+ qemudShutdown();
return -1;
}
if (!qemu_driver)
return 0;
+ qemuDriverLock(qemu_driver);
virDomainLoadAllConfigs(NULL,
qemu_driver->caps,
&qemu_driver->domains,
qemudNotifyLoadDomain, qemu_driver);
qemudAutostartConfigs(qemu_driver);
+ qemuDriverUnlock(qemu_driver);
return 0;
}
static int
qemudActive(void) {
unsigned int i;
+ int active = 0;
if (!qemu_driver)
return 0;
- for (i = 0 ; i < qemu_driver->domains.count ; i++)
- if (virDomainIsActive(qemu_driver->domains.objs[i]))
- return 1;
+ qemuDriverLock(qemu_driver);
+ for (i = 0 ; i < qemu_driver->domains.count ; i++) {
+ virDomainObjPtr vm = qemu_driver->domains.objs[i];
+ virDomainObjLock(vm);
+ if (virDomainIsActive(vm))
+ active = 1;
+ virDomainObjUnlock(vm);
+ }
- /* Otherwise we're happy to deal with a shutdown */
- return 0;
+ qemuDriverUnlock(qemu_driver);
+ return active;
}
/**
if (!qemu_driver)
return -1;
+ qemuDriverLock(qemu_driver);
virCapabilitiesFree(qemu_driver->caps);
/* shutdown active VMs */
for (i = 0 ; i < qemu_driver->domains.count ; i++) {
virDomainObjPtr dom = qemu_driver->domains.objs[i];
+ virDomainObjLock(dom);
if (virDomainIsActive(dom))
qemudShutdownVMDaemon(NULL, qemu_driver, dom);
- if (!dom->persistent)
- virDomainRemoveInactive(&qemu_driver->domains,
- dom);
+ virDomainObjUnlock(dom);
}
virDomainObjListFree(&qemu_driver->domains);
if (qemu_driver->brctl)
brShutdown(qemu_driver->brctl);
+ qemuDriverUnlock(qemu_driver);
VIR_FREE(qemu_driver);
return 0;
}
}
-static int qemudDispatchVMLog(struct qemud_driver *driver, virDomainObjPtr vm, int fd) {
- if (qemudVMData(driver, vm, fd) < 0) {
- qemudShutdownVMDaemon(NULL, driver, vm);
- qemudDomainEventDispatch(driver, vm,
- VIR_DOMAIN_EVENT_STOPPED,
- VIR_DOMAIN_EVENT_STOPPED_FAILED);
- if (!vm->persistent)
- virDomainRemoveInactive(&driver->domains,
- vm);
- }
- return 0;
-}
-
-static int qemudDispatchVMFailure(struct qemud_driver *driver, virDomainObjPtr vm,
- int fd ATTRIBUTE_UNUSED) {
- qemudShutdownVMDaemon(NULL, driver, vm);
- qemudDomainEventDispatch(driver, vm,
- VIR_DOMAIN_EVENT_STOPPED,
- VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN);
- if (!vm->persistent)
- virDomainRemoveInactive(&driver->domains,
- vm);
- return 0;
-}
-
static void
qemudDispatchVMEvent(int watch, int fd, int events, void *opaque) {
struct qemud_driver *driver = opaque;
virDomainObjPtr vm = NULL;
unsigned int i;
+ int quit = 0, failed = 0;
+ qemuDriverLock(driver);
for (i = 0 ; i < driver->domains.count ; i++) {
- if (virDomainIsActive(driver->domains.objs[i]) &&
- (driver->domains.objs[i]->stdout_watch == watch ||
- driver->domains.objs[i]->stderr_watch == watch)) {
- vm = driver->domains.objs[i];
+ virDomainObjPtr tmpvm = driver->domains.objs[i];
+ virDomainObjLock(tmpvm);
+ if (virDomainIsActive(tmpvm) &&
+ (tmpvm->stdout_watch == watch ||
+ tmpvm->stderr_watch == watch)) {
+ vm = tmpvm;
break;
}
+ virDomainObjUnlock(tmpvm);
}
if (!vm)
- return;
+ goto cleanup;
if (vm->stdout_fd != fd &&
vm->stderr_fd != fd) {
- qemudDispatchVMFailure(driver, vm, fd);
- return;
+ failed = 1;
+ } else {
+ if (events & VIR_EVENT_HANDLE_READABLE) {
+ if (qemudVMData(driver, vm, fd) < 0)
+ failed = 1;
+ } else {
+ quit = 1;
+ }
}
- if (events == VIR_EVENT_HANDLE_READABLE)
- qemudDispatchVMLog(driver, vm, fd);
- else
- qemudDispatchVMFailure(driver, vm, fd);
+ if (failed || quit) {
+ qemudShutdownVMDaemon(NULL, driver, vm);
+ qemudDomainEventDispatch(driver, vm,
+ VIR_DOMAIN_EVENT_STOPPED,
+ quit ?
+ VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN :
+ VIR_DOMAIN_EVENT_STOPPED_FAILED);
+ if (!vm->persistent) {
+ virDomainRemoveInactive(&driver->domains,
+ vm);
+ vm = NULL;
+ }
+ }
+
+cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
+ qemuDriverUnlock(driver);
}
static int
struct qemud_driver *driver = conn->privateData;
char *xml;
+ qemuDriverLock(driver);
if ((xml = virCapabilitiesFormatXML(driver->caps)) == NULL)
qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
"%s", _("failed to allocate space for capabilities support"));
+ qemuDriverUnlock(driver);
return xml;
}
virDomainObjPtr vm;
virDomainPtr dom = NULL;
+ qemuDriverLock(driver);
vm = virDomainFindByID(&driver->domains, id);
+ qemuDriverUnlock(driver);
if (!vm) {
qemudReportError(conn, NULL, NULL, VIR_ERR_NO_DOMAIN, NULL);
if (dom) dom->id = vm->def->id;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return dom;
}
+
static virDomainPtr qemudDomainLookupByUUID(virConnectPtr conn,
const unsigned char *uuid) {
struct qemud_driver *driver = conn->privateData;
virDomainObjPtr vm;
virDomainPtr dom = NULL;
+ qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, uuid);
+ qemuDriverUnlock(driver);
+
if (!vm) {
qemudReportError(conn, NULL, NULL, VIR_ERR_NO_DOMAIN, NULL);
goto cleanup;
if (dom) dom->id = vm->def->id;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return dom;
}
+
static virDomainPtr qemudDomainLookupByName(virConnectPtr conn,
const char *name) {
struct qemud_driver *driver = conn->privateData;
virDomainObjPtr vm;
virDomainPtr dom = NULL;
+ qemuDriverLock(driver);
vm = virDomainFindByName(&driver->domains, name);
+ qemuDriverUnlock(driver);
+
if (!vm) {
qemudReportError(conn, NULL, NULL, VIR_ERR_NO_DOMAIN, NULL);
goto cleanup;
if (dom) dom->id = vm->def->id;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return dom;
}
struct qemud_driver *driver = conn->privateData;
int ret = -1;
+ qemuDriverLock(driver);
if (qemudExtractVersion(conn, driver) < 0)
goto cleanup;
ret = 0;
cleanup:
+ qemuDriverUnlock(driver);
return ret;
}
struct qemud_driver *driver = conn->privateData;
int got = 0, i;
- for (i = 0 ; i < driver->domains.count && got < nids ; i++)
+ qemuDriverLock(driver);
+ for (i = 0 ; i < driver->domains.count && got < nids ; i++) {
+ virDomainObjLock(driver->domains.objs[i]);
if (virDomainIsActive(driver->domains.objs[i]))
ids[got++] = driver->domains.objs[i]->def->id;
+ virDomainObjUnlock(driver->domains.objs[i]);
+ }
+ qemuDriverUnlock(driver);
return got;
}
+
static int qemudNumDomains(virConnectPtr conn) {
struct qemud_driver *driver = conn->privateData;
int n = 0, i;
- for (i = 0 ; i < driver->domains.count ; i++)
+ qemuDriverLock(driver);
+ for (i = 0 ; i < driver->domains.count ; i++) {
+ virDomainObjLock(driver->domains.objs[i]);
if (virDomainIsActive(driver->domains.objs[i]))
n++;
+ virDomainObjUnlock(driver->domains.objs[i]);
+ }
+ qemuDriverUnlock(driver);
return n;
}
+
static virDomainPtr qemudDomainCreate(virConnectPtr conn, const char *xml,
unsigned int flags ATTRIBUTE_UNUSED) {
struct qemud_driver *driver = conn->privateData;
virDomainDefPtr def;
- virDomainObjPtr vm;
+ virDomainObjPtr vm = NULL;
virDomainPtr dom = NULL;
+ qemuDriverLock(driver);
if (!(def = virDomainDefParseString(conn, driver->caps, xml)))
goto cleanup;
if (qemudStartVMDaemon(conn, driver, vm, NULL) < 0) {
virDomainRemoveInactive(&driver->domains,
vm);
+ vm = NULL;
goto cleanup;
}
qemudDomainEventDispatch(driver, vm,
cleanup:
virDomainDefFree(def);
-
+ if (vm)
+ virDomainObjUnlock(vm);
+ qemuDriverUnlock(driver);
return dom;
}
virDomainObjPtr vm;
int ret = -1;
+ qemuDriverLock(driver);
vm = virDomainFindByID(&driver->domains, dom->id);
+ qemuDriverUnlock(driver);
+
if (!vm) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_INVALID_DOMAIN, _("no domain with matching id %d"), dom->id);
goto cleanup;
ret = 0;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
virDomainObjPtr vm;
int ret = -1;
+ qemuDriverLock(driver);
vm = virDomainFindByID(&driver->domains, dom->id);
+ qemuDriverUnlock(driver);
+
if (!vm) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_INVALID_DOMAIN,
_("no domain with matching id %d"), dom->id);
ret = 0;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
char* info;
int ret = -1;
+ qemuDriverLock(driver);
vm = virDomainFindByID(&driver->domains, dom->id);
+ qemuDriverUnlock(driver);
+
if (!vm) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_INVALID_DOMAIN,
_("no domain with matching id %d"), dom->id);
ret = 0;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
-
}
virDomainObjPtr vm;
int ret = -1;
+ qemuDriverLock(driver);
vm = virDomainFindByID(&driver->domains, dom->id);
if (!vm) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_INVALID_DOMAIN,
qemudDomainEventDispatch(driver, vm,
VIR_DOMAIN_EVENT_STOPPED,
VIR_DOMAIN_EVENT_STOPPED_DESTROYED);
- if (!vm->persistent)
+ if (!vm->persistent) {
virDomainRemoveInactive(&driver->domains,
vm);
+ vm = NULL;
+ }
ret = 0;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
+ qemuDriverUnlock(driver);
return ret;
}
virDomainObjPtr vm;
char *type = NULL;
+ qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+ qemuDriverUnlock(driver);
if (!vm) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_INVALID_DOMAIN,
"%s", _("no domain with matching uuid"));
"%s", _("failed to allocate space for ostype"));
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return type;
}
virDomainObjPtr vm;
unsigned long ret = 0;
+ qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+ qemuDriverUnlock(driver);
+
if (!vm) {
char uuidstr[VIR_UUID_STRING_BUFLEN];
ret = vm->def->maxmem;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
virDomainObjPtr vm;
int ret = -1;
+ qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+ qemuDriverUnlock(driver);
+
if (!vm) {
char uuidstr[VIR_UUID_STRING_BUFLEN];
ret = 0;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
virDomainObjPtr vm;
int ret = -1;
+ qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+ qemuDriverUnlock(driver);
if (!vm) {
char uuidstr[VIR_UUID_STRING_BUFLEN];
ret = 0;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
virDomainObjPtr vm;
int ret = -1;
+ qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+ qemuDriverUnlock(driver);
if (!vm) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_INVALID_DOMAIN,
"%s", _("no domain with matching uuid"));
ret = 0;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
memcpy(header.magic, QEMUD_SAVE_MAGIC, sizeof(header.magic));
header.version = QEMUD_SAVE_VERSION;
+ qemuDriverLock(driver);
vm = virDomainFindByID(&driver->domains, dom->id);
if (!vm) {
if (safewrite(fd, &header, sizeof(header)) != sizeof(header)) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
"%s", _("failed to write save header"));
- return -1;
+ goto cleanup;
}
if (safewrite(fd, xml, header.xml_len) != header.xml_len) {
qemudDomainEventDispatch(driver, vm,
VIR_DOMAIN_EVENT_STOPPED,
VIR_DOMAIN_EVENT_STOPPED_SAVED);
- if (!vm->persistent)
+ if (!vm->persistent) {
virDomainRemoveInactive(&driver->domains,
vm);
+ vm = NULL;
+ }
ret = 0;
cleanup:
VIR_FREE(info);
if (ret != 0)
unlink(path);
-
+ if (vm)
+ virDomainObjUnlock(vm);
+ qemuDriverUnlock(driver);
return ret;
}
int max;
int ret = -1;
+ qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+ qemuDriverUnlock(driver);
+
if (!vm) {
char uuidstr[VIR_UUID_STRING_BUFLEN];
ret = 0;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
virNodeInfo nodeinfo;
int ret = -1;
+ qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+ qemuDriverUnlock(driver);
+
if (!virDomainIsActive(vm)) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_INVALID_ARG,
"%s",_("cannot pin vcpus on an inactive domain"));
ret = 0;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
int i, v, maxcpu;
int ret = -1;
+ qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+ qemuDriverUnlock(driver);
+
if (!virDomainIsActive(vm)) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_INVALID_ARG,
"%s",_("cannot pin vcpus on an inactive domain"));
ret = maxinfo;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
#endif /* HAVE_SCHED_GETAFFINITY */
const char *type;
int ret = -1;
+ qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+ qemuDriverUnlock(driver);
+
if (!vm) {
char uuidstr[VIR_UUID_STRING_BUFLEN];
ret = qemudGetMaxVCPUs(dom->conn, type);
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
const char *path) {
struct qemud_driver *driver = conn->privateData;
virDomainDefPtr def = NULL;
- virDomainObjPtr vm;
+ virDomainObjPtr vm = NULL;
int fd = -1;
int ret = -1;
char *xml = NULL;
struct qemud_save_header header;
+ qemuDriverLock(driver);
/* Verify the header and read the XML */
if ((fd = open(path, O_RDONLY)) < 0) {
qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
if (ret < 0) {
qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
"%s", _("failed to start VM"));
- if (!vm->persistent)
+ if (!vm->persistent) {
virDomainRemoveInactive(&driver->domains,
vm);
+ vm = NULL;
+ }
goto cleanup;
}
VIR_FREE(xml);
if (fd != -1)
close(fd);
-
+ if (vm)
+ virDomainObjUnlock(vm);
+ qemuDriverUnlock(driver);
return ret;
}
virDomainObjPtr vm;
char *ret = NULL;
+ qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+ qemuDriverUnlock(driver);
+
if (!vm) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_INVALID_DOMAIN,
"%s", _("no domain with matching uuid"));
flags);
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
struct qemud_driver *driver = conn->privateData;
int got = 0, i;
+ qemuDriverLock(driver);
for (i = 0 ; i < driver->domains.count && got < nnames ; i++) {
+ virDomainObjLock(driver->domains.objs[i]);
if (!virDomainIsActive(driver->domains.objs[i])) {
if (!(names[got++] = strdup(driver->domains.objs[i]->def->name))) {
qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
"%s", _("failed to allocate space for VM name string"));
+ virDomainObjUnlock(driver->domains.objs[i]);
goto cleanup;
}
}
+ virDomainObjUnlock(driver->domains.objs[i]);
}
+ qemuDriverUnlock(driver);
return got;
cleanup:
for (i = 0 ; i < got ; i++)
VIR_FREE(names[i]);
+ qemuDriverUnlock(driver);
return -1;
}
struct qemud_driver *driver = conn->privateData;
int n = 0, i;
+ qemuDriverLock(driver);
for (i = 0 ; i < driver->domains.count ; i++)
if (!virDomainIsActive(driver->domains.objs[i]))
n++;
+ qemuDriverUnlock(driver);
return n;
}
virDomainObjPtr vm;
int ret = -1;
+ qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+ qemuDriverUnlock(driver);
+
if (!vm) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_INVALID_DOMAIN,
"%s", _("no domain with matching uuid"));
VIR_DOMAIN_EVENT_STARTED_BOOTED);
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
static virDomainPtr qemudDomainDefine(virConnectPtr conn, const char *xml) {
struct qemud_driver *driver = conn->privateData;
virDomainDefPtr def;
- virDomainObjPtr vm;
+ virDomainObjPtr vm = NULL;
virDomainPtr dom = NULL;
int newVM = 1;
+ qemuDriverLock(driver);
if (!(def = virDomainDefParseString(conn, driver->caps, xml)))
goto cleanup;
vm = virDomainFindByName(&driver->domains, def->name);
- if (vm)
+ if (vm) {
+ virDomainObjUnlock(vm);
newVM = 0;
+ }
if (!(vm = virDomainAssignDef(conn,
&driver->domains,
vm->newDef ? vm->newDef : vm->def) < 0) {
virDomainRemoveInactive(&driver->domains,
vm);
+ vm = NULL;
goto cleanup;
}
if (dom) dom->id = vm->def->id;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
+ qemuDriverUnlock(driver);
return dom;
}
virDomainObjPtr vm;
int ret = -1;
+ qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+
if (!vm) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_INVALID_DOMAIN,
"%s", _("no domain with matching uuid"));
virDomainRemoveInactive(&driver->domains,
vm);
+ vm = NULL;
ret = 0;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
+ qemuDriverUnlock(driver);
return ret;
}
virDomainDeviceDefPtr dev = NULL;
int ret = -1;
+ qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
if (!vm) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_INVALID_DOMAIN,
cleanup:
virDomainDeviceDefFree(dev);
+ if (vm)
+ virDomainObjUnlock(vm);
+ qemuDriverUnlock(driver);
return ret;
}
virDomainDeviceDefPtr dev = NULL;
int ret = -1;
+ qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
if (!vm) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_INVALID_DOMAIN,
cleanup:
virDomainDeviceDefFree(dev);
+ if (vm)
+ virDomainObjUnlock(vm);
+ qemuDriverUnlock(driver);
return ret;
}
static int qemudDomainGetAutostart(virDomainPtr dom,
- int *autostart) {
+ int *autostart) {
struct qemud_driver *driver = dom->conn->privateData;
virDomainObjPtr vm;
int ret = -1;
+ qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+ qemuDriverUnlock(driver);
+
if (!vm) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_INVALID_DOMAIN,
"%s", _("no domain with matching uuid"));
ret = 0;
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
char *configFile = NULL, *autostartLink = NULL;
int ret = -1;
+ qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+ qemuDriverUnlock(driver);
+
if (!vm) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_INVALID_DOMAIN,
"%s", _("no domain with matching uuid"));
cleanup:
VIR_FREE(configFile);
VIR_FREE(autostartLink);
-
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
virDomainObjPtr vm;
virDomainDiskDefPtr disk = NULL;
+ qemuDriverLock(driver);
vm = virDomainFindByID(&driver->domains, dom->id);
+ qemuDriverUnlock(driver);
if (!vm) {
qemudReportError (dom->conn, dom, NULL, VIR_ERR_INVALID_DOMAIN,
_("no domain with matching id %d"), dom->id);
cleanup:
VIR_FREE(qemu_dev_name);
VIR_FREE(info);
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
int i;
int ret = -1;
+ qemuDriverLock(driver);
vm = virDomainFindByID(&driver->domains, dom->id);
+ qemuDriverUnlock(driver);
+
if (!vm) {
qemudReportError (dom->conn, dom, NULL, VIR_ERR_INVALID_DOMAIN,
_("no domain with matching id %d"), dom->id);
_("invalid path, '%s' is not a known interface"), path);
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
#else
virDomainObjPtr vm;
int fd = -1, ret = -1, i;
+ qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
+ qemuDriverUnlock(driver);
+
if (!vm) {
qemudReportError (dom->conn, dom, NULL, VIR_ERR_INVALID_DOMAIN,
"%s", _("no domain with matching uuid"));
cleanup:
if (fd >= 0)
close (fd);
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
char tmp[] = TEMPDIR "/qemu.mem.XXXXXX";
int fd = -1, ret = -1;
+ qemuDriverLock(driver);
vm = virDomainFindByID(&driver->domains, dom->id);
+ qemuDriverUnlock(driver);
if (!vm) {
qemudReportError (dom->conn, dom, NULL, VIR_ERR_INVALID_DOMAIN,
VIR_FREE(info);
if (fd >= 0) close (fd);
unlink (tmp);
+ if (vm)
+ virDomainObjUnlock(vm);
return ret;
}
struct qemud_driver *driver = conn->privateData;
int ret;
+ qemuDriverLock(driver);
ret = virDomainEventCallbackListAdd(conn, driver->domainEventCallbacks,
callback, opaque, freecb);
+ qemuDriverUnlock(driver);
return ret;
}
struct qemud_driver *driver = conn->privateData;
int ret;
+ qemuDriverLock(driver);
ret = virDomainEventCallbackListRemove(conn, driver->domainEventCallbacks,
callback);
+ qemuDriverUnlock(driver);
return ret;
}
*uri_out = NULL;
+ qemuDriverLock(driver);
if (!dom_xml) {
qemudReportError (dconn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
"%s", _("no domain XML passed"));
if (qemudStartVMDaemon (dconn, driver, vm, migrateFrom) < 0) {
qemudReportError (dconn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
"%s", _("failed to start listening VM"));
- if (!vm->persistent)
+ if (!vm->persistent) {
virDomainRemoveInactive(&driver->domains, vm);
-
+ vm = NULL;
+ }
goto cleanup;
}
qemudDomainEventDispatch(driver, vm,
if (ret != 0) {
VIR_FREE(*uri_out);
}
-
+ if (vm)
+ virDomainObjUnlock(vm);
+ qemuDriverUnlock(driver);
return ret;
}
char *info = NULL;
int ret = -1;
+ qemuDriverLock(driver);
vm = virDomainFindByID(&driver->domains, dom->id);
if (!vm) {
qemudReportError (dom->conn, dom, NULL, VIR_ERR_INVALID_DOMAIN,
qemudDomainEventDispatch(driver, vm,
VIR_DOMAIN_EVENT_STOPPED,
VIR_DOMAIN_EVENT_STOPPED_MIGRATED);
- if (!vm->persistent)
+ if (!vm->persistent) {
virDomainRemoveInactive(&driver->domains, vm);
+ vm = NULL;
+ }
ret = 0;
cleanup:
VIR_FREE(info);
+ if (vm)
+ virDomainObjUnlock(vm);
+ qemuDriverUnlock(driver);
return ret;
}
virDomainPtr dom = NULL;
char *info = NULL;
+ qemuDriverLock(driver);
vm = virDomainFindByName(&driver->domains, dname);
if (!vm) {
qemudReportError (dconn, NULL, NULL, VIR_ERR_INVALID_DOMAIN,
qemudDomainEventDispatch(driver, vm,
VIR_DOMAIN_EVENT_STOPPED,
VIR_DOMAIN_EVENT_STOPPED_FAILED);
- if (!vm->persistent)
+ if (!vm->persistent) {
virDomainRemoveInactive(&driver->domains, vm);
+ vm = NULL;
+ }
}
cleanup:
+ if (vm)
+ virDomainObjUnlock(vm);
+ qemuDriverUnlock(driver);
return dom;
}