Although the serial, parallel, chanel, input & fs devices do not have PCI address info, they can all have device aliases. Thus it neccessary to associate the virDomainDeviceInfo data with them all. * src/conf/domain_conf.c, src/conf/domain_conf.h: Add hooks for parsing / formatting device info for serial, parallel, channel input and fs devices. * docs/schemas/domain.rng: Associate device info with character devices, input & fs device --- docs/schemas/domain.rng | 12 ++++++++ src/conf/domain_conf.c | 67 ++++++++++++++++++++++++++++++++++++++-------- src/conf/domain_conf.h | 4 +++ 3 files changed, 71 insertions(+), 12 deletions(-) diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng index a32ce45..f4bef7b 100644 --- a/docs/schemas/domain.rng +++ b/docs/schemas/domain.rng @@ -600,6 +600,9 @@ </interleave> </group> </choice> + <optional> + <ref name="address"/> + </optional> </element> </define> <define name="filesystemtgt"> @@ -990,6 +993,9 @@ </optional> </element> </optional> + <optional> + <ref name="address"/> + </optional> </interleave> </define> <define name="qemucdevSrcType"> @@ -1119,6 +1125,9 @@ <interleave> <ref name="qemucdevSrcDef"/> <ref name="guestfwdTarget"/> + <optional> + <ref name="address"/> + </optional> </interleave> </element> </define> @@ -1139,6 +1148,9 @@ </choice> </attribute> </optional> + <optional> + <ref name="address"/> + </optional> </element> </define> <define name="hostdev"> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 7c5abde..9c03aab 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -355,6 +355,7 @@ void virDomainInputDefFree(virDomainInputDefPtr def) if (!def) return; + virDomainDeviceInfoClear(&def->info); VIR_FREE(def); } @@ -391,6 +392,7 @@ void virDomainFSDefFree(virDomainFSDefPtr def) VIR_FREE(def->src); VIR_FREE(def->dst); + virDomainDeviceInfoClear(&def->info); VIR_FREE(def); } @@ -474,6 +476,8 @@ void virDomainChrDefFree(virDomainChrDefPtr def) break; } + virDomainDeviceInfoClear(&def->info); + VIR_FREE(def); } @@ -844,11 +848,23 @@ static void virDomainDefClearDeviceInfo(virDomainDefPtr def, int alias, int pcia for (i = 0; i < def->nhostdevs ; i++) virDomainDeviceInfoClearField(&def->hostdevs[i]->info, alias, pciaddr); for (i = 0; i < def->nvideos ; i++) - virDomainDeviceInfoClearField(&def->videos[i]->info, alias, pciaddr); + virDomainDeviceInfoClearField(&def->videos[i]->info, alias, pciaddr); for (i = 0; i < def->ncontrollers ; i++) - virDomainDeviceInfoClearField(&def->controllers[i]->info, alias, pciaddr); + virDomainDeviceInfoClearField(&def->controllers[i]->info, alias, pciaddr); + for (i = 0; i < def->nserials ; i++) + virDomainDeviceInfoClearField(&def->serials[i]->info, alias, pciaddr); + for (i = 0; i < def->nparallels ; i++) + virDomainDeviceInfoClearField(&def->parallels[i]->info, alias, pciaddr); + for (i = 0; i < def->nchannels ; i++) + virDomainDeviceInfoClearField(&def->channels[i]->info, alias, pciaddr); + for (i = 0; i < def->ninputs ; i++) + virDomainDeviceInfoClearField(&def->inputs[i]->info, alias, pciaddr); + for (i = 0; i < def->nfss ; i++) + virDomainDeviceInfoClearField(&def->fss[i]->info, alias, pciaddr); if (def->watchdog) virDomainDeviceInfoClearField(&def->watchdog->info, alias, pciaddr); + if (def->console) + virDomainDeviceInfoClearField(&def->console->info, alias, pciaddr); } @@ -1485,7 +1501,7 @@ cleanup: static virDomainFSDefPtr virDomainFSDefParseXML(virConnectPtr conn, xmlNodePtr node, - int flags ATTRIBUTE_UNUSED) { + int flags) { virDomainFSDefPtr def; xmlNodePtr cur; char *type = NULL; @@ -1549,6 +1565,9 @@ virDomainFSDefParseXML(virConnectPtr conn, def->dst = target; target = NULL; + if (virDomainDeviceInfoParseXML(conn, node, &def->info, flags) < 0) + goto error; + cleanup: VIR_FREE(type); VIR_FREE(target); @@ -1890,7 +1909,7 @@ error: static virDomainChrDefPtr virDomainChrDefParseXML(virConnectPtr conn, xmlNodePtr node, - int flags ATTRIBUTE_UNUSED) { + int flags) { xmlNodePtr cur; char *type = NULL; char *bindHost = NULL; @@ -2184,6 +2203,9 @@ virDomainChrDefParseXML(virConnectPtr conn, break; } + if (virDomainDeviceInfoParseXML(conn, node, &def->info, flags) < 0) + goto error; + cleanup: VIR_FREE(mode); VIR_FREE(protocol); @@ -2210,7 +2232,7 @@ static virDomainInputDefPtr virDomainInputDefParseXML(virConnectPtr conn, const char *ostype, xmlNodePtr node, - int flags ATTRIBUTE_UNUSED) { + int flags) { virDomainInputDefPtr def; char *type = NULL; char *bus = NULL; @@ -2280,6 +2302,9 @@ virDomainInputDefParseXML(virConnectPtr conn, } } + if (virDomainDeviceInfoParseXML(conn, node, &def->info, flags) < 0) + goto error; + cleanup: VIR_FREE(type); VIR_FREE(bus); @@ -4642,7 +4667,8 @@ virDomainControllerDefFormat(virConnectPtr conn, static int virDomainFSDefFormat(virConnectPtr conn, virBufferPtr buf, - virDomainFSDefPtr def) + virDomainFSDefPtr def, + int flags) { const char *type = virDomainFSTypeToString(def->type); @@ -4685,6 +4711,9 @@ virDomainFSDefFormat(virConnectPtr conn, if (def->readonly) virBufferAddLit(buf, " <readonly/>\n"); + if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0) + return -1; + virBufferAddLit(buf, " </filesystem>\n"); return 0; @@ -4926,6 +4955,9 @@ virDomainChrDefFormat(virConnectPtr conn, return -1; } + if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0) + return -1; + virBufferVSprintf(buf, " </%s>\n", elementName); @@ -5054,7 +5086,8 @@ virDomainVideoDefFormat(virConnectPtr conn, static int virDomainInputDefFormat(virConnectPtr conn, virBufferPtr buf, - virDomainInputDefPtr def) + virDomainInputDefPtr def, + int flags) { const char *type = virDomainInputTypeToString(def->type); const char *bus = virDomainInputBusTypeToString(def->bus); @@ -5070,9 +5103,18 @@ virDomainInputDefFormat(virConnectPtr conn, return -1; } - virBufferVSprintf(buf, " <input type='%s' bus='%s'/>\n", + virBufferVSprintf(buf, " <input type='%s' bus='%s'", type, bus); + if (virDomainDeviceInfoIsSet(&def->info)) { + virBufferAddLit(buf, ">\n"); + if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0) + return -1; + virBufferAddLit(buf, " </input>\n"); + } else { + virBufferAddLit(buf, "/>\n"); + } + return 0; } @@ -5395,7 +5437,7 @@ char *virDomainDefFormat(virConnectPtr conn, goto cleanup; for (n = 0 ; n < def->nfss ; n++) - if (virDomainFSDefFormat(conn, &buf, def->fss[n]) < 0) + if (virDomainFSDefFormat(conn, &buf, def->fss[n], flags) < 0) goto cleanup; @@ -5431,7 +5473,7 @@ char *virDomainDefFormat(virConnectPtr conn, for (n = 0 ; n < def->ninputs ; n++) if (def->inputs[n]->bus == VIR_DOMAIN_INPUT_BUS_USB && - virDomainInputDefFormat(conn, &buf, def->inputs[n]) < 0) + virDomainInputDefFormat(conn, &buf, def->inputs[n], flags) < 0) goto cleanup; if (def->ngraphics > 0) { @@ -5439,10 +5481,11 @@ char *virDomainDefFormat(virConnectPtr conn, virDomainInputDef autoInput = { VIR_DOMAIN_INPUT_TYPE_MOUSE, STREQ(def->os.type, "hvm") ? - VIR_DOMAIN_INPUT_BUS_PS2 : VIR_DOMAIN_INPUT_BUS_XEN + VIR_DOMAIN_INPUT_BUS_PS2 : VIR_DOMAIN_INPUT_BUS_XEN, + { .alias = NULL }, }; - if (virDomainInputDefFormat(conn, &buf, &autoInput) < 0) + if (virDomainInputDefFormat(conn, &buf, &autoInput, flags) < 0) goto cleanup; for (n = 0 ; n < def->ngraphics ; n++) diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 87fbba7..1413273 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -197,6 +197,7 @@ struct _virDomainFSDef { char *src; char *dst; unsigned int readonly : 1; + virDomainDeviceInfo info; }; @@ -316,6 +317,8 @@ struct _virDomainChrDef { int listen; } nix; } data; + + virDomainDeviceInfo info; }; enum virDomainInputType { @@ -338,6 +341,7 @@ typedef virDomainInputDef *virDomainInputDefPtr; struct _virDomainInputDef { int type; int bus; + virDomainDeviceInfo info; }; enum virDomainSoundModel { -- 1.6.5.2 -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list