This patch is identical to the patch fixing this same issue in the qemu
hypervisor.
---
src/lxc/lxc_driver.c | 28 +++++++++++++++++++++++++++-
1 files changed, 27 insertions(+), 1 deletions(-)
diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
index c475887..a2ef8a1 100644
--- a/src/lxc/lxc_driver.c
+++ b/src/lxc/lxc_driver.c
@@ -67,6 +67,8 @@ typedef lxcDomainObjPrivate *lxcDomainObjPrivatePtr;
struct _lxcDomainObjPrivate {
int monitor;
int monitorWatch;
+
+ virStreamPtr console;
};
@@ -102,6 +104,9 @@ static void lxcDomainObjPrivateFree(void *data)
{
lxcDomainObjPrivatePtr priv = data;
+ if (priv->console)
+ virStreamFree(priv->console);
+
VIR_FREE(priv);
}
@@ -2868,8 +2873,10 @@ lxcDomainOpenConsole(virDomainPtr dom,
char uuidstr[VIR_UUID_STRING_BUFLEN];
int ret = -1;
virDomainChrDefPtr chr = NULL;
+ lxcDomainObjPrivatePtr priv;
- virCheckFlags(0, -1);
+ virCheckFlags(VIR_DOMAIN_CONSOLE_TRY |
+ VIR_DOMAIN_CONSOLE_FORCE, -1);
lxcDriverLock(driver);
virUUIDFormat(dom->uuid, uuidstr);
@@ -2898,6 +2905,8 @@ lxcDomainOpenConsole(virDomainPtr dom,
chr = vm->def->serials[0];
}
+ priv = vm->privateData;
+
if (!chr) {
lxcError(VIR_ERR_INTERNAL_ERROR, "%s",
_("cannot find default console device"));
@@ -2910,10 +2919,27 @@ lxcDomainOpenConsole(virDomainPtr dom,
goto cleanup;
}
+ /* kill open console stream */
+ if (priv->console) {
+ if (virFDStreamIsOpen(priv->console) &&
+ !(flags & VIR_DOMAIN_CONSOLE_FORCE)) {
+ lxcError(VIR_ERR_OPERATION_FAILED,
+ _("Active console session exists for this
domain"));
+ goto cleanup;
+ }
+
+ virStreamAbort(priv->console);
+ virStreamFree(priv->console);
+ priv->console = NULL;
+ }
+
if (virFDStreamOpenFile(st, chr->source.data.file.path,
0, 0, O_RDWR) < 0)
goto cleanup;
+ virStreamRef(st);
+ priv->console = st;
+
ret = 0;
cleanup:
if (vm)
--
1.7.3.4