From a3e1505daec31ef56f0489f8c8fff1b8e4ca92bd Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Mon, 5 Dec 2016 09:49:34 -0600 Subject: qcow2: Don't strand clusters near 2G intervals during commit The qcow2_make_empty() function is reached during 'qemu-img commit', in order to clear out ALL clusters of an image. However, if the image cannot use the fast code path (true if the image is format 0.10, or if the image contains a snapshot), the cluster size is larger than 512, and the image is larger than 2G in size, then our choice of sector_step causes problems. Since it is not cluster aligned, but qcow2_discard_clusters() silently ignores an unaligned head or tail, we are leaving clusters allocated. Enhance the testsuite to expose the flaw, and patch the problem by ensuring our step size is aligned. Signed-off-by: Eric Blake Reviewed-by: John Snow Reviewed-by: Stefan Hajnoczi Signed-off-by: Kevin Wolf --- block/qcow2.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'block/qcow2.c') diff --git a/block/qcow2.c b/block/qcow2.c index ed9e0f31d6..96fb8a8f16 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -2808,7 +2808,8 @@ static int qcow2_make_empty(BlockDriverState *bs) { BDRVQcow2State *s = bs->opaque; uint64_t start_sector; - int sector_step = INT_MAX / BDRV_SECTOR_SIZE; + int sector_step = (QEMU_ALIGN_DOWN(INT_MAX, s->cluster_size) / + BDRV_SECTOR_SIZE); int l1_clusters, ret = 0; l1_clusters = DIV_ROUND_UP(s->l1_size, s->cluster_size / sizeof(uint64_t)); -- cgit v1.2.3