mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
qemu: Alter error path cleanup for qemuDomainAttachHostSCSIDevice
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.
This commit is contained in:
parent
28e191a96c
commit
6fe2eb2458
@ -1874,6 +1874,7 @@ qemuDomainAttachHostSCSIDevice(virConnectPtr conn,
|
|||||||
char *drvstr = NULL;
|
char *drvstr = NULL;
|
||||||
bool teardowncgroup = false;
|
bool teardowncgroup = false;
|
||||||
bool teardownlabel = false;
|
bool teardownlabel = false;
|
||||||
|
bool driveAdded = false;
|
||||||
|
|
||||||
if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE_SCSI_GENERIC)) {
|
if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE_SCSI_GENERIC)) {
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
@ -1935,17 +1936,17 @@ qemuDomainAttachHostSCSIDevice(virConnectPtr conn,
|
|||||||
if (VIR_REALLOC_N(vm->def->hostdevs, vm->def->nhostdevs + 1) < 0)
|
if (VIR_REALLOC_N(vm->def->hostdevs, vm->def->nhostdevs + 1) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
/* Attach the device - 2 step process */
|
|
||||||
qemuDomainObjEnterMonitor(driver, vm);
|
qemuDomainObjEnterMonitor(driver, vm);
|
||||||
|
|
||||||
if (qemuMonitorAddDrive(priv->mon, drvstr) < 0)
|
if (qemuMonitorAddDrive(priv->mon, drvstr) < 0)
|
||||||
goto failadddrive;
|
goto exit_monitor;
|
||||||
|
driveAdded = true;
|
||||||
|
|
||||||
if (qemuMonitorAddDevice(priv->mon, devstr) < 0)
|
if (qemuMonitorAddDevice(priv->mon, devstr) < 0)
|
||||||
goto failadddevice;
|
goto exit_monitor;
|
||||||
|
|
||||||
if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
||||||
goto failexitmonitor;
|
goto cleanup;
|
||||||
|
|
||||||
virDomainAuditHostdev(vm, hostdev, "attach", true);
|
virDomainAuditHostdev(vm, hostdev, "attach", true);
|
||||||
|
|
||||||
@ -1968,21 +1969,19 @@ qemuDomainAttachHostSCSIDevice(virConnectPtr conn,
|
|||||||
VIR_FREE(devstr);
|
VIR_FREE(devstr);
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
failadddevice:
|
exit_monitor:
|
||||||
orig_err = virSaveLastError();
|
orig_err = virSaveLastError();
|
||||||
if (qemuMonitorDriveDel(priv->mon, drvstr) < 0)
|
if (driveAdded && qemuMonitorDriveDel(priv->mon, drvstr) < 0) {
|
||||||
VIR_WARN("Unable to remove drive %s (%s) after failed "
|
VIR_WARN("Unable to remove drive %s (%s) after failed "
|
||||||
"qemuMonitorAddDevice",
|
"qemuMonitorAddDevice",
|
||||||
drvstr, devstr);
|
drvstr, devstr);
|
||||||
|
}
|
||||||
if (orig_err) {
|
if (orig_err) {
|
||||||
virSetError(orig_err);
|
virSetError(orig_err);
|
||||||
virFreeError(orig_err);
|
virFreeError(orig_err);
|
||||||
}
|
}
|
||||||
|
|
||||||
failadddrive:
|
|
||||||
ignore_value(qemuDomainObjExitMonitor(driver, vm));
|
ignore_value(qemuDomainObjExitMonitor(driver, vm));
|
||||||
|
|
||||||
failexitmonitor:
|
|
||||||
virDomainAuditHostdev(vm, hostdev, "attach", false);
|
virDomainAuditHostdev(vm, hostdev, "attach", false);
|
||||||
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
Loading…
Reference in New Issue
Block a user