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