[libvirt] [PATCHv2 05/14] Fix vmdef usage after domain crash in monitor on device attach
John Ferlan
jferlan at redhat.com
Mon Jan 12 22:08:02 UTC 2015
On 01/07/2015 10:42 AM, Ján Tomko wrote:
> https://bugzilla.redhat.com/show_bug.cgi?id=1161024
>
> If the domain crashed while we were in monitor,
> we cannot rely on the REALLOC done on live definition,
> since vm->def now points to the persistent definition.
> Skip adding the attached devices to domain definition
> if the domain crashed.
>
> In AttachChrDevice, the chardev was already added to the
> live definition and freed by qemuProcessStop in the case
> of a crash. Skip the device removal in that case.
> ---
> src/qemu/qemu_hotplug.c | 54 ++++++++++++++++++++++++++++++++-----------------
> 1 file changed, 36 insertions(+), 18 deletions(-)
>
> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> index c480dcd..a4e4d6b 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -391,7 +391,10 @@ qemuDomainAttachVirtioDiskDevice(virConnectPtr conn,
> memcpy(&disk->info.addr.pci, &guestAddr, sizeof(guestAddr));
> }
> }
> - qemuDomainObjExitMonitor(driver, vm);
> + if (qemuDomainObjExitMonitor(driver, vm) < 0) {
> + releaseaddr = false;
> + ret = -1;
> + }
So here's another case where will will do the Audit even though
ExitMonitor fails - seems to contract the check in 4/14...
>
> virDomainAuditDisk(vm, NULL, disk->src, "attach", ret >= 0);
>
> @@ -477,7 +480,10 @@ int qemuDomainAttachControllerDevice(virQEMUDriverPtr driver,
> type,
> &controller->info.addr.pci);
> }
> - qemuDomainObjExitMonitor(driver, vm);
> + if (qemuDomainObjExitMonitor(driver, vm) < 0) {
> + releaseaddr = false;
> + ret = -1;
> + }
No Audit for AttachController, but detach and remove don't have one
either...
>
> if (ret == 0) {
> if (controller->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)
> @@ -628,7 +634,8 @@ qemuDomainAttachSCSIDisk(virConnectPtr conn,
> disk->info.addr.drive.unit = driveAddr.unit;
> }
> }
> - qemuDomainObjExitMonitor(driver, vm);
> + if (qemuDomainObjExitMonitor(driver, vm) < 0)
> + ret = -1;
Again here we do the Audit...
>
> virDomainAuditDisk(vm, NULL, disk->src, "attach", ret >= 0);
>
> @@ -708,7 +715,8 @@ qemuDomainAttachUSBMassstorageDevice(virConnectPtr conn,
> } else {
> ret = qemuMonitorAddUSBDisk(priv->mon, src);
> }
> - qemuDomainObjExitMonitor(driver, vm);
> + if (qemuDomainObjExitMonitor(driver, vm) < 0)
> + ret = -1;
Again the Audit is done
>
> virDomainAuditDisk(vm, NULL, disk->src, "attach", ret >= 0);
>
> @@ -1272,7 +1280,8 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr driver,
> qemuDomainObjEnterMonitor(driver, vm);
> ret = qemuMonitorAddDeviceWithFd(priv->mon, devstr,
> configfd, configfd_name);
> - qemuDomainObjExitMonitor(driver, vm);
> + if (qemuDomainObjExitMonitor(driver, vm) < 0)
> + ret = -1;
after the else is the Audit
> } else {
> virDevicePCIAddressPtr guestAddr = &hostdev->info->addr.pci;
> virDevicePCIAddressPtr hostAddr = &hostdev->source.subsys.u.pci.addr;
> @@ -1288,7 +1297,8 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr driver,
>
> qemuDomainObjEnterMonitor(driver, vm);
> ret = qemuMonitorAddPCIHostDevice(priv->mon, hostAddr, guestAddr);
> - qemuDomainObjExitMonitor(driver, vm);
> + if (qemuDomainObjExitMonitor(driver, vm) < 0)
> + ret = -1;
same function, same Audit
>
> hostdev->info->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
> }
> @@ -1352,12 +1362,11 @@ int qemuDomainAttachRedirdevDevice(virQEMUDriverPtr driver,
> goto error;
>
> qemuDomainObjEnterMonitor(driver, vm);
> - if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE))
> - ret = qemuMonitorAddDevice(priv->mon, devstr);
> - else
> - goto error;
> + ret = qemuMonitorAddDevice(priv->mon, devstr);
> +
> + if (qemuDomainObjExitMonitor(driver, vm) < 0)
> + ret = -1;
Here we Audit again
>
> - qemuDomainObjExitMonitor(driver, vm);
> virDomainAuditRedirdev(vm, redirdev, "attach", ret == 0);
> if (ret < 0)
> goto error;
> @@ -1479,17 +1488,22 @@ int qemuDomainAttachChrDevice(virQEMUDriverPtr driver,
>
> qemuDomainObjEnterMonitor(driver, vm);
> if (qemuMonitorAttachCharDev(priv->mon, charAlias, &chr->source) < 0) {
> - qemuDomainObjExitMonitor(driver, vm);
> + if (qemuDomainObjExitMonitor(driver, vm) < 0)
> + need_remove = false;
> goto audit;
Auditing here too.
> }
>
> if (devstr && qemuMonitorAddDevice(priv->mon, devstr) < 0) {
> /* detach associated chardev on error */
> qemuMonitorDetachCharDev(priv->mon, charAlias);
> - qemuDomainObjExitMonitor(driver, vm);
> + if (qemuDomainObjExitMonitor(driver, vm) < 0)
> + need_remove = false;
> + goto audit;
> + }
> + if (qemuDomainObjExitMonitor(driver, vm) < 0) {
> + need_remove = false;
> goto audit;
Same...
> }
> - qemuDomainObjExitMonitor(driver, vm);
>
> ret = 0;
> audit:
> @@ -1545,7 +1559,8 @@ qemuDomainAttachHostUSBDevice(virQEMUDriverPtr driver,
> ret = qemuMonitorAddUSBDeviceExact(priv->mon,
> hostdev->source.subsys.u.usb.bus,
> hostdev->source.subsys.u.usb.device);
> - qemuDomainObjExitMonitor(driver, vm);
> + if (qemuDomainObjExitMonitor(driver, vm) < 0)
> + ret = -1;
Same
> virDomainAuditHostdev(vm, hostdev, "attach", ret == 0);
> if (ret < 0)
> goto cleanup;
> @@ -1648,7 +1663,8 @@ qemuDomainAttachHostSCSIDevice(virConnectPtr conn,
> }
> }
> }
> - qemuDomainObjExitMonitor(driver, vm);
> + if (qemuDomainObjExitMonitor(driver, vm) < 0)
> + ret = -1;
Same
John
>
> virDomainAuditHostdev(vm, hostdev, "attach", ret == 0);
> if (ret < 0)
> @@ -1848,7 +1864,8 @@ int qemuDomainChangeNetLinkState(virQEMUDriverPtr driver,
> dev->linkstate = linkstate;
>
> cleanup:
> - qemuDomainObjExitMonitor(driver, vm);
> + if (qemuDomainObjExitMonitor(driver, vm) < 0)
> + return -1;
>
> return ret;
> }
> @@ -3633,7 +3650,8 @@ qemuDomainChangeGraphicsPasswords(virQEMUDriverPtr driver,
> }
>
> end_job:
> - qemuDomainObjExitMonitor(driver, vm);
> + if (qemuDomainObjExitMonitor(driver, vm) < 0)
> + ret = -1;
> cleanup:
> virObjectUnref(cfg);
> return ret;
>
More information about the libvir-list
mailing list