]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
conf: Introduce virDomainDiskSourceIsBlockType
authorJohn Ferlan <jferlan@redhat.com>
Thu, 18 Jul 2013 10:39:55 +0000 (06:39 -0400)
committerJohn Ferlan <jferlan@redhat.com>
Mon, 22 Jul 2013 18:01:04 +0000 (14:01 -0400)
Introduce a new helper to check if the disk source is of block type

src/conf/domain_conf.c
src/conf/domain_conf.h
src/libvirt_private.syms
src/qemu/qemu_command.c
src/qemu/qemu_conf.c

index 297553c23af20a7d0ee7c29d09aeeeb35b628178..8753b481d2766d709eb3f9c4b1e15fb4193461ed 100644 (file)
@@ -41,6 +41,7 @@
 #include "virbuffer.h"
 #include "virlog.h"
 #include "nwfilter_conf.h"
+#include "storage_conf.h"
 #include "virstoragefile.h"
 #include "virfile.h"
 #include "virbitmap.h"
@@ -18380,3 +18381,34 @@ virDomainDefFindDevice(virDomainDefPtr def,
 
     return 0;
 }
+
+/**
+ * virDomainDiskSourceIsBlockType:
+ *
+ * Check if the disk *source* is of block type. This just tries
+ * to check from the type of disk def, not to probe the underlying
+ * storage.
+ *
+ * Return true if its source is block type, or false otherwise.
+ */
+bool
+virDomainDiskSourceIsBlockType(virDomainDiskDefPtr def)
+{
+    /* No reason to think the disk source is block type if
+     * the source is empty
+     */
+    if (!def->src)
+        return false;
+
+    if (def->type == VIR_DOMAIN_DISK_TYPE_BLOCK)
+        return true;
+
+    /* For volume types, check the srcpool.
+     * If it's a block type source pool, then it's possible
+     */
+    if (def->type == VIR_DOMAIN_DISK_TYPE_VOLUME && def->srcpool &&
+        def->srcpool->voltype == VIR_STORAGE_VOL_BLOCK) {
+        return true;
+    }
+    return false;
+}
index 900fb01f056fd82ce677fbd2b829224be6a063b3..3f9a9bcaf9adf89f80c5c0476071e9e3c6f207e0 100644 (file)
@@ -2715,4 +2715,7 @@ int virDomainDefFindDevice(virDomainDefPtr def,
                            virDomainDeviceDefPtr dev,
                            bool reportError);
 
+bool virDomainDiskSourceIsBlockType(virDomainDiskDefPtr def)
+    ATTRIBUTE_NONNULL(1);
+
 #endif /* __DOMAIN_CONF_H */
index 885b03ec91895ced68f6909760a27ac26df4212d..76873ad058045dac3ede1d51c8b61f5f08cbbf13 100644 (file)
@@ -206,6 +206,7 @@ virDomainDiskProtocolTransportTypeToString;
 virDomainDiskProtocolTypeToString;
 virDomainDiskRemove;
 virDomainDiskRemoveByName;
+virDomainDiskSourceIsBlockType;
 virDomainDiskTypeFromString;
 virDomainDiskTypeToString;
 virDomainEmulatorPinAdd;
index 9088c11aa80e06b15a53875eb8d8e53b64ad42c7..8d414a12dcb61eca751ac868388235dfa1d98ece 100644 (file)
@@ -42,6 +42,7 @@
 #include "domain_audit.h"
 #include "domain_conf.h"
 #include "snapshot_conf.h"
+#include "storage_conf.h"
 #include "network/bridge_driver.h"
 #include "virnetdevtap.h"
 #include "base64.h"
@@ -3492,9 +3493,7 @@ qemuBuildDriveDevStr(virDomainDefPtr def,
                                virDomainDiskProtocolTypeToString(disk->protocol));
                 goto error;
             }
-        } else if (disk->type != VIR_DOMAIN_DISK_TYPE_BLOCK &&
-                   !(disk->type == VIR_DOMAIN_DISK_TYPE_VOLUME &&
-                     disk->srcpool->voltype == VIR_STORAGE_VOL_BLOCK)) {
+        } else if (!virDomainDiskSourceIsBlockType(disk)) {
             virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                            _("disk device='lun' is only valid for block type disk source"));
             goto error;
index 64214b9769621edc835888a063a3c7991961c384..332b9f2db85c3c81b2c3af160c0a6832274e8399 100644 (file)
@@ -52,6 +52,7 @@
 #include "virfile.h"
 #include "virstring.h"
 #include "viratomic.h"
+#include "storage_conf.h"
 #include "configmake.h"
 
 #define VIR_FROM_THIS VIR_FROM_QEMU
@@ -867,12 +868,7 @@ qemuAddSharedDevice(virQEMUDriverPtr driver,
     if (dev->type == VIR_DOMAIN_DEVICE_DISK) {
         disk = dev->data.disk;
 
-        if (!disk->shared ||
-            !disk->src ||
-            (disk->type != VIR_DOMAIN_DISK_TYPE_BLOCK &&
-             !(disk->type == VIR_DOMAIN_DISK_TYPE_VOLUME &&
-               disk->srcpool &&
-               disk->srcpool->voltype == VIR_STORAGE_VOL_BLOCK)))
+        if (!disk->shared || !virDomainDiskSourceIsBlockType(disk))
             return 0;
     } else if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV) {
         hostdev = dev->data.hostdev;
@@ -978,12 +974,7 @@ qemuRemoveSharedDevice(virQEMUDriverPtr driver,
     if (dev->type == VIR_DOMAIN_DEVICE_DISK) {
         disk = dev->data.disk;
 
-        if (!disk->shared ||
-            !disk->src ||
-            (disk->type != VIR_DOMAIN_DISK_TYPE_BLOCK &&
-             !(disk->type == VIR_DOMAIN_DISK_TYPE_VOLUME &&
-               disk->srcpool &&
-               disk->srcpool->voltype == VIR_STORAGE_VOL_BLOCK)))
+        if (!disk->shared || !virDomainDiskSourceIsBlockType(disk))
             return 0;
     } else if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV) {
         hostdev = dev->data.hostdev;
@@ -1073,12 +1064,8 @@ qemuSetUnprivSGIO(virDomainDeviceDefPtr dev)
     if (dev->type == VIR_DOMAIN_DEVICE_DISK) {
         disk = dev->data.disk;
 
-        if (!disk->src ||
-            disk->device != VIR_DOMAIN_DISK_DEVICE_LUN ||
-            (disk->type != VIR_DOMAIN_DISK_TYPE_BLOCK &&
-             !(disk->type == VIR_DOMAIN_DISK_TYPE_VOLUME &&
-               disk->srcpool &&
-               disk->srcpool->voltype == VIR_STORAGE_VOL_BLOCK)))
+        if (disk->device != VIR_DOMAIN_DISK_DEVICE_LUN ||
+            virDomainDiskSourceIsBlockType(disk))
             return 0;
 
         path = disk->src;