[libvirt] [PATCH v2 08/12] qemu: hotplug: Adjust error path for attach virtio disk
Cole Robinson
crobinso at redhat.com
Wed Apr 27 23:20:08 UTC 2016
On 04/16/2016 10:17 AM, John Ferlan wrote:
> Adjust error path logic to make it clearer how to undo the failed add.
>
> Signed-off-by: John Ferlan <jferlan at redhat.com>
> ---
> src/qemu/qemu_hotplug.c | 55 ++++++++++++++++++++++++++++---------------------
> 1 file changed, 32 insertions(+), 23 deletions(-)
>
> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> index ae314be..17a70a3 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -318,6 +318,7 @@ qemuDomainAttachVirtioDiskDevice(virConnectPtr conn,
> {
> int ret = -1;
> qemuDomainObjPrivatePtr priv = vm->privateData;
> + virErrorPtr orig_err;
> char *devstr = NULL;
> char *drivestr = NULL;
> char *drivealias = NULL;
> @@ -368,36 +369,24 @@ qemuDomainAttachVirtioDiskDevice(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) {
> - virErrorPtr orig_err = virSaveLastError();
> - if (!drivealias ||
> - qemuMonitorDriveDel(priv->mon, drivealias) < 0) {
> - VIR_WARN("Unable to remove drive %s (%s) after failed "
> - "qemuMonitorAddDevice",
> - NULLSTR(drivealias), drivestr);
> - }
> - if (orig_err) {
> - virSetError(orig_err);
> - virFreeError(orig_err);
> - }
> - }
> - }
> +
> + if (qemuMonitorAddDrive(priv->mon, drivestr) < 0)
> + goto failadddrive;
> +
> + if (qemuMonitorAddDevice(priv->mon, devstr) < 0)
> + goto failadddevice;
> +
> if (qemuDomainObjExitMonitor(driver, vm) < 0) {
> releaseaddr = false;
> - ret = -1;
> - goto error;
> + goto failexitmonitor;
> }
>
> - virDomainAuditDisk(vm, NULL, disk->src, "attach", ret >= 0);
> -
> - if (ret < 0)
> - goto error;
> + virDomainAuditDisk(vm, NULL, disk->src, "attach", true);
>
> virDomainDiskInsertPreAlloced(vm->def, disk);
> + ret = 0;
>
> cleanup:
> qemuDomainSecretDiskDestroy(disk);
> @@ -407,6 +396,26 @@ qemuDomainAttachVirtioDiskDevice(virConnectPtr conn,
> virObjectUnref(cfg);
> return ret;
>
> + failadddevice:
> + orig_err = virSaveLastError();
> + if (!drivealias ||
> + qemuMonitorDriveDel(priv->mon, drivealias) < 0) {
> + VIR_WARN("Unable to remove drive %s (%s) after failed "
> + "qemuMonitorAddDevice",
> + NULLSTR(drivealias), drivestr);
Hey there it is ;)
ACK
- Cole
More information about the libvir-list
mailing list