From patchwork Tue May 8 14:51:58 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 157747 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 75278B6FB4 for ; Wed, 9 May 2012 02:50:05 +1000 (EST) Received: from localhost ([::1]:38621 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SRlnc-0002z3-Fg for incoming@patchwork.ozlabs.org; Tue, 08 May 2012 10:54:00 -0400 Received: from eggs.gnu.org ([208.118.235.92]:60313) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SRlnE-0002C8-1I for qemu-devel@nongnu.org; Tue, 08 May 2012 10:53:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SRln8-00083C-SF for qemu-devel@nongnu.org; Tue, 08 May 2012 10:53:35 -0400 Received: from mail-pb0-f45.google.com ([209.85.160.45]:35271) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SRln8-0007gL-J5 for qemu-devel@nongnu.org; Tue, 08 May 2012 10:53:30 -0400 Received: by mail-pb0-f45.google.com with SMTP id ro12so10991250pbb.4 for ; Tue, 08 May 2012 07:53:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=NAzPBwFv4PAh3ftcJxLfERCBJ4f1/fOedOhGhN/cBpM=; b=sCps7sg5Maq0dahlQFDev2tiZjD9VGqQcAARXmAw6kwjIr12SEv+ZYx+k+yTjlqIcY MVlCLaX1q18dn0mVoNuWaHpSVXnsqSLMEGh5TM1+ASmd7IkHTZJwA6u/lBSrYJmVJu4N d1Ec5oBROwL8tnTqnYLxDCa6qG4LU8+PSF/wiI+FtDAdygtvMTihaGnhQ+0a68Kjho3H FHLkzGI2Yoe6WNhgQG9VaQfW+DzMd0jPrZ0R/I8ZI2tbegBvMOSI0nDhCHSI4MRdq8dM EIl4D8gU2/oo96Ds06cjX0+XXKgYemxwg/0EQ8Ps0IcTMhOFAX04aSeISm8nNfBR3GYJ MTxw== Received: by 10.68.200.68 with SMTP id jq4mr7278646pbc.42.1336488809676; Tue, 08 May 2012 07:53:29 -0700 (PDT) Received: from yakj.usersys.redhat.com (93-34-182-16.ip50.fastwebnet.it. [93.34.182.16]) by mx.google.com with ESMTPS id i1sm2604863pbv.49.2012.05.08.07.53.26 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 08 May 2012 07:53:28 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Tue, 8 May 2012 16:51:58 +0200 Message-Id: <1336488722-13120-19-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.7.10.1 In-Reply-To: <1336488722-13120-1-git-send-email-pbonzini@redhat.com> References: <1336488722-13120-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.85.160.45 Cc: kwolf@redhat.com, stefanha@linux.vnet.ibm.com Subject: [Qemu-devel] [PATCH 1.1 18/22] stream: do not copy unallocated sectors from the base X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org 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 --- This is a semantic change. We could delay it to 1.2 as a bug fix, or do it now to avoid changing semantics in the next release. 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 0aa7a0a..61cb027 100755 --- a/tests/qemu-iotests/030 +++ b/tests/qemu-iotests/030 @@ -82,8 +82,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()