提交 4ac290cc 编写于 作者: D Daniel P. Berrange

Add device info to serial, parallel, channel, input & fs devices

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
上级 5da9c980
...@@ -600,6 +600,9 @@ ...@@ -600,6 +600,9 @@
</interleave> </interleave>
</group> </group>
</choice> </choice>
<optional>
<ref name="address"/>
</optional>
</element> </element>
</define> </define>
<define name="filesystemtgt"> <define name="filesystemtgt">
...@@ -990,6 +993,9 @@ ...@@ -990,6 +993,9 @@
</optional> </optional>
</element> </element>
</optional> </optional>
<optional>
<ref name="address"/>
</optional>
</interleave> </interleave>
</define> </define>
<define name="qemucdevSrcType"> <define name="qemucdevSrcType">
...@@ -1119,6 +1125,9 @@ ...@@ -1119,6 +1125,9 @@
<interleave> <interleave>
<ref name="qemucdevSrcDef"/> <ref name="qemucdevSrcDef"/>
<ref name="guestfwdTarget"/> <ref name="guestfwdTarget"/>
<optional>
<ref name="address"/>
</optional>
</interleave> </interleave>
</element> </element>
</define> </define>
...@@ -1139,6 +1148,9 @@ ...@@ -1139,6 +1148,9 @@
</choice> </choice>
</attribute> </attribute>
</optional> </optional>
<optional>
<ref name="address"/>
</optional>
</element> </element>
</define> </define>
<define name="hostdev"> <define name="hostdev">
......
...@@ -355,6 +355,7 @@ void virDomainInputDefFree(virDomainInputDefPtr def) ...@@ -355,6 +355,7 @@ void virDomainInputDefFree(virDomainInputDefPtr def)
if (!def) if (!def)
return; return;
virDomainDeviceInfoClear(&def->info);
VIR_FREE(def); VIR_FREE(def);
} }
...@@ -391,6 +392,7 @@ void virDomainFSDefFree(virDomainFSDefPtr def) ...@@ -391,6 +392,7 @@ void virDomainFSDefFree(virDomainFSDefPtr def)
VIR_FREE(def->src); VIR_FREE(def->src);
VIR_FREE(def->dst); VIR_FREE(def->dst);
virDomainDeviceInfoClear(&def->info);
VIR_FREE(def); VIR_FREE(def);
} }
...@@ -474,6 +476,8 @@ void virDomainChrDefFree(virDomainChrDefPtr def) ...@@ -474,6 +476,8 @@ void virDomainChrDefFree(virDomainChrDefPtr def)
break; break;
} }
virDomainDeviceInfoClear(&def->info);
VIR_FREE(def); VIR_FREE(def);
} }
...@@ -845,11 +849,23 @@ static void virDomainDefClearDeviceInfo(virDomainDefPtr def, int alias, int pcia ...@@ -845,11 +849,23 @@ static void virDomainDefClearDeviceInfo(virDomainDefPtr def, int alias, int pcia
for (i = 0; i < def->nhostdevs ; i++) for (i = 0; i < def->nhostdevs ; i++)
virDomainDeviceInfoClearField(&def->hostdevs[i]->info, alias, pciaddr); virDomainDeviceInfoClearField(&def->hostdevs[i]->info, alias, pciaddr);
for (i = 0; i < def->nvideos ; i++) 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++) 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) if (def->watchdog)
virDomainDeviceInfoClearField(&def->watchdog->info, alias, pciaddr); virDomainDeviceInfoClearField(&def->watchdog->info, alias, pciaddr);
if (def->console)
virDomainDeviceInfoClearField(&def->console->info, alias, pciaddr);
} }
...@@ -1488,7 +1504,7 @@ cleanup: ...@@ -1488,7 +1504,7 @@ cleanup:
static virDomainFSDefPtr static virDomainFSDefPtr
virDomainFSDefParseXML(virConnectPtr conn, virDomainFSDefParseXML(virConnectPtr conn,
xmlNodePtr node, xmlNodePtr node,
int flags ATTRIBUTE_UNUSED) { int flags) {
virDomainFSDefPtr def; virDomainFSDefPtr def;
xmlNodePtr cur; xmlNodePtr cur;
char *type = NULL; char *type = NULL;
...@@ -1552,6 +1568,9 @@ virDomainFSDefParseXML(virConnectPtr conn, ...@@ -1552,6 +1568,9 @@ virDomainFSDefParseXML(virConnectPtr conn,
def->dst = target; def->dst = target;
target = NULL; target = NULL;
if (virDomainDeviceInfoParseXML(conn, node, &def->info, flags) < 0)
goto error;
cleanup: cleanup:
VIR_FREE(type); VIR_FREE(type);
VIR_FREE(target); VIR_FREE(target);
...@@ -1893,7 +1912,7 @@ error: ...@@ -1893,7 +1912,7 @@ error:
static virDomainChrDefPtr static virDomainChrDefPtr
virDomainChrDefParseXML(virConnectPtr conn, virDomainChrDefParseXML(virConnectPtr conn,
xmlNodePtr node, xmlNodePtr node,
int flags ATTRIBUTE_UNUSED) { int flags) {
xmlNodePtr cur; xmlNodePtr cur;
char *type = NULL; char *type = NULL;
char *bindHost = NULL; char *bindHost = NULL;
...@@ -2187,6 +2206,9 @@ virDomainChrDefParseXML(virConnectPtr conn, ...@@ -2187,6 +2206,9 @@ virDomainChrDefParseXML(virConnectPtr conn,
break; break;
} }
if (virDomainDeviceInfoParseXML(conn, node, &def->info, flags) < 0)
goto error;
cleanup: cleanup:
VIR_FREE(mode); VIR_FREE(mode);
VIR_FREE(protocol); VIR_FREE(protocol);
...@@ -2213,7 +2235,7 @@ static virDomainInputDefPtr ...@@ -2213,7 +2235,7 @@ static virDomainInputDefPtr
virDomainInputDefParseXML(virConnectPtr conn, virDomainInputDefParseXML(virConnectPtr conn,
const char *ostype, const char *ostype,
xmlNodePtr node, xmlNodePtr node,
int flags ATTRIBUTE_UNUSED) { int flags) {
virDomainInputDefPtr def; virDomainInputDefPtr def;
char *type = NULL; char *type = NULL;
char *bus = NULL; char *bus = NULL;
...@@ -2283,6 +2305,9 @@ virDomainInputDefParseXML(virConnectPtr conn, ...@@ -2283,6 +2305,9 @@ virDomainInputDefParseXML(virConnectPtr conn,
} }
} }
if (virDomainDeviceInfoParseXML(conn, node, &def->info, flags) < 0)
goto error;
cleanup: cleanup:
VIR_FREE(type); VIR_FREE(type);
VIR_FREE(bus); VIR_FREE(bus);
...@@ -4650,7 +4675,8 @@ virDomainControllerDefFormat(virConnectPtr conn, ...@@ -4650,7 +4675,8 @@ virDomainControllerDefFormat(virConnectPtr conn,
static int static int
virDomainFSDefFormat(virConnectPtr conn, virDomainFSDefFormat(virConnectPtr conn,
virBufferPtr buf, virBufferPtr buf,
virDomainFSDefPtr def) virDomainFSDefPtr def,
int flags)
{ {
const char *type = virDomainFSTypeToString(def->type); const char *type = virDomainFSTypeToString(def->type);
...@@ -4693,6 +4719,9 @@ virDomainFSDefFormat(virConnectPtr conn, ...@@ -4693,6 +4719,9 @@ virDomainFSDefFormat(virConnectPtr conn,
if (def->readonly) if (def->readonly)
virBufferAddLit(buf, " <readonly/>\n"); virBufferAddLit(buf, " <readonly/>\n");
if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
return -1;
virBufferAddLit(buf, " </filesystem>\n"); virBufferAddLit(buf, " </filesystem>\n");
return 0; return 0;
...@@ -4934,6 +4963,9 @@ virDomainChrDefFormat(virConnectPtr conn, ...@@ -4934,6 +4963,9 @@ virDomainChrDefFormat(virConnectPtr conn,
return -1; return -1;
} }
if (virDomainDeviceInfoFormat(buf, &def->info, flags) < 0)
return -1;
virBufferVSprintf(buf, " </%s>\n", virBufferVSprintf(buf, " </%s>\n",
elementName); elementName);
...@@ -5062,7 +5094,8 @@ virDomainVideoDefFormat(virConnectPtr conn, ...@@ -5062,7 +5094,8 @@ virDomainVideoDefFormat(virConnectPtr conn,
static int static int
virDomainInputDefFormat(virConnectPtr conn, virDomainInputDefFormat(virConnectPtr conn,
virBufferPtr buf, virBufferPtr buf,
virDomainInputDefPtr def) virDomainInputDefPtr def,
int flags)
{ {
const char *type = virDomainInputTypeToString(def->type); const char *type = virDomainInputTypeToString(def->type);
const char *bus = virDomainInputBusTypeToString(def->bus); const char *bus = virDomainInputBusTypeToString(def->bus);
...@@ -5078,9 +5111,18 @@ virDomainInputDefFormat(virConnectPtr conn, ...@@ -5078,9 +5111,18 @@ virDomainInputDefFormat(virConnectPtr conn,
return -1; return -1;
} }
virBufferVSprintf(buf, " <input type='%s' bus='%s'/>\n", virBufferVSprintf(buf, " <input type='%s' bus='%s'",
type, bus); 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; return 0;
} }
...@@ -5403,7 +5445,7 @@ char *virDomainDefFormat(virConnectPtr conn, ...@@ -5403,7 +5445,7 @@ char *virDomainDefFormat(virConnectPtr conn,
goto cleanup; goto cleanup;
for (n = 0 ; n < def->nfss ; n++) 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; goto cleanup;
...@@ -5439,7 +5481,7 @@ char *virDomainDefFormat(virConnectPtr conn, ...@@ -5439,7 +5481,7 @@ char *virDomainDefFormat(virConnectPtr conn,
for (n = 0 ; n < def->ninputs ; n++) for (n = 0 ; n < def->ninputs ; n++)
if (def->inputs[n]->bus == VIR_DOMAIN_INPUT_BUS_USB && 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; goto cleanup;
if (def->ngraphics > 0) { if (def->ngraphics > 0) {
...@@ -5447,10 +5489,11 @@ char *virDomainDefFormat(virConnectPtr conn, ...@@ -5447,10 +5489,11 @@ char *virDomainDefFormat(virConnectPtr conn,
virDomainInputDef autoInput = { virDomainInputDef autoInput = {
VIR_DOMAIN_INPUT_TYPE_MOUSE, VIR_DOMAIN_INPUT_TYPE_MOUSE,
STREQ(def->os.type, "hvm") ? 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; goto cleanup;
for (n = 0 ; n < def->ngraphics ; n++) for (n = 0 ; n < def->ngraphics ; n++)
......
...@@ -197,6 +197,7 @@ struct _virDomainFSDef { ...@@ -197,6 +197,7 @@ struct _virDomainFSDef {
char *src; char *src;
char *dst; char *dst;
unsigned int readonly : 1; unsigned int readonly : 1;
virDomainDeviceInfo info;
}; };
...@@ -316,6 +317,8 @@ struct _virDomainChrDef { ...@@ -316,6 +317,8 @@ struct _virDomainChrDef {
int listen; int listen;
} nix; } nix;
} data; } data;
virDomainDeviceInfo info;
}; };
enum virDomainInputType { enum virDomainInputType {
...@@ -338,6 +341,7 @@ typedef virDomainInputDef *virDomainInputDefPtr; ...@@ -338,6 +341,7 @@ typedef virDomainInputDef *virDomainInputDefPtr;
struct _virDomainInputDef { struct _virDomainInputDef {
int type; int type;
int bus; int bus;
virDomainDeviceInfo info;
}; };
enum virDomainSoundModel { enum virDomainSoundModel {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册