
On 12/07/2011 11:08 AM, Peter Krempa wrote:
This patch fixes console corruption, that happens if two concurrent sessions are opened for a single console on a domain. Result of this corruption was, that each of the console streams did recieve just a part
s/was, that/was that/ s/did recieve/received/
of the data written to the pipe so every console rendered unusable.
s/pipe so every console/pipe, and both sessions were/
New helper function for safe console handling is used to establis the
s/establis/establish/
console stream connection. This function ensurest that no other libvirt
s/ensurest/ensures/
client is using the console (with the ability to disconnect consoles of libvirt clients) and that no UUCP style lockfile is placed on the PTY device.
* src/qemu/qemu_domain.h - add data structure to domain's private data dealing with console connections * src/qemu/qemu_domain.c: - allocate/free domain's console data structure * src/qemu/qemu_driver.c - use the new helper function for console handling --- src/qemu/qemu_domain.c | 5 +++++ src/qemu/qemu_domain.h | 3 +++ src/qemu/qemu_driver.c | 21 ++++++++++++++++----- 3 files changed, 24 insertions(+), 5 deletions(-)
+++ b/src/qemu/qemu_driver.c @@ -10847,8 +10847,10 @@ qemuDomainOpenConsole(virDomainPtr dom, int ret = -1; int i; virDomainChrDefPtr chr = NULL; + qemuDomainObjPrivatePtr priv;
- virCheckFlags(0, -1); + virCheckFlags(VIR_DOMAIN_CONSOLE_TRY | + VIR_DOMAIN_CONSOLE_FORCE, -1);
Failed to compile, if you applied my proposed fixups to 1/6 (https://www.redhat.com/archives/libvir-list/2011-December/msg00624.html): qemu/qemu_driver.c:11284:50: error: 'VIR_DOMAIN_CONSOLE_TRY' undeclared (first use in this function)
@@ -10900,11 +10904,18 @@ qemuDomainOpenConsole(virDomainPtr dom, goto cleanup; }
- if (virFDStreamOpenFile(st, chr->source.data.file.path, - 0, 0, O_RDWR) < 0) - goto cleanup; + /* handle mutualy exclusive access to console devices */
s/mutualy/mutually/
+ ret = virDomainSafeConsoleOpen(priv->cons, + chr->source.data.file.path, + st, + (flags & VIR_DOMAIN_CONSOLE_FORCE) != 0); + + if (ret == 1) { + qemuReportError(VIR_ERR_OPERATION_FAILED, + _("Active console session exists for this domain")); + ret = -1; + }
- ret = 0;
Looks simple, compared to the bulk of the work in patch 5/6. Here's what I would squash in, as part of rebasing the series to latest. diff --git i/src/qemu/qemu_driver.c w/src/qemu/qemu_driver.c index 0f358df..beffdf5 100644 --- i/src/qemu/qemu_driver.c +++ w/src/qemu/qemu_driver.c @@ -11281,8 +11281,7 @@ qemuDomainOpenConsole(virDomainPtr dom, virDomainChrDefPtr chr = NULL; qemuDomainObjPrivatePtr priv; - virCheckFlags(VIR_DOMAIN_CONSOLE_TRY | - VIR_DOMAIN_CONSOLE_FORCE, -1); + virCheckFlags(VIR_DOMAIN_CONSOLE_FORCE, -1); qemuDriverLock(driver); virUUIDFormat(dom->uuid, uuidstr); -- Eric Blake eblake@redhat.com +1-919-301-3266 Libvirt virtualization library http://libvirt.org