mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-07 05:25:25 +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;
|
||||
bool releaseaddr = false;
|
||||
bool teardowncgroup = false;
|
||||
bool teardownlabel = false;
|
||||
int backend = hostdev->source.subsys.u.pci.backend;
|
||||
|
||||
if (VIR_REALLOC_N(vm->def->hostdevs, vm->def->nhostdevs + 1) < 0)
|
||||
@ -1176,6 +1177,11 @@ qemuDomainAttachHostPciDevice(virQEMUDriverPtr driver,
|
||||
goto error;
|
||||
teardowncgroup = true;
|
||||
|
||||
if (virSecurityManagerSetHostdevLabel(driver->securityManager,
|
||||
vm->def, hostdev, NULL) < 0)
|
||||
goto error;
|
||||
teardownlabel = true;
|
||||
|
||||
if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE)) {
|
||||
if (qemuAssignDeviceHostdevAlias(vm->def, hostdev, -1) < 0)
|
||||
goto error;
|
||||
@ -1233,6 +1239,10 @@ qemuDomainAttachHostPciDevice(virQEMUDriverPtr driver,
|
||||
error:
|
||||
if (teardowncgroup && qemuTeardownHostdevCgroup(vm, hostdev) < 0)
|
||||
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)
|
||||
qemuDomainReleaseDeviceAddress(vm, hostdev->info, NULL);
|
||||
@ -1428,6 +1438,7 @@ qemuDomainAttachHostUsbDevice(virQEMUDriverPtr driver,
|
||||
char *devstr = NULL;
|
||||
bool added = false;
|
||||
bool teardowncgroup = false;
|
||||
bool teardownlabel = false;
|
||||
int ret = -1;
|
||||
|
||||
if (qemuFindHostdevUSBDevice(hostdev, true, &usb) < 0)
|
||||
@ -1449,6 +1460,11 @@ qemuDomainAttachHostUsbDevice(virQEMUDriverPtr driver,
|
||||
goto cleanup;
|
||||
teardowncgroup = true;
|
||||
|
||||
if (virSecurityManagerSetHostdevLabel(driver->securityManager,
|
||||
vm->def, hostdev, NULL) < 0)
|
||||
goto cleanup;
|
||||
teardownlabel = true;
|
||||
|
||||
if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE)) {
|
||||
if (qemuAssignDeviceHostdevAlias(vm->def, hostdev, -1) < 0)
|
||||
goto cleanup;
|
||||
@ -1475,10 +1491,14 @@ qemuDomainAttachHostUsbDevice(virQEMUDriverPtr driver,
|
||||
|
||||
ret = 0;
|
||||
cleanup:
|
||||
if (ret < 0 &&
|
||||
teardowncgroup &&
|
||||
qemuTeardownHostdevCgroup(vm, hostdev) < 0)
|
||||
VIR_WARN("Unable to remove host device cgroup ACL on hotplug fail");
|
||||
if (ret < 0) {
|
||||
if (teardowncgroup && qemuTeardownHostdevCgroup(vm, hostdev) < 0)
|
||||
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)
|
||||
virUSBDeviceListSteal(driver->activeUsbHostdevs, usb);
|
||||
virUSBDeviceFree(usb);
|
||||
@ -1497,6 +1517,7 @@ qemuDomainAttachHostScsiDevice(virQEMUDriverPtr driver,
|
||||
char *devstr = NULL;
|
||||
char *drvstr = NULL;
|
||||
bool teardowncgroup = false;
|
||||
bool teardownlabel = false;
|
||||
|
||||
if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DRIVE) ||
|
||||
!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE) ||
|
||||
@ -1521,6 +1542,11 @@ qemuDomainAttachHostScsiDevice(virQEMUDriverPtr driver,
|
||||
goto cleanup;
|
||||
teardowncgroup = true;
|
||||
|
||||
if (virSecurityManagerSetHostdevLabel(driver->securityManager,
|
||||
vm->def, hostdev, NULL) < 0)
|
||||
goto cleanup;
|
||||
teardownlabel = true;
|
||||
|
||||
if (qemuAssignDeviceHostdevAlias(vm->def, hostdev, -1) < 0)
|
||||
goto cleanup;
|
||||
|
||||
@ -1562,6 +1588,10 @@ cleanup:
|
||||
qemuDomainReAttachHostScsiDevices(driver, vm->def->name, &hostdev, 1);
|
||||
if (teardowncgroup && qemuTeardownHostdevCgroup(vm, hostdev) < 0)
|
||||
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(devstr);
|
||||
@ -1579,10 +1609,6 @@ int qemuDomainAttachHostDevice(virQEMUDriverPtr driver,
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (virSecurityManagerSetHostdevLabel(driver->securityManager,
|
||||
vm->def, hostdev, NULL) < 0)
|
||||
return -1;
|
||||
|
||||
switch (hostdev->source.subsys.type) {
|
||||
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
|
||||
if (qemuDomainAttachHostPciDevice(driver, vm,
|
||||
|
Loading…
Reference in New Issue
Block a user