]> git.ipfire.org Git - thirdparty/qemu.git/commit - block.c
block: Activate recursively even for already active nodes
authorKevin Wolf <kwolf@redhat.com>
Tue, 17 Dec 2019 14:06:38 +0000 (15:06 +0100)
committerKevin Wolf <kwolf@redhat.com>
Thu, 19 Dec 2019 17:04:25 +0000 (18:04 +0100)
commit7bb4941ace471fc7dd6ded4749b95b9622baa6ed
tree514dfbdd63c9eadd442a2fc2f04ec77cad1e80c4
parent7fe6bb7a34599714afa8d4e5fac612ec1fdbdb5c
block: Activate recursively even for already active nodes

bdrv_invalidate_cache_all() assumes that all nodes in a given subtree
are either active or inactive when it starts. Therefore, as soon as it
arrives at an already active node, it stops.

However, this assumption is wrong. For example, it's possible to take a
snapshot of an inactive node, which results in an active overlay over an
inactive backing file. The active overlay is probably also the root node
of an inactive BlockBackend (blk->disable_perm == true).

In this case, bdrv_invalidate_cache_all() does not need to do anything
to activate the overlay node, but it still needs to recurse into the
children and the parents to make sure that after returning success,
really everything is activated.

Cc: qemu-stable@nongnu.org
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
block.c