@@ -1904,17 +1904,8 @@ static void bdrv_close(BlockDriverState *bs)
void bdrv_close_all(void)
{
- BlockBackend *blk = NULL;
-
notifier_list_notify(&close_all_notifiers, NULL);
-
- while ((blk = blk_next_inserted(blk)) != NULL) {
- AioContext *aio_context = blk_get_aio_context(blk);
-
- aio_context_acquire(aio_context);
- bdrv_close(blk_bs(blk));
- aio_context_release(aio_context);
- }
+ blk_close_all_finalize();
}
void bdrv_add_close_all_notifier(Notifier *notifier)
@@ -223,6 +223,14 @@ void blk_unref(BlockBackend *blk, Notifier *close_all_notifier)
}
/*
+ * For use by bdrv_close_all()
+ */
+void blk_close_all_finalize(void)
+{
+ assert(QTAILQ_EMPTY(&blk_backends));
+}
+
+/*
* Return the BlockBackend after @blk.
* If @blk is null, return the first one.
* Else, return @blk's next sibling, which may be null.
@@ -70,6 +70,7 @@ BlockBackend *blk_new_open(const char *name, const char *filename,
Notifier *close_all_notifier, Error **errp);
void blk_ref(BlockBackend *blk, Notifier *close_all_notifier);
void blk_unref(BlockBackend *blk, Notifier *close_all_notifier);
+void blk_close_all_finalize(void);
const char *blk_name(BlockBackend *blk);
BlockBackend *blk_by_name(const char *name);
bool blk_name_taken(const char *name);
References to all BlockBackends and BlockDriverStates are now released by their respective holders; force-closing them is no longer necessary. Signed-off-by: Max Reitz <mreitz@redhat.com> --- block.c | 11 +---------- block/block-backend.c | 8 ++++++++ include/sysemu/block-backend.h | 1 + 3 files changed, 10 insertions(+), 10 deletions(-)