struct _virDomainDiskSourcePoolDef {
char *pool; /* pool name */
char *volume; /* volume name */
+ int voltype; /* enum virStorageVolType, internal only */
};
typedef virDomainDiskSourcePoolDef *virDomainDiskSourcePoolDefPtr;
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,
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,
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) {
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",
char ***retvalues,
int allowEmptyValue);
-
#endif /* __QEMU_COMMAND_H__*/
{
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;
+}
int qemuDriverAllocateID(virQEMUDriverPtr driver);
virDomainXMLOptionPtr virQEMUDriverCreateXMLConf(virQEMUDriverPtr driver);
+int qemuTranslateDiskSourcePool(virConnectPtr conn,
+ virDomainDiskDefPtr def);
#endif /* __QEMUD_CONF_H */
goto end;
}
+ if (qemuTranslateDiskSourcePool(conn, disk) < 0)
+ goto end;
+
if (qemuAddSharedDisk(driver, disk, vm->def->name) < 0)
goto end;
}
static int
-qemuDomainChangeDiskMediaLive(virDomainObjPtr vm,
+qemuDomainChangeDiskMediaLive(virConnectPtr conn,
+ virDomainObjPtr vm,
virDomainDeviceDefPtr dev,
virQEMUDriverPtr driver,
bool force)
virCapsPtr caps = NULL;
int ret = -1;
+ if (qemuTranslateDiskSourcePool(conn, disk) < 0)
+ goto end;
+
if (qemuDomainDetermineDiskChain(driver, disk, false) < 0)
goto end;
}
static int
-qemuDomainUpdateDeviceLive(virDomainObjPtr vm,
+qemuDomainUpdateDeviceLive(virConnectPtr conn,
+ virDomainObjPtr vm,
virDomainDeviceDefPtr dev,
virDomainPtr dom,
bool force)
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);
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,
* 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;
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,