From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47675) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bEzpz-0007s0-UY for qemu-devel@nongnu.org; Mon, 20 Jun 2016 10:06:09 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bEzpx-00074f-4w for qemu-devel@nongnu.org; Mon, 20 Jun 2016 10:06:02 -0400 Received: from mx1.redhat.com ([209.132.183.28]:56516) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bEzpw-00074X-SF for qemu-devel@nongnu.org; Mon, 20 Jun 2016 10:06:01 -0400 From: Stefan Hajnoczi Date: Mon, 20 Jun 2016 15:05:22 +0100 Message-Id: <1466431531-17806-12-git-send-email-stefanha@redhat.com> In-Reply-To: <1466431531-17806-1-git-send-email-stefanha@redhat.com> References: <1466431531-17806-1-git-send-email-stefanha@redhat.com> Subject: [Qemu-devel] [PULL 11/20] block: fix race in bdrv_co_discard with drive-mirror List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Peter Maydell , "Denis V. Lunev" , Stefan Hajnoczi , Kevin Wolf , Max Reitz From: "Denis V. Lunev" 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 Reviewed-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Fam Zheng Reviewed-by: Eric Blake Message-id: 1466093381-6120-3-git-send-email-den@openvz.org CC: Stefan Hajnoczi CC: Kevin Wolf CC: Max Reitz Signed-off-by: Stefan Hajnoczi --- block/io.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/block/io.c b/block/io.c index 3527d91..8ab6f95 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; } -- 2.5.5