[libvirt] [PATCH] libxl: use serial device for console when targetType is serial

Cole Robinson crobinso at redhat.com
Wed Jun 22 20:03:11 UTC 2016


On 06/22/2016 03:45 PM, Jim Fehlig wrote:
> 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:
> 
> Signed-off-by: Jim Fehlig <jfehlig at suse.com>
> ---
>  src/libxl/libxl_domain.c | 8 ++++++--
>  src/libxl/libxl_driver.c | 5 ++++-
>  2 files changed, 10 insertions(+), 3 deletions(-)
> 
> diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
> index 221af87..6bcb4d9 100644
> --- a/src/libxl/libxl_domain.c
> +++ b/src/libxl/libxl_domain.c
> @@ -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,
> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
> index c8c1f07..3189f1c 100644
> --- a/src/libxl/libxl_driver.c
> +++ b/src/libxl/libxl_driver.c
> @@ -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,
> 

ACK (if my ACK is sufficient for functional libxl changes :) )

= Cole




More information about the libvir-list mailing list