[libvirt] [PATCH] conf: Don't drop console definition on domain restart
Daniel Veillard
veillard at redhat.com
Fri Nov 25 02:39:51 UTC 2011
On Thu, Nov 24, 2011 at 04:57:41PM +0100, Michal Privoznik wrote:
> One of my latest patches 2e37bf42d28d8bb5d045b206587c64643c64d02a
> copy serial console definition. On domain shutdown we save this
> info into state XML. However, later on the daemon start we simply
> drop this info and since we are not re-reading qemu log,
> vm->def->consoles[0] does not get populated with copy. Therefore
> we need to avoid dropping console definition if it is just alias
> for serial console.
> ---
> src/conf/domain_conf.c | 76 +++++++++++++++++++++++++++++++++++++++++++----
> 1 files changed, 69 insertions(+), 7 deletions(-)
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index d365cee..f04e477 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -1042,6 +1042,57 @@ void virDomainChrSourceDefFree(virDomainChrSourceDefPtr def)
> VIR_FREE(def);
> }
>
> +/* virDomainChrSourceDefIsEqual:
> + * @src: Source
> + * @tgt: Target
> + *
> + * Compares source and target if they contain
> + * the same information.
> + */
> +static bool
> +virDomainChrSourceDefIsEqual(const virDomainChrSourceDef *src,
> + const virDomainChrSourceDef *tgt)
> +{
> + if (tgt->type != src->type)
> + return false;
> +
> + switch (src->type) {
> + case VIR_DOMAIN_CHR_TYPE_PTY:
> + case VIR_DOMAIN_CHR_TYPE_DEV:
> + case VIR_DOMAIN_CHR_TYPE_FILE:
> + case VIR_DOMAIN_CHR_TYPE_PIPE:
> + return STREQ_NULLABLE(src->data.file.path, tgt->data.file.path);
> + break;
> + case VIR_DOMAIN_CHR_TYPE_UDP:
> + return STREQ_NULLABLE(src->data.udp.bindHost, tgt->data.udp.bindHost) &&
> + STREQ_NULLABLE(src->data.udp.bindService, tgt->data.udp.bindService) &&
> + STREQ_NULLABLE(src->data.udp.connectHost, tgt->data.udp.connectHost) &&
> + STREQ_NULLABLE(src->data.udp.connectService, tgt->data.udp.connectService);
> + break;
> + case VIR_DOMAIN_CHR_TYPE_TCP:
> + return src->data.tcp.listen == tgt->data.tcp.listen &&
> + src->data.tcp.protocol == tgt->data.tcp.protocol &&
> + STREQ_NULLABLE(src->data.tcp.host, tgt->data.tcp.host) &&
> + STREQ_NULLABLE(src->data.tcp.service, tgt->data.tcp.service);
> + break;
> + case VIR_DOMAIN_CHR_TYPE_UNIX:
> + return src->data.nix.listen == tgt->data.nix.listen &&
> + STREQ_NULLABLE(src->data.nix.path, tgt->data.nix.path);
> + break;
> +
> + case VIR_DOMAIN_CHR_TYPE_VC:
> + case VIR_DOMAIN_CHR_TYPE_STDIO:
> + case VIR_DOMAIN_CHR_TYPE_SPICEVMC:
> + /* nada */
> + return true;
> + }
> +
> + /* This should happen only on new,
> + * yet unhandled type */
> +
> + return false;
> +}
> +
> void virDomainChrDefFree(virDomainChrDefPtr def)
> {
> if (!def)
> @@ -7308,6 +7359,7 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
> goto no_memory;
>
> for (i = 0 ; i < n ; i++) {
> + bool create_stub = true;
> virDomainChrDefPtr chr = virDomainChrDefParseXML(caps,
> def,
> nodes[i],
> @@ -7325,7 +7377,9 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
> * So if we see that this console device should
> * be a serial device, then we move the config
> * over to def->serials[0] (or discard it if
> - * that already exists
> + * that already exists). However, given console
> + * can already be filled with aliased data of
> + * def->serials[0]. Keep it then.
> *
> * We then fill def->consoles[0] with a stub
> * just so we get sequencing correct for consoles
> @@ -7341,7 +7395,13 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
>
> /* Either discard or move this chr to the serial config */
> if (def->nserials != 0) {
> - virDomainChrDefFree(chr);
> + if (virDomainChrSourceDefIsEqual(&def->serials[0]->source,
> + &chr->source)) {
> + /* Alias to def->serial[0]. Skip it */
> + create_stub = false;
> + } else {
> + virDomainChrDefFree(chr);
> + }
> } else {
> if (VIR_ALLOC_N(def->serials, 1) < 0) {
> virDomainChrDefFree(chr);
> @@ -7353,11 +7413,13 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
> chr->target.port = 0;
> }
>
> - /* And create a stub placeholder */
> - if (VIR_ALLOC(chr) < 0)
> - goto no_memory;
> - chr->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE;
> - chr->targetType = VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL;
> + if (create_stub) {
> + /* And create a stub placeholder */
> + if (VIR_ALLOC(chr) < 0)
> + goto no_memory;
> + chr->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE;
> + chr->targetType = VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL;
> + }
> }
>
> chr->target.port = i;
ACK,
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list