mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-22 11:22:23 +00:00
libxl: Set path to console on domain startup.
The path to the pty of a Xen PV console is set only in virDomainOpenConsole. But this is done too late. A call to virDomainGetXMLDesc done before OpenConsole will not have the path to the pty, but a call after OpenConsole will. e.g. of the current issue. Starting a domain with '<console type="pty"/>' Then: virDomainGetXMLDesc(): <devices> <console type='pty'> <target type='xen' port='0'/> </console> </devices> virDomainOpenConsole() virDomainGetXMLDesc(): <devices> <console type='pty' tty='/dev/pts/30'> <source path='/dev/pts/30'/> <target type='xen' port='0'/> </console> </devices> The patch intend to have the TTY path on the first call of GetXMLDesc. This is done by setting up the path at domain start up instead of in OpenConsole. https://bugzilla.redhat.com/show_bug.cgi?id=1170743 Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
This commit is contained in:
parent
87fa184910
commit
368042cf4a
@ -1149,6 +1149,42 @@ libxlDomainFreeMem(libxlDomainObjPrivatePtr priv, libxl_domain_config *d_config)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
libxlConsoleCallback(libxl_ctx *ctx, libxl_event* ev, void *for_callback)
|
||||
{
|
||||
virDomainObjPtr vm = for_callback;
|
||||
libxlDomainObjPrivatePtr priv = vm->privateData;
|
||||
size_t i;
|
||||
|
||||
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) {
|
||||
libxl_console_type console_type;
|
||||
char *console = NULL;
|
||||
int ret;
|
||||
|
||||
console_type =
|
||||
(chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL ?
|
||||
LIBXL_CONSOLE_TYPE_SERIAL : LIBXL_CONSOLE_TYPE_PV);
|
||||
ret = libxl_console_get_tty(priv->ctx, ev->domid,
|
||||
chr->target.port, console_type,
|
||||
&console);
|
||||
if (!ret) {
|
||||
VIR_FREE(chr->source.data.file.path);
|
||||
if (console && console[0] != '\0') {
|
||||
ignore_value(VIR_STRDUP(chr->source.data.file.path,
|
||||
console));
|
||||
}
|
||||
}
|
||||
VIR_FREE(console);
|
||||
}
|
||||
}
|
||||
virObjectUnlock(vm);
|
||||
libxl_event_free(ctx, ev);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Start a domain through libxenlight.
|
||||
*
|
||||
@ -1173,6 +1209,7 @@ libxlDomainStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
|
||||
libxl_domain_restore_params params;
|
||||
#endif
|
||||
virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr;
|
||||
libxl_asyncprogress_how aop_console_how;
|
||||
|
||||
libxl_domain_config_init(&d_config);
|
||||
|
||||
@ -1242,17 +1279,21 @@ libxlDomainStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
|
||||
|
||||
/* Unlock virDomainObj while creating the domain */
|
||||
virObjectUnlock(vm);
|
||||
|
||||
aop_console_how.for_callback = vm;
|
||||
aop_console_how.callback = libxlConsoleCallback;
|
||||
if (restore_fd < 0) {
|
||||
ret = libxl_domain_create_new(priv->ctx, &d_config,
|
||||
&domid, NULL, NULL);
|
||||
&domid, NULL, &aop_console_how);
|
||||
} else {
|
||||
#ifdef LIBXL_HAVE_DOMAIN_CREATE_RESTORE_PARAMS
|
||||
params.checkpointed_stream = 0;
|
||||
ret = libxl_domain_create_restore(priv->ctx, &d_config, &domid,
|
||||
restore_fd, ¶ms, NULL, NULL);
|
||||
restore_fd, ¶ms, NULL,
|
||||
&aop_console_how);
|
||||
#else
|
||||
ret = libxl_domain_create_restore(priv->ctx, &d_config, &domid,
|
||||
restore_fd, NULL, NULL);
|
||||
restore_fd, NULL, &aop_console_how);
|
||||
#endif
|
||||
}
|
||||
virObjectLock(vm);
|
||||
|
@ -3991,10 +3991,8 @@ libxlDomainOpenConsole(virDomainPtr dom,
|
||||
{
|
||||
virDomainObjPtr vm = NULL;
|
||||
int ret = -1;
|
||||
libxl_console_type console_type;
|
||||
virDomainChrDefPtr chr = NULL;
|
||||
libxlDomainObjPrivatePtr priv;
|
||||
char *console = NULL;
|
||||
|
||||
virCheckFlags(VIR_DOMAIN_CONSOLE_FORCE, -1);
|
||||
|
||||
@ -4036,18 +4034,6 @@ libxlDomainOpenConsole(virDomainPtr dom,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
console_type =
|
||||
(chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL ?
|
||||
LIBXL_CONSOLE_TYPE_SERIAL : LIBXL_CONSOLE_TYPE_PV);
|
||||
|
||||
ret = libxl_console_get_tty(priv->ctx, vm->def->id, chr->target.port,
|
||||
console_type, &console);
|
||||
if (ret)
|
||||
goto cleanup;
|
||||
|
||||
if (VIR_STRDUP(chr->source.data.file.path, console) < 0)
|
||||
goto cleanup;
|
||||
|
||||
/* handle mutually exclusive access to console devices */
|
||||
ret = virChrdevOpen(priv->devs,
|
||||
&chr->source,
|
||||
@ -4061,7 +4047,6 @@ libxlDomainOpenConsole(virDomainPtr dom,
|
||||
}
|
||||
|
||||
cleanup:
|
||||
VIR_FREE(console);
|
||||
if (vm)
|
||||
virObjectUnlock(vm);
|
||||
return ret;
|
||||
|
Loading…
x
Reference in New Issue
Block a user