]> Git Repo - qemu.git/commitdiff
block: clear dirty bitmap when discarding
authorPaolo Bonzini <[email protected]>
Mon, 14 Jan 2013 15:26:58 +0000 (16:26 +0100)
committerStefan Hajnoczi <[email protected]>
Tue, 15 Jan 2013 09:03:48 +0000 (10:03 +0100)
Note that resetting bits in the dirty bitmap is done _before_ actually
processing the request.  Writes, instead, set bits after the request
is completed.

This way, when there are concurrent write and discard requests, the
outcome will always be that the blocks are marked dirty.  This scenario
should never happen, but it is safer to do it this way.

Signed-off-by: Paolo Bonzini <[email protected]>
Signed-off-by: Stefan Hajnoczi <[email protected]>
block.c

diff --git a/block.c b/block.c
index 4a90dd1a78175d5612a24fc3dada5e002fe18971..6fa7c901442d846af54a79578b90115e6b0c7a0f 100644 (file)
--- a/block.c
+++ b/block.c
@@ -4170,7 +4170,13 @@ int coroutine_fn bdrv_co_discard(BlockDriverState *bs, int64_t sector_num,
         return -EIO;
     } else if (bs->read_only) {
         return -EROFS;
-    } else if (bs->drv->bdrv_co_discard) {
+    }
+
+    if (bs->dirty_bitmap) {
+        set_dirty_bitmap(bs, sector_num, nb_sectors, 0);
+    }
+
+    if (bs->drv->bdrv_co_discard) {
         return bs->drv->bdrv_co_discard(bs, sector_num, nb_sectors);
     } else if (bs->drv->bdrv_aio_discard) {
         BlockDriverAIOCB *acb;
This page took 0.024934 seconds and 4 git commands to generate.