[libvirt] [PATCH 6/6] qemu: Remove the shared disk entry if the operation is ejecting
John Ferlan
jferlan at redhat.com
Tue Feb 19 01:28:51 UTC 2013
On 02/13/2013 09:58 AM, Osier Yang wrote:
> For both qemuDomainAttachDeviceDiskLive and qemuDomainChangeDiskMediaLive.
This is a really sparse definition of what's being changed here. In
fact this just seems very different from the remainder of this patch series.
I'm unclear why you have to get a copy of the DeviceDef
> ---
> src/qemu/qemu_driver.c | 40 +++++++++++++++++++++++++++++++++++-----
> src/qemu/qemu_hotplug.c | 10 +++++++++-
> src/qemu/qemu_hotplug.h | 3 ++-
> 3 files changed, 46 insertions(+), 7 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 48852ad..f362027 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -5827,7 +5827,10 @@ qemuDomainAttachDeviceDiskLive(virConnectPtr conn,
> virDomainDeviceDefPtr dev)
> {
> virDomainDiskDefPtr disk = dev->data.disk;
> + virDomainDeviceDefPtr dev_copy = NULL;
> virCgroupPtr cgroup = NULL;
> + virCapsPtr caps = NULL;
> + int eject;
> int ret = -1;
>
> if (disk->driverName != NULL && !STREQ(disk->driverName, "qemu")) {
> @@ -5860,7 +5863,13 @@ 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 (!(caps = virQEMUDriverGetCapabilities(driver, false)))
> + goto end;
> +
> + if (!(dev_copy = virDomainDeviceDefCopy(caps, vm->def, dev)))
> + goto end;
> +
> + ret = qemuDomainChangeEjectableMedia(driver, vm, disk, false, &eject);
> break;
> case VIR_DOMAIN_DISK_DEVICE_DISK:
> case VIR_DOMAIN_DISK_DEVICE_LUN:
> @@ -5889,8 +5898,12 @@ qemuDomainAttachDeviceDiskLive(virConnectPtr conn,
> break;
> }
>
> - if (ret != 0 && cgroup) {
> - if (qemuTeardownDiskCgroup(vm, cgroup, disk) < 0)
> + if (ret == 0) {
> + if (eject)
> + ignore_value(qemuRemoveSharedDisk(driver, dev_copy->data.disk,
> + vm->def->name));
> + } else {
> + if (cgroup && qemuTeardownDiskCgroup(vm, cgroup, disk) < 0)
> VIR_WARN("Failed to teardown cgroup for disk path %s",
> NULLSTR(disk->src));
> }
> @@ -5900,6 +5913,8 @@ end:
> ignore_value(qemuRemoveSharedDisk(driver, disk, vm->def->name));
> if (cgroup)
> virCgroupFree(&cgroup);
> + virObjectUnref(caps);
> + virDomainDeviceDefFree(dev_copy);
> return ret;
> }
>
> @@ -6079,6 +6094,9 @@ qemuDomainChangeDiskMediaLive(virDomainObjPtr vm,
> {
> virDomainDiskDefPtr disk = dev->data.disk;
> virCgroupPtr cgroup = NULL;
> + virDomainDeviceDefPtr dev_copy = NULL;
> + virCapsPtr caps = NULL;
> + int eject;
> int ret = -1;
>
> if (qemuDomainDetermineDiskChain(driver, disk, false) < 0)
> @@ -6099,9 +6117,19 @@ 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 (!(caps = virQEMUDriverGetCapabilities(driver, false)))
> + goto end;
> +
> + if (!(dev_copy = virDomainDeviceDefCopy(caps, vm->def, dev)))
> + goto end;
> +
> + ret = qemuDomainChangeEjectableMedia(driver, vm, disk, force, &eject);
> + if (ret == 0) {
> dev->data.disk = NULL;
> + if (eject)
> + ignore_value(qemuRemoveSharedDisk(driver, dev_copy->data.disk,
> + vm->def->name));
> + }
> break;
> default:
> virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> @@ -6118,6 +6146,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 0c28a6a..e54cf09 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -53,7 +53,8 @@
> int qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver,
> virDomainObjPtr vm,
> virDomainDiskDefPtr disk,
> - bool force)
> + bool force,
> + int *eject)
> {
> virDomainDiskDefPtr origdisk = NULL;
> int i;
> @@ -93,6 +94,13 @@ int qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver,
> goto cleanup;
> }
>
> + if (eject) {
> + if (origdisk->src && !disk->src)
> + *eject = 1;
> + else
> + *eject = 0;
> + }
> +
> if (virDomainLockDiskAttach(driver->lockManager, cfg->uri,
> vm, disk) < 0)
> goto cleanup;
> diff --git a/src/qemu/qemu_hotplug.h b/src/qemu/qemu_hotplug.h
> index 8f01d23..fc0532a 100644
> --- a/src/qemu/qemu_hotplug.h
> +++ b/src/qemu/qemu_hotplug.h
> @@ -31,7 +31,8 @@
> int qemuDomainChangeEjectableMedia(virQEMUDriverPtr driver,
> virDomainObjPtr vm,
> virDomainDiskDefPtr disk,
> - bool force);
> + bool force,
> + int *eject);
> int qemuDomainCheckEjectableMedia(virQEMUDriverPtr driver,
> virDomainObjPtr vm,
> enum qemuDomainAsyncJob asyncJob);
>
More information about the libvir-list
mailing list