[libvirt] [PATCH v5 2/5] domain_conf: Auto fill chardev port

Michal Privoznik mprivozn at redhat.com
Fri Jul 12 17:23:59 UTC 2013


Now that we have callbacks, we should auto fill in omitted pieces of
information. It's important for chardev hotplug to fill in the correct
/{serial,parallel,console,channel}/target/@port if no value has been
provided by user.
---
 src/conf/domain_conf.c | 46 +++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 41 insertions(+), 5 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 5f0366e..80ea18b 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -2780,13 +2780,49 @@ virDomainDefPostParseInternal(virDomainDefPtr def,
 
 static int
 virDomainDeviceDefPostParseInternal(virDomainDeviceDefPtr dev,
-                                    virDomainDefPtr def ATTRIBUTE_UNUSED,
+                                    virDomainDefPtr def,
                                     virCapsPtr caps ATTRIBUTE_UNUSED)
 {
-    if (dev->type == VIR_DOMAIN_DEVICE_CHR &&
-        dev->data.chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE &&
-        dev->data.chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_NONE)
-        dev->data.chr->targetType = VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL;
+    if (dev->type == VIR_DOMAIN_DEVICE_CHR) {
+        virDomainChrDefPtr chr = dev->data.chr;
+        virDomainChrDefPtr **arrPtr;
+        size_t i, *cnt;
+
+        virDomainChrGetDomainPtrs(def, chr, &arrPtr, &cnt);
+
+        if (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE &&
+            chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_NONE)
+            chr->targetType = VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_SERIAL;
+
+        if (chr->target.port == -1 &&
+            (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_PARALLEL ||
+             chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL ||
+             chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE)) {
+            int maxport = -1;
+
+            for (i = 0; i < *cnt; i++) {
+                if ((*arrPtr)[i]->target.port > maxport)
+                    maxport = (*arrPtr)[i]->target.port;
+            }
+
+            chr->target.port = maxport + 1;
+        }
+
+        if (chr->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_SERIAL &&
+            chr->info.addr.vioserial.port == 0) {
+            int maxport = 0;
+
+            for (i = 0; i < *cnt; i++) {
+                virDomainChrDefPtr thischr = (*arrPtr)[i];
+                if (thischr->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_SERIAL &&
+                    thischr->info.addr.vioserial.controller == chr->info.addr.vioserial.controller &&
+                    thischr->info.addr.vioserial.bus == chr->info.addr.vioserial.bus &&
+                    (int)thischr->info.addr.vioserial.port > maxport)
+                    maxport = thischr->info.addr.vioserial.port;
+            }
+            chr->info.addr.vioserial.port = maxport + 1;
+        }
+    }
 
     return 0;
 }
-- 
1.8.1.5




More information about the libvir-list mailing list