]> xenbits.xensource.com Git - libvirt.git/commitdiff
libxl: use serial device for console when targetType is serial
authorJim Fehlig <jfehlig@suse.com>
Wed, 22 Jun 2016 02:25:23 +0000 (20:25 -0600)
committerJim Fehlig <jfehlig@suse.com>
Wed, 22 Jun 2016 21:06:27 +0000 (15:06 -0600)
When domXML contains only <console type='pty'> and no corresponding
<serial>, the console is "stolen" [1] and used as the first <serial>
device. When this "stolen" console is accessed from the libxl driver
(in libxlConsoleCallback and libxlDomainOpenConsole), check if the
targetType is VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL, and use the
"stolen" device in def->serials[0] instead. Prior to this change,
creating a domain with input XML containing only a <console> device
and subsequently attempting to access its console with
'virsh console' would fail

error: internal error: character device <null> is not using a PTY

[1] See comments associated with virDomainDefAddConsoleCompat() in
    $LIBVIRT-SRC/src/conf/domain_conf.c:

src/libxl/libxl_domain.c
src/libxl/libxl_driver.c

index 221af8754d1ee8bfbf17df08958234482873aec6..6bcb4d93defd213b39c507990bf855167ce217bd 100644 (file)
@@ -964,13 +964,17 @@ libxlConsoleCallback(libxl_ctx *ctx, libxl_event *ev, void *for_callback)
     virObjectLock(vm);
     for (i = 0; i < vm->def->nconsoles; i++) {
         virDomainChrDefPtr chr = vm->def->consoles[i];
-        if (chr && chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY) {
+        if (i == 0 &&
+            chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL)
+            chr = vm->def->serials[0];
+
+        if (chr->source.type == VIR_DOMAIN_CHR_TYPE_PTY) {
             libxl_console_type console_type;
             char *console = NULL;
             int ret;
 
             console_type =
-                (chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL ?
+                (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL ?
                  LIBXL_CONSOLE_TYPE_SERIAL : LIBXL_CONSOLE_TYPE_PV);
             ret = libxl_console_get_tty(ctx, ev->domid,
                                         chr->target.port, console_type,
index c8c1f074a6e7ccfaae427dc53fb622ec0067615d..3189f1c598fb73a63e2c486ab5e55f2c9174571a 100644 (file)
@@ -4443,8 +4443,11 @@ libxlDomainOpenConsole(virDomainPtr dom,
 
     priv = vm->privateData;
 
-    if (vm->def->nconsoles)
+    if (vm->def->nconsoles) {
         chr = vm->def->consoles[0];
+        if (chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL)
+            chr = vm->def->serials[0];
+    }
 
     if (!chr) {
         virReportError(VIR_ERR_INTERNAL_ERROR,