static qemuHotplugDiskSourceDataPtr
qemuHotplugDiskSourceRemovePrepare(virDomainDiskDefPtr disk,
+ virStorageSourcePtr src,
virQEMUCapsPtr qemuCaps)
{
qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
if (VIR_STRDUP(data->corAlias, diskPriv->nodeCopyOnRead) < 0)
goto cleanup;
- for (n = disk->src; virStorageSourceIsBacking(n); n = n->backingStore) {
+ for (n = src; virStorageSourceIsBacking(n); n = n->backingStore) {
if (!(backend = qemuHotplugRemoveStorageSourcePrepareData(n, NULL)))
goto cleanup;
if (!(drivealias = qemuAliasDiskDriveFromDisk(disk)))
goto cleanup;
- if (!(backend = qemuHotplugRemoveStorageSourcePrepareData(disk->src,
+ if (!(backend = qemuHotplugRemoveStorageSourcePrepareData(src,
drivealias)))
goto cleanup;
/**
* qemuHotplugDiskSourceAttachPrepare:
* @disk: disk to generate attachment data for
+ * @src: disk source to prepare attachment
* @qemuCaps: capabilities of the qemu process
*
* Prepares and returns qemuHotplugDiskSourceData structure filled with all data
*/
static qemuHotplugDiskSourceDataPtr
qemuHotplugDiskSourceAttachPrepare(virDomainDiskDefPtr disk,
+ virStorageSourcePtr src,
virQEMUCapsPtr qemuCaps)
{
qemuBlockStorageSourceAttachDataPtr backend = NULL;
qemuHotplugDiskSourceDataPtr data;
qemuHotplugDiskSourceDataPtr ret = NULL;
+ virStorageSourcePtr savesrc = NULL;
virStorageSourcePtr n;
if (VIR_ALLOC(data) < 0)
!(data->corProps = qemuBlockStorageGetCopyOnReadProps(disk)))
goto cleanup;
- for (n = disk->src; virStorageSourceIsBacking(n); n = n->backingStore) {
+ for (n = src; virStorageSourceIsBacking(n); n = n->backingStore) {
if (!(backend = qemuBlockStorageSourceAttachPrepareBlockdev(n)))
goto cleanup;
goto cleanup;
}
} else {
+ VIR_STEAL_PTR(savesrc, disk->src);
+ disk->src = src;
+
if (!(backend = qemuBuildStorageSourceAttachPrepareDrive(disk, qemuCaps)))
goto cleanup;
- if (qemuBuildStorageSourceAttachPrepareCommon(disk->src, backend, qemuCaps) < 0)
+ VIR_STEAL_PTR(disk->src, savesrc);
+
+ if (qemuBuildStorageSourceAttachPrepareCommon(src, backend, qemuCaps) < 0)
goto cleanup;
if (VIR_APPEND_ELEMENT(data->backends, data->nbackends, backend) < 0)
VIR_STEAL_PTR(ret, data);
cleanup:
+ if (savesrc)
+ VIR_STEAL_PTR(disk->src, savesrc);
+
qemuBlockStorageSourceAttachDataFree(backend);
qemuHotplugDiskSourceDataFree(data);
return ret;
int ret = -1;
if (!virStorageSourceIsEmpty(disk->src) &&
- !(oldbackend = qemuHotplugDiskSourceRemovePrepare(disk, priv->qemuCaps)))
+ !(oldbackend = qemuHotplugDiskSourceRemovePrepare(disk, disk->src,
+ priv->qemuCaps)))
goto cleanup;
disk->src = newsrc;
if (!virStorageSourceIsEmpty(disk->src)) {
- if (!(newbackend = qemuHotplugDiskSourceAttachPrepare(disk,
+ if (!(newbackend = qemuHotplugDiskSourceAttachPrepare(disk, disk->src,
priv->qemuCaps)))
goto cleanup;
if (qemuDomainPrepareDiskSource(disk, priv, cfg) < 0)
goto error;
- if (!(diskdata = qemuHotplugDiskSourceAttachPrepare(disk, priv->qemuCaps)))
+ if (!(diskdata = qemuHotplugDiskSourceAttachPrepare(disk, disk->src,
+ priv->qemuCaps)))
goto error;
if (!(devstr = qemuBuildDiskDeviceStr(vm->def, disk, 0, priv->qemuCaps)))
VIR_DEBUG("Removing disk %s from domain %p %s",
disk->info.alias, vm, vm->def->name);
- if (!(diskbackend = qemuHotplugDiskSourceRemovePrepare(disk, priv->qemuCaps)))
+ if (!(diskbackend = qemuHotplugDiskSourceRemovePrepare(disk, disk->src,
+ priv->qemuCaps)))
return -1;
for (i = 0; i < vm->def->ndisks; i++) {