]> git.proxmox.com Git - mirror_qemu.git/commit - block.c
block: Close a BlockDriverState completely even when bs->drv is NULL
authorAlberto Garcia <berto@igalia.com>
Mon, 6 Nov 2017 14:53:45 +0000 (16:53 +0200)
committerMax Reitz <mreitz@redhat.com>
Tue, 21 Nov 2017 13:54:02 +0000 (14:54 +0100)
commit50a3efb0f05bcfbe04201d4ebac0b96551a1b551
treed11d2e71e3b1ed1a4e7cb4fd6a85584484cff825
parent70a5afedd64c3f0d3b5feae6b40b30f3e8d13e4b
block: Close a BlockDriverState completely even when bs->drv is NULL

bdrv_close() skips much of its logic when bs->drv is NULL. This is
fine when we're closing a BlockDriverState that has just been created
(because e.g the initialization process failed), but it's not enough
in other cases.

For example, when a valid qcow2 image is found to be corrupted then
QEMU marks it as such in the file header and then sets bs->drv to
NULL in order to make the BlockDriverState unusable. When that BDS is
later closed then many of its data structures are not freed (leaking
their memory) and none of its children are detached. This results in
bdrv_close_all() failing to close all BDSs and making this assertion
fail when QEMU is being shut down:

   bdrv_close_all: Assertion `QTAILQ_EMPTY(&all_bdrv_states)' failed.

This patch makes bdrv_close() do the full uninitialization process
in all cases. This fixes the problem with corrupted images and still
works fine with freshly created BDSs.

Signed-off-by: Alberto Garcia <berto@igalia.com>
Message-id: 20171106145345.12038-1-berto@igalia.com
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>
block.c
tests/qemu-iotests/060
tests/qemu-iotests/060.out