static int
qemuDomainDetachDeviceControllerLive(virQEMUDriverPtr driver,
virDomainObjPtr vm,
- virDomainDeviceDefPtr dev)
+ virDomainDeviceDefPtr dev,
+ bool async)
{
virDomainControllerDefPtr cont = dev->data.controller;
int ret = -1;
switch (cont->type) {
case VIR_DOMAIN_CONTROLLER_TYPE_SCSI:
- ret = qemuDomainDetachControllerDevice(driver, vm, dev);
+ ret = qemuDomainDetachControllerDevice(driver, vm, dev, async);
break;
default :
virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
static int
qemuDomainDetachDeviceLive(virDomainObjPtr vm,
virDomainDeviceDefPtr dev,
- virQEMUDriverPtr driver)
+ virQEMUDriverPtr driver,
+ bool async)
{
int ret = -1;
switch ((virDomainDeviceType)dev->type) {
case VIR_DOMAIN_DEVICE_DISK:
- ret = qemuDomainDetachDeviceDiskLive(driver, vm, dev);
+ ret = qemuDomainDetachDeviceDiskLive(driver, vm, dev, async);
break;
case VIR_DOMAIN_DEVICE_CONTROLLER:
- ret = qemuDomainDetachDeviceControllerLive(driver, vm, dev);
+ ret = qemuDomainDetachDeviceControllerLive(driver, vm, dev, async);
break;
case VIR_DOMAIN_DEVICE_LEASE:
ret = qemuDomainDetachLease(driver, vm, dev->data.lease);
break;
case VIR_DOMAIN_DEVICE_NET:
- ret = qemuDomainDetachNetDevice(driver, vm, dev);
+ ret = qemuDomainDetachNetDevice(driver, vm, dev, async);
break;
case VIR_DOMAIN_DEVICE_HOSTDEV:
- ret = qemuDomainDetachHostDevice(driver, vm, dev);
+ ret = qemuDomainDetachHostDevice(driver, vm, dev, async);
break;
case VIR_DOMAIN_DEVICE_CHR:
- ret = qemuDomainDetachChrDevice(driver, vm, dev->data.chr);
+ ret = qemuDomainDetachChrDevice(driver, vm, dev->data.chr, async);
break;
case VIR_DOMAIN_DEVICE_RNG:
- ret = qemuDomainDetachRNGDevice(driver, vm, dev->data.rng);
+ ret = qemuDomainDetachRNGDevice(driver, vm, dev->data.rng, async);
break;
case VIR_DOMAIN_DEVICE_MEMORY:
- ret = qemuDomainDetachMemoryDevice(driver, vm, dev->data.memory);
+ ret = qemuDomainDetachMemoryDevice(driver, vm, dev->data.memory, async);
break;
case VIR_DOMAIN_DEVICE_SHMEM:
- ret = qemuDomainDetachShmemDevice(driver, vm, dev->data.shmem);
+ ret = qemuDomainDetachShmemDevice(driver, vm, dev->data.shmem, async);
break;
case VIR_DOMAIN_DEVICE_WATCHDOG:
- ret = qemuDomainDetachWatchdog(driver, vm, dev->data.watchdog);
+ ret = qemuDomainDetachWatchdog(driver, vm, dev->data.watchdog, async);
break;
case VIR_DOMAIN_DEVICE_INPUT:
- ret = qemuDomainDetachInputDevice(vm, dev->data.input);
+ ret = qemuDomainDetachInputDevice(vm, dev->data.input, async);
break;
case VIR_DOMAIN_DEVICE_REDIRDEV:
- ret = qemuDomainDetachRedirdevDevice(driver, vm, dev->data.redirdev);
+ ret = qemuDomainDetachRedirdevDevice(driver, vm, dev->data.redirdev, async);
break;
case VIR_DOMAIN_DEVICE_FS:
}
if (flags & VIR_DOMAIN_AFFECT_LIVE) {
- if (qemuDomainDetachDeviceLive(vm, dev_copy, driver) < 0)
+ if (qemuDomainDetachDeviceLive(vm, dev_copy, driver, false) < 0)
goto cleanup;
/*
* update domain status forcibly because the domain status may be
static int
qemuDomainDetachVirtioDiskDevice(virQEMUDriverPtr driver,
virDomainObjPtr vm,
- virDomainDiskDefPtr detach)
+ virDomainDiskDefPtr detach,
+ bool async)
{
int ret = -1;
qemuDomainObjPrivatePtr priv = vm->privateData;
goto cleanup;
}
- qemuDomainMarkDeviceForRemoval(vm, &detach->info);
+ if (!async)
+ qemuDomainMarkDeviceForRemoval(vm, &detach->info);
qemuDomainObjEnterMonitor(driver, vm);
if (qemuMonitorDelDevice(priv->mon, detach->info.alias) < 0) {
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto cleanup;
- if ((ret = qemuDomainWaitForDeviceRemoval(vm)) == 1)
- ret = qemuDomainRemoveDiskDevice(driver, vm, detach);
+ if (async) {
+ ret = 0;
+ } else {
+ if ((ret = qemuDomainWaitForDeviceRemoval(vm)) == 1)
+ ret = qemuDomainRemoveDiskDevice(driver, vm, detach);
+ }
cleanup:
- qemuDomainResetDeviceRemoval(vm);
+ if (!async)
+ qemuDomainResetDeviceRemoval(vm);
return ret;
}
static int
qemuDomainDetachDiskDevice(virQEMUDriverPtr driver,
virDomainObjPtr vm,
- virDomainDiskDefPtr detach)
+ virDomainDiskDefPtr detach,
+ bool async)
{
int ret = -1;
qemuDomainObjPrivatePtr priv = vm->privateData;
if (qemuDomainDiskBlockJobIsActive(detach))
goto cleanup;
- qemuDomainMarkDeviceForRemoval(vm, &detach->info);
+ if (!async)
+ qemuDomainMarkDeviceForRemoval(vm, &detach->info);
qemuDomainObjEnterMonitor(driver, vm);
if (qemuMonitorDelDevice(priv->mon, detach->info.alias) < 0) {
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto cleanup;
- if ((ret = qemuDomainWaitForDeviceRemoval(vm)) == 1)
- ret = qemuDomainRemoveDiskDevice(driver, vm, detach);
+ if (async) {
+ ret = 0;
+ } else {
+ if ((ret = qemuDomainWaitForDeviceRemoval(vm)) == 1)
+ ret = qemuDomainRemoveDiskDevice(driver, vm, detach);
+ }
cleanup:
- qemuDomainResetDeviceRemoval(vm);
+ if (!async)
+ qemuDomainResetDeviceRemoval(vm);
return ret;
}
int
qemuDomainDetachDeviceDiskLive(virQEMUDriverPtr driver,
virDomainObjPtr vm,
- virDomainDeviceDefPtr dev)
+ virDomainDeviceDefPtr dev,
+ bool async)
{
virDomainDiskDefPtr disk;
int ret = -1;
case VIR_DOMAIN_DISK_DEVICE_DISK:
case VIR_DOMAIN_DISK_DEVICE_LUN:
if (disk->bus == VIR_DOMAIN_DISK_BUS_VIRTIO)
- ret = qemuDomainDetachVirtioDiskDevice(driver, vm, disk);
+ ret = qemuDomainDetachVirtioDiskDevice(driver, vm, disk, async);
else if (disk->bus == VIR_DOMAIN_DISK_BUS_SCSI ||
disk->bus == VIR_DOMAIN_DISK_BUS_USB)
- ret = qemuDomainDetachDiskDevice(driver, vm, disk);
+ ret = qemuDomainDetachDiskDevice(driver, vm, disk, async);
else
virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
_("This type of disk cannot be hot unplugged"));
int qemuDomainDetachControllerDevice(virQEMUDriverPtr driver,
virDomainObjPtr vm,
- virDomainDeviceDefPtr dev)
+ virDomainDeviceDefPtr dev,
+ bool async)
{
int idx, ret = -1;
virDomainControllerDefPtr detach = NULL;
goto cleanup;
}
- qemuDomainMarkDeviceForRemoval(vm, &detach->info);
+ if (!async)
+ qemuDomainMarkDeviceForRemoval(vm, &detach->info);
qemuDomainObjEnterMonitor(driver, vm);
if (qemuMonitorDelDevice(priv->mon, detach->info.alias)) {
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto cleanup;
- if ((ret = qemuDomainWaitForDeviceRemoval(vm)) == 1)
- ret = qemuDomainRemoveControllerDevice(driver, vm, detach);
+ if (async) {
+ ret = 0;
+ } else {
+ if ((ret = qemuDomainWaitForDeviceRemoval(vm)) == 1)
+ ret = qemuDomainRemoveControllerDevice(driver, vm, detach);
+ }
cleanup:
- qemuDomainResetDeviceRemoval(vm);
+ if (!async)
+ qemuDomainResetDeviceRemoval(vm);
return ret;
}
static int
qemuDomainDetachHostPCIDevice(virQEMUDriverPtr driver,
virDomainObjPtr vm,
- virDomainHostdevDefPtr detach)
+ virDomainHostdevDefPtr detach,
+ bool async)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
virDomainHostdevSubsysPCIPtr pcisrc = &detach->source.subsys.u.pci;
return -1;
}
- qemuDomainMarkDeviceForRemoval(vm, detach->info);
+ if (!async)
+ qemuDomainMarkDeviceForRemoval(vm, detach->info);
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorDelDevice(priv->mon, detach->info->alias);
static int
qemuDomainDetachHostUSBDevice(virQEMUDriverPtr driver,
virDomainObjPtr vm,
- virDomainHostdevDefPtr detach)
+ virDomainHostdevDefPtr detach,
+ bool async)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
int ret;
return -1;
}
- qemuDomainMarkDeviceForRemoval(vm, detach->info);
+ if (!async)
+ qemuDomainMarkDeviceForRemoval(vm, detach->info);
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorDelDevice(priv->mon, detach->info->alias);
static int
qemuDomainDetachHostSCSIDevice(virQEMUDriverPtr driver,
virDomainObjPtr vm,
- virDomainHostdevDefPtr detach)
+ virDomainHostdevDefPtr detach,
+ bool async)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
int ret = -1;
return -1;
}
- qemuDomainMarkDeviceForRemoval(vm, detach->info);
+ if (!async)
+ qemuDomainMarkDeviceForRemoval(vm, detach->info);
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorDelDevice(priv->mon, detach->info->alias);
static int
qemuDomainDetachSCSIVHostDevice(virQEMUDriverPtr driver,
virDomainObjPtr vm,
- virDomainHostdevDefPtr detach)
+ virDomainHostdevDefPtr detach,
+ bool async)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
int ret = -1;
return -1;
}
- qemuDomainMarkDeviceForRemoval(vm, detach->info);
+ if (!async)
+ qemuDomainMarkDeviceForRemoval(vm, detach->info);
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorDelDevice(priv->mon, detach->info->alias);
static int
qemuDomainDetachMediatedDevice(virQEMUDriverPtr driver,
virDomainObjPtr vm,
- virDomainHostdevDefPtr detach)
+ virDomainHostdevDefPtr detach,
+ bool async)
{
int ret = -1;
qemuDomainObjPrivatePtr priv = vm->privateData;
return -1;
}
- qemuDomainMarkDeviceForRemoval(vm, detach->info);
+ if (!async)
+ qemuDomainMarkDeviceForRemoval(vm, detach->info);
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorDelDevice(priv->mon, detach->info->alias);
static int
qemuDomainDetachThisHostDevice(virQEMUDriverPtr driver,
virDomainObjPtr vm,
- virDomainHostdevDefPtr detach)
+ virDomainHostdevDefPtr detach,
+ bool async)
{
int ret = -1;
switch (detach->source.subsys.type) {
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
- ret = qemuDomainDetachHostPCIDevice(driver, vm, detach);
+ ret = qemuDomainDetachHostPCIDevice(driver, vm, detach, async);
break;
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
- ret = qemuDomainDetachHostUSBDevice(driver, vm, detach);
+ ret = qemuDomainDetachHostUSBDevice(driver, vm, detach, async);
break;
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI:
- ret = qemuDomainDetachHostSCSIDevice(driver, vm, detach);
+ ret = qemuDomainDetachHostSCSIDevice(driver, vm, detach, async);
break;
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST:
- ret = qemuDomainDetachSCSIVHostDevice(driver, vm, detach);
+ ret = qemuDomainDetachSCSIVHostDevice(driver, vm, detach, async);
break;
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV:
- ret = qemuDomainDetachMediatedDevice(driver, vm, detach);
+ ret = qemuDomainDetachMediatedDevice(driver, vm, detach, async);
break;
default:
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
if (ret < 0) {
if (virDomainObjIsActive(vm))
virDomainAuditHostdev(vm, detach, "detach", false);
- } else if ((ret = qemuDomainWaitForDeviceRemoval(vm)) == 1) {
+ } else if (!async &&
+ (ret = qemuDomainWaitForDeviceRemoval(vm)) == 1) {
ret = qemuDomainRemoveHostDevice(driver, vm, detach);
}
- qemuDomainResetDeviceRemoval(vm);
+ if (!async)
+ qemuDomainResetDeviceRemoval(vm);
return ret;
}
/* search for a hostdev matching dev and detach it */
int qemuDomainDetachHostDevice(virQEMUDriverPtr driver,
virDomainObjPtr vm,
- virDomainDeviceDefPtr dev)
+ virDomainDeviceDefPtr dev,
+ bool async)
{
virDomainHostdevDefPtr hostdev = dev->data.hostdev;
virDomainHostdevSubsysPtr subsys = &hostdev->source.subsys;
* function so that mac address / virtualport are reset
*/
if (detach->parent.type == VIR_DOMAIN_DEVICE_NET)
- return qemuDomainDetachNetDevice(driver, vm, &detach->parent);
+ return qemuDomainDetachNetDevice(driver, vm, &detach->parent, async);
else
- return qemuDomainDetachThisHostDevice(driver, vm, detach);
+ return qemuDomainDetachThisHostDevice(driver, vm, detach, async);
}
int
qemuDomainDetachShmemDevice(virQEMUDriverPtr driver,
virDomainObjPtr vm,
- virDomainShmemDefPtr dev)
+ virDomainShmemDefPtr dev,
+ bool async)
{
int ret = -1;
ssize_t idx = -1;
return -1;
}
- qemuDomainMarkDeviceForRemoval(vm, &shmem->info);
+ if (!async)
+ qemuDomainMarkDeviceForRemoval(vm, &shmem->info);
qemuDomainObjEnterMonitor(driver, vm);
if (qemuMonitorDelDevice(priv->mon, shmem->info.alias) < 0) {
int
qemuDomainDetachWatchdog(virQEMUDriverPtr driver,
virDomainObjPtr vm,
- virDomainWatchdogDefPtr dev)
+ virDomainWatchdogDefPtr dev,
+ bool async)
{
int ret = -1;
virDomainWatchdogDefPtr watchdog = vm->def->watchdog;
return -1;
}
- qemuDomainMarkDeviceForRemoval(vm, &watchdog->info);
+ if (!async)
+ qemuDomainMarkDeviceForRemoval(vm, &watchdog->info);
qemuDomainObjEnterMonitor(driver, vm);
if (qemuMonitorDelDevice(priv->mon, watchdog->info.alias) < 0) {
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto cleanup;
- if ((ret = qemuDomainWaitForDeviceRemoval(vm)) == 1)
- ret = qemuDomainRemoveWatchdog(driver, vm, watchdog);
+ if (async) {
+ ret = 0;
+ } else {
+ if ((ret = qemuDomainWaitForDeviceRemoval(vm)) == 1)
+ ret = qemuDomainRemoveWatchdog(driver, vm, watchdog);
+ }
cleanup:
- qemuDomainResetDeviceRemoval(vm);
+ if (!async)
+ qemuDomainResetDeviceRemoval(vm);
return ret;
}
int
qemuDomainDetachRedirdevDevice(virQEMUDriverPtr driver,
virDomainObjPtr vm,
- virDomainRedirdevDefPtr dev)
+ virDomainRedirdevDefPtr dev,
+ bool async)
{
int ret = -1;
qemuDomainObjPrivatePtr priv = vm->privateData;
return -1;
}
- qemuDomainMarkDeviceForRemoval(vm, &tmpRedirdevDef->info);
+ if (!async)
+ qemuDomainMarkDeviceForRemoval(vm, &tmpRedirdevDef->info);
qemuDomainObjEnterMonitor(driver, vm);
if (qemuMonitorDelDevice(priv->mon, tmpRedirdevDef->info.alias) < 0) {
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto cleanup;
- if ((ret = qemuDomainWaitForDeviceRemoval(vm)) == 1)
- ret = qemuDomainRemoveRedirdevDevice(driver, vm, tmpRedirdevDef);
+ if (async) {
+ ret = 0;
+ } else {
+ if ((ret = qemuDomainWaitForDeviceRemoval(vm)) == 1)
+ ret = qemuDomainRemoveRedirdevDevice(driver, vm, tmpRedirdevDef);
+ }
cleanup:
- qemuDomainResetDeviceRemoval(vm);
+ if (!async)
+ qemuDomainResetDeviceRemoval(vm);
return ret;
}
int
qemuDomainDetachNetDevice(virQEMUDriverPtr driver,
virDomainObjPtr vm,
- virDomainDeviceDefPtr dev)
+ virDomainDeviceDefPtr dev,
+ bool async)
{
int detachidx, ret = -1;
virDomainNetDefPtr detach = NULL;
if (virDomainNetGetActualType(detach) == VIR_DOMAIN_NET_TYPE_HOSTDEV) {
ret = qemuDomainDetachThisHostDevice(driver, vm,
- virDomainNetGetActualHostdev(detach));
+ virDomainNetGetActualHostdev(detach),
+ async);
goto cleanup;
}
*/
ignore_value(qemuInterfaceStopDevice(detach));
- qemuDomainMarkDeviceForRemoval(vm, &detach->info);
+ if (!async)
+ qemuDomainMarkDeviceForRemoval(vm, &detach->info);
qemuDomainObjEnterMonitor(driver, vm);
if (qemuMonitorDelDevice(priv->mon, detach->info.alias) < 0) {
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto cleanup;
- if ((ret = qemuDomainWaitForDeviceRemoval(vm)) == 1)
- ret = qemuDomainRemoveNetDevice(driver, vm, detach);
+ if (async) {
+ ret = 0;
+ } else {
+ if ((ret = qemuDomainWaitForDeviceRemoval(vm)) == 1)
+ ret = qemuDomainRemoveNetDevice(driver, vm, detach);
+ }
cleanup:
- qemuDomainResetDeviceRemoval(vm);
+ if (!async)
+ qemuDomainResetDeviceRemoval(vm);
return ret;
}
int qemuDomainDetachChrDevice(virQEMUDriverPtr driver,
virDomainObjPtr vm,
- virDomainChrDefPtr chr)
+ virDomainChrDefPtr chr,
+ bool async)
{
int ret = -1;
qemuDomainObjPrivatePtr priv = vm->privateData;
if (qemuBuildChrDeviceStr(&devstr, vmdef, chr, priv->qemuCaps) < 0)
goto cleanup;
- qemuDomainMarkDeviceForRemoval(vm, &tmpChr->info);
+ if (!async)
+ qemuDomainMarkDeviceForRemoval(vm, &tmpChr->info);
qemuDomainObjEnterMonitor(driver, vm);
if (devstr && qemuMonitorDelDevice(priv->mon, tmpChr->info.alias) < 0) {
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto cleanup;
- if ((ret = qemuDomainWaitForDeviceRemoval(vm)) == 1)
- ret = qemuDomainRemoveChrDevice(driver, vm, tmpChr);
+ if (async) {
+ ret = 0;
+ } else {
+ if ((ret = qemuDomainWaitForDeviceRemoval(vm)) == 1)
+ ret = qemuDomainRemoveChrDevice(driver, vm, tmpChr);
+ }
cleanup:
- qemuDomainResetDeviceRemoval(vm);
+ if (!async)
+ qemuDomainResetDeviceRemoval(vm);
VIR_FREE(devstr);
return ret;
}
int
qemuDomainDetachRNGDevice(virQEMUDriverPtr driver,
virDomainObjPtr vm,
- virDomainRNGDefPtr rng)
+ virDomainRNGDefPtr rng,
+ bool async)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
ssize_t idx;
return -1;
}
- qemuDomainMarkDeviceForRemoval(vm, &tmpRNG->info);
+ if (!async)
+ qemuDomainMarkDeviceForRemoval(vm, &tmpRNG->info);
qemuDomainObjEnterMonitor(driver, vm);
rc = qemuMonitorDelDevice(priv->mon, tmpRNG->info.alias);
if (qemuDomainObjExitMonitor(driver, vm) || rc < 0)
goto cleanup;
- if ((ret = qemuDomainWaitForDeviceRemoval(vm)) == 1)
- ret = qemuDomainRemoveRNGDevice(driver, vm, tmpRNG);
+ if (async) {
+ ret = 0;
+ } else {
+ if ((ret = qemuDomainWaitForDeviceRemoval(vm)) == 1)
+ ret = qemuDomainRemoveRNGDevice(driver, vm, tmpRNG);
+ }
cleanup:
- qemuDomainResetDeviceRemoval(vm);
+ if (!async)
+ qemuDomainResetDeviceRemoval(vm);
return ret;
}
int
qemuDomainDetachMemoryDevice(virQEMUDriverPtr driver,
virDomainObjPtr vm,
- virDomainMemoryDefPtr memdef)
+ virDomainMemoryDefPtr memdef,
+ bool async)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
virDomainMemoryDefPtr mem;
return -1;
}
- qemuDomainMarkDeviceForRemoval(vm, &mem->info);
+ if (!async)
+ qemuDomainMarkDeviceForRemoval(vm, &mem->info);
qemuDomainObjEnterMonitor(driver, vm);
rc = qemuMonitorDelDevice(priv->mon, mem->info.alias);
if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0)
goto cleanup;
- if ((ret = qemuDomainWaitForDeviceRemoval(vm)) == 1)
- ret = qemuDomainRemoveMemoryDevice(driver, vm, mem);
+ if (async) {
+ ret = 0;
+ } else {
+ if ((ret = qemuDomainWaitForDeviceRemoval(vm)) == 1)
+ ret = qemuDomainRemoveMemoryDevice(driver, vm, mem);
+ }
cleanup:
- qemuDomainResetDeviceRemoval(vm);
+ if (!async)
+ qemuDomainResetDeviceRemoval(vm);
return ret;
}
int
qemuDomainDetachInputDevice(virDomainObjPtr vm,
- virDomainInputDefPtr def)
+ virDomainInputDefPtr def,
+ bool async)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
virQEMUDriverPtr driver = priv->driver;
break;
}
- qemuDomainMarkDeviceForRemoval(vm, &input->info);
+ if (!async)
+ qemuDomainMarkDeviceForRemoval(vm, &input->info);
qemuDomainObjEnterMonitor(driver, vm);
if (qemuMonitorDelDevice(priv->mon, input->info.alias)) {
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto cleanup;
- if ((ret = qemuDomainWaitForDeviceRemoval(vm)) == 1)
- ret = qemuDomainRemoveInputDevice(vm, input);
+ if (async) {
+ ret = 0;
+ } else {
+ if ((ret = qemuDomainWaitForDeviceRemoval(vm)) == 1)
+ ret = qemuDomainRemoveInputDevice(vm, input);
+ }
cleanup:
- qemuDomainResetDeviceRemoval(vm);
+ if (!async)
+ qemuDomainResetDeviceRemoval(vm);
return ret;
}