On Sat, Oct 13, 2012 at 5:00 PM, Eric Blake <eblake(a)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