
On 06/04/13 08:34, John Ferlan wrote:
On 04/04/2013 03:38 PM, Osier Yang wrote:
To support "shareable" for volume type disk, we have to translate the source before trying to add the shared disk entry. To archieve s/archeive/achieve/
the goal, this moves the helper qemuTranslateDiskSourcePool into src/qemu/qemu_conf.c, and introduce a internal only member (voltype) s/a internal/an internal/
for struct _virDomainDiskSourcePoolDef, to record the underlying volume type, for use when building the drive string. s/type,/type/
Later patch will support "shareable" volume type disk. --- src/conf/domain_conf.h | 1 + src/qemu/qemu_command.c | 56 +------------------------------------------------ src/qemu/qemu_command.h | 1 - src/qemu/qemu_conf.c | 52 +++++++++++++++++++++++++++++++++++++++++++++ src/qemu/qemu_conf.h | 3 +++ src/qemu/qemu_driver.c | 16 ++++++++++---- src/qemu/qemu_process.c | 7 +++++++ 7 files changed, 76 insertions(+), 60 deletions(-)
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 988636e..13d6d89 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -611,6 +611,7 @@ typedef struct _virDomainDiskSourcePoolDef virDomainDiskSourcePoolDef; struct _virDomainDiskSourcePoolDef { char *pool; /* pool name */ char *volume; /* volume name */ + int voltype; /* enum virStorageVolType, internal only */ }; typedef virDomainDiskSourcePoolDef *virDomainDiskSourcePoolDefPtr;
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index cdfe801..c29796d 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -2681,56 +2681,6 @@ qemuBuildNBDString(virConnectPtr conn, virDomainDiskDefPtr disk, virBufferPtr op return 0; }
-static int -qemuTranslateDiskSourcePool(virConnectPtr conn, - virDomainDiskDefPtr def, - int *voltype) -{ - virStoragePoolPtr pool = NULL; - virStorageVolPtr vol = NULL; - virStorageVolInfo info; - int ret = -1; - - if (def->type != VIR_DOMAIN_DISK_TYPE_VOLUME) - return 0; - - if (!(pool = virStoragePoolLookupByName(conn, def->srcpool->pool))) - return -1; - - if (!(vol = virStorageVolLookupByName(pool, def->srcpool->volume))) - goto cleanup; - - if (virStorageVolGetInfo(vol, &info) < 0) - goto cleanup; - - if (def->startupPolicy && - info.type != VIR_STORAGE_VOL_FILE) { - virReportError(VIR_ERR_XML_ERROR, "%s", - _("'startupPolicy' is only valid for 'file' type volume")); - goto cleanup; - } - - switch (info.type) { - case VIR_STORAGE_VOL_FILE: - case VIR_STORAGE_VOL_BLOCK: - case VIR_STORAGE_VOL_DIR: - if (!(def->src = virStorageVolGetPath(vol))) - goto cleanup; - break; - case VIR_STORAGE_VOL_NETWORK: - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", - _("Using network volume as disk source is not supported")); - goto cleanup; - } - - *voltype = info.type; - ret = 0; -cleanup: - virStoragePoolFree(pool); - virStorageVolFree(vol); - return ret; -} - char * qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED, virDomainDiskDefPtr disk, @@ -2743,7 +2693,6 @@ qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED, virDomainDiskGeometryTransTypeToString(disk->geometry.trans); int idx = virDiskNameToIndex(disk->dst); int busid = -1, unitid = -1; - int voltype = -1;
if (idx < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -2751,9 +2700,6 @@ qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED, goto error; }
- if (qemuTranslateDiskSourcePool(conn, disk, &voltype) < 0) - goto error; - switch (disk->bus) { case VIR_DOMAIN_DISK_BUS_SCSI: if (disk->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE) { @@ -2889,7 +2835,7 @@ qemuBuildDriveStr(virConnectPtr conn ATTRIBUTE_UNUSED, break; } } else if (disk->type == VIR_DOMAIN_DISK_TYPE_VOLUME) { - switch (voltype) { + switch (disk->srcpool->voltype) { case VIR_STORAGE_VOL_DIR: if (!disk->readonly) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index 17687f4..20e3066 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -237,5 +237,4 @@ qemuParseKeywords(const char *str, char ***retvalues, int allowEmptyValue);
- #endif /* __QEMU_COMMAND_H__*/ diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index c2e2e10..8ae690f 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -1240,3 +1240,55 @@ int qemuDriverAllocateID(virQEMUDriverPtr driver) { return virAtomicIntInc(&driver->nextvmid); } + +int +qemuTranslateDiskSourcePool(virConnectPtr conn, + virDomainDiskDefPtr def) +{ + virStoragePoolPtr pool = NULL; + virStorageVolPtr vol = NULL; + virStorageVolInfo info; + int ret = -1; + + if (def->type != VIR_DOMAIN_DISK_TYPE_VOLUME) + return 0; + + if (!def->srcpool) + return 0; + + if (!(pool = virStoragePoolLookupByName(conn, def->srcpool->pool))) + return -1; + + if (!(vol = virStorageVolLookupByName(pool, def->srcpool->volume))) + goto cleanup; + + if (virStorageVolGetInfo(vol, &info) < 0) + goto cleanup; + + if (def->startupPolicy && + info.type != VIR_STORAGE_VOL_FILE) { + virReportError(VIR_ERR_XML_ERROR, "%s", + _("'startupPolicy' is only valid for 'file' type volume")); + goto cleanup; + } + + switch (info.type) { + case VIR_STORAGE_VOL_FILE: + case VIR_STORAGE_VOL_BLOCK: + case VIR_STORAGE_VOL_DIR: + if (!(def->src = virStorageVolGetPath(vol))) + goto cleanup; + break; + case VIR_STORAGE_VOL_NETWORK: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("Using network volume as disk source is not supported")); + goto cleanup; + } + + def->srcpool->voltype = info.type; + ret = 0; +cleanup: + virStoragePoolFree(pool); + virStorageVolFree(vol); + return ret; +} diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index c5ddaad..9f58454 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -303,4 +303,7 @@ void qemuSharedDiskEntryFree(void *payload, const void *name) int qemuDriverAllocateID(virQEMUDriverPtr driver); virDomainXMLConfPtr virQEMUDriverCreateXMLConf(void);
+int qemuTranslateDiskSourcePool(virConnectPtr conn, + virDomainDiskDefPtr def); + #endif /* __QEMUD_CONF_H */ diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 552a81b..4e8c666 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -5748,6 +5748,9 @@ qemuDomainAttachDeviceDiskLive(virConnectPtr conn, goto end; }
+ if (qemuTranslateDiskSourcePool(conn, disk) < 0) + goto end; + if (qemuAddSharedDisk(driver, disk, vm->def->name) < 0) goto end;
@@ -6016,7 +6019,8 @@ qemuDomainDetachDeviceLive(virDomainObjPtr vm, }
static int -qemuDomainChangeDiskMediaLive(virDomainObjPtr vm, +qemuDomainChangeDiskMediaLive(virConnectPtr conn, + virDomainObjPtr vm, virDomainDeviceDefPtr dev, virQEMUDriverPtr driver, bool force) @@ -6029,6 +6033,9 @@ qemuDomainChangeDiskMediaLive(virDomainObjPtr vm, virCapsPtr caps = NULL; int ret = -1;
+ if (qemuTranslateDiskSourcePool(conn, disk) < 0) + goto end; + if (qemuDomainDetermineDiskChain(driver, disk, false) < 0) goto end;
@@ -6107,7 +6114,8 @@ end: }
static int -qemuDomainUpdateDeviceLive(virDomainObjPtr vm, +qemuDomainUpdateDeviceLive(virConnectPtr conn, + virDomainObjPtr vm, virDomainDeviceDefPtr dev, virDomainPtr dom, bool force) @@ -6117,7 +6125,7 @@ qemuDomainUpdateDeviceLive(virDomainObjPtr vm,
switch (dev->type) { case VIR_DOMAIN_DEVICE_DISK: - ret = qemuDomainChangeDiskMediaLive(vm, dev, driver, force); + ret = qemuDomainChangeDiskMediaLive(conn, vm, dev, driver, force); break; case VIR_DOMAIN_DEVICE_GRAPHICS: ret = qemuDomainChangeGraphics(driver, vm, dev->data.graphics); @@ -6529,7 +6537,7 @@ qemuDomainModifyDeviceFlags(virDomainPtr dom, const char *xml, ret = qemuDomainDetachDeviceLive(vm, dev_copy, dom); break; case QEMU_DEVICE_UPDATE: - ret = qemuDomainUpdateDeviceLive(vm, dev_copy, dom, force); + ret = qemuDomainUpdateDeviceLive(dom->conn, vm, dev_copy, dom, force); break; default: virReportError(VIR_ERR_INTERNAL_ERROR, diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 8c4bfb7..3ac0c70 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -3008,6 +3008,8 @@ qemuProcessReconnect(void *opaque) * qemu_driver->sharedDisks. */ for (i = 0; i < obj->def->ndisks; i++) { + if (qemuTranslateDiskSourcePool(conn, obj->def->disks[i]) < 0) + goto error; if (qemuAddSharedDisk(driver, obj->def->disks[i], obj->def->name) < 0) goto error; @@ -3556,6 +3558,11 @@ int qemuProcessStart(virConnectPtr conn, goto cleanup; }
+ for (i = 0; i < vm->def->ndisks; i++) { + if (qemuTranslateDiskSourcePool(conn, vm->def->disks[i]) < 0) + goto cleanup; + } + VIR_DEBUG("Building emulator command line"); if (!(cmd = qemuBuildCommandLine(conn, driver, vm->def, priv->monConfig, priv->monJSON != 0, priv->qemuCaps,
ACK; however, I see paths to qemuBuildDriveStr() that don't go through qemuBuildCommandLine(), so just double check that you aren't missing a place to get that disk->src set for one of these pool/vol's. The point being that qemuBuildDriveStr() "had" code that did something before (albeit in this set of patches). Since you're moving it - just be sure there's no path that could enter qemuBuildDriveStr() that would need it.
Yeah, I expect there are still places missed, but as I replied for 0/8. Let's find them out step by step. Osier