From: Fiona Ebner <f.ebner@proxmox.com>
Same rationale as for commit "block-backend: fix edge case in
bdrv_next() where BDS associated to BB changes". The block graph might
change between the bdrv_next() call and the bdrv_next_cleanup() call,
so it could be that the associated BDS is not the same that was
referenced previously anymore. Instead, rely on bdrv_next() to set
it->bs to the BDS it referenced and unreference that one in any case.
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
Message-ID: <20240322095009.346989-4-f.ebner@proxmox.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
(cherry picked from commit bac09b093ebbb79e6a7444c7b979c32ca5540132)
Signed-off-by: Michael Tokarev <mjt@tls.msk.ru>
diff --git a/block/block-backend.c b/block/block-backend.c
index 4a419f75fb..86315d62c6 100644
--- a/block/block-backend.c
+++ b/block/block-backend.c
@@ -677,13 +677,10 @@ void bdrv_next_cleanup(BdrvNextIterator *it)
/* Must be called from the main loop */
assert(qemu_get_current_aio_context() == qemu_get_aio_context());
- if (it->phase == BDRV_NEXT_BACKEND_ROOTS) {
- if (it->blk) {
- bdrv_unref(blk_bs(it->blk));
- blk_unref(it->blk);
- }
- } else {
- bdrv_unref(it->bs);
+ bdrv_unref(it->bs);
+
+ if (it->phase == BDRV_NEXT_BACKEND_ROOTS && it->blk) {
+ blk_unref(it->blk);
}
bdrv_next_reset(it);
--
2.39.2