struct _qemuHotplugDiskSourceData {
qemuBlockStorageSourceAttachDataPtr *backends;
size_t nbackends;
-
- /* disk copy-on-read object */
- virJSONValuePtr corProps;
- char *corAlias;
};
typedef struct _qemuHotplugDiskSourceData qemuHotplugDiskSourceData;
typedef qemuHotplugDiskSourceData *qemuHotplugDiskSourceDataPtr;
if (!data)
return;
- virJSONValueFree(data->corProps);
- VIR_FREE(data->corAlias);
-
for (i = 0; i < data->nbackends; i++)
qemuBlockStorageSourceAttachDataFree(data->backends[i]);
virStorageSourcePtr src,
virQEMUCapsPtr qemuCaps)
{
- qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
VIR_AUTOPTR(qemuBlockStorageSourceAttachData) backend = NULL;
qemuHotplugDiskSourceDataPtr data = NULL;
qemuHotplugDiskSourceDataPtr ret = NULL;
return NULL;
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV)) {
- if (VIR_STRDUP(data->corAlias, diskPriv->nodeCopyOnRead) < 0)
- goto cleanup;
-
for (n = src; virStorageSourceIsBacking(n); n = n->backingStore) {
if (!(backend = qemuBlockStorageSourceDetachPrepare(n, NULL)))
goto cleanup;
return NULL;
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV)) {
- if (disk->copy_on_read == VIR_TRISTATE_SWITCH_ON &&
- !(data->corProps = qemuBlockStorageGetCopyOnReadProps(disk)))
- goto cleanup;
-
for (n = src; virStorageSourceIsBacking(n); n = n->backingStore) {
if (!(backend = qemuBlockStorageSourceAttachPrepareBlockdev(n)))
goto cleanup;
return -1;
}
- if (data->corProps &&
- qemuMonitorAddObject(mon, &data->corProps, &data->corAlias) < 0)
- return -1;
return 0;
}
{
size_t i;
- if (data->corAlias)
- ignore_value(qemuMonitorDelObject(mon, data->corAlias));
-
for (i = 0; i < data->nbackends; i++)
qemuBlockStorageSourceAttachRollback(mon, data->backends[i]);
}
qemuHotplugDiskSourceDataPtr diskdata = NULL;
char *devstr = NULL;
VIR_AUTOUNREF(virQEMUDriverConfigPtr) cfg = virQEMUDriverGetConfig(driver);
+ VIR_AUTOPTR(virJSONValue) corProps = NULL;
+ VIR_AUTOFREE(char *) corAlias = NULL;
if (qemuDomainStorageSourceChainAccessAllow(driver, vm, disk->src) < 0)
goto cleanup;
if (qemuDomainPrepareDiskSource(disk, priv, cfg) < 0)
goto error;
+ if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV)) {
+ 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 (qemuHotplugDiskSourceAttach(priv->mon, diskdata) < 0)
goto exit_monitor;
+ if (corProps &&
+ qemuMonitorAddObject(priv->mon, &corProps, &corAlias) < 0)
+ goto exit_monitor;
+
if (qemuDomainAttachExtensionDevice(priv->mon, &disk->info) < 0)
goto exit_monitor;
return ret;
exit_monitor:
+ if (corAlias)
+ ignore_value(qemuMonitorDelObject(priv->mon, corAlias));
qemuHotplugDiskSourceRemove(priv->mon, diskdata);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
virDomainObjPtr vm,
virDomainDiskDefPtr disk)
{
+ qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
qemuHotplugDiskSourceDataPtr diskbackend = NULL;
virDomainDeviceDef dev;
size_t i;
qemuDomainObjPrivatePtr priv = vm->privateData;
+ VIR_AUTOFREE(char *) corAlias = NULL;
+ bool blockdev = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV);
int ret = -1;
VIR_DEBUG("Removing disk %s from domain %p %s",
priv->qemuCaps)))
return -1;
+ if (blockdev) {
+ if (VIR_STRDUP(corAlias, diskPriv->nodeCopyOnRead) < 0)
+ goto cleanup;
+ }
+
for (i = 0; i < vm->def->ndisks; i++) {
if (vm->def->disks[i] == disk) {
virDomainDiskRemove(vm->def, i);
qemuDomainObjEnterMonitor(driver, vm);
+ if (corAlias)
+ ignore_value(qemuMonitorDelObject(priv->mon, corAlias));
+
qemuHotplugDiskSourceRemove(priv->mon, diskbackend);
if (qemuDomainObjExitMonitor(driver, vm) < 0)