]> xenbits.xensource.com Git - libvirt.git/commitdiff
conf: domain: Introduce virDomainDeviceIterateFlags
authorErik Skultety <eskultet@redhat.com>
Fri, 7 Dec 2018 12:13:03 +0000 (13:13 +0100)
committerErik Skultety <eskultet@redhat.com>
Wed, 12 Dec 2018 14:12:35 +0000 (15:12 +0100)
Validation of domain devices is accomplished via a generic device
iterator which takes a callback, iterates over all kinds of supported
device types and invokes the callback on every single device. However,
there might be cases when we need to alter the behaviour of the
iteration (most notably skip or include a group of devices). Therefore,
this patch introduces iterator flags.

Signed-off-by: Erik Skultety <eskultet@redhat.com>
Reviewed-by: John Ferlan <jferlan@redhat.com>
src/conf/domain_conf.c

index efa0a94f398bc264a012ab7aed8a2eff1766d0c4..e03bfbce90c78015cf53deca3a591e2c0e28c78c 100644 (file)
@@ -3703,10 +3703,18 @@ virDomainSkipBackcompatConsole(virDomainDefPtr def,
 }
 
 
+enum {
+    DOMAIN_DEVICE_ITERATE_ALL_CONSOLES = 1 << 0,
+} virDomainDeviceIterateFlags;
+
+/*
+ * Iterates over domain devices calling @cb on each device. The default
+ * behaviour can be altered with virDomainDeviceIterateFlags.
+ */
 static int
 virDomainDeviceInfoIterateInternal(virDomainDefPtr def,
                                    virDomainDeviceInfoCallback cb,
-                                   bool all,
+                                   unsigned int iteratorFlags,
                                    void *opaque)
 {
     size_t i;
@@ -3772,6 +3780,8 @@ virDomainDeviceInfoIterateInternal(virDomainDefPtr def,
             return rc;
     }
     for (i = 0; i < def->nconsoles; i++) {
+        bool all = iteratorFlags & DOMAIN_DEVICE_ITERATE_ALL_CONSOLES;
+
         if (virDomainSkipBackcompatConsole(def, i, all))
             continue;
         device.data.chr = def->consoles[i];
@@ -3908,7 +3918,7 @@ virDomainDeviceInfoIterate(virDomainDefPtr def,
                            virDomainDeviceInfoCallback cb,
                            void *opaque)
 {
-    return virDomainDeviceInfoIterateInternal(def, cb, false, opaque);
+    return virDomainDeviceInfoIterateInternal(def, cb, 0, opaque);
 }
 
 
@@ -3918,7 +3928,7 @@ virDomainDefHasDeviceAddress(virDomainDefPtr def,
 {
     if (virDomainDeviceInfoIterateInternal(def,
                                            virDomainDefHasDeviceAddressIterator,
-                                           true,
+                                           DOMAIN_DEVICE_ITERATE_ALL_CONSOLES,
                                            info) < 0)
         return true;
 
@@ -5291,7 +5301,7 @@ virDomainDefPostParse(virDomainDefPtr def,
     /* iterate the devices */
     ret = virDomainDeviceInfoIterateInternal(def,
                                              virDomainDefPostParseDeviceIterator,
-                                             true,
+                                             DOMAIN_DEVICE_ITERATE_ALL_CONSOLES,
                                              &data);
 
     if (virDomainDefPostParseCheckFailure(def, parseFlags, ret) < 0)
@@ -5927,7 +5937,8 @@ virDomainDefValidateAliases(const virDomainDef *def,
 
     if (virDomainDeviceInfoIterateInternal((virDomainDefPtr) def,
                                            virDomainDeviceDefValidateAliasesIterator,
-                                           true, &data) < 0)
+                                           DOMAIN_DEVICE_ITERATE_ALL_CONSOLES,
+                                           &data) < 0)
         goto cleanup;
 
     if (aliases) {
@@ -6337,7 +6348,8 @@ virDomainDefValidate(virDomainDefPtr def,
     /* iterate the devices */
     if (virDomainDeviceInfoIterateInternal(def,
                                            virDomainDefValidateDeviceIterator,
-                                           true, &data) < 0)
+                                           DOMAIN_DEVICE_ITERATE_ALL_CONSOLES,
+                                           &data) < 0)
         return -1;
 
     if (virDomainDefValidateInternal(def) < 0)
@@ -29926,7 +29938,8 @@ virDomainDefFindDevice(virDomainDefPtr def,
 
     dev->type = VIR_DOMAIN_DEVICE_NONE;
     virDomainDeviceInfoIterateInternal(def, virDomainDefFindDeviceCallback,
-                                       true, &data);
+                                       DOMAIN_DEVICE_ITERATE_ALL_CONSOLES,
+                                       &data);
 
     if (dev->type == VIR_DOMAIN_DEVICE_NONE) {
         if (reportError) {