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@xxxxxxxxxx +1-919-301-3266 Libvirt virtualization library http://libvirt.org
Attachment:
signature.asc
Description: OpenPGP digital signature
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list