Pass the source of the changed media instead of a complete disk
definition.
Note that the @disk argument now contains what @olddisk would contain.
The new source is passed as a virStorageSource struct.
---
src/qemu/qemu_driver.c | 6 ++++-
src/qemu/qemu_hotplug.c | 71 ++++++++++++++++++++++---------------------------
src/qemu/qemu_hotplug.h | 2 +-
3 files changed, 38 insertions(+), 41 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 03fe96f..fc345d5 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -6623,6 +6623,7 @@ qemuDomainChangeDiskMediaLive(virConnectPtr conn,
virDomainDiskDefPtr orig_disk = NULL;
virDomainDiskDefPtr tmp = NULL;
virDomainDeviceDefPtr dev_copy = NULL;
+ virStorageSourcePtr newsrc;
virCapsPtr caps = NULL;
int ret = -1;
@@ -6661,7 +6662,10 @@ qemuDomainChangeDiskMediaLive(virConnectPtr conn,
if (qemuAddSharedDevice(driver, dev, vm->def->name) < 0)
goto end;
- ret = qemuDomainChangeEjectableMedia(driver, vm, disk, orig_disk, force);
+ newsrc = disk->src;
+ disk->src = NULL;
+
+ ret = qemuDomainChangeEjectableMedia(driver, vm, orig_disk, newsrc, force);
/* 'disk' must not be accessed now - it has been freed.
* 'orig_disk' now points to the new disk, while 'dev_copy'
* now points to the old disk */
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 5894f43..9ad06be 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -140,34 +140,33 @@ qemuDomainPrepareDisk(virQEMUDriverPtr driver,
int qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver,
virDomainObjPtr vm,
virDomainDiskDefPtr disk,
- virDomainDiskDefPtr origdisk,
+ virStorageSourcePtr newsrc,
bool force)
{
int ret = -1;
char *driveAlias = NULL;
qemuDomainObjPrivatePtr priv = vm->privateData;
int retries = CHANGE_MEDIA_RETRIES;
- virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
- const char *src = NULL;
+ const char *format = NULL;
- if (!origdisk->info.alias) {
+ if (!disk->info.alias) {
virReportError(VIR_ERR_INTERNAL_ERROR,
- _("missing disk device alias name for %s"),
origdisk->dst);
+ _("missing disk device alias name for %s"),
disk->dst);
goto cleanup;
}
- if (origdisk->device != VIR_DOMAIN_DISK_DEVICE_FLOPPY &&
- origdisk->device != VIR_DOMAIN_DISK_DEVICE_CDROM) {
+ if (disk->device != VIR_DOMAIN_DISK_DEVICE_FLOPPY &&
+ disk->device != VIR_DOMAIN_DISK_DEVICE_CDROM) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Removable media not supported for %s device"),
virDomainDiskDeviceTypeToString(disk->device));
goto cleanup;
}
- if (qemuDomainPrepareDisk(driver, vm, disk, NULL, false) < 0)
+ if (qemuDomainPrepareDisk(driver, vm, disk, newsrc, false) < 0)
goto cleanup;
- if (!(driveAlias = qemuDeviceDriveHostAlias(origdisk, priv->qemuCaps)))
+ if (!(driveAlias = qemuDeviceDriveHostAlias(disk, priv->qemuCaps)))
goto error;
qemuDomainObjEnterMonitor(driver, vm);
@@ -180,7 +179,7 @@ int qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver,
virObjectRef(vm);
/* we don't want to report errors from media tray_open polling */
while (retries) {
- if (origdisk->tray_status == VIR_DOMAIN_DISK_TRAY_OPEN)
+ if (disk->tray_status == VIR_DOMAIN_DISK_TRAY_OPEN)
break;
retries--;
@@ -198,53 +197,42 @@ int qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver,
goto error;
}
- src = virDomainDiskGetSource(disk);
- if (src) {
- /* deliberately don't depend on 'ret' as 'eject' may have
failed the
- * first time and we are going to check the drive state anyway */
- const char *format = NULL;
- int type = virDomainDiskGetType(disk);
- int diskFormat = virDomainDiskGetFormat(disk);
-
- if (type != VIR_STORAGE_TYPE_DIR) {
- if (diskFormat > 0) {
- format = virStorageFileFormatTypeToString(diskFormat);
+ if (newsrc->path) {
+ if (virStorageSourceGetActualType(newsrc) != VIR_STORAGE_TYPE_DIR) {
+ if (newsrc->format > 0) {
+ format = virStorageFileFormatTypeToString(newsrc->format);
} else {
- diskFormat = virDomainDiskGetFormat(origdisk);
- if (diskFormat > 0)
- format = virStorageFileFormatTypeToString(diskFormat);
+ if (disk->src->format > 0)
+ format = virStorageFileFormatTypeToString(disk->src->format);
}
}
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorChangeMedia(priv->mon,
driveAlias,
- src, format);
+ newsrc->path,
+ format);
qemuDomainObjExitMonitor(driver, vm);
}
- virDomainAuditDisk(vm, origdisk->src, disk->src, "update", ret >=
0);
+ virDomainAuditDisk(vm, disk->src, newsrc, "update", ret >= 0);
if (ret < 0)
goto error;
- ignore_value(qemuDomainPrepareDisk(driver, vm, origdisk, NULL, true));
-
- if (virDomainDiskSetSource(origdisk, src) < 0)
- goto error;
- virDomainDiskSetType(origdisk, virDomainDiskGetType(disk));
+ ignore_value(qemuDomainPrepareDisk(driver, vm, disk, NULL, true));
- virDomainDiskDefFree(disk);
+ virStorageSourceFree(disk->src);
+ disk->src = newsrc;
+ newsrc = NULL;
cleanup:
+ virStorageSourceFree(newsrc);
VIR_FREE(driveAlias);
- virObjectUnref(cfg);
return ret;
error:
- virDomainAuditDisk(vm, origdisk->src, disk->src, "update", false);
-
- ignore_value(qemuDomainPrepareDisk(driver, vm, disk, NULL, true));
-
+ virDomainAuditDisk(vm, disk->src, newsrc, "update", false);
+ ignore_value(qemuDomainPrepareDisk(driver, vm, disk, newsrc, true));
goto cleanup;
}
@@ -746,6 +734,7 @@ qemuDomainAttachDeviceDiskLive(virConnectPtr conn,
virDomainDiskDefPtr disk = dev->data.disk;
virDomainDiskDefPtr orig_disk = NULL;
virDomainDeviceDefPtr dev_copy = NULL;
+ virStorageSourcePtr newsrc;
virDomainDiskDefPtr tmp = NULL;
virCapsPtr caps = NULL;
int ret = -1;
@@ -788,6 +777,7 @@ qemuDomainAttachDeviceDiskLive(virConnectPtr conn,
if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
goto end;
+
tmp = dev->data.disk;
dev->data.disk = orig_disk;
@@ -798,8 +788,11 @@ qemuDomainAttachDeviceDiskLive(virConnectPtr conn,
}
dev->data.disk = tmp;
- ret = qemuDomainChangeEjectableMedia(driver, vm, disk, orig_disk, false);
- /* 'disk' must not be accessed now - it has been free'd.
+ newsrc = disk->src;
+ disk->src = NULL;
+
+ ret = qemuDomainChangeEjectableMedia(driver, vm, orig_disk, newsrc, false);
+ /* 'newsrc' must not be accessed now - it has been free'd.
* 'orig_disk' now points to the new disk, while 'dev_copy'
* now points to the old disk */
diff --git a/src/qemu/qemu_hotplug.h b/src/qemu/qemu_hotplug.h
index 6192973..5ce8f0a 100644
--- a/src/qemu/qemu_hotplug.h
+++ b/src/qemu/qemu_hotplug.h
@@ -31,7 +31,7 @@
int qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver,
virDomainObjPtr vm,
virDomainDiskDefPtr disk,
- virDomainDiskDefPtr orig_disk,
+ virStorageSourcePtr newsrc,
bool force);
int qemuDomainCheckEjectableMedia(virQEMUDriverPtr driver,
virDomainObjPtr vm,
--
2.0.2