[libvirt] [PATCH 6/6] qemu: Remove the shared disk entry if the operation is ejecting or updating
John Ferlan
jferlan at redhat.com
Wed Feb 20 01:12:32 UTC 2013
On 02/19/2013 07:27 AM, Osier Yang wrote:
> For both qemuDomainAttachDeviceDiskLive and qemuDomainChangeDiskMediaLive,
> remove the shared disk entry of original disk src.
> ---
> src/conf/domain_conf.c | 20 ++++++++++++
> src/conf/domain_conf.h | 3 ++
> src/libvirt_private.syms | 1 +
> src/qemu/qemu_driver.c | 76 ++++++++++++++++++++++++++++++++++++++++++++--
> src/qemu/qemu_hotplug.c | 19 +-----------
> src/qemu/qemu_hotplug.h | 1 +
> 6 files changed, 99 insertions(+), 21 deletions(-)
>
Soft ACK - it looks OK, but I'm not too familiar with the code and
what's being done here. I do think you need to make a better git
description at least with respect to what's going on!
John
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 7a2b012..f2887c6 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -3359,6 +3359,26 @@ virDomainDiskFindControllerModel(virDomainDefPtr def,
> return model;
> }
>
> +virDomainDiskDefPtr
> +virDomainDiskFindByBusAndDst(virDomainDefPtr def,
> + int bus,
> + char *dst)
> +{
> + int i;
> +
> + if (!dst)
> + return NULL;
> +
> + for (i = 0 ; i < def->ndisks ; i++) {
> + if (def->disks[i]->bus == bus &&
> + STREQ(def->disks[i]->dst, dst)) {
> + return def->disks[i];
> + }
> + }
> +
> + return NULL;
> +}
> +
> int
> virDomainDiskDefAssignAddress(virCapsPtr caps, virDomainDiskDefPtr def)
> {
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 9232ff9..4ffa4aa 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -1936,6 +1936,9 @@ void virDomainDiskHostDefFree(virDomainDiskHostDefPtr def);
> int virDomainDiskFindControllerModel(virDomainDefPtr def,
> virDomainDiskDefPtr disk,
> int controllerType);
> +virDomainDiskDefPtr virDomainDiskFindByBusAndDst(virDomainDefPtr def,
> + int bus,
> + char *dst);
> void virDomainControllerDefFree(virDomainControllerDefPtr def);
> void virDomainFSDefFree(virDomainFSDefPtr def);
> void virDomainActualNetDefFree(virDomainActualNetDefPtr def);
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index d8d5877..54ccf95 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -360,6 +360,7 @@ virDomainDiskDefGetSecurityLabelDef;
> virDomainDiskDeviceTypeToString;
> virDomainDiskErrorPolicyTypeFromString;
> virDomainDiskErrorPolicyTypeToString;
> +virDomainDiskFindByBusAndDst;
> virDomainDiskFindControllerModel;
> virDomainDiskGeometryTransTypeFromString;
> virDomainDiskGeometryTransTypeToString;
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 5a3550d..18302e7 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -5700,7 +5700,11 @@ qemuDomainAttachDeviceDiskLive(virConnectPtr conn,
> virDomainDeviceDefPtr dev)
> {
> virDomainDiskDefPtr disk = dev->data.disk;
> + virDomainDiskDefPtr orig_disk = NULL;
> + virDomainDeviceDefPtr dev_copy = NULL;
> + virDomainDiskDefPtr tmp = NULL;
> virCgroupPtr cgroup = NULL;
> + virCapsPtr caps = NULL;
> int ret = -1;
>
> if (disk->driverName != NULL && !STREQ(disk->driverName, "qemu")) {
> @@ -5733,7 +5737,37 @@ qemuDomainAttachDeviceDiskLive(virConnectPtr conn,
> switch (disk->device) {
> case VIR_DOMAIN_DISK_DEVICE_CDROM:
> case VIR_DOMAIN_DISK_DEVICE_FLOPPY:
> - ret = qemuDomainChangeEjectableMedia(driver, vm, disk, false);
> + if (!(orig_disk = virDomainDiskFindByBusAndDst(vm->def,
> + disk->bus, disk->dst))) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("No device with bus '%s' and target '%s'"),
> + virDomainDiskBusTypeToString(disk->bus),
> + disk->dst);
> + goto end;
> + }
> +
> + if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
> + goto end;
> +
> + tmp = dev->data.disk;
> + dev->data.disk = orig_disk;
> +
> + if (!(dev_copy = virDomainDeviceDefCopy(caps, vm->def, dev))) {
> + dev->data.disk = tmp;
> + goto end;
> + }
> + dev->data.disk = tmp;
> +
> + ret = qemuDomainChangeEjectableMedia(driver, vm, disk, orig_disk, false);
> +
> + /* Need to remove the shared disk entry for the original disk src
> + * if the operation is either ejecting or updating.
> + */
> + if (ret == 0 &&
> + orig_disk->src &&
> + STRNEQ_NULLABLE(orig_disk->src, disk->src))
> + ignore_value(qemuRemoveSharedDisk(driver, dev_copy->data.disk,
> + vm->def->name));
> break;
> case VIR_DOMAIN_DISK_DEVICE_DISK:
> case VIR_DOMAIN_DISK_DEVICE_LUN:
> @@ -5773,6 +5807,8 @@ end:
> ignore_value(qemuRemoveSharedDisk(driver, disk, vm->def->name));
> if (cgroup)
> virCgroupFree(&cgroup);
> + virObjectUnref(caps);
> + virDomainDeviceDefFree(dev_copy);
> return ret;
> }
>
> @@ -5951,7 +5987,11 @@ qemuDomainChangeDiskMediaLive(virDomainObjPtr vm,
> bool force)
> {
> virDomainDiskDefPtr disk = dev->data.disk;
> + virDomainDiskDefPtr orig_disk = NULL;
> + virDomainDiskDefPtr tmp = NULL;
> virCgroupPtr cgroup = NULL;
> + virDomainDeviceDefPtr dev_copy = NULL;
> + virCapsPtr caps = NULL;
> int ret = -1;
>
> if (qemuDomainDetermineDiskChain(driver, disk, false) < 0)
> @@ -5972,9 +6012,37 @@ qemuDomainChangeDiskMediaLive(virDomainObjPtr vm,
> switch (disk->device) {
> case VIR_DOMAIN_DISK_DEVICE_CDROM:
> case VIR_DOMAIN_DISK_DEVICE_FLOPPY:
> - ret = qemuDomainChangeEjectableMedia(driver, vm, disk, force);
> - if (ret == 0)
> + if (!(orig_disk = virDomainDiskFindByBusAndDst(vm->def,
> + disk->bus, disk->dst))) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("No device with bus '%s' and target '%s'"),
> + virDomainDiskBusTypeToString(disk->bus),
> + disk->dst);
> + goto end;
> + }
> +
> + if (!(caps = virQEMUDriverGetCapabilities(driver, false)))
> + goto end;
> +
> + tmp = dev->data.disk;
> + dev->data.disk = orig_disk;
> +
> + if (!(dev_copy = virDomainDeviceDefCopy(caps, vm->def, dev))) {
> + dev->data.disk = tmp;
> + goto end;
> + }
> + dev->data.disk = tmp;
> +
> + ret = qemuDomainChangeEjectableMedia(driver, vm, disk, orig_disk, force);
> + if (ret == 0) {
> dev->data.disk = NULL;
> + /* Need to remove the shared disk entry for the original
> + * disk src if the operation is either ejecting or updating.
> + */
> + if (orig_disk->src && STRNEQ_NULLABLE(orig_disk->src, disk->src))
> + ignore_value(qemuRemoveSharedDisk(driver, dev_copy->data.disk,
> + vm->def->name));
> + }
> break;
> default:
> virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> @@ -5991,6 +6059,8 @@ qemuDomainChangeDiskMediaLive(virDomainObjPtr vm,
> end:
> if (cgroup)
> virCgroupFree(&cgroup);
> + virObjectUnref(caps);
> + virDomainDeviceDefFree(dev_copy);
> return ret;
> }
>
> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> index 488a440..e631587 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -53,32 +53,15 @@
> int qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver,
> virDomainObjPtr vm,
> virDomainDiskDefPtr disk,
> + virDomainDiskDefPtr origdisk,
> bool force)
> {
> - virDomainDiskDefPtr origdisk = NULL;
> - int i;
> int ret = -1;
> char *driveAlias = NULL;
> qemuDomainObjPrivatePtr priv = vm->privateData;
> int retries = CHANGE_MEDIA_RETRIES;
> virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
>
> - for (i = 0 ; i < vm->def->ndisks ; i++) {
> - if (vm->def->disks[i]->bus == disk->bus &&
> - STREQ(vm->def->disks[i]->dst, disk->dst)) {
> - origdisk = vm->def->disks[i];
> - break;
> - }
> - }
> -
> - if (!origdisk) {
> - virReportError(VIR_ERR_INTERNAL_ERROR,
> - _("No device with bus '%s' and target '%s'"),
> - virDomainDiskBusTypeToString(disk->bus),
> - disk->dst);
> - goto cleanup;
> - }
> -
> if (!origdisk->info.alias) {
> virReportError(VIR_ERR_INTERNAL_ERROR,
> _("missing disk device alias name for %s"), origdisk->dst);
> diff --git a/src/qemu/qemu_hotplug.h b/src/qemu/qemu_hotplug.h
> index 8f01d23..2a146fe 100644
> --- a/src/qemu/qemu_hotplug.h
> +++ b/src/qemu/qemu_hotplug.h
> @@ -31,6 +31,7 @@
> int qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver,
> virDomainObjPtr vm,
> virDomainDiskDefPtr disk,
> + virDomainDiskDefPtr orig_disk,
> bool force);
> int qemuDomainCheckEjectableMedia(virQEMUDriverPtr driver,
> virDomainObjPtr vm,
>
More information about the libvir-list
mailing list