virDomainObjPtr vm,
virDomainDiskDefPtr disk)
{
+ VIR_AUTOPTR(qemuBlockStorageSourceChainData) data = NULL;
int ret = -1;
qemuDomainObjPrivatePtr priv = vm->privateData;
- qemuHotplugDiskSourceDataPtr diskdata = NULL;
char *devstr = NULL;
VIR_AUTOUNREF(virQEMUDriverConfigPtr) cfg = virQEMUDriverGetConfig(driver);
VIR_AUTOPTR(virJSONValue) corProps = NULL;
if (disk->copy_on_read == VIR_TRISTATE_SWITCH_ON &&
!(corProps = qemuBlockStorageGetCopyOnReadProps(disk)))
goto cleanup;
- }
- if (!(diskdata = qemuHotplugDiskSourceAttachPrepare(disk, disk->src,
- priv->qemuCaps)))
- goto error;
+ if (!(data = qemuBuildStorageSourceChainAttachPrepareBlockdev(disk->src,
+ priv->qemuCaps)))
+ goto cleanup;
+ } else {
+ if (!(data = qemuBuildStorageSourceChainAttachPrepareDrive(disk,
+ priv->qemuCaps)))
+ goto cleanup;
+ }
if (!(devstr = qemuBuildDiskDeviceStr(vm->def, disk, 0, priv->qemuCaps)))
goto error;
qemuDomainObjEnterMonitor(driver, vm);
- if (qemuHotplugDiskSourceAttach(priv->mon, diskdata) < 0)
+ if (qemuBlockStorageSourceChainAttach(priv->mon, data) < 0)
goto exit_monitor;
if (corProps &&
ret = 0;
cleanup:
- qemuHotplugDiskSourceDataFree(diskdata);
qemuDomainSecretDiskDestroy(disk);
VIR_FREE(devstr);
return ret;
exit_monitor:
if (corAlias)
ignore_value(qemuMonitorDelObject(priv->mon, corAlias));
- qemuHotplugDiskSourceRemove(priv->mon, diskdata);
+ qemuBlockStorageSourceChainDetach(priv->mon, data);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -2;