qemu/include
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
..
block async: aio_context_new(): Handle event_notifier_init failure 2014-09-22 11:39:48 +01:00
disas disas: Implement disassembly output for A64 2014-02-08 14:50:48 +00:00
exec - Memory: improve error reporting and avoid crashes on hotplug 2014-09-12 16:55:49 +01:00
fpu fpu: softfloat: drop INLINE macro 2014-06-23 11:00:12 -04:00
hw virtio: Fix wrong type cast from pointer to long 2014-09-24 12:51:38 +01:00
libdecnumber Fix new typos in comments (found by codespell) 2014-07-18 17:45:36 +04:00
migration vmstate: Add preallocation for migrating arrays (VMS_ALLOC flag) 2014-06-27 13:48:27 +02:00
monitor monitor: fix use after free 2014-08-18 14:39:10 -04:00
net net: move queue number into NICPeers 2014-06-27 11:19:31 +02:00
qapi rename parse_enum_option to qapi_enum_parse and make it public 2014-09-08 11:12:43 +01:00
qemu async: aio_context_new(): Handle event_notifier_init failure 2014-09-22 11:39:48 +01:00
qom cpu-exec: Make debug_excp_handler a QOM CPU method 2014-09-12 14:06:48 +01:00
sysemu block: Keep DriveInfo alive until BlockDriverState dies 2014-09-25 15:24:14 +02:00
ui console: Remove unused QEMU_BIG_ENDIAN_FLAG 2014-09-05 15:38:04 +02:00
config.h
elf.h target-tricore: Add target stubs and qom-cpu 2014-09-01 14:49:20 +01:00
glib-compat.h glib-compat.h: add new thread API emulation on top of pre-2.31 API 2014-06-10 07:44:01 +02:00
qemu-common.h cpu: init vmstate for ticks and clock offset 2014-09-11 12:20:32 +02:00
qemu-io.h qemu-io: Fix warnings from static code analysis 2014-03-13 14:42:24 +01:00
trace-tcg.h trace: [tcg] Generate TCG tracing routines 2014-08-12 14:26:12 +01:00
trace.h trace: [tcg] Include event definitions in "trace.h" 2014-08-12 14:26:12 +01:00