From: John Ferlan Date: Mon, 11 Apr 2016 13:42:54 +0000 (-0400) Subject: qemu: hotplug: Adjust error path for attach scsi disk X-Git-Tag: v1.3.5-rc1~471 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b0e002fcfd9e5d6f8c7362ba2738e9e2fe00fe54;p=thirdparty%2Flibvirt.git qemu: hotplug: Adjust error path for attach scsi disk Adjust error path logic to make it clearer how to undo the failed add. Signed-off-by: John Ferlan --- diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 3f25ef451a..396acd876e 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -590,29 +590,22 @@ qemuDomainAttachSCSIDisk(virConnectPtr conn, if (VIR_REALLOC_N(vm->def->disks, vm->def->ndisks+1) < 0) goto error; + /* Attach the device - 2 step process */ qemuDomainObjEnterMonitor(driver, vm); - ret = qemuMonitorAddDrive(priv->mon, drivestr); - if (ret == 0) { - ret = qemuMonitorAddDevice(priv->mon, devstr); - if (ret < 0) { - VIR_WARN("qemuMonitorAddDevice failed on %s (%s)", - drivestr, devstr); - /* XXX should call 'drive_del' on error but this does not exist yet */ - } - } + if (qemuMonitorAddDrive(priv->mon, drivestr) < 0) + goto failadddrive; - if (qemuDomainObjExitMonitor(driver, vm) < 0) { - ret = -1; - goto error; - } + if (qemuMonitorAddDevice(priv->mon, devstr) < 0) + goto failadddevice; - virDomainAuditDisk(vm, NULL, disk->src, "attach", ret >= 0); + if (qemuDomainObjExitMonitor(driver, vm) < 0) + goto failexitmonitor; - if (ret < 0) - goto error; + virDomainAuditDisk(vm, NULL, disk->src, "attach", true); virDomainDiskInsertPreAlloced(vm->def, disk); + ret = 0; cleanup: qemuDomainSecretDiskDestroy(disk); @@ -621,6 +614,16 @@ qemuDomainAttachSCSIDisk(virConnectPtr conn, virObjectUnref(cfg); return ret; + failadddevice: + /* XXX should call 'drive_del' on error but this does not exist yet */ + VIR_WARN("qemuMonitorAddDevice failed on %s (%s)", drivestr, devstr); + + failadddrive: + ignore_value(qemuDomainObjExitMonitor(driver, vm)); + + failexitmonitor: + virDomainAuditDisk(vm, NULL, disk->src, "attach", false); + error: ignore_value(qemuDomainPrepareDisk(driver, vm, disk, NULL, true)); goto cleanup;