mirror_qemu/stubs
Markus Armbruster 3ae59580a0 block: Keep DriveInfo alive until BlockDriverState dies
If the BDS's refcnt > 0, drive_del() destroys the DriveInfo, but not
the BDS.  This can happen in three places:

* Device model destruction during unplug: blockdev_auto_del()

* Xen IDE unplug: pci_piix3_xen_ide_unplug()

* drive_del command when no device model is attached: do_drive_del()

The other callers of drive_del are on error paths where refcnt == 1.

If the user somehow manages to plug in a device model using a BDS that
has gone through drive_del(), the legacy configuration passed in
DriveInfo doesn't reach the device model, and automatic deletion on
unplug doesn't work.  Worse, some device models such as scsi-disk
crash when DriveInfo doesn't exist.

This is theoretical; I didn't research an actual reproducer. The problem
was introduced when we replaced DriveInfo reference counting by BDS
reference counting in commit a94a3fa..fa510eb.

Fix by keeping DriveInfo alive until its BDS dies.

This affects qemu_drive_opts: now you can't reuse the same ID for new
drive options until the BDS dies.  Before, you could, but since the
code always attempts to create a BDS with the same ID next, the
enclosing operation "create a new drive" failed anyway.  Different
error path, same result.

Unfortunately, the fix involves use of blockdev.c stuff from block.c,
which is a layering violation.  Fortunately, my forthcoming
BlockBackend work will get rid of it again.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Benoît Canet <benoit.canet@nodalink.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
2014-09-25 15:24:14 +02:00
..
Makefile.objs block: Keep DriveInfo alive until BlockDriverState dies 2014-09-25 15:24:14 +02:00
arch-query-cpu-def.c qerror.h: Replace QERR_NOT_SUPPORTED with QERR_UNSUPPORTED 2014-04-25 09:19:59 -04:00
bdrv-commit-all.c libqemustub: add stubs to be able to use qemu-char.c 2014-06-19 18:44:18 +03:00
blockdev.c block: Keep DriveInfo alive until BlockDriverState dies 2014-09-25 15:24:14 +02:00
chr-baum-init.c libqemustub: add more stubs for qemu-char 2014-06-23 17:37:59 +03:00
chr-msmouse.c libqemustub: add stubs to be able to use qemu-char.c 2014-06-19 18:44:18 +03:00
chr-testdev.c backends: Introduce chr-testdev 2014-08-06 17:53:05 +02:00
clock-warp.c aio / timers: Rearrange timer.h & make legacy functions call non-legacy 2013-08-22 19:14:24 +02:00
cpu-get-clock.c stubs: fully replace qemu-tool.c and qemu-user.c 2013-01-12 17:19:08 +01:00
cpu-get-icount.c stubs: fully replace qemu-tool.c and qemu-user.c 2013-01-12 17:19:08 +01:00
cpus.c cpu: Change qemu_init_vcpu() argument to CPUState 2013-06-28 13:25:13 +02:00
dump.c dump: Make DumpState and endian conversion routines available for arch-specific dump code 2014-06-16 13:24:36 +02:00
fd-register.c misc: move include files to include/qemu/ 2012-12-19 08:32:39 +01:00
fdset-add-fd.c monitor: move include files to include/monitor/ 2012-12-19 08:31:32 +01:00
fdset-find-fd.c monitor: move include files to include/monitor/ 2012-12-19 08:31:32 +01:00
fdset-get-fd.c monitor: move include files to include/monitor/ 2012-12-19 08:31:32 +01:00
fdset-remove-fd.c monitor: fix use after free 2014-08-18 14:39:10 -04:00
gdbstub.c stubs: Optimize dependencies for gdbstub.c 2014-03-02 17:13:31 +04:00
get-fd.c monitor: move include files to include/monitor/ 2012-12-19 08:31:32 +01:00
get-next-serial.c libqemustub: add stubs to be able to use qemu-char.c 2014-06-19 18:44:18 +03:00
get-vm-name.c stubs: fully replace qemu-tool.c and qemu-user.c 2013-01-12 17:19:08 +01:00
iothread-lock.c stubs: fully replace qemu-tool.c and qemu-user.c 2013-01-12 17:19:08 +01:00
is-daemonized.c Add qtest for vhost-user 2014-06-19 18:44:18 +03:00
kvm.c kvm: Introduce kvm_arch_irqchip_create 2014-02-26 17:20:00 +00:00
machine-init-done.c libqemustub: add stubs to be able to use qemu-char.c 2014-06-19 18:44:18 +03:00
migr-blocker.c stubs: fully replace qemu-tool.c and qemu-user.c 2013-01-12 17:19:08 +01:00
mon-is-qmp.c stubs: fully replace qemu-tool.c and qemu-user.c 2013-01-12 17:19:08 +01:00
mon-printf.c stubs: fully replace qemu-tool.c and qemu-user.c 2013-01-12 17:19:08 +01:00
mon-set-error.c stubs: fully replace qemu-tool.c and qemu-user.c 2013-01-12 17:19:08 +01:00
monitor-init.c libqemustub: add stubs to be able to use qemu-char.c 2014-06-19 18:44:18 +03:00
notify-event.c libqemustub: add stubs to be able to use qemu-char.c 2014-06-19 18:44:18 +03:00
pci-drive-hot-add.c hw: move device-hotplug.o to toplevel, compile it once 2013-03-01 13:57:13 +01:00
qemu-chr-open-spice.c libqemustub: add more stubs for qemu-char 2014-06-23 17:37:59 +03:00
qmp_pc_dimm_device_list.c qmp: add query-memory-devices command 2014-06-19 18:44:22 +03:00
qtest.c main-loop: Suppress "I/O thread spun" warnings for qtest 2014-03-13 21:36:50 +01:00
reset.c libqemustub: Add qemu_[un]register_reset() stubs 2013-01-08 21:03:43 +01:00
runstate-check.c blockdev: Refuse to open encrypted image unless paused 2014-03-14 16:24:42 +01:00
set-fd-handler.c misc: move include files to include/qemu/ 2012-12-19 08:32:39 +01:00
slirp.c slirp: set mainloop timeout with more precise value 2013-09-17 12:26:05 +02:00
sysbus.c libqemustub: sysbus_get_default() stub 2013-01-08 21:03:43 +01:00
uuid.c scsi: prefer UUID to VM name for the initiator name 2013-09-12 08:46:21 +02:00
vc-init.c console: move chardev declarations to sysemu/char.h 2014-06-23 10:56:20 +01:00
vm-stop.c block: asynchronously stop the VM on I/O errors 2014-06-23 16:36:13 +08:00
vmstate.c stubs: Add a vmstate_dummy struct for CONFIG_USER_ONLY 2013-03-12 10:35:54 +01:00