On 2013年02月11日 18:55, Daniel P. Berrange wrote:
On Fri, Feb 08, 2013 at 09:08:02PM +0800, Osier Yang wrote:
> The disk def could be free'ed by qemuDomainChangeEjectableMedia
> for cdrom or floppy disk. This moves the adding and setting before
> the attaching takes place. And for cdrom floppy disk, if the
> change is ejecting, removing the existed hash entry for it.
> ---
> src/qemu/qemu_driver.c | 23 +++++++++++++----------
> src/qemu/qemu_hotplug.c | 6 +++++-
> src/qemu/qemu_hotplug.h | 3 ++-
> 3 files changed, 20 insertions(+), 12 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 03fe526..4aad42f 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -5789,6 +5789,7 @@ qemuDomainAttachDeviceDiskLive(virConnectPtr conn,
> {
> virDomainDiskDefPtr disk = dev->data.disk;
> virCgroupPtr cgroup = NULL;
> + int eject, added;
> int ret = -1;
>
> if (disk->driverName != NULL&& !STREQ(disk->driverName,
"qemu")) {
> @@ -5798,6 +5799,12 @@ qemuDomainAttachDeviceDiskLive(virConnectPtr conn,
> goto end;
> }
>
> + if (qemuAddSharedDisk(driver->sharedDisks, disk,&added)< 0)
> + goto end;
> +
> + if (qemuSetUnprivSGIO(disk)< 0)
> + goto end;
> +
> if (qemuDomainDetermineDiskChain(driver, disk, false)< 0)
> goto end;
>
> @@ -5814,7 +5821,7 @@ qemuDomainAttachDeviceDiskLive(virConnectPtr conn,
> switch (disk->device) {
> case VIR_DOMAIN_DISK_DEVICE_CDROM:
> case VIR_DOMAIN_DISK_DEVICE_FLOPPY:
> - ret = qemuDomainChangeEjectableMedia(driver, vm, disk, false);
> + ret = qemuDomainChangeEjectableMedia(driver, vm, disk, false,&eject);
> break;
> case VIR_DOMAIN_DISK_DEVICE_DISK:
> case VIR_DOMAIN_DISK_DEVICE_LUN:
> @@ -5843,22 +5850,18 @@ qemuDomainAttachDeviceDiskLive(virConnectPtr conn,
> break;
> }
>
> + if (ret == 0&& eject)
> + ignore_value(qemuRemoveSharedDisk(driver->sharedDisks, disk));
This doesn't make sense - you're removing the disk we just added.
No, the removing only happens when the operation is to eject the
media of CD-ROM or Floppy. It's determined by "eject".
You need to remove the *old* disk->src surely ?
Yes, if the operation is ejecting.
In addition it is
*not* valid to reference 'disk' at all at this point, since the
functions we just called may have free'd it.
Oh, yes, I should copy the disk def before
qemuDomainChangeEjectableMedia takes place.
Osier