Hi,
I've been posting this patch using git send-email but unfortunately it
didn't arrive to the list but I saw some other mails arrive to the list
AFAIK so I'm posting this one just to make sure it wasn't my sendmail issue.
Michal
-------- Original Message --------
Subject: [PATCH] Add support for multiple serial ports to Xen driver
Date: Thu, 20 Jan 2011 13:20:50 +0100
From: Michal Novotny <minovotn(a)redhat.com>
To: libvir-list(a)redhat.com
CC: Michal Novotny <minovotn(a)redhat.com>
Hi,
this is the patch for to support multiple serial ports
for Xen driver. The definition for Xen has been
introduced in BZ #614004 and this is adding
support to libvirt-based tools.
The patch was originally written for RHEL-5 and libvirt
0.8.2 (RHEL-5.6) where it has been tested using
the virsh command and correct device creation has
been confirmed in the xend.log to have the same data
for serial ports using both `xm create` and `virsh
start` commands. Also, domains with both single and
multiple serial ports has been tested to confirm
it won't introduce any regression and everything
was working fine according to my testing. This patch
is the forward-port of RHEL-5 version of the patch.
Michal
Signed-off-by: Michal Novotny<minovotn(a)redhat.com>
---
src/xen/xend_internal.c | 19 ++++++++++++-
src/xen/xm_internal.c | 66 +++++++++++++++++++++++++++++++++++++++--------
3 files changed, 73 insertions(+), 14 deletions(-)
diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
index 44d5a22..35cdd3c 100644
--- a/src/xen/xend_internal.c
+++ b/src/xen/xend_internal.c
@@ -5959,8 +5959,23 @@ xenDaemonFormatSxpr(virConnectPtr conn,
}
if (def->serials) {
virBufferAddLit(&buf, "(serial ");
- if (xenDaemonFormatSxprChr(def->serials[0],&buf)< 0)
- goto error;
+ /*
+ * If domain doesn't have multiple serial ports defined we
+ * keep the old-style formatting not to fail the sexpr tests
+ */
+ if (def->nserials> 1) {
+ for (i = 0; i< def->nserials; i++) {
+ virBufferAddLit(&buf, "(");
+ if (xenDaemonFormatSxprChr(def->serials[i],&buf)< 0)
+ goto error;
+ virBufferAddLit(&buf, ")");
+ }
+ }
+ else {
+ if (xenDaemonFormatSxprChr(def->serials[0],&buf)< 0)
+ goto error;
+ }
+
virBufferAddLit(&buf, ")");
} else {
virBufferAddLit(&buf, "(serial none)");
diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c
index bfb6698..1bb62d7 100644
--- a/src/xen/xm_internal.c
+++ b/src/xen/xm_internal.c
@@ -1432,20 +1432,64 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) {
chr = NULL;
}
- if (xenXMConfigGetString(conf, "serial",&str, NULL)< 0)
- goto cleanup;
- if (str&& STRNEQ(str, "none")&&
- !(chr = xenDaemonParseSxprChar(str, NULL)))
- goto cleanup;
+ /* Try to get the list of values to support multiple serial ports */
+ list = virConfGetValue(conf, "serial");
+ if (list&& list->type == VIR_CONF_LIST) {
+ list = list->list;
+ while (list) {
+ char *port;
+
+ if ((list->type != VIR_CONF_STRING) || (list->str == NULL))
+ goto skipport;
+
+ port = list->str;
+ if (VIR_ALLOC(chr)< 0)
+ goto no_memory;
- if (chr) {
- if (VIR_ALLOC_N(def->serials, 1)< 0) {
+ if (!(chr = xenDaemonParseSxprChar(port, NULL)))
+ goto skipport;
+
+ if (VIR_REALLOC_N(def->serials, def->nserials+1)< 0)
+ goto no_memory;
+
+ chr->targetType = VIR_DOMAIN_CHR_TARGET_TYPE_SERIAL;
+ chr->type = VIR_DOMAIN_CHR_TYPE_PTY;
+
+ /* Implement device type of serial port when appropriate */
+ if (STRPREFIX(port, "/dev")) {
+ chr->type = VIR_DOMAIN_CHR_TYPE_DEV;
+ chr->target.port = def->nserials;
+ chr->data.file.path = strdup(port);
+
+ if (!chr->data.file.path)
+ goto no_memory;
+ }
+
+ def->serials[def->nserials++] = chr;
+ chr = NULL;
+
+ skipport:
+ list = list->next;
virDomainChrDefFree(chr);
- goto no_memory;
}
- chr->deviceType = VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL;
- def->serials[0] = chr;
- def->nserials++;
+ }
+ /* If domain is not using multiple serial ports we parse data old way */
+ else {
+ if (xenXMConfigGetString(conf, "serial",&str, NULL)< 0)
+ goto cleanup;
+ if (str&& STRNEQ(str, "none")&&
+ !(chr = xenDaemonParseSxprChar(str, NULL)))
+ goto cleanup;
+
+ if (chr) {
+ if (VIR_ALLOC_N(def->serials, 1)< 0) {
+ virDomainChrDefFree(chr);
+ goto no_memory;
+ }
+ chr->targetType = VIR_DOMAIN_CHR_TARGET_TYPE_SERIAL;
+ def->serials[0] = chr;
+ def->nserials++;
+ }
}
} else {
if (!(def->console = xenDaemonParseSxprChar("pty", NULL)))
--
1.7.3.2
Show replies by date