[libvirt] [PATCH 18/34] Add device info to serial, parallel, channel, input & fs devices

Daniel P. Berrange berrange at redhat.com
Fri Jan 8 17:23:14 UTC 2010


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




More information about the libvir-list mailing list