static int qemudDomainGetMaxVcpus(virDomainPtr dom);
-static int qemudMonitorCommand (const struct qemud_driver *driver,
- const virDomainObjPtr vm,
+static int qemudMonitorCommand (const virDomainObjPtr vm,
const char *cmd,
char **reply);
/* Return -1 for error, 1 to continue reading and 0 for success */
typedef int qemudHandlerMonitorOutput(virConnectPtr conn,
- struct qemud_driver *driver,
virDomainObjPtr vm,
const char *output,
int fd);
static int
qemudReadMonitorOutput(virConnectPtr conn,
- struct qemud_driver *driver,
virDomainObjPtr vm,
int fd,
char *buf,
} else {
got += ret;
buf[got] = '\0';
- if ((ret = func(conn, driver, vm, buf, fd)) != 1)
+ if ((ret = func(conn, vm, buf, fd)) != 1)
return ret;
}
}
static int
qemudCheckMonitorPrompt(virConnectPtr conn ATTRIBUTE_UNUSED,
- struct qemud_driver *driver ATTRIBUTE_UNUSED,
virDomainObjPtr vm,
const char *output,
int fd)
}
static int qemudOpenMonitor(virConnectPtr conn,
- struct qemud_driver *driver,
virDomainObjPtr vm,
const char *monitor) {
int monfd;
}
ret = qemudReadMonitorOutput(conn,
- driver, vm, monfd,
+ vm, monfd,
buf, sizeof(buf),
qemudCheckMonitorPrompt,
"monitor", 10000);
static int
qemudFindCharDevicePTYs(virConnectPtr conn,
- struct qemud_driver *driver,
virDomainObjPtr vm,
const char *output,
int fd ATTRIBUTE_UNUSED)
}
/* Got them all, so now open the monitor console */
- ret = qemudOpenMonitor(conn, driver, vm, monitor);
+ ret = qemudOpenMonitor(conn, vm, monitor);
cleanup:
VIR_FREE(monitor);
}
static int qemudWaitForMonitor(virConnectPtr conn,
- struct qemud_driver *driver,
virDomainObjPtr vm) {
char buf[1024]; /* Plenty of space to get startup greeting */
int ret = qemudReadMonitorOutput(conn,
- driver, vm, vm->stderr_fd,
+ vm, vm->stderr_fd,
buf, sizeof(buf),
qemudFindCharDevicePTYs,
"console", 3000);
static int
qemudDetectVcpuPIDs(virConnectPtr conn,
- struct qemud_driver *driver,
virDomainObjPtr vm) {
char *qemucpus = NULL;
char *line;
return 0;
}
- if (qemudMonitorCommand(driver, vm, "info cpus", &qemucpus) < 0) {
+ if (qemudMonitorCommand(vm, "info cpus", &qemucpus) < 0) {
qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
"%s", _("cannot run monitor command to fetch CPU thread info"));
VIR_FREE(vm->vcpupids);
static int
qemudInitCpus(virConnectPtr conn,
- struct qemud_driver *driver,
virDomainObjPtr vm,
const char *migrateFrom) {
char *info = NULL;
if (migrateFrom == NULL) {
/* Allow the CPUS to start executing */
- if (qemudMonitorCommand(driver, vm, "cont", &info) < 0) {
+ if (qemudMonitorCommand(vm, "cont", &info) < 0) {
qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
"%s", _("resume operation failed"));
return -1;
VIR_EVENT_HANDLE_HANGUP,
qemudDispatchVMEvent,
driver, NULL)) < 0) ||
- (qemudWaitForMonitor(conn, driver, vm) < 0) ||
- (qemudDetectVcpuPIDs(conn, driver, vm) < 0) ||
- (qemudInitCpus(conn, driver, vm, migrateFrom) < 0)) {
+ (qemudWaitForMonitor(conn, vm) < 0) ||
+ (qemudDetectVcpuPIDs(conn, vm) < 0) ||
+ (qemudInitCpus(conn, vm, migrateFrom) < 0)) {
qemudShutdownVMDaemon(conn, driver, vm);
return -1;
}
}
static int
-qemudMonitorCommand (const struct qemud_driver *driver ATTRIBUTE_UNUSED,
- const virDomainObjPtr vm,
+qemudMonitorCommand (const virDomainObjPtr vm,
const char *cmd,
char **reply) {
int size = 0;
goto cleanup;
}
if (vm->state != VIR_DOMAIN_PAUSED) {
- if (qemudMonitorCommand(driver, vm, "stop", &info) < 0) {
+ if (qemudMonitorCommand(vm, "stop", &info) < 0) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
"%s", _("suspend operation failed"));
goto cleanup;
goto cleanup;
}
if (vm->state == VIR_DOMAIN_PAUSED) {
- if (qemudMonitorCommand(driver, vm, "cont", &info) < 0) {
+ if (qemudMonitorCommand(vm, "cont", &info) < 0) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
"%s", _("resume operation failed"));
goto cleanup;
goto cleanup;
}
- if (qemudMonitorCommand(driver, vm, "system_powerdown", &info) < 0) {
+ if (qemudMonitorCommand(vm, "system_powerdown", &info) < 0) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
"%s", _("shutdown operation failed"));
goto cleanup;
goto cleanup;
}
- if (qemudMonitorCommand(driver, vm, command, &info) < 0) {
+ if (qemudMonitorCommand(vm, command, &info) < 0) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
"%s", _("migrate operation failed"));
goto cleanup;
/* If it was running before, resume it now. */
if (header.was_running) {
char *info;
- if (qemudMonitorCommand(driver, vm, "cont", &info) < 0) {
+ if (qemudMonitorCommand(vm, "cont", &info) < 0) {
qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
"%s", _("failed to resume domain"));
goto cleanup;
}
static int qemudDomainChangeEjectableMedia(virConnectPtr conn,
- struct qemud_driver *driver,
virDomainObjPtr vm,
virDomainDeviceDefPtr dev)
{
}
VIR_FREE(devname);
- if (qemudMonitorCommand(driver, vm, cmd, &reply) < 0) {
+ if (qemudMonitorCommand(vm, cmd, &reply) < 0) {
qemudReportError(conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
"%s", _("cannot change cdrom media"));
VIR_FREE(cmd);
}
static int qemudDomainAttachPciDiskDevice(virConnectPtr conn,
- struct qemud_driver *driver,
virDomainObjPtr vm,
virDomainDeviceDefPtr dev)
{
return ret;
}
- if (qemudMonitorCommand(driver, vm, cmd, &reply) < 0) {
+ if (qemudMonitorCommand(vm, cmd, &reply) < 0) {
qemudReportError(conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
_("cannot attach %s disk"), type);
VIR_FREE(cmd);
}
static int qemudDomainAttachUsbMassstorageDevice(virConnectPtr conn,
- struct qemud_driver *driver,
virDomainObjPtr vm,
virDomainDeviceDefPtr dev)
{
return ret;
}
- if (qemudMonitorCommand(driver, vm, cmd, &reply) < 0) {
+ if (qemudMonitorCommand(vm, cmd, &reply) < 0) {
qemudReportError(conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
"%s", _("cannot attach usb disk"));
VIR_FREE(cmd);
}
static int qemudDomainAttachHostDevice(virConnectPtr conn,
- struct qemud_driver *driver,
virDomainObjPtr vm,
virDomainDeviceDefPtr dev)
{
return -1;
}
- if (qemudMonitorCommand(driver, vm, cmd, &reply) < 0) {
+ if (qemudMonitorCommand(vm, cmd, &reply) < 0) {
qemudReportError(conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
"%s", _("cannot attach usb device"));
VIR_FREE(cmd);
qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
if (!vm) {
+ qemuDriverUnlock(driver);
qemudReportError(dom->conn, dom, NULL, VIR_ERR_INVALID_DOMAIN,
"%s", _("no domain with matching uuid"));
goto cleanup;
}
if (!virDomainIsActive(vm)) {
+ qemuDriverUnlock(driver);
qemudReportError(dom->conn, dom, NULL, VIR_ERR_INTERNAL_ERROR,
"%s", _("cannot attach device on inactive domain"));
goto cleanup;
dev = virDomainDeviceDefParse(dom->conn,
driver->caps,
vm->def, xml);
+ qemuDriverUnlock(driver);
if (dev == NULL)
goto cleanup;
switch (dev->data.disk->device) {
case VIR_DOMAIN_DISK_DEVICE_CDROM:
case VIR_DOMAIN_DISK_DEVICE_FLOPPY:
- ret = qemudDomainChangeEjectableMedia(dom->conn, driver, vm, dev);
+ ret = qemudDomainChangeEjectableMedia(dom->conn, vm, dev);
break;
case VIR_DOMAIN_DISK_DEVICE_DISK:
if (dev->data.disk->bus == VIR_DOMAIN_DISK_BUS_USB) {
- ret = qemudDomainAttachUsbMassstorageDevice(dom->conn, driver, vm, dev);
+ ret = qemudDomainAttachUsbMassstorageDevice(dom->conn, vm, dev);
} else if (dev->data.disk->bus == VIR_DOMAIN_DISK_BUS_SCSI ||
dev->data.disk->bus == VIR_DOMAIN_DISK_BUS_VIRTIO) {
- ret = qemudDomainAttachPciDiskDevice(dom->conn, driver, vm, dev);
+ ret = qemudDomainAttachPciDiskDevice(dom->conn, vm, dev);
}
break;
default:
} else if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV &&
dev->data.hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
dev->data.hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) {
- ret = qemudDomainAttachHostDevice(dom->conn, driver, vm, dev);
+ ret = qemudDomainAttachHostDevice(dom->conn, vm, dev);
} else {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_NO_SUPPORT,
"%s", _("this device type cannot be attached"));
virDomainDeviceDefFree(dev);
if (vm)
virDomainObjUnlock(vm);
- qemuDriverUnlock(driver);
return ret;
}
static int qemudDomainDetachPciDiskDevice(virConnectPtr conn,
- struct qemud_driver *driver,
virDomainObjPtr vm, virDomainDeviceDefPtr dev)
{
int i, ret = -1;
goto cleanup;
}
- if (qemudMonitorCommand(driver, vm, cmd, &reply) < 0) {
+ if (qemudMonitorCommand(vm, cmd, &reply) < 0) {
qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
_("failed to execute detach disk %s command"), detach->dst);
goto cleanup;
qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, dom->uuid);
if (!vm) {
+ qemuDriverUnlock(driver);
qemudReportError(dom->conn, dom, NULL, VIR_ERR_INVALID_DOMAIN,
"%s", _("no domain with matching uuid"));
goto cleanup;
}
if (!virDomainIsActive(vm)) {
+ qemuDriverUnlock(driver);
qemudReportError(dom->conn, dom, NULL, VIR_ERR_INTERNAL_ERROR,
"%s", _("cannot attach device on inactive domain"));
goto cleanup;
}
dev = virDomainDeviceDefParse(dom->conn, driver->caps, vm->def, xml);
+ qemuDriverUnlock(driver);
if (dev == NULL)
goto cleanup;
dev->data.disk->device == VIR_DOMAIN_DISK_DEVICE_DISK &&
(dev->data.disk->bus == VIR_DOMAIN_DISK_BUS_SCSI ||
dev->data.disk->bus == VIR_DOMAIN_DISK_BUS_VIRTIO))
- ret = qemudDomainDetachPciDiskDevice(dom->conn, driver, vm, dev);
+ ret = qemudDomainDetachPciDiskDevice(dom->conn, vm, dev);
else
qemudReportError(dom->conn, dom, NULL, VIR_ERR_NO_SUPPORT,
"%s", _("only SCSI or virtio disk device can be detached dynamically"));
virDomainDeviceDefFree(dev);
if (vm)
virDomainObjUnlock(vm);
- qemuDriverUnlock(driver);
return ret;
}
goto cleanup;
len = strlen (qemu_dev_name);
- if (qemudMonitorCommand (driver, vm, "info blockstats", &info) < 0) {
+ if (qemudMonitorCommand (vm, "info blockstats", &info) < 0) {
qemudReportError (dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
"%s", _("'info blockstats' command failed"));
goto cleanup;
/* Issue the memsave command. */
snprintf (cmd, sizeof cmd, "memsave %llu %zi \"%s\"", offset, size, tmp);
- if (qemudMonitorCommand (driver, vm, cmd, &info) < 0) {
+ if (qemudMonitorCommand (vm, cmd, &info) < 0) {
qemudReportError (dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
"%s", _("'memsave' command failed"));
goto cleanup;
if (!(flags & VIR_MIGRATE_LIVE)) {
/* Pause domain for non-live migration */
snprintf(cmd, sizeof cmd, "%s", "stop");
- qemudMonitorCommand (driver, vm, cmd, &info);
+ qemudMonitorCommand (vm, cmd, &info);
DEBUG ("stop reply: %s", info);
VIR_FREE(info);
if (resource > 0) {
/* Issue migrate_set_speed command. Don't worry if it fails. */
snprintf (cmd, sizeof cmd, "migrate_set_speed %lum", resource);
- qemudMonitorCommand (driver, vm, cmd, &info);
+ qemudMonitorCommand (vm, cmd, &info);
DEBUG ("migrate_set_speed reply: %s", info);
VIR_FREE (info);
snprintf (cmd, sizeof cmd, "migrate \"%s\"", safe_uri);
VIR_FREE (safe_uri);
- if (qemudMonitorCommand (driver, vm, cmd, &info) < 0) {
+ if (qemudMonitorCommand (vm, cmd, &info) < 0) {
qemudReportError (dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
"%s", _("migrate operation failed"));
goto cleanup;