[libvirt] [PATCHv2 05/16] storage: use enum for disk driver type

Doug Goldstein cardoe at gentoo.org
Mon Oct 15 04:25:31 UTC 2012


On Sat, Oct 13, 2012 at 5:00 PM, Eric Blake <eblake at redhat.com> wrote:
> Actually use the enum in the domain conf structure.
>
> * src/conf/domain_conf.h (_virDomainDiskDef): Store enum rather
> than string for disk type.
> * src/conf/domain_conf.c (virDomainDiskDefFree)
> (virDomainDiskDefParseXML, virDomainDiskDefFormat)
> (virDomainDiskDefForeachPath): Adjust users.
> * src/xenxs/xen_sxpr.c (xenParseSxprDisks, xenFormatSxprDisk):
> Likewise.
> * src/xenxs/xen_xm.c (xenParseXM, xenFormatXMDisk): Likewise.
> * src/vbox/vbox_tmpl.c (vboxAttachDrives): Likewise.
> * src/libxl/libxl_conf.c (libxlMakeDisk): Likewise.
> ---
>  src/conf/domain_conf.c   | 60 ++++++++++++++++----------------
>  src/conf/domain_conf.h   |  4 +--
>  src/libxl/libxl_conf.c   | 42 +++++++++++++----------
>  src/libxl/libxl_driver.c |  6 +---
>  src/qemu/qemu_command.c  | 18 +++++-----
>  src/qemu/qemu_domain.c   |  7 ++--
>  src/qemu/qemu_driver.c   | 89 ++++++++++++++++--------------------------------
>  src/qemu/qemu_hotplug.c  |  9 ++---
>  src/vbox/vbox_tmpl.c     |  6 ++--
>  src/xenxs/xen_sxpr.c     | 26 +++++++++-----
>  src/xenxs/xen_xm.c       | 29 ++++++++++------
>  11 files changed, 145 insertions(+), 151 deletions(-)
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 70e3b53..acf1904 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -971,9 +971,7 @@ void virDomainDiskDefFree(virDomainDiskDefPtr def)
>      VIR_FREE(def->src);
>      VIR_FREE(def->dst);
>      VIR_FREE(def->driverName);
> -    VIR_FREE(def->driverType);
>      VIR_FREE(def->mirror);
> -    VIR_FREE(def->mirrorFormat);
>      VIR_FREE(def->auth.username);
>      VIR_FREE(def->wwn);
>      if (def->auth.secretType == VIR_DOMAIN_DISK_SECRET_TYPE_USAGE)
> @@ -4144,12 +4142,8 @@ virDomainDiskDefParseXML(virCapsPtr caps,
>      authUsername = NULL;
>      def->driverName = driverName;
>      driverName = NULL;
> -    def->driverType = driverType;
> -    driverType = NULL;
>      def->mirror = mirror;
>      mirror = NULL;
> -    def->mirrorFormat = mirrorFormat;
> -    mirrorFormat = NULL;
>      def->mirroring = mirroring;
>      def->encryption = encryption;
>      encryption = NULL;
> @@ -4158,23 +4152,34 @@ virDomainDiskDefParseXML(virCapsPtr caps,
>      def->wwn = wwn;
>      wwn = NULL;
>
> -    if (!def->driverType &&
> -        caps->defaultDiskDriverType &&
> -        !(def->driverType = strdup(virStorageFileFormatTypeToString(
> -                                       caps->defaultDiskDriverType))))
> -        goto no_memory;
> +    if (driverType) {
> +        def->format = virStorageFileFormatTypeFromString(driverType);
> +        if (def->format <= 0) {
> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                           _("unknown driver format value '%s'"),
> +                           driverType);
> +            goto error;
> +        }
> +    } else {
> +        def->format = caps->defaultDiskDriverType;
> +    }
>
>      if (!def->driverName &&
>          caps->defaultDiskDriverName &&
>          !(def->driverName = strdup(caps->defaultDiskDriverName)))
>          goto no_memory;
>
> -
> -    if (def->mirror && !def->mirrorFormat &&
> -        caps->defaultDiskDriverType &&
> -        !(def->mirrorFormat = strdup(virStorageFileFormatTypeToString(
> -                                         caps->defaultDiskDriverType))))
> -        goto no_memory;
> +    if (mirrorFormat) {
> +        def->mirrorFormat = virStorageFileFormatTypeFromString(mirrorFormat);
> +        if (def->mirrorFormat <= 0) {
> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                           _("unknown mirror format value '%s'"),
> +                           driverType);
> +            goto error;
> +        }
> +    } else if (def->mirror) {
> +        def->mirrorFormat = caps->defaultDiskDriverType;
> +    }
>
>      if (def->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE
>          && virDomainDiskDefAssignAddress(caps, def) < 0)
> @@ -11715,13 +11720,14 @@ virDomainDiskDefFormat(virBufferPtr buf,
>                            virDomainSnapshotLocationTypeToString(def->snapshot));
>      virBufferAddLit(buf, ">\n");
>
> -    if (def->driverName || def->driverType || def->cachemode ||
> +    if (def->driverName || def->format > 0 || def->cachemode ||
>          def->ioeventfd || def->event_idx || def->copy_on_read) {
>          virBufferAddLit(buf, "      <driver");
>          if (def->driverName)
>              virBufferAsprintf(buf, " name='%s'", def->driverName);
> -        if (def->driverType)
> -            virBufferAsprintf(buf, " type='%s'", def->driverType);
> +        if (def->format > 0)
> +            virBufferAsprintf(buf, " type='%s'",
> +                              virStorageFileFormatTypeToString(def->format));
>          if (def->cachemode)
>              virBufferAsprintf(buf, " cache='%s'", cachemode);
>          if (def->error_policy)
> @@ -11833,7 +11839,8 @@ virDomainDiskDefFormat(virBufferPtr buf,
>      if (def->mirror && !(flags & VIR_DOMAIN_XML_INACTIVE)) {
>          virBufferEscapeString(buf, "      <mirror file='%s'", def->mirror);
>          if (def->mirrorFormat)
> -            virBufferAsprintf(buf, " format='%s'", def->mirrorFormat);
> +            virBufferAsprintf(buf, " format='%s'",
> +                              virStorageFileFormatTypeToString(def->mirrorFormat));
>          if (def->mirroring)
>              virBufferAddLit(buf, " ready='yes'");
>          virBufferAddLit(buf, "/>\n");
> @@ -14647,15 +14654,8 @@ int virDomainDiskDefForeachPath(virDomainDiskDefPtr disk,
>          return ret;
>      }
>
> -    if (disk->driverType) {
> -        const char *formatStr = disk->driverType;
> -
> -        if ((format = virStorageFileFormatTypeFromString(formatStr)) <= 0) {
> -            virReportError(VIR_ERR_INTERNAL_ERROR,
> -                           _("unknown disk format '%s' for %s"),
> -                           disk->driverType, disk->src);
> -            goto cleanup;
> -        }
> +    if (disk->format > 0) {
> +        format = disk->format;
>      } else {
>          if (allowProbing) {
>              format = VIR_STORAGE_FILE_AUTO;
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index cc63da1..1d20522 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -567,10 +567,10 @@ struct _virDomainDiskDef {
>          } secret;
>      } auth;
>      char *driverName;
> -    char *driverType;
> +    int format; /* enum virStorageFileFormat */
>
>      char *mirror;
> -    char *mirrorFormat;
> +    int mirrorFormat; /* enum virStorageFileFormat */
>      bool mirroring;
>
>      struct {
> diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
> index b988fa7..fa931c3 100644
> --- a/src/libxl/libxl_conf.c
> +++ b/src/libxl/libxl_conf.c
> @@ -41,6 +41,7 @@
>  #include "capabilities.h"
>  #include "libxl_driver.h"
>  #include "libxl_conf.h"
> +#include "storage_file.h"
>
>
>  #define VIR_FROM_THIS VIR_FROM_LIBXL
> @@ -505,25 +506,30 @@ libxlMakeDisk(virDomainDefPtr def, virDomainDiskDefPtr l_disk,
>      if (l_disk->driverName) {
>          if (STREQ(l_disk->driverName, "tap") ||
>              STREQ(l_disk->driverName, "tap2")) {
> -            if (l_disk->driverType) {
> -                if (STREQ(l_disk->driverType, "qcow")) {
> -                    x_disk->format = DISK_FORMAT_QCOW;
> -                    x_disk->backend = DISK_BACKEND_QDISK;
> -                } else if (STREQ(l_disk->driverType, "qcow2")) {
> -                    x_disk->format = DISK_FORMAT_QCOW2;
> -                    x_disk->backend = DISK_BACKEND_QDISK;
> -                } else if (STREQ(l_disk->driverType, "vhd")) {
> -                    x_disk->format = DISK_FORMAT_VHD;
> -                    x_disk->backend = DISK_BACKEND_TAP;
> -                } else if (STREQ(l_disk->driverType, "aio") ||
> -                            STREQ(l_disk->driverType, "raw")) {
> -                    x_disk->format = DISK_FORMAT_RAW;
> -                    x_disk->backend = DISK_BACKEND_TAP;
> -                }
> -            } else {
> +            switch (l_disk->format) {
> +            case VIR_STORAGE_FILE_QCOW:
> +                x_disk->format = DISK_FORMAT_QCOW;
> +                x_disk->backend = DISK_BACKEND_QDISK;
> +                break;
> +            case VIR_STORAGE_FILE_QCOW2:
> +                x_disk->format = DISK_FORMAT_QCOW2;
> +                x_disk->backend = DISK_BACKEND_QDISK;
> +                break;
> +            case VIR_STORAGE_FILE_VHD:
> +                x_disk->format = DISK_FORMAT_VHD;
> +                x_disk->backend = DISK_BACKEND_TAP;
> +                break;
> +            case VIR_STORAGE_FILE_NONE:
>                  /* No subtype specified, default to raw/tap */
> -                    x_disk->format = DISK_FORMAT_RAW;
> -                    x_disk->backend = DISK_BACKEND_TAP;
> +            case VIR_STORAGE_FILE_RAW:
> +                x_disk->format = DISK_FORMAT_RAW;
> +                x_disk->backend = DISK_BACKEND_TAP;
> +                break;
> +            default:
> +                virReportError(VIR_ERR_INTERNAL_ERROR,
> +                               _("libxenlight does not support disk driver %s"),
> +                               virStorageFileFormatTypeToString(l_disk->format));
> +                return -1;
>              }
>          } else if (STREQ(l_disk->driverName, "file")) {
>              x_disk->format = DISK_FORMAT_RAW;
> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
> index 6fe284f..f4e9aa6 100644
> --- a/src/libxl/libxl_driver.c
> +++ b/src/libxl/libxl_driver.c
> @@ -3202,11 +3202,7 @@ libxlDomainUpdateDeviceConfig(virDomainDefPtr vmdef, virDomainDeviceDefPtr dev)
>                  orig->driverName = disk->driverName;
>                  disk->driverName = NULL;
>              }
> -            if (disk->driverType) {
> -                VIR_FREE(orig->driverType);
> -                orig->driverType = disk->driverType;
> -                disk->driverType = NULL;
> -            }
> +            orig->format = disk->format;
>              disk->src = NULL;
>              break;
>          default:
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index d590df6..ab046eb 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -43,6 +43,7 @@
>  #include "virnetdevtap.h"
>  #include "base64.h"
>  #include "device_conf.h"
> +#include "storage_file.h"
>
>  #include <sys/utsname.h>
>  #include <sys/stat.h>
> @@ -2128,11 +2129,10 @@ qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED,
>            disk->tray_status == VIR_DOMAIN_DISK_TRAY_OPEN)) {
>          if (disk->type == VIR_DOMAIN_DISK_TYPE_DIR) {
>              /* QEMU only supports magic FAT format for now */
> -            if (disk->driverType &&
> -                STRNEQ(disk->driverType, "fat")) {
> +            if (disk->format && disk->format != VIR_STORAGE_FILE_FAT) {
>                  virReportError(VIR_ERR_INTERNAL_ERROR,
>                                 _("unsupported disk driver type for '%s'"),
> -                               disk->driverType);
> +                               virStorageFileFormatTypeToString(disk->format));
>                  goto error;
>              }
>              if (!disk->readonly) {
> @@ -2229,10 +2229,11 @@ qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED,
>                         _("transient disks not supported yet"));
>          goto error;
>      }
> -    if (disk->driverType && *disk->driverType != '\0' &&
> +    if (disk->format > 0 &&
>          disk->type != VIR_DOMAIN_DISK_TYPE_DIR &&
>          qemuCapsGet(caps, QEMU_CAPS_DRIVE_FORMAT))
> -        virBufferAsprintf(&opt, ",format=%s", disk->driverType);
> +        virBufferAsprintf(&opt, ",format=%s",
> +                          virStorageFileFormatTypeToString(disk->format));
>
>      /* generate geometry command string */
>      if (disk->geometry.cylinders > 0 &&
> @@ -5209,11 +5210,10 @@ qemuBuildCommandLine(virConnectPtr conn,
>
>              if (disk->type == VIR_DOMAIN_DISK_TYPE_DIR) {
>                  /* QEMU only supports magic FAT format for now */
> -                if (disk->driverType &&
> -                    STRNEQ(disk->driverType, "fat")) {
> +                if (disk->format && disk->format != VIR_STORAGE_FILE_FAT) {
>                      virReportError(VIR_ERR_INTERNAL_ERROR,
>                                     _("unsupported disk driver type for '%s'"),
> -                                   disk->driverType);
> +                                   virStorageFileFormatTypeToString(disk->format));
>                      goto error;
>                  }
>                  if (!disk->readonly) {
> @@ -7020,7 +7020,7 @@ qemuParseCommandLineDisk(virCapsPtr caps,
>                  virReportOOMError();
>                  goto cleanup;
>              }
> -            def->driverType = values[i];
> +            def->format = virStorageFileFormatTypeFromString(values[i]);
>              values[i] = NULL;
>          } else if (STREQ(keywords[i], "cache")) {
>              if (STREQ(values[i], "off") ||
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 427258d..b51edc2 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -36,6 +36,7 @@
>  #include "virfile.h"
>  #include "domain_event.h"
>  #include "virtime.h"
> +#include "storage_file.h"
>
>  #include <sys/time.h>
>  #include <fcntl.h>
> @@ -1408,7 +1409,7 @@ void qemuDomainObjCheckDiskTaint(struct qemud_driver *driver,
>                                   virDomainDiskDefPtr disk,
>                                   int logFD)
>  {
> -    if (!disk->driverType &&
> +    if ((!disk->format || disk->format == VIR_STORAGE_FILE_AUTO) &&
>          driver->allowDiskFormatProbing)
>          qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_DISK_PROBING, logFD);
>
> @@ -1660,8 +1661,8 @@ qemuDomainSnapshotForEachQcow2Raw(struct qemud_driver *driver,
>      for (i = 0; i < ndisks; i++) {
>          /* FIXME: we also need to handle LVM here */
>          if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_DISK) {
> -            if (!def->disks[i]->driverType ||
> -                STRNEQ(def->disks[i]->driverType, "qcow2")) {
> +            if (def->disks[i]->format > 0 &&
> +                def->disks[i]->format != VIR_STORAGE_FILE_QCOW2) {
>                  if (try_all) {
>                      /* Continue on even in the face of error, since other
>                       * disks in this VM may have the same snapshot name.
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index f514199..35aab74 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -6224,11 +6224,8 @@ qemuDomainUpdateDeviceConfig(qemuCapsPtr caps,
>              orig->driverName = disk->driverName;
>              disk->driverName = NULL;
>          }
> -        if (disk->driverType) {
> -            VIR_FREE(orig->driverType);
> -            orig->driverType = disk->driverType;
> -            disk->driverType = NULL;
> -        }
> +        if (disk->format)
> +            orig->format = disk->format;
>          disk->src = NULL;
>          break;
>
> @@ -9191,13 +9188,8 @@ static int qemuDomainGetBlockInfo(virDomainPtr dom,
>      }
>
>      /* Probe for magic formats */
> -    if (disk->driverType) {
> -        if ((format = virStorageFileFormatTypeFromString(disk->driverType)) <= 0) {
> -            virReportError(VIR_ERR_INTERNAL_ERROR,
> -                           _("unknown disk format %s for %s"),
> -                           disk->driverType, disk->src);
> -            goto cleanup;
> -        }
> +    if (disk->format) {
> +        format = disk->format;
>      } else {
>          if (driver->allowDiskFormatProbing) {
>              if ((format = virStorageFileProbeFormat(disk->src)) < 0)
> @@ -10369,7 +10361,7 @@ qemuDomainSnapshotIsAllowed(virDomainObjPtr vm)
>
>          if ((disk->device == VIR_DOMAIN_DISK_DEVICE_LUN) ||
>              (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK &&
> -             STRNEQ_NULLABLE(disk->driverType, "qcow2"))) {
> +             disk->format > 0 && disk->format != VIR_STORAGE_FILE_QCOW2)) {
>              virReportError(VIR_ERR_OPERATION_INVALID,
>                             _("Disk '%s' does not support snapshotting"),
>                             disk->src);
> @@ -10563,13 +10555,14 @@ qemuDomainSnapshotDiskPrepare(virDomainObjPtr vm, virDomainSnapshotDefPtr def,
>                                 disk->name);
>                  goto cleanup;
>              }
> -            if (!vm->def->disks[i]->driverType ||
> -                STRNEQ(vm->def->disks[i]->driverType, "qcow2")) {
> +            if (vm->def->disks[i]->format > 0 &&
> +                vm->def->disks[i]->format != VIR_STORAGE_FILE_QCOW2) {
>                  virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>                                 _("internal snapshot for disk %s unsupported "
>                                   "for storage type %s"),
>                                 disk->name,
> -                               NULLSTR(vm->def->disks[i]->driverType));
> +                               virStorageFileFormatTypeToString(
> +                                   vm->def->disks[i]->format));
>                  goto cleanup;
>              }
>              found = true;
> @@ -10656,13 +10649,12 @@ qemuDomainSnapshotCreateSingleDiskActive(struct qemud_driver *driver,
>      qemuDomainObjPrivatePtr priv = vm->privateData;
>      char *device = NULL;
>      char *source = NULL;
> -    char *driverType = NULL;
> +    int format = VIR_STORAGE_FILE_NONE;
>      char *persistSource = NULL;
> -    char *persistDriverType = NULL;
>      int ret = -1;
>      int fd = -1;
>      char *origsrc = NULL;
> -    char *origdriver = NULL;
> +    int origdriver;
>      bool need_unlink = false;
>
>      if (snap->snapshot != VIR_DOMAIN_SNAPSHOT_LOCATION_EXTERNAL) {
> @@ -10671,14 +10663,19 @@ qemuDomainSnapshotCreateSingleDiskActive(struct qemud_driver *driver,
>          return -1;
>      }
>
> +    if (snap->driverType) {
> +        format = virStorageFileFormatTypeFromString(snap->driverType);
> +        if (format <= 0) {
> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                           _("unknown driver type %s"), snap->driverType);
> +            goto cleanup;
> +        }
> +    }
> +
>      if (virAsprintf(&device, "drive-%s", disk->info.alias) < 0 ||
>          !(source = strdup(snap->file)) ||
> -        (STRNEQ_NULLABLE(disk->driverType, snap->driverType) &&
> -         !(driverType = strdup(snap->driverType))) ||
>          (persistDisk &&
> -         (!(persistSource = strdup(source)) ||
> -          (STRNEQ_NULLABLE(persistDisk->driverType, snap->driverType) &&
> -           !(persistDriverType = strdup(snap->driverType)))))) {
> +         !(persistSource = strdup(source)))) {
>          virReportOOMError();
>          goto cleanup;
>      }
> @@ -10695,8 +10692,8 @@ qemuDomainSnapshotCreateSingleDiskActive(struct qemud_driver *driver,
>
>      origsrc = disk->src;
>      disk->src = source;
> -    origdriver = disk->driverType;
> -    disk->driverType = (char *) "raw"; /* Don't want to probe backing files */
> +    origdriver = disk->format;
> +    disk->format = VIR_STORAGE_FILE_RAW; /* Don't want to probe backing files */
>
>      if (virDomainLockDiskAttach(driver->lockManager, driver->uri,
>                                  vm, disk) < 0)
> @@ -10717,8 +10714,7 @@ qemuDomainSnapshotCreateSingleDiskActive(struct qemud_driver *driver,
>
>      disk->src = origsrc;
>      origsrc = NULL;
> -    disk->driverType = origdriver;
> -    origdriver = NULL;
> +    disk->format = origdriver;
>
>      /* create the actual snapshot */
>      ret = qemuMonitorDiskSnapshot(priv->mon, actions, device, source,
> @@ -10732,34 +10728,24 @@ qemuDomainSnapshotCreateSingleDiskActive(struct qemud_driver *driver,
>      VIR_FREE(disk->src);
>      disk->src = source;
>      source = NULL;
> -    if (driverType) {
> -        VIR_FREE(disk->driverType);
> -        disk->driverType = driverType;
> -        driverType = NULL;
> -    }
> +    disk->format = format;
>      if (persistDisk) {
>          VIR_FREE(persistDisk->src);
>          persistDisk->src = persistSource;
>          persistSource = NULL;
> -        if (persistDriverType) {
> -            VIR_FREE(persistDisk->driverType);
> -            persistDisk->driverType = persistDriverType;
> -            persistDriverType = NULL;
> -        }
> +        persistDisk->format = format;
>      }
>
>  cleanup:
>      if (origsrc) {
>          disk->src = origsrc;
> -        disk->driverType = origdriver;
> +        disk->format = origdriver;
>      }
>      if (need_unlink && unlink(source))
>          VIR_WARN("unable to unlink just-created %s", source);
>      VIR_FREE(device);
>      VIR_FREE(source);
> -    VIR_FREE(driverType);
>      VIR_FREE(persistSource);
> -    VIR_FREE(persistDriverType);
>      return ret;
>  }
>
> @@ -10776,17 +10762,12 @@ qemuDomainSnapshotUndoSingleDiskActive(struct qemud_driver *driver,
>                                         bool need_unlink)
>  {
>      char *source = NULL;
> -    char *driverType = NULL;
>      char *persistSource = NULL;
> -    char *persistDriverType = NULL;
>      struct stat st;
>
>      if (!(source = strdup(origdisk->src)) ||
> -        (origdisk->driverType &&
> -         !(driverType = strdup(origdisk->driverType))) ||
>          (persistDisk &&
> -         (!(persistSource = strdup(source)) ||
> -          (driverType && !(persistDriverType = strdup(driverType)))))) {
> +         !(persistSource = strdup(source)))) {
>          virReportOOMError();
>          goto cleanup;
>      }
> @@ -10806,27 +10787,17 @@ qemuDomainSnapshotUndoSingleDiskActive(struct qemud_driver *driver,
>      VIR_FREE(disk->src);
>      disk->src = source;
>      source = NULL;
> -    VIR_FREE(disk->driverType);
> -    if (driverType) {
> -        disk->driverType = driverType;
> -        driverType = NULL;
> -    }
> +    disk->format = origdisk->format;
>      if (persistDisk) {
>          VIR_FREE(persistDisk->src);
>          persistDisk->src = persistSource;
>          persistSource = NULL;
> -        VIR_FREE(persistDisk->driverType);
> -        if (persistDriverType) {
> -            persistDisk->driverType = persistDriverType;
> -            persistDriverType = NULL;
> -        }
> +        persistDisk->format = origdisk->format;
>      }
>
>  cleanup:
>      VIR_FREE(source);
> -    VIR_FREE(driverType);
>      VIR_FREE(persistSource);
> -    VIR_FREE(persistDriverType);
>  }
>
>  /* The domain is expected to be locked and active. */
> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> index 78f1278..6bc5cfb 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -44,6 +44,7 @@
>  #include "virnetdevbridge.h"
>  #include "virnetdevtap.h"
>  #include "device_conf.h"
> +#include "storage_file.h"
>
>  #define VIR_FROM_THIS VIR_FROM_QEMU
>
> @@ -106,10 +107,10 @@ int qemuDomainChangeEjectableMedia(struct qemud_driver *driver,
>      if (disk->src) {
>          const char *format = NULL;
>          if (disk->type != VIR_DOMAIN_DISK_TYPE_DIR) {
> -            if (disk->driverType)
> -                format = disk->driverType;
> -            else if (origdisk->driverType)
> -                format = origdisk->driverType;
> +            if (disk->format > 0)
> +                format = virStorageFileFormatTypeToString(disk->format);
> +            else if (origdisk->format > 0)
> +                format = virStorageFileFormatTypeToString(origdisk->format);
>          }
>          ret = qemuMonitorChangeMedia(priv->mon,
>                                       driveAlias,
> diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
> index 0eeac85..32a903e 100644
> --- a/src/vbox/vbox_tmpl.c
> +++ b/src/vbox/vbox_tmpl.c
> @@ -3846,7 +3846,8 @@ vboxAttachDrives(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
>          VIR_DEBUG("disk(%d) src:        %s", i, def->disks[i]->src);
>          VIR_DEBUG("disk(%d) dst:        %s", i, def->disks[i]->dst);
>          VIR_DEBUG("disk(%d) driverName: %s", i, def->disks[i]->driverName);
> -        VIR_DEBUG("disk(%d) driverType: %s", i, def->disks[i]->driverType);
> +        VIR_DEBUG("disk(%d) driverType: %s", i,
> +                  virStorageFileFormatTypeToString(def->disks[i]->format));
>          VIR_DEBUG("disk(%d) cachemode:  %d", i, def->disks[i]->cachemode);
>          VIR_DEBUG("disk(%d) readonly:   %s", i, (def->disks[i]->readonly
>                                               ? "True" : "False"));
> @@ -4125,7 +4126,8 @@ vboxAttachDrives(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
>          VIR_DEBUG("disk(%d) src:        %s", i, def->disks[i]->src);
>          VIR_DEBUG("disk(%d) dst:        %s", i, def->disks[i]->dst);
>          VIR_DEBUG("disk(%d) driverName: %s", i, def->disks[i]->driverName);
> -        VIR_DEBUG("disk(%d) driverType: %s", i, def->disks[i]->driverType);
> +        VIR_DEBUG("disk(%d) driverType: %s", i,
> +                  virStorageFileFormatTypeToString(def->disks[i]->format));
>          VIR_DEBUG("disk(%d) cachemode:  %d", i, def->disks[i]->cachemode);
>          VIR_DEBUG("disk(%d) readonly:   %s", i, (def->disks[i]->readonly
>                                               ? "True" : "False"));
> diff --git a/src/xenxs/xen_sxpr.c b/src/xenxs/xen_sxpr.c
> index 3d20350..35ad496 100644
> --- a/src/xenxs/xen_sxpr.c
> +++ b/src/xenxs/xen_sxpr.c
> @@ -36,6 +36,7 @@
>  #include "count-one-bits.h"
>  #include "xenxs_private.h"
>  #include "xen_sxpr.h"
> +#include "storage_file.h"
>
>  /* Get a domain id from a S-expression string */
>  int xenGetDomIdFromSxprString(const char *sexpr, int xendConfigVersion)
> @@ -427,6 +428,8 @@ xenParseSxprDisks(virDomainDefPtr def,
>
>                  if (STREQ (disk->driverName, "tap") ||
>                      STREQ (disk->driverName, "tap2")) {
> +                    char *driverType = NULL;
> +
>                      offset = strchr(src, ':');
>                      if (!offset) {
>                          virReportError(VIR_ERR_INTERNAL_ERROR,
> @@ -434,17 +437,19 @@ xenParseSxprDisks(virDomainDefPtr def,
>                          goto error;
>                      }
>
> -                    if (VIR_ALLOC_N(disk->driverType, (offset-src)+1)< 0)
> +                    if (!(driverType = strndup(src, offset - src)))
>                          goto no_memory;
> -                    if (virStrncpy(disk->driverType, src, offset-src,
> -                                   (offset-src)+1) == NULL) {
> +                    if (STREQ(driverType, "aio"))
> +                        disk->format = VIR_STORAGE_FILE_RAW;
> +                    else
> +                        disk->format =
> +                            virStorageFileFormatTypeFromString(driverType);
> +                    VIR_FREE(driverType);
> +                    if (disk->format <= 0) {
>                          virReportError(VIR_ERR_INTERNAL_ERROR,
> -                                       _("Driver type %s too big for destination"),
> -                                       src);
> +                                       _("Unknown driver type %s"), src);
>                          goto error;
>                      }
> -                    if (STREQ(disk->driverType, "aio"))
> -                        memcpy(disk->driverType, "raw", strlen("raw"));
>
>                      src = offset + 1;
>                      /* Its possible to use blktap driver for block devs
> @@ -1833,9 +1838,12 @@ xenFormatSxprDisk(virDomainDiskDefPtr def,
>          if (def->driverName) {
>              if (STREQ(def->driverName, "tap") ||
>                  STREQ(def->driverName, "tap2")) {
> -                const char *type = def->driverType ? def->driverType : "aio";
> -                if (STREQ(type, "raw"))
> +                const char *type;
> +
> +                if (!def->format || def->format == VIR_STORAGE_FILE_RAW)
>                      type = "aio";
> +                else
> +                    type = virStorageFileFormatTypeToString(def->format);
>                  virBufferEscapeSexpr(buf, "(uname '%s:", def->driverName);
>                  virBufferEscapeSexpr(buf, "%s:", type);
>                  virBufferEscapeSexpr(buf, "%s')", def->src);
> diff --git a/src/xenxs/xen_xm.c b/src/xenxs/xen_xm.c
> index 41e6744..2e560a6 100644
> --- a/src/xenxs/xen_xm.c
> +++ b/src/xenxs/xen_xm.c
> @@ -37,6 +37,7 @@
>  #include "xen_xm.h"
>  #include "xen_sxpr.h"
>  #include "domain_conf.h"
> +#include "storage_file.h"
>
>  /* Convenience method to grab a long int from the config file object */
>  static int xenXMConfigGetBool(virConfPtr conf,
> @@ -554,20 +555,25 @@ xenParseXM(virConfPtr conf, int xendConfigVersion,
>                  /* And the sub-type for tap:XXX: type */
>                  if (disk->driverName &&
>                      STREQ(disk->driverName, "tap")) {
> +                    char *driverType;
> +
>                      if (!(tmp = strchr(disk->src, ':')))
>                          goto skipdisk;
> -                    if (VIR_ALLOC_N(disk->driverType, (tmp - disk->src) + 1) < 0)
> +
> +                    if (!(driverType = strndup(disk->src, tmp - disk->src)))
>                          goto no_memory;
> -                    if (virStrncpy(disk->driverType, disk->src,
> -                                   (tmp - disk->src),
> -                                   (tmp - disk->src) + 1) == NULL) {
> +                    if (STREQ(driverType, "aio"))
> +                        disk->format = VIR_STORAGE_FILE_RAW;
> +                    else
> +                        disk->format =
> +                            virStorageFileFormatTypeFromString(driverType);
> +                    VIR_FREE(driverType);
> +                    if (disk->format <= 0) {
>                          virReportError(VIR_ERR_INTERNAL_ERROR,
> -                                       _("Driver type %s too big for destination"),
> +                                       _("Unknown driver type %s"),
>                                         disk->src);
>                          goto cleanup;
>                      }
> -                    if (STREQ(disk->driverType, "aio"))
> -                        memcpy(disk->driverType, "raw", strlen("raw"));
>
>                      /* Strip the prefix we found off the source file name */
>                      memmove(disk->src, disk->src+(tmp-disk->src)+1,
> @@ -1204,10 +1210,13 @@ static int xenFormatXMDisk(virConfValuePtr list,
>      virConfValuePtr val, tmp;
>
>      if(disk->src) {
> -        if (disk->driverName) {
> -            const char *type = disk->driverType ? disk->driverType : "aio";
> -            if (STREQ(type, "raw"))
> +        if (disk->format) {
> +            const char *type;
> +
> +            if (disk->format == VIR_STORAGE_FILE_RAW)
>                  type = "aio";
> +            else
> +                type = virStorageFileFormatTypeToString(disk->format);
>              virBufferAsprintf(&buf, "%s:", disk->driverName);
>              if (STREQ(disk->driverName, "tap"))
>                  virBufferAsprintf(&buf, "%s:", type);
> --

Looks good. Tested this (and the preceding 4 patches) with vbox briefly.

-- 
Doug Goldstein




More information about the libvir-list mailing list