提交 7300ca21 编写于 作者: J John Ferlan

qemu: Clean up error path in qemuDomainAttachRedirdevDevice

It's about to get more complicated - let's alter the logic to handle
various failures. Adds saving of the error as well.
上级 8b82355e
...@@ -1509,6 +1509,8 @@ int qemuDomainAttachRedirdevDevice(virQEMUDriverPtr driver, ...@@ -1509,6 +1509,8 @@ int qemuDomainAttachRedirdevDevice(virQEMUDriverPtr driver,
virDomainDefPtr def = vm->def; virDomainDefPtr def = vm->def;
char *charAlias = NULL; char *charAlias = NULL;
char *devstr = NULL; char *devstr = NULL;
bool chardevAdded = false;
virErrorPtr orig_err;
if (qemuAssignDeviceRedirdevAlias(def, redirdev, -1) < 0) if (qemuAssignDeviceRedirdevAlias(def, redirdev, -1) < 0)
goto cleanup; goto cleanup;
...@@ -1525,17 +1527,12 @@ int qemuDomainAttachRedirdevDevice(virQEMUDriverPtr driver, ...@@ -1525,17 +1527,12 @@ int qemuDomainAttachRedirdevDevice(virQEMUDriverPtr driver,
qemuDomainObjEnterMonitor(driver, vm); qemuDomainObjEnterMonitor(driver, vm);
if (qemuMonitorAttachCharDev(priv->mon, if (qemuMonitorAttachCharDev(priv->mon,
charAlias, charAlias,
redirdev->source.chr) < 0) { redirdev->source.chr) < 0)
ignore_value(qemuDomainObjExitMonitor(driver, vm)); goto exit_monitor;
goto audit; chardevAdded = true;
}
if (qemuMonitorAddDevice(priv->mon, devstr) < 0) { if (qemuMonitorAddDevice(priv->mon, devstr) < 0)
/* detach associated chardev on error */ goto exit_monitor;
qemuMonitorDetachCharDev(priv->mon, charAlias);
ignore_value(qemuDomainObjExitMonitor(driver, vm));
goto audit;
}
if (qemuDomainObjExitMonitor(driver, vm) < 0) if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto audit; goto audit;
...@@ -1548,6 +1545,18 @@ int qemuDomainAttachRedirdevDevice(virQEMUDriverPtr driver, ...@@ -1548,6 +1545,18 @@ int qemuDomainAttachRedirdevDevice(virQEMUDriverPtr driver,
VIR_FREE(charAlias); VIR_FREE(charAlias);
VIR_FREE(devstr); VIR_FREE(devstr);
return ret; return ret;
exit_monitor:
orig_err = virSaveLastError();
/* detach associated chardev on error */
if (chardevAdded)
ignore_value(qemuMonitorDetachCharDev(priv->mon, charAlias));
if (orig_err) {
virSetError(orig_err);
virFreeError(orig_err);
}
ignore_value(qemuDomainObjExitMonitor(driver, vm));
goto audit;
} }
static int static int
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册