From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38225) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YRO1a-0000Cy-Gk for qemu-devel@nongnu.org; Fri, 27 Feb 2015 11:44:27 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YRO1X-0006Lr-3b for qemu-devel@nongnu.org; Fri, 27 Feb 2015 11:44:26 -0500 From: Max Reitz Date: Fri, 27 Feb 2015 11:43:59 -0500 Message-Id: <1425055440-18038-11-git-send-email-mreitz@redhat.com> In-Reply-To: <1425055440-18038-1-git-send-email-mreitz@redhat.com> References: <1425055440-18038-1-git-send-email-mreitz@redhat.com> Subject: [Qemu-devel] [PATCH v4 10/11] block: Eject BDS tree from BB at bdrv_close_all() List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-block@nongnu.org Cc: Kevin Wolf , Fam Zheng , qemu-devel@nongnu.org, Markus Armbruster , Stefan Hajnoczi , Paolo Bonzini , Max Reitz When bdrv_close_all() is called, instead of force-closing all root BlockDriverStates, it is better to just drop the reference from all BlockBackends and let them be closed automatically. This prevents BDS from getting closed that are still referenced by other BDS, which may result in loss of cached data. Signed-off-by: Max Reitz --- block.c | 11 +---------- block/block-backend.c | 13 +++++++++++++ include/sysemu/block-backend.h | 1 + 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/block.c b/block.c index 0b0792c..a2637b6 100644 --- a/block.c +++ b/block.c @@ -1941,17 +1941,8 @@ static void bdrv_close(BlockDriverState *bs) void bdrv_close_all(void) { - BlockDriverState *bs; - blockdev_close_all_bdrv_states(); - - QTAILQ_FOREACH(bs, &bdrv_states, device_list) { - AioContext *aio_context = bdrv_get_aio_context(bs); - - aio_context_acquire(aio_context); - bdrv_close(bs); - aio_context_release(aio_context); - } + blk_remove_all_bs(); } /* Check if any requests are in-flight (including throttled requests) */ diff --git a/block/block-backend.c b/block/block-backend.c index 7e9d53a..2e820fe 100644 --- a/block/block-backend.c +++ b/block/block-backend.c @@ -207,6 +207,19 @@ void blk_unref(BlockBackend *blk) } } +void blk_remove_all_bs(void) +{ + BlockBackend *blk; + + QTAILQ_FOREACH(blk, &blk_backends, link) { + AioContext *ctx = blk_get_aio_context(blk); + + aio_context_acquire(ctx); + blk_remove_bs(blk); + aio_context_release(ctx); + } +} + /* * Return the BlockBackend after @blk. * If @blk is null, return the first one. diff --git a/include/sysemu/block-backend.h b/include/sysemu/block-backend.h index e0a2749..ab765a7 100644 --- a/include/sysemu/block-backend.h +++ b/include/sysemu/block-backend.h @@ -67,6 +67,7 @@ BlockBackend *blk_new_open(const char *name, const char *filename, Error **errp); void blk_ref(BlockBackend *blk); void blk_unref(BlockBackend *blk); +void blk_remove_all_bs(void); const char *blk_name(BlockBackend *blk); BlockBackend *blk_by_name(const char *name); BlockBackend *blk_next(BlockBackend *blk); -- 2.1.0