]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Reject invalid block copy targets for <disk device='lun'>
authorPeter Krempa <pkrempa@redhat.com>
Mon, 2 May 2016 13:26:51 +0000 (15:26 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 9 May 2016 11:16:26 +0000 (13:16 +0200)
Extract the relevant parts of the existing checker and reuse them for
blockcopy since copying to a non-block device creates an invalid
configuration.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1209802

src/qemu/qemu_command.c
src/qemu/qemu_domain.c
src/qemu/qemu_domain.h
src/qemu/qemu_driver.c

index a5abf9ba1818d8a5c9caec9b9f8d4ee8a67418ad..cc06a45ac25df7f881d128b6db75d1e29117afe9 100644 (file)
@@ -972,20 +972,8 @@ qemuCheckDiskConfig(virDomainDiskDefPtr disk)
             return -1;
         }
 
-        if (virStorageSourceGetActualType(disk->src) == VIR_STORAGE_TYPE_NETWORK) {
-            if (disk->src->protocol != VIR_STORAGE_NET_PROTOCOL_ISCSI) {
-                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                               _("disk device='lun' is not supported "
-                                 "for protocol='%s'"),
-                               virStorageNetProtocolTypeToString(disk->src->protocol));
-                return -1;
-            }
-        } else if (!virStorageSourceIsBlockLocal(disk->src)) {
-            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                           _("disk device='lun' is only valid for block "
-                             "type disk source"));
+        if (qemuDomainDefValidateDiskLunSource(disk->src) < 0)
             return -1;
-        }
 
         if (disk->wwn) {
             virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
index cae356cc89e414b15546f142f8d1f6c298a52553..7540578dfbf954e477b06c845a00e65d72fc0b12 100644 (file)
@@ -5297,3 +5297,34 @@ qemuDomainDiskByName(virDomainDefPtr def,
 
     return ret;
 }
+
+
+/**
+ * qemuDomainDefValidateDiskLunSource:
+ * @src: disk source struct
+ *
+ * Validate whether the disk source is valid for disk device='lun'.
+ *
+ * Returns 0 if the configuration is valid -1 and a libvirt error if the soure
+ * is invalid.
+ */
+int
+qemuDomainDefValidateDiskLunSource(const virStorageSource *src)
+{
+    if (virStorageSourceGetActualType(src) == VIR_STORAGE_TYPE_NETWORK) {
+        if (src->protocol != VIR_STORAGE_NET_PROTOCOL_ISCSI) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           _("disk device='lun' is not supported "
+                             "for protocol='%s'"),
+                           virStorageNetProtocolTypeToString(src->protocol));
+            return -1;
+        }
+    } else if (!virStorageSourceIsBlockLocal(src)) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("disk device='lun' is only valid for block "
+                         "type disk source"));
+        return -1;
+    }
+
+    return 0;
+}
index 5af802c02cc7b298b9cc0418399263cd0782d589..c71118845d022eb44486551ef12aba409bdcf380 100644 (file)
@@ -666,4 +666,7 @@ void qemuDomainSecretDestroy(virDomainObjPtr vm)
 int qemuDomainSecretPrepare(virConnectPtr conn, virDomainObjPtr vm)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
 
+int qemuDomainDefValidateDiskLunSource(const virStorageSource *src)
+    ATTRIBUTE_NONNULL(1);
+
 #endif /* __QEMU_DOMAIN_H__ */
index 396e64cf0d389dc912731c8bd1365c9519bc0c85..b0cfb10db44adbc17a9d1eba05cf0eafe9649f45 100644 (file)
@@ -16759,6 +16759,10 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm,
     if (qemuDomainDiskBlockJobIsActive(disk))
         goto endjob;
 
+    if (disk->device == VIR_DOMAIN_DISK_DEVICE_LUN &&
+        qemuDomainDefValidateDiskLunSource(mirror) < 0)
+        goto endjob;
+
     if (!(virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DRIVE_MIRROR) &&
           virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKJOB_ASYNC))) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",