[libvirt] [PATCH 5/7] qemu: Alter error path cleanup for qemuDomainAttachRNGDevice

Ján Tomko jtomko at redhat.com
Tue Jul 19 10:38:42 UTC 2016


On Fri, Jul 15, 2016 at 07:50:25AM -0400, John Ferlan wrote:
>Based on recent review comment - rather than have a spate of goto failxxxx,
>change to a boolean based model. Ensures that the original error can be
>preserved and cleanup is a bit more orderly if more objects are added.
>
>Signed-off-by: John Ferlan <jferlan at redhat.com>
>---
> src/qemu/qemu_hotplug.c | 44 ++++++++++++++++++++++++++------------------
> 1 file changed, 26 insertions(+), 18 deletions(-)
>
>diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
>index a220d9f..c5a1a91 100644
>--- a/src/qemu/qemu_hotplug.c
>+++ b/src/qemu/qemu_hotplug.c
>@@ -1587,12 +1587,17 @@ qemuDomainAttachRNGDevice(virQEMUDriverPtr driver,
>                           virDomainRNGDefPtr rng)
> {
>     qemuDomainObjPrivatePtr priv = vm->privateData;
>+    virErrorPtr orig_err;
>     char *devstr = NULL;
>     char *charAlias = NULL;
>     char *objAlias = NULL;
>+    bool releaseaddr = false;
>+    bool cleanupCharAlias = false;

could be chardevAdded

>+    bool cleanupObjAlias = false;

objAdded

>     virJSONValuePtr props = NULL;
>     const char *type;
>     int ret = -1;
>+    int rv;
>
>     if (qemuAssignDeviceRNGAlias(vm->def, rng) < 0)
>         return -1;
>@@ -1613,6 +1618,7 @@ qemuDomainAttachRNGDevice(virQEMUDriverPtr driver,
>                                             rng->source.file))
>             return -1;
>     }
>+    releaseaddr = true;
>
>     if (rng->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE ||
>         rng->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
>@@ -1637,23 +1643,25 @@ qemuDomainAttachRNGDevice(virQEMUDriverPtr driver,
>     if (virAsprintf(&charAlias, "char%s", rng->info.alias) < 0)
>         goto cleanup;
>
>-    /* attach the device - up to a 3 stage process */
>     qemuDomainObjEnterMonitor(driver, vm);
>
>     if (rng->backend == VIR_DOMAIN_RNG_BACKEND_EGD &&
>         qemuMonitorAttachCharDev(priv->mon, charAlias,
>                                  rng->source.chardev) < 0)
>-        goto failchardev;
>+        goto monitor_error;
>+    cleanupCharAlias = true;
>
>-    if (qemuMonitorAddObject(priv->mon, type, objAlias, props) < 0)
>-        goto failbackend;
>-    props = NULL;
>+    rv = qemuMonitorAddObject(priv->mon, type, objAlias, props);
>+    props = NULL; /* qemuMonitorAddObject consumes */
>+    if (rv < 0)
>+        goto monitor_error;
>+    cleanupObjAlias = true;
>
>     if (qemuMonitorAddDevice(priv->mon, devstr) < 0)
>-        goto failfrontend;
>+        goto monitor_error;
>
>     if (qemuDomainObjExitMonitor(driver, vm) < 0) {
>-        vm = NULL;
>+        releaseaddr = false;
>         goto cleanup;
>     }
>
>@@ -1665,24 +1673,24 @@ qemuDomainAttachRNGDevice(virQEMUDriverPtr driver,
>     virDomainAuditRNG(vm, NULL, rng, "attach", ret == 0);
>  cleanup:
>     virJSONValueFree(props);
>-    if (ret < 0 && vm)
>+    if (ret < 0 && releaseaddr)
>         qemuDomainReleaseDeviceAddress(vm, &rng->info, NULL);
>     VIR_FREE(charAlias);
>     VIR_FREE(objAlias);
>     VIR_FREE(devstr);
>     return ret;
>
>-    /* rollback */
>- failfrontend:
>-    ignore_value(qemuMonitorDelObject(priv->mon, objAlias));
>- failbackend:
>-    if (rng->backend == VIR_DOMAIN_RNG_BACKEND_EGD)
>+ monitor_error:

exit_monitor is nicer IMO.

>+    orig_err = virSaveLastError();
>+    if (cleanupObjAlias)
>+        ignore_value(qemuMonitorDelObject(priv->mon, objAlias));
>+    if (rng->backend == VIR_DOMAIN_RNG_BACKEND_EGD && cleanupCharAlias)
>         ignore_value(qemuMonitorDetachCharDev(priv->mon, charAlias));
>-    props = NULL;  /* qemuMonitorAddObject consumes on failure */
>- failchardev:
>-    if (qemuDomainObjExitMonitor(driver, vm) < 0) {
>-        vm = NULL;
>-        goto cleanup;
>+    if (qemuDomainObjExitMonitor(driver, vm) < 0)

Same comment about the error applies.

Jan

>+        releaseaddr = false;
>+    if (orig_err) {
>+        virSetError(orig_err);
>+        virFreeError(orig_err);
>     }
>
>     goto audit;
>-- 
>2.5.5
>
>--
>libvir-list mailing list
>libvir-list at redhat.com
>https://www.redhat.com/mailman/listinfo/libvir-list




More information about the libvir-list mailing list