If hostdev is unplugged we don't need to delete it's correspondent device
from qemu etc. Just remove it from config immediately.
Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy(a)virtuozzo.com>
---
src/qemu/qemu_hotplug.c | 16 +++++++++++++++-
src/util/virhostdev.c | 2 ++
2 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 920e0cb72b..8ba0235dbc 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -4462,6 +4462,7 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver,
VIR_AUTOFREE(char *) objAlias = NULL;
bool is_vfio = false;
bool unplug = hostdev->deleteAction == VIR_DOMAIN_HOSTDEV_DELETE_ACTION_UNPLUG;
+ bool unplugged = false;
VIR_DEBUG("Removing host device %s from domain %p %s",
hostdev->info->alias, vm, vm->def->name);
@@ -4520,13 +4521,17 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver,
virDomainAuditHostdev(vm, hostdev, "detach", true);
+ if (hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB) {
+ virDomainHostdevSubsysUSBPtr usbsrc = &hostdev->source.subsys.u.usb;
+ unplugged = !usbsrc->bus && !usbsrc->device;
+ }
/*
* In case of unplug the attempt to restore label will fail. But we don't
* need to restore the label! In case of separate mount namespace for the
* domain we remove device file later in this function. In case of global
* mount namespace the device file is deleted or being deleted by systemd.
*/
- if (!is_vfio && !unplug &&
+ if (!is_vfio && !unplug && !unplugged &&
qemuSecurityRestoreHostdevLabel(driver, vm, hostdev) < 0)
VIR_WARN("Failed to restore host device labelling");
@@ -5832,6 +5837,15 @@ qemuDomainDetachDeviceLive(virDomainObjPtr vm,
unplug) < 0) {
return -1;
}
+ if (!unplug) {
+ virDomainHostdevDefPtr hostdev = detach.data.hostdev;
+ virDomainHostdevSubsysUSBPtr usbsrc = &hostdev->source.subsys.u.usb;
+
+ if (hostdev->startupPolicy != VIR_DOMAIN_STARTUP_POLICY_OPTIONAL
&&
+ hostdev->startupPolicy != VIR_DOMAIN_STARTUP_POLICY_REQUISITE
&&
+ usbsrc->device == 0 && usbsrc->bus == 0)
+ return qemuDomainRemoveDevice(driver, vm, &detach);
+ }
break;
case VIR_DOMAIN_DEVICE_RNG:
if (qemuDomainDetachPrepRNG(vm, match->data.rng,
diff --git a/src/util/virhostdev.c b/src/util/virhostdev.c
index 41fcab7222..ed9bc09e14 100644
--- a/src/util/virhostdev.c
+++ b/src/util/virhostdev.c
@@ -1793,6 +1793,8 @@ virHostdevReAttachUSBDevices(virHostdevManagerPtr mgr,
continue;
if (hostdev->missing)
continue;
+ if (!usbsrc->bus && !usbsrc->device)
+ continue;
if (!(usb = virUSBDeviceNew(usbsrc->bus, usbsrc->device, NULL))) {
VIR_WARN("Unable to reattach USB device %03d.%03d on domain %s",
--
2.23.0