From: Peter Krempa Date: Fri, 8 Aug 2014 08:16:32 +0000 (+0200) Subject: qemu: hotplug: Format proper source string for cdrom media change X-Git-Tag: v1.2.8-rc1~75 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b57ca1320c8201e6e127868f7b0495c65eaa5056;p=thirdparty%2Flibvirt.git qemu: hotplug: Format proper source string for cdrom media change Use the qemu source string formatter to format the source string correctly for remote and other storage instead of passing source->path blindly. --- diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index c29e1c8657..628109dcfe 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -6681,7 +6681,8 @@ qemuDomainChangeDiskMediaLive(virConnectPtr conn, newsrc = disk->src; disk->src = NULL; - ret = qemuDomainChangeEjectableMedia(driver, vm, orig_disk, newsrc, force); + ret = qemuDomainChangeEjectableMedia(driver, conn, 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 f40434bc1d..1a2b4b27ff 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -139,6 +139,7 @@ qemuDomainPrepareDisk(virQEMUDriverPtr driver, int qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver, + virConnectPtr conn, virDomainObjPtr vm, virDomainDiskDefPtr disk, virStorageSourcePtr newsrc, @@ -149,6 +150,7 @@ int qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver, qemuDomainObjPrivatePtr priv = vm->privateData; int retries = CHANGE_MEDIA_RETRIES; const char *format = NULL; + char *sourcestr = NULL; if (!disk->info.alias) { virReportError(VIR_ERR_INTERNAL_ERROR, @@ -198,7 +200,10 @@ int qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver, goto error; } - if (newsrc->path) { + if (!virStorageSourceIsLocalStorage(newsrc) || newsrc->path) { + if (qemuGetDriveSourceString(newsrc, conn, &sourcestr) < 0) + goto error; + if (virStorageSourceGetActualType(newsrc) != VIR_STORAGE_TYPE_DIR) { if (newsrc->format > 0) { format = virStorageFileFormatTypeToString(newsrc->format); @@ -210,7 +215,7 @@ int qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver, qemuDomainObjEnterMonitor(driver, vm); ret = qemuMonitorChangeMedia(priv->mon, driveAlias, - newsrc->path, + sourcestr, format); qemuDomainObjExitMonitor(driver, vm); } @@ -229,6 +234,7 @@ int qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver, cleanup: virStorageSourceFree(newsrc); VIR_FREE(driveAlias); + VIR_FREE(sourcestr); return ret; error: @@ -792,7 +798,7 @@ qemuDomainAttachDeviceDiskLive(virConnectPtr conn, newsrc = disk->src; disk->src = NULL; - ret = qemuDomainChangeEjectableMedia(driver, vm, orig_disk, newsrc, false); + ret = qemuDomainChangeEjectableMedia(driver, conn, 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 a8fe231c11..55c9333da5 100644 --- a/src/qemu/qemu_hotplug.h +++ b/src/qemu/qemu_hotplug.h @@ -29,6 +29,7 @@ # include "domain_conf.h" int qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver, + virConnectPtr conn, virDomainObjPtr vm, virDomainDiskDefPtr disk, virStorageSourcePtr newsrc,