]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
Check boot order on device attach
authorJiri Denemark <jdenemar@redhat.com>
Thu, 20 Mar 2014 14:34:32 +0000 (15:34 +0100)
committerJiri Denemark <jdenemar@redhat.com>
Thu, 20 Mar 2014 21:42:32 +0000 (22:42 +0100)
https://bugzilla.redhat.com/show_bug.cgi?id=1007754

When attaching a new device, we need to check if its boot order
configuration is compatible with current domain definition.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
src/conf/domain_conf.c

index 95c6c6d8979c4279ad2eb39686640aa627048219..b3592a08e193f4315225dbaab0eb7c81e01a1a04 100644 (file)
@@ -17873,11 +17873,30 @@ virDomainDeviceIsUSB(virDomainDeviceDefPtr dev)
     return false;
 }
 
+static int
+virDomainDeviceInfoCheckBootIndex(virDomainDefPtr def ATTRIBUTE_UNUSED,
+                                  virDomainDeviceDefPtr device ATTRIBUTE_UNUSED,
+                                  virDomainDeviceInfoPtr info,
+                                  void *opaque)
+{
+    virDomainDeviceInfoPtr newinfo = opaque;
+
+    if (info->bootIndex == newinfo->bootIndex) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                       _("boot order %d is already used by another device"),
+                       newinfo->bootIndex);
+        return -1;
+    }
+    return 0;
+}
+
 int
 virDomainDefCompatibleDevice(virDomainDefPtr def,
                              virDomainDeviceDefPtr dev,
                              virDomainDeviceAction action)
 {
+    virDomainDeviceInfoPtr info = virDomainDeviceGetInfo(dev);
+
     if (action != VIR_DOMAIN_DEVICE_ACTION_ATTACH)
         return 0;
 
@@ -17890,6 +17909,19 @@ virDomainDefCompatibleDevice(virDomainDefPtr def,
         return -1;
     }
 
+    if (info && info->bootIndex > 0) {
+        if (def->os.nBootDevs > 0) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                           _("per-device boot elements cannot be used"
+                             " together with os/boot elements"));
+            return -1;
+        }
+        if (virDomainDeviceInfoIterate(def,
+                                       virDomainDeviceInfoCheckBootIndex,
+                                       info) < 0)
+            return -1;
+    }
+
     return 0;
 }