From 4c6eff78f4b31ec4bd7b42440396760d19fde63e Mon Sep 17 00:00:00 2001 From: Hanna Reitz Date: Tue, 18 Jan 2022 17:59:59 +0100 Subject: [PATCH 6/7] block/io: Update BSC only if want_zero is true RH-Author: Hanna Reitz RH-MergeRequest: 112: block/io: Update BSC only if want_zero is true RH-Commit: [1/2] a202de1f52110d1e871c3b5b58f2d9e9b5d17570 RH-Bugzilla: 2041480 RH-Acked-by: Eric Blake RH-Acked-by: Stefan Hajnoczi RH-Acked-by: Kevin Wolf We update the block-status cache whenever we get new information from a bdrv_co_block_status() call to the block driver. However, if we have passed want_zero=false to that call, it may flag areas containing zeroes as data, and so we would update the block-status cache with wrong information. Therefore, we should not update the cache with want_zero=false. Reported-by: Nir Soffer Fixes: 0bc329fbb00 ("block: block-status cache for data regions") Reviewed-by: Nir Soffer Cc: qemu-stable@nongnu.org Signed-off-by: Hanna Reitz Message-Id: <20220118170000.49423-2-hreitz@redhat.com> Reviewed-by: Eric Blake Signed-off-by: Eric Blake (cherry picked from commit 113b727ce788335cf76f65355d670c9bc130fd75) Signed-off-by: Hanna Reitz --- block/io.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/block/io.c b/block/io.c index bb0a254def..4e4cb556c5 100644 --- a/block/io.c +++ b/block/io.c @@ -2497,8 +2497,12 @@ static int coroutine_fn bdrv_co_block_status(BlockDriverState *bs, * non-protocol nodes, and then it is never used. However, filling * the cache requires an RCU update, so double check here to avoid * such an update if possible. + * + * Check want_zero, because we only want to update the cache when we + * have accurate information about what is zero and what is data. */ - if (ret == (BDRV_BLOCK_DATA | BDRV_BLOCK_OFFSET_VALID) && + if (want_zero && + ret == (BDRV_BLOCK_DATA | BDRV_BLOCK_OFFSET_VALID) && QLIST_EMPTY(&bs->children)) { /* -- 2.27.0