From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:60032) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SSRsw-0002NL-Ft for qemu-devel@nongnu.org; Thu, 10 May 2012 07:50:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SSRsr-0006Wj-D8 for qemu-devel@nongnu.org; Thu, 10 May 2012 07:50:18 -0400 Received: from mx1.redhat.com ([209.132.183.28]:18182) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SSRsr-0006WL-05 for qemu-devel@nongnu.org; Thu, 10 May 2012 07:50:13 -0400 From: Kevin Wolf Date: Thu, 10 May 2012 13:49:32 +0200 Message-Id: <1336650574-12835-29-git-send-email-kwolf@redhat.com> In-Reply-To: <1336650574-12835-1-git-send-email-kwolf@redhat.com> References: <1336650574-12835-1-git-send-email-kwolf@redhat.com> Subject: [Qemu-devel] [PATCH 28/30] stream: do not copy unallocated sectors from the base List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: anthony@codemonkey.ws Cc: kwolf@redhat.com, qemu-devel@nongnu.org From: Paolo Bonzini Unallocated sectors should really never be accessed by the guest, so there's no need to copy them during the streaming process. If they are read by the guest during streaming, guest-initiated copy-on-read will copy them (we're in the base == NULL case, which enables copy on read). If they are read after we disconnect the image from the base, they will read as zeroes anyway. Signed-off-by: Paolo Bonzini Signed-off-by: Kevin Wolf --- block/stream.c | 18 ++++-------------- tests/qemu-iotests/030 | 5 +++-- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/block/stream.c b/block/stream.c index a2c8f67..608a860 100644 --- a/block/stream.c +++ b/block/stream.c @@ -130,14 +130,9 @@ static int coroutine_fn is_allocated_base(BlockDriverState *top, */ intermediate = top->backing_hd; - while (intermediate) { + while (intermediate != base) { int pnum_inter; - /* reached base */ - if (intermediate == base) { - *pnum = n; - return 1; - } ret = bdrv_co_is_allocated(intermediate, sector_num, nb_sectors, &pnum_inter); if (ret < 0) { @@ -160,6 +155,7 @@ static int coroutine_fn is_allocated_base(BlockDriverState *top, intermediate = intermediate->backing_hd; } + *pnum = n; return 1; } @@ -203,14 +199,8 @@ wait: break; } - if (base) { - ret = is_allocated_base(bs, base, sector_num, - STREAM_BUFFER_SIZE / BDRV_SECTOR_SIZE, &n); - } else { - ret = bdrv_co_is_allocated(bs, sector_num, - STREAM_BUFFER_SIZE / BDRV_SECTOR_SIZE, - &n); - } + ret = is_allocated_base(bs, base, sector_num, + STREAM_BUFFER_SIZE / BDRV_SECTOR_SIZE, &n); trace_stream_one_iteration(s, sector_num, n, ret); if (ret == 0) { if (s->common.speed) { diff --git a/tests/qemu-iotests/030 b/tests/qemu-iotests/030 index 277a98b..eb7bf99 100755 --- a/tests/qemu-iotests/030 +++ b/tests/qemu-iotests/030 @@ -83,8 +83,9 @@ class TestSingleDrive(ImageStreamingTestCase): self.assert_no_active_streams() self.vm.shutdown() - self.assertFalse('sectors not allocated' in qemu_io('-c', 'map', test_img), - 'image file not fully populated after streaming') + self.assertEqual(qemu_io('-c', 'map', backing_img), + qemu_io('-c', 'map', test_img), + 'image file map does not match backing file after streaming') def test_stream_partial(self): self.assert_no_active_streams() -- 1.7.6.5