summaryrefslogtreecommitdiffstats
path: root/block
diff options
context:
space:
mode:
authorDenis V. Lunev2016-06-16 18:09:40 +0200
committerStefan Hajnoczi2016-06-20 12:44:12 +0200
commit968d8b0627d3585d6b82da4239b9adf98614ab7c (patch)
tree9299bab69353df8cc078950b4ca2624a14119154 /block
parentblock: fixed BdrvTrackedRequest filling in bdrv_co_discard (diff)
downloadqemu-968d8b0627d3585d6b82da4239b9adf98614ab7c.tar.gz
qemu-968d8b0627d3585d6b82da4239b9adf98614ab7c.tar.xz
qemu-968d8b0627d3585d6b82da4239b9adf98614ab7c.zip
block: fix race in bdrv_co_discard with drive-mirror
Actually we must set dirty bitmap dirty after we have written all our zeroes for correct processing in drive mirror code. In the other case we can face not zeroes in this area in mirror_iteration. Signed-off-by: Denis V. Lunev <den@openvz.org> Reviewed-by: Vladimir Sementsov-Ogievskiy<vsementsov@virtuozzo.com> Reviewed-by: Fam Zheng <famz@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Message-id: 1466093381-6120-3-git-send-email-den@openvz.org CC: Stefan Hajnoczi <stefanha@redhat.com> CC: Kevin Wolf <kwolf@redhat.com> CC: Max Reitz <mreitz@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Diffstat (limited to 'block')
-rw-r--r--block/io.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/block/io.c b/block/io.c
index 3527d91aa0..8ab6f95477 100644
--- a/block/io.c
+++ b/block/io.c
@@ -2349,7 +2349,6 @@ int coroutine_fn bdrv_co_discard(BlockDriverState *bs, int64_t sector_num,
tracked_request_begin(&req, bs, sector_num << BDRV_SECTOR_BITS,
nb_sectors << BDRV_SECTOR_BITS, BDRV_TRACKED_DISCARD);
- bdrv_set_dirty(bs, sector_num, nb_sectors);
max_discard = MIN_NON_ZERO(bs->bl.max_discard, BDRV_REQUEST_MAX_SECTORS);
while (nb_sectors > 0) {
@@ -2398,6 +2397,8 @@ int coroutine_fn bdrv_co_discard(BlockDriverState *bs, int64_t sector_num,
}
ret = 0;
out:
+ bdrv_set_dirty(bs, req.offset >> BDRV_SECTOR_BITS,
+ req.bytes >> BDRV_SECTOR_BITS);
tracked_request_end(&req);
return ret;
}