[libvirt] [PATCH 21/25] qemu: command: Refactor code extracted to qemuBuildDriveSourceStr

Peter Krempa pkrempa at redhat.com
Mon Jul 25 18:12:06 UTC 2016


Avoid a large block by tweaking the condition skipping empty drives and
split up the switch containing two branches having different purpose.
---
 src/qemu/qemu_command.c | 99 +++++++++++++++++++++++--------------------------
 1 file changed, 46 insertions(+), 53 deletions(-)

diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index ee7329c..3b42b73 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -1107,70 +1107,63 @@ qemuBuildDriveSourceStr(virDomainDiskDefPtr disk,
     if (qemuGetDriveSourceString(disk->src, secinfo, &source) < 0)
         goto cleanup;

-    if (source &&
-        !((disk->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY ||
-           disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM) &&
-          disk->tray_status == VIR_DOMAIN_DISK_TRAY_OPEN)) {
-
-        virBufferAddLit(buf, "file=");
-
-        switch (actualType) {
-        case VIR_STORAGE_TYPE_DIR:
-            /* QEMU only supports magic FAT format for now */
-            if (disk->src->format > 0 &&
-                disk->src->format != VIR_STORAGE_FILE_FAT) {
-                virReportError(VIR_ERR_INTERNAL_ERROR,
-                               _("unsupported disk driver type for '%s'"),
-                               virStorageFileFormatTypeToString(disk->src->format));
-                goto cleanup;
-            }
-
-            if (!disk->src->readonly) {
-                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                               _("cannot create virtual FAT disks in read-write mode"));
-                goto cleanup;
-            }
-
-            virBufferAddLit(buf, "fat:");
+    /* nothing to format if the drive is empty */
+    if (!source ||
+        ((disk->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY ||
+          disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM) &&
+         disk->tray_status == VIR_DOMAIN_DISK_TRAY_OPEN))
+        return 0;

-            if (disk->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY)
-                virBufferAddLit(buf, "floppy:");
+    if (actualType == VIR_STORAGE_TYPE_BLOCK &&
+        disk->tray_status == VIR_DOMAIN_DISK_TRAY_OPEN) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       disk->src->type == VIR_STORAGE_TYPE_VOLUME ?
+                       _("tray status 'open' is invalid for block type volume") :
+                       _("tray status 'open' is invalid for block type disk"));
+        goto cleanup;
+    }

-            break;
+    virBufferAddLit(buf, "file=");

-        case VIR_STORAGE_TYPE_BLOCK:
-            if (disk->tray_status == VIR_DOMAIN_DISK_TRAY_OPEN) {
-                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                               disk->src->type == VIR_STORAGE_TYPE_VOLUME ?
-                               _("tray status 'open' is invalid for block type volume") :
-                               _("tray status 'open' is invalid for block type disk"));
-                goto cleanup;
-            }
-
-            break;
+    /* for now the DIR based storage is handled by the magic FAT format */
+    if (actualType == VIR_STORAGE_TYPE_DIR) {
+        if (disk->src->format > 0 &&
+            disk->src->format != VIR_STORAGE_FILE_FAT) {
+            virReportError(VIR_ERR_INTERNAL_ERROR,
+                           _("unsupported disk driver type for '%s'"),
+                           virStorageFileFormatTypeToString(disk->src->format));
+            goto cleanup;
+        }

-        default:
-            break;
+        if (!disk->src->readonly) {
+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                           _("cannot create virtual FAT disks in read-write mode"));
+            goto cleanup;
         }

-        virQEMUBuildBufferEscapeComma(buf, source);
-        virBufferAddLit(buf, ",");
+        virBufferAddLit(buf, "fat:");

-        if (secinfo && secinfo->type == VIR_DOMAIN_SECRET_INFO_TYPE_AES) {
-            virBufferAsprintf(buf, "password-secret=%s,",
-                              secinfo->s.aes.alias);
-        }
+        if (disk->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY)
+            virBufferAddLit(buf, "floppy:");
+    }

-        if (encinfo)
-            virQEMUBuildLuksOpts(buf, &disk->src->encryption->encinfo,
-                                 encinfo->s.aes.alias);
+    virQEMUBuildBufferEscapeComma(buf, source);
+    virBufferAddLit(buf, ",");

-        if (disk->src->format > 0 &&
-            disk->src->type != VIR_STORAGE_TYPE_DIR)
-            virBufferAsprintf(buf, "format=%s,",
-                              virStorageFileFormatTypeToString(disk->src->format));
+    if (secinfo && secinfo->type == VIR_DOMAIN_SECRET_INFO_TYPE_AES) {
+        virBufferAsprintf(buf, "password-secret=%s,",
+                          secinfo->s.aes.alias);
     }

+    if (encinfo)
+        virQEMUBuildLuksOpts(buf, &disk->src->encryption->encinfo,
+                             encinfo->s.aes.alias);
+
+    if (disk->src->format > 0 &&
+        disk->src->type != VIR_STORAGE_TYPE_DIR)
+        virBufferAsprintf(buf, "format=%s,",
+                          virStorageFileFormatTypeToString(disk->src->format));
+
     ret = 0;

  cleanup:
-- 
2.9.0




More information about the libvir-list mailing list