mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-08 05:55:19 +00:00
qemu: hotplug: Only label hostdev after checking device conflicts
Similar to what Jiri did for cgroup setup/teardown in05e149f94
, push it all into the device handler functions so we can do the necessary prep work before claiming the device. This also fixes hotplugging USB devices by product/vendor (virt-manager's default behavior): https://bugzilla.redhat.com/show_bug.cgi?id=1016511 (cherry picked from commitee414b5d6d
)
This commit is contained in:
parent
80e9c8656c
commit
8a4762ec84
@ -1136,6 +1136,7 @@ qemuDomainAttachHostPciDevice(virQEMUDriverPtr driver,
|
|||||||
char *configfd_name = NULL;
|
char *configfd_name = NULL;
|
||||||
bool releaseaddr = false;
|
bool releaseaddr = false;
|
||||||
bool teardowncgroup = false;
|
bool teardowncgroup = false;
|
||||||
|
bool teardownlabel = false;
|
||||||
int backend = hostdev->source.subsys.u.pci.backend;
|
int backend = hostdev->source.subsys.u.pci.backend;
|
||||||
|
|
||||||
if (VIR_REALLOC_N(vm->def->hostdevs, vm->def->nhostdevs + 1) < 0)
|
if (VIR_REALLOC_N(vm->def->hostdevs, vm->def->nhostdevs + 1) < 0)
|
||||||
@ -1176,6 +1177,11 @@ qemuDomainAttachHostPciDevice(virQEMUDriverPtr driver,
|
|||||||
goto error;
|
goto error;
|
||||||
teardowncgroup = true;
|
teardowncgroup = true;
|
||||||
|
|
||||||
|
if (virSecurityManagerSetHostdevLabel(driver->securityManager,
|
||||||
|
vm->def, hostdev, NULL) < 0)
|
||||||
|
goto error;
|
||||||
|
teardownlabel = true;
|
||||||
|
|
||||||
if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE)) {
|
if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE)) {
|
||||||
if (qemuAssignDeviceHostdevAlias(vm->def, hostdev, -1) < 0)
|
if (qemuAssignDeviceHostdevAlias(vm->def, hostdev, -1) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
@ -1233,6 +1239,10 @@ qemuDomainAttachHostPciDevice(virQEMUDriverPtr driver,
|
|||||||
error:
|
error:
|
||||||
if (teardowncgroup && qemuTeardownHostdevCgroup(vm, hostdev) < 0)
|
if (teardowncgroup && qemuTeardownHostdevCgroup(vm, hostdev) < 0)
|
||||||
VIR_WARN("Unable to remove host device cgroup ACL on hotplug fail");
|
VIR_WARN("Unable to remove host device cgroup ACL on hotplug fail");
|
||||||
|
if (teardownlabel &&
|
||||||
|
virSecurityManagerRestoreHostdevLabel(driver->securityManager,
|
||||||
|
vm->def, hostdev, NULL) < 0)
|
||||||
|
VIR_WARN("Unable to restore host device labelling on hotplug fail");
|
||||||
|
|
||||||
if (releaseaddr)
|
if (releaseaddr)
|
||||||
qemuDomainReleaseDeviceAddress(vm, hostdev->info, NULL);
|
qemuDomainReleaseDeviceAddress(vm, hostdev->info, NULL);
|
||||||
@ -1428,6 +1438,7 @@ qemuDomainAttachHostUsbDevice(virQEMUDriverPtr driver,
|
|||||||
char *devstr = NULL;
|
char *devstr = NULL;
|
||||||
bool added = false;
|
bool added = false;
|
||||||
bool teardowncgroup = false;
|
bool teardowncgroup = false;
|
||||||
|
bool teardownlabel = false;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
if (qemuFindHostdevUSBDevice(hostdev, true, &usb) < 0)
|
if (qemuFindHostdevUSBDevice(hostdev, true, &usb) < 0)
|
||||||
@ -1449,6 +1460,11 @@ qemuDomainAttachHostUsbDevice(virQEMUDriverPtr driver,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
teardowncgroup = true;
|
teardowncgroup = true;
|
||||||
|
|
||||||
|
if (virSecurityManagerSetHostdevLabel(driver->securityManager,
|
||||||
|
vm->def, hostdev, NULL) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
teardownlabel = true;
|
||||||
|
|
||||||
if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE)) {
|
if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE)) {
|
||||||
if (qemuAssignDeviceHostdevAlias(vm->def, hostdev, -1) < 0)
|
if (qemuAssignDeviceHostdevAlias(vm->def, hostdev, -1) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
@ -1475,10 +1491,14 @@ qemuDomainAttachHostUsbDevice(virQEMUDriverPtr driver,
|
|||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
cleanup:
|
cleanup:
|
||||||
if (ret < 0 &&
|
if (ret < 0) {
|
||||||
teardowncgroup &&
|
if (teardowncgroup && qemuTeardownHostdevCgroup(vm, hostdev) < 0)
|
||||||
qemuTeardownHostdevCgroup(vm, hostdev) < 0)
|
VIR_WARN("Unable to remove host device cgroup ACL on hotplug fail");
|
||||||
VIR_WARN("Unable to remove host device cgroup ACL on hotplug fail");
|
if (teardownlabel &&
|
||||||
|
virSecurityManagerRestoreHostdevLabel(driver->securityManager,
|
||||||
|
vm->def, hostdev, NULL) < 0)
|
||||||
|
VIR_WARN("Unable to restore host device labelling on hotplug fail");
|
||||||
|
}
|
||||||
if (added)
|
if (added)
|
||||||
virUSBDeviceListSteal(driver->activeUsbHostdevs, usb);
|
virUSBDeviceListSteal(driver->activeUsbHostdevs, usb);
|
||||||
virUSBDeviceFree(usb);
|
virUSBDeviceFree(usb);
|
||||||
@ -1497,6 +1517,7 @@ qemuDomainAttachHostScsiDevice(virQEMUDriverPtr driver,
|
|||||||
char *devstr = NULL;
|
char *devstr = NULL;
|
||||||
char *drvstr = NULL;
|
char *drvstr = NULL;
|
||||||
bool teardowncgroup = false;
|
bool teardowncgroup = false;
|
||||||
|
bool teardownlabel = false;
|
||||||
|
|
||||||
if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DRIVE) ||
|
if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DRIVE) ||
|
||||||
!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE) ||
|
!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE) ||
|
||||||
@ -1521,6 +1542,11 @@ qemuDomainAttachHostScsiDevice(virQEMUDriverPtr driver,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
teardowncgroup = true;
|
teardowncgroup = true;
|
||||||
|
|
||||||
|
if (virSecurityManagerSetHostdevLabel(driver->securityManager,
|
||||||
|
vm->def, hostdev, NULL) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
teardownlabel = true;
|
||||||
|
|
||||||
if (qemuAssignDeviceHostdevAlias(vm->def, hostdev, -1) < 0)
|
if (qemuAssignDeviceHostdevAlias(vm->def, hostdev, -1) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -1562,6 +1588,10 @@ cleanup:
|
|||||||
qemuDomainReAttachHostScsiDevices(driver, vm->def->name, &hostdev, 1);
|
qemuDomainReAttachHostScsiDevices(driver, vm->def->name, &hostdev, 1);
|
||||||
if (teardowncgroup && qemuTeardownHostdevCgroup(vm, hostdev) < 0)
|
if (teardowncgroup && qemuTeardownHostdevCgroup(vm, hostdev) < 0)
|
||||||
VIR_WARN("Unable to remove host device cgroup ACL on hotplug fail");
|
VIR_WARN("Unable to remove host device cgroup ACL on hotplug fail");
|
||||||
|
if (teardownlabel &&
|
||||||
|
virSecurityManagerRestoreHostdevLabel(driver->securityManager,
|
||||||
|
vm->def, hostdev, NULL) < 0)
|
||||||
|
VIR_WARN("Unable to restore host device labelling on hotplug fail");
|
||||||
}
|
}
|
||||||
VIR_FREE(drvstr);
|
VIR_FREE(drvstr);
|
||||||
VIR_FREE(devstr);
|
VIR_FREE(devstr);
|
||||||
@ -1579,10 +1609,6 @@ int qemuDomainAttachHostDevice(virQEMUDriverPtr driver,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (virSecurityManagerSetHostdevLabel(driver->securityManager,
|
|
||||||
vm->def, hostdev, NULL) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
switch (hostdev->source.subsys.type) {
|
switch (hostdev->source.subsys.type) {
|
||||||
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
|
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
|
||||||
if (qemuDomainAttachHostPciDevice(driver, vm,
|
if (qemuDomainAttachHostPciDevice(driver, vm,
|
||||||
|
Loading…
Reference in New Issue
Block a user