From nobody Sat May 4 12:39:44 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1493257717636591.9572796942834; Wed, 26 Apr 2017 18:48:37 -0700 (PDT) Received: from localhost ([::1]:57792 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3YXr-0000bM-18 for importer@patchew.org; Wed, 26 Apr 2017 21:48:35 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33529) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3YVx-0007RE-7Q for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d3YVw-00042G-Ay for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:37 -0400 Received: from mx1.redhat.com ([209.132.183.28]:42358) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1d3YVr-0003xj-St; Wed, 26 Apr 2017 21:46:32 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id B96D43DBDB; Thu, 27 Apr 2017 01:46:30 +0000 (UTC) Received: from red.redhat.com (ovpn-123-177.rdu2.redhat.com [10.10.123.177]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0967118114; Thu, 27 Apr 2017 01:46:29 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com B96D43DBDB Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=eblake@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com B96D43DBDB From: Eric Blake To: qemu-devel@nongnu.org Date: Wed, 26 Apr 2017 20:46:10 -0500 Message-Id: <20170427014626.11553-2-eblake@redhat.com> In-Reply-To: <20170427014626.11553-1-eblake@redhat.com> References: <20170427014626.11553-1-eblake@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Thu, 27 Apr 2017 01:46:30 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v10 01/17] block: Update comments on BDRV_BLOCK_* meanings X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, qemu-block@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" We had some conflicting documentation: a nice 8-way table that described all possible combinations of DATA, ZERO, and OFFSET_VALID, couple with text that implied that OFFSET_VALID always meant raw data could be read directly. As the 8-way table is the intended semantics, simplify the rest of the text to get rid of the confusion. Suggested-by: Max Reitz Signed-off-by: Eric Blake Reviewed-by: Max Reitz --- v10: new patch --- include/block/block.h | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/include/block/block.h b/include/block/block.h index 862eb56..04fcbd0 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -121,21 +121,22 @@ typedef struct HDGeometry { /* * Allocation status flags - * BDRV_BLOCK_DATA: data is read from a file returned by bdrv_get_block_st= atus. + * BDRV_BLOCK_DATA: data is read from a file returned by bdrv_get_block_st= atus * BDRV_BLOCK_ZERO: sectors read as zero - * BDRV_BLOCK_OFFSET_VALID: sector stored as raw data in a file returned by - * bdrv_get_block_status. + * BDRV_BLOCK_OFFSET_VALID: an associated offset exists for accessing raw = data * BDRV_BLOCK_ALLOCATED: the content of the block is determined by this * layer (as opposed to the backing file) * BDRV_BLOCK_RAW: used internally to indicate that the request * was answered by the raw driver and that one * should look in bs->file directly. * - * If BDRV_BLOCK_OFFSET_VALID is set, bits 9-62 represent the offset in - * bs->file where sector data can be read from as raw data. - * * DATA =3D=3D 0 && ZERO =3D=3D 0 means that data is read from backing_hd = if present. * + * If BDRV_BLOCK_OFFSET_VALID is set, bits 9-62 represent the offset + * in bs->file that is allocated for the corresponding raw data; + * however, whether that offset actually contains data also depends on + * BDRV_BLOCK_DATA, as follows: + * * DATA ZERO OFFSET_VALID * t t t sectors read as zero, bs->file is zero at offset * t f t sectors read as valid from bs->file at offset --=20 2.9.3 From nobody Sat May 4 12:39:44 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 14932577392911019.0105349617403; Wed, 26 Apr 2017 18:48:59 -0700 (PDT) Received: from localhost ([::1]:57793 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3YYD-0000ry-Mu for importer@patchew.org; Wed, 26 Apr 2017 21:48:57 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33530) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3YVx-0007RF-7z for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d3YVw-00042B-9T for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:37 -0400 Received: from mx1.redhat.com ([209.132.183.28]:52978) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1d3YVs-0003ys-Rn; Wed, 26 Apr 2017 21:46:33 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A9BC0811AC; Thu, 27 Apr 2017 01:46:31 +0000 (UTC) Received: from red.redhat.com (ovpn-123-177.rdu2.redhat.com [10.10.123.177]) by smtp.corp.redhat.com (Postfix) with ESMTP id EE931784A4; Thu, 27 Apr 2017 01:46:30 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com A9BC0811AC Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=eblake@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com A9BC0811AC From: Eric Blake To: qemu-devel@nongnu.org Date: Wed, 26 Apr 2017 20:46:11 -0500 Message-Id: <20170427014626.11553-3-eblake@redhat.com> In-Reply-To: <20170427014626.11553-1-eblake@redhat.com> References: <20170427014626.11553-1-eblake@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Thu, 27 Apr 2017 01:46:31 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v10 02/17] qcow2: Correctly report status of preallocated zero clusters X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, qemu-block@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" We were throwing away the preallocation information associated with zero clusters. But we should be matching the well-defined semantics in bdrv_get_block_status(), where (BDRV_BLOCK_ZERO | BDRV_BLOCK_OFFSET_VALID) informs the user which offset is reserved, while still reminding the user that reading from that offset is likely to read garbage. Making this change lets us see which portions of an image are zero but preallocated, when using qemu-img map --output=3Djson. The --output=3Dhuman side intentionally ignores all zero clusters, whether or not they are preallocated. The fact that there is no change to qemu-iotests './check -qcow2' merely means that we aren't yet testing this aspect of qemu-img; a later patch will add a test. Signed-off-by: Eric Blake --- v10: new patch --- block/qcow2-cluster.c | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c index 100398c..d1063df 100644 --- a/block/qcow2-cluster.c +++ b/block/qcow2-cluster.c @@ -328,6 +328,10 @@ static int count_contiguous_clusters(int nb_clusters, = int cluster_size, return i; } +/* + * Checks how many consecutive clusters in a given L2 table have the same + * cluster type with no corresponding allocation. + */ static int count_contiguous_clusters_by_type(int nb_clusters, uint64_t *l2_table, int wanted_type) @@ -335,9 +339,10 @@ static int count_contiguous_clusters_by_type(int nb_cl= usters, int i; for (i =3D 0; i < nb_clusters; i++) { - int type =3D qcow2_get_cluster_type(be64_to_cpu(l2_table[i])); + uint64_t entry =3D be64_to_cpu(l2_table[i]); + int type =3D qcow2_get_cluster_type(entry); - if (type !=3D wanted_type) { + if (type !=3D wanted_type || entry & L2E_OFFSET_MASK) { break; } } @@ -559,9 +564,26 @@ int qcow2_get_cluster_offset(BlockDriverState *bs, uin= t64_t offset, ret =3D -EIO; goto fail; } - c =3D count_contiguous_clusters_by_type(nb_clusters, &l2_table[l2_= index], - QCOW2_CLUSTER_ZERO); - *cluster_offset =3D 0; + /* Distinguish between pure zero clusters and pre-allocated ones */ + if (*cluster_offset & L2E_OFFSET_MASK) { + c =3D count_contiguous_clusters(nb_clusters, s->cluster_size, + &l2_table[l2_index], QCOW_OFLAG_= ZERO); + *cluster_offset &=3D L2E_OFFSET_MASK; + if (offset_into_cluster(s, *cluster_offset)) { + qcow2_signal_corruption(bs, true, -1, -1, + "Preallocated zero cluster offset = %#" + PRIx64 " unaligned (L2 offset: %#" + PRIx64 ", L2 index: %#x)", + *cluster_offset, l2_offset, l2_ind= ex); + ret =3D -EIO; + goto fail; + } + } else { + c =3D count_contiguous_clusters_by_type(nb_clusters, + &l2_table[l2_index], + QCOW2_CLUSTER_ZERO); + *cluster_offset =3D 0; + } break; case QCOW2_CLUSTER_UNALLOCATED: /* how many empty clusters ? */ --=20 2.9.3 From nobody Sat May 4 12:39:44 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1493257740238259.058503889642; Wed, 26 Apr 2017 18:49:00 -0700 (PDT) Received: from localhost ([::1]:57794 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3YYE-0000tC-Ri for importer@patchew.org; Wed, 26 Apr 2017 21:48:58 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33566) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3YVy-0007S1-73 for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:39 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d3YVw-00043Y-TZ for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:38 -0400 Received: from mx1.redhat.com ([209.132.183.28]:59526) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1d3YVt-0003zF-Ox; Wed, 26 Apr 2017 21:46:33 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A1DD346D091; Thu, 27 Apr 2017 01:46:32 +0000 (UTC) Received: from red.redhat.com (ovpn-123-177.rdu2.redhat.com [10.10.123.177]) by smtp.corp.redhat.com (Postfix) with ESMTP id E2D8218114; Thu, 27 Apr 2017 01:46:31 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com A1DD346D091 Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=eblake@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com A1DD346D091 From: Eric Blake To: qemu-devel@nongnu.org Date: Wed, 26 Apr 2017 20:46:12 -0500 Message-Id: <20170427014626.11553-4-eblake@redhat.com> In-Reply-To: <20170427014626.11553-1-eblake@redhat.com> References: <20170427014626.11553-1-eblake@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Thu, 27 Apr 2017 01:46:32 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v10 03/17] qcow2: Reuse preallocated zero clusters X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, qemu-block@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Max Reitz Instead of just freeing preallocated zero clusters and completely allocating them from scratch, reuse them. We cannot do this in handle_copied(), however, since this is a COW operation. Therefore, we have to add the new logic to handle_alloc() and simply return the existing offset if it exists. The only catch is that we have to convince qcow2_alloc_cluster_link_l2() not to free the old clusters (because we have reused them). Reported-by: Eric Blake Signed-off-by: Max Reitz Signed-off-by: Eric Blake --- v10: new patch. Max hasn't posted the patch directly on list, but did mention it here: https://lists.gnu.org/archive/html/qemu-devel/2017-04/msg03936.html and that he would post it once he has tests. Well, my later patches add a test that requires this one :) The other two patches that he mentioned there are also good, but not essential for my series (and I didn't want to write tests to expose the behavior difference, because it would deprive Max of that fun). --- block/qcow2.h | 3 ++ block/qcow2-cluster.c | 83 +++++++++++++++++++++++++++++++++++------------= ---- 2 files changed, 60 insertions(+), 26 deletions(-) diff --git a/block/qcow2.h b/block/qcow2.h index f8aeb08..8731f24 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -322,6 +322,9 @@ typedef struct QCowL2Meta /** Number of newly allocated clusters */ int nb_clusters; + /** Do not free the old clusters */ + bool keep_old_clusters; + /** * Requests that overlap with this allocation and wait to be restarted * when the allocating request has completed. diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c index d1063df..db3d937 100644 --- a/block/qcow2-cluster.c +++ b/block/qcow2-cluster.c @@ -309,14 +309,20 @@ static int count_contiguous_clusters(int nb_clusters,= int cluster_size, uint64_t *l2_table, uint64_t stop_flags) { int i; + int first_cluster_type; uint64_t mask =3D stop_flags | L2E_OFFSET_MASK | QCOW_OFLAG_COMPRESSED; uint64_t first_entry =3D be64_to_cpu(l2_table[0]); uint64_t offset =3D first_entry & mask; - if (!offset) + if (!offset) { return 0; + } - assert(qcow2_get_cluster_type(first_entry) =3D=3D QCOW2_CLUSTER_NORMAL= ); + /* must be allocated */ + first_cluster_type =3D qcow2_get_cluster_type(first_entry); + assert(first_cluster_type =3D=3D QCOW2_CLUSTER_NORMAL || + (first_cluster_type =3D=3D QCOW2_CLUSTER_ZERO && + (first_entry & L2E_OFFSET_MASK) !=3D 0)); for (i =3D 0; i < nb_clusters; i++) { uint64_t l2_entry =3D be64_to_cpu(l2_table[i]) & mask; @@ -857,7 +863,7 @@ int qcow2_alloc_cluster_link_l2(BlockDriverState *bs, Q= CowL2Meta *m) * Don't discard clusters that reach a refcount of 0 (e.g. compressed * clusters), the next write will reuse them anyway. */ - if (j !=3D 0) { + if (!m->keep_old_clusters && j !=3D 0) { for (i =3D 0; i < j; i++) { qcow2_free_any_clusters(bs, be64_to_cpu(old_cluster[i]), 1, QCOW2_DISCARD_NEVER); @@ -1154,8 +1160,9 @@ static int handle_alloc(BlockDriverState *bs, uint64_= t guest_offset, uint64_t entry; uint64_t nb_clusters; int ret; + bool keep_old_clusters =3D false; - uint64_t alloc_cluster_offset; + uint64_t alloc_cluster_offset =3D 0; trace_qcow2_handle_alloc(qemu_coroutine_self(), guest_offset, *host_of= fset, *bytes); @@ -1192,31 +1199,53 @@ static int handle_alloc(BlockDriverState *bs, uint6= 4_t guest_offset, * wrong with our code. */ assert(nb_clusters > 0); + if (!*host_offset && qcow2_get_cluster_type(entry) =3D=3D QCOW2_CLUSTE= R_ZERO && + (entry & L2E_OFFSET_MASK) !=3D 0 && (entry & QCOW_OFLAG_COPIED)) + { + /* Try to reuse preallocated zero clusters; contiguous normal clus= ters + * would be fine, too, but count_cow_clusters() above has limited + * nb_clusters already to a range of COW clusters */ + int preallocated_nb_clusters =3D + count_contiguous_clusters(nb_clusters, s->cluster_size, l2_tab= le, + QCOW_OFLAG_COPIED); + + if (preallocated_nb_clusters) { + nb_clusters =3D preallocated_nb_clusters; + alloc_cluster_offset =3D entry & L2E_OFFSET_MASK; + + /* We want to reuse these clusters, so qcow2_alloc_cluster_lin= k_l2() + * should not free them. */ + keep_old_clusters =3D true; + } + } + qcow2_cache_put(bs, s->l2_table_cache, (void **) &l2_table); - /* Allocate, if necessary at a given offset in the image file */ - alloc_cluster_offset =3D start_of_cluster(s, *host_offset); - ret =3D do_alloc_cluster_offset(bs, guest_offset, &alloc_cluster_offse= t, - &nb_clusters); - if (ret < 0) { - goto fail; - } - - /* Can't extend contiguous allocation */ - if (nb_clusters =3D=3D 0) { - *bytes =3D 0; - return 0; - } - - /* !*host_offset would overwrite the image header and is reserved for = "no - * host offset preferred". If 0 was a valid host offset, it'd trigger = the - * following overlap check; do that now to avoid having an invalid val= ue in - * *host_offset. */ if (!alloc_cluster_offset) { - ret =3D qcow2_pre_write_overlap_check(bs, 0, alloc_cluster_offset, - nb_clusters * s->cluster_size); - assert(ret < 0); - goto fail; + /* Allocate, if necessary at a given offset in the image file */ + alloc_cluster_offset =3D start_of_cluster(s, *host_offset); + ret =3D do_alloc_cluster_offset(bs, guest_offset, &alloc_cluster_o= ffset, + &nb_clusters); + if (ret < 0) { + goto fail; + } + + /* Can't extend contiguous allocation */ + if (nb_clusters =3D=3D 0) { + *bytes =3D 0; + return 0; + } + + /* !*host_offset would overwrite the image header and is reserved = for + * "no host offset preferred". If 0 was a valid host offset, it'd + * trigger the following overlap check; do that now to avoid havin= g an + * invalid value in *host_offset. */ + if (!alloc_cluster_offset) { + ret =3D qcow2_pre_write_overlap_check(bs, 0, alloc_cluster_off= set, + nb_clusters * s->cluster_s= ize); + assert(ret < 0); + goto fail; + } } /* @@ -1247,6 +1276,8 @@ static int handle_alloc(BlockDriverState *bs, uint64_= t guest_offset, .offset =3D start_of_cluster(s, guest_offset), .nb_clusters =3D nb_clusters, + .keep_old_clusters =3D keep_old_clusters, + .cow_start =3D { .offset =3D 0, .nb_bytes =3D offset_into_cluster(s, guest_offset), --=20 2.9.3 From nobody Sat May 4 12:39:44 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1493258010992348.01684196001975; Wed, 26 Apr 2017 18:53:30 -0700 (PDT) Received: from localhost ([::1]:57818 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3YcY-0004xl-Na for importer@patchew.org; Wed, 26 Apr 2017 21:53:26 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33595) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3YVz-0007TF-8k for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:41 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d3YVy-00044A-49 for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:39 -0400 Received: from mx1.redhat.com ([209.132.183.28]:35824) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1d3YVu-000406-Nn; Wed, 26 Apr 2017 21:46:34 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9974E81240; Thu, 27 Apr 2017 01:46:33 +0000 (UTC) Received: from red.redhat.com (ovpn-123-177.rdu2.redhat.com [10.10.123.177]) by smtp.corp.redhat.com (Postfix) with ESMTP id DA9FF18114; Thu, 27 Apr 2017 01:46:32 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 9974E81240 Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=eblake@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 9974E81240 From: Eric Blake To: qemu-devel@nongnu.org Date: Wed, 26 Apr 2017 20:46:13 -0500 Message-Id: <20170427014626.11553-5-eblake@redhat.com> In-Reply-To: <20170427014626.11553-1-eblake@redhat.com> References: <20170427014626.11553-1-eblake@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Thu, 27 Apr 2017 01:46:33 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v10 04/17] qcow2: Optimize zero_single_l2() to minimize L2 churn X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, qemu-block@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Similar to discard_single_l2(), we should try to avoid dirtying the L2 cache when the cluster we are changing already has the right characteristics. Note that by the time we get to zero_single_l2(), BDRV_REQ_MAY_UNMAP is a requirement to unallocate a cluster (this is because the block layer clears that flag if discard.* flags during open requested that we never punch holes - see the conversation around commit 170f4b2e, https://lists.gnu.org/archive/html/qemu-devel/2016-09/msg07306.html). Therefore, this patch can only reuse a zero cluster as-is if either unmapping is not requested, or if the zero cluster was not associated with an allocation. Technically, there are some cases where an unallocated cluster already reads as all zeroes (namely, when there is no backing file [easy: check bs->backing], or when the backing file also reads as zeroes [harder: we can't check bdrv_get_block_status since we are already holding the lock]), where the guest would not immediately see a difference if we left that cluster unallocated. But if the user did not request unmapping, leaving an unallocated cluster is wrong; and even if the user DID request unmapping, keeping a cluster unallocated risks a subtle semantic change of guest-visible contents if a backing file is later added, and it is not worth auditing whether all internal uses such as mirror properly avoid an unmap request. Thus, this patch is intentionally limited to just clusters that are already marked as zero. Signed-off-by: Eric Blake Reviewed-by: Max Reitz --- v10: new patch, replacing earlier attempt to use unallocated clusters, and ditching any optimization of v2 files --- block/qcow2-cluster.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c index db3d937..d542894 100644 --- a/block/qcow2-cluster.c +++ b/block/qcow2-cluster.c @@ -1614,6 +1614,7 @@ static int zero_single_l2(BlockDriverState *bs, uint6= 4_t offset, int l2_index; int ret; int i; + bool unmap =3D !!(flags & BDRV_REQ_MAY_UNMAP); ret =3D get_cluster_table(bs, offset, &l2_table, &l2_index); if (ret < 0) { @@ -1629,9 +1630,17 @@ static int zero_single_l2(BlockDriverState *bs, uint= 64_t offset, old_offset =3D be64_to_cpu(l2_table[l2_index + i]); - /* Update L2 entries */ + /* + * Minimize L2 changes if the cluster already reads back as + * zeroes with correct allocation. + */ + if (qcow2_get_cluster_type(old_offset) =3D=3D QCOW2_CLUSTER_ZERO && + !(unmap && old_offset & L2E_OFFSET_MASK)) { + continue; + } + qcow2_cache_entry_mark_dirty(bs, s->l2_table_cache, l2_table); - if (old_offset & QCOW_OFLAG_COMPRESSED || flags & BDRV_REQ_MAY_UNM= AP) { + if (old_offset & QCOW_OFLAG_COMPRESSED || unmap) { l2_table[l2_index + i] =3D cpu_to_be64(QCOW_OFLAG_ZERO); qcow2_free_any_clusters(bs, old_offset, 1, QCOW2_DISCARD_REQUE= ST); } else { --=20 2.9.3 From nobody Sat May 4 12:39:44 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1493258114221374.92944245397894; Wed, 26 Apr 2017 18:55:14 -0700 (PDT) Received: from localhost ([::1]:57826 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3YeG-0006Lc-RX for importer@patchew.org; Wed, 26 Apr 2017 21:55:12 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33667) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3YW2-0007XE-BF for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:44 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d3YW0-00045r-Jj for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:42 -0400 Received: from mx1.redhat.com ([209.132.183.28]:57990) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1d3YVv-00040g-N5; Wed, 26 Apr 2017 21:46:35 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9E7DFC05678E; Thu, 27 Apr 2017 01:46:34 +0000 (UTC) Received: from red.redhat.com (ovpn-123-177.rdu2.redhat.com [10.10.123.177]) by smtp.corp.redhat.com (Postfix) with ESMTP id D514218114; Thu, 27 Apr 2017 01:46:33 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 9E7DFC05678E Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=eblake@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 9E7DFC05678E From: Eric Blake To: qemu-devel@nongnu.org Date: Wed, 26 Apr 2017 20:46:14 -0500 Message-Id: <20170427014626.11553-6-eblake@redhat.com> In-Reply-To: <20170427014626.11553-1-eblake@redhat.com> References: <20170427014626.11553-1-eblake@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Thu, 27 Apr 2017 01:46:34 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v10 05/17] iotests: Add test 179 to cover write zeroes with unmap X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, qemu-block@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" No tests were covering write zeroes with unmap. Additionally, I needed to prove that my previous patches for correct status reporting and write zeroes optimizations actually had an impact. The test works for cluster_size between 8k and 2M (for smaller sizes, it fails because our allocation patterns are not contiguous with small clusters). Signed-off-by: Eric Blake --- v10: drop any changes to v2 files, rewrite test to work with updates earlier in the series, add a blkdebug probe v9: new patch --- tests/qemu-iotests/179 | 123 +++++++++++++++++++++++++++++++++++++++++= ++++ tests/qemu-iotests/179.out | 90 +++++++++++++++++++++++++++++++++ tests/qemu-iotests/group | 1 + 3 files changed, 214 insertions(+) create mode 100755 tests/qemu-iotests/179 create mode 100644 tests/qemu-iotests/179.out diff --git a/tests/qemu-iotests/179 b/tests/qemu-iotests/179 new file mode 100755 index 0000000..4e4ffce --- /dev/null +++ b/tests/qemu-iotests/179 @@ -0,0 +1,123 @@ +#!/bin/bash +# +# Test case for write zeroes with unmap +# +# Copyright (C) 2017 Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# creator +owner=3Deblake@redhat.com + +seq=3D"$(basename $0)" +echo "QA output created by $seq" + +here=3D"$PWD" +status=3D1 # failure is the default! + +_cleanup() +{ + _cleanup_test_img +} +trap "_cleanup; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +_supported_fmt qcow2 +_supported_proto file +_supported_os Linux + +# v2 images can't mark clusters as zero +_unsupported_imgopts compat=3D0.10 + +echo +echo '=3D=3D=3D Testing write zeroes with unmap =3D=3D=3D' +echo + +TEST_IMG=3D"$TEST_IMG.base" _make_test_img 64M +_make_test_img -b "$TEST_IMG.base" + +# Offsets chosen at or near 2M boundaries so test works at any cluster size + +# Aligned writes to unallocated cluster should not allocate mapping, but m= ust +# mark cluster as zero, whether or not unmap was requested +$QEMU_IO -c "write -z -u 2M 2M" "$TEST_IMG.base" | _filter_qemu_io +$QEMU_IO -c "write -z 6M 2M" "$TEST_IMG.base" | _filter_qemu_io + +# Unaligned writes need not allocate mapping if the cluster already reads +# as zero, but must mark cluster as zero, whether or not unmap was request= ed +$QEMU_IO -c "write -z -u 10485761 2097150" "$TEST_IMG.base" | _filter_qemu= _io +$QEMU_IO -c "write -z 14680065 2097150" "$TEST_IMG.base" | _filter_qemu_io + +# Requesting unmap of normal data must deallocate; omitting unmap should +# preserve the mapping +$QEMU_IO -c "write 18M 14M" "$TEST_IMG.base" | _filter_qemu_io +$QEMU_IO -c "write -z -u 20M 2M" "$TEST_IMG.base" | _filter_qemu_io +$QEMU_IO -c "write -z 24M 6M" "$TEST_IMG.base" | _filter_qemu_io + +# Likewise when writing on already-mapped zero data +$QEMU_IO -c "write -z -u 26M 2M" "$TEST_IMG.base" | _filter_qemu_io +$QEMU_IO -c "write -z 28M 2M" "$TEST_IMG.base" | _filter_qemu_io + +# Writing on unmapped zeroes does not allocate +$QEMU_IO -c "write -z 32M 8M" "$TEST_IMG.base" | _filter_qemu_io +$QEMU_IO -c "write -z -u 34M 2M" "$TEST_IMG.base" | _filter_qemu_io +$QEMU_IO -c "write -z 36M 2M" "$TEST_IMG.base" | _filter_qemu_io + +# Writing zero overrides a backing file, regardless of backing cluster type +$QEMU_IO -c "write -z 40M 8M" "$TEST_IMG.base" | _filter_qemu_io +$QEMU_IO -c "write 48M 8M" "$TEST_IMG.base" | _filter_qemu_io +$QEMU_IO -c "write -z -u 42M 2M" "$TEST_IMG" | _filter_qemu_io +$QEMU_IO -c "write -z 44M 2M" "$TEST_IMG" | _filter_qemu_io +$QEMU_IO -c "write -z -u 50M 2M" "$TEST_IMG" | _filter_qemu_io +$QEMU_IO -c "write -z 52M 2M" "$TEST_IMG" | _filter_qemu_io +$QEMU_IO -c "write -z -u 58M 2M" "$TEST_IMG" | _filter_qemu_io +$QEMU_IO -c "write -z 60M 2M" "$TEST_IMG" | _filter_qemu_io + +# Final check that mappings are correct and images are still sane +$QEMU_IO -c "map" "$TEST_IMG.base" | _filter_qemu_io +$QEMU_IMG map --output=3Djson "$TEST_IMG" | _filter_qemu_img_map | + sed 's/"offset": [0-9]*/"offset": OFFSET/g' +TEST_IMG=3D"$TEST_IMG.base" _check_test_img +_check_test_img + +echo +echo '=3D=3D=3D Testing cache optimization =3D=3D=3D' +echo + +BLKDBG_TEST_IMG=3D"blkdebug:$TEST_DIR/blkdebug.conf:$TEST_IMG.base" + +cat > "$TEST_DIR/blkdebug.conf" < Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1493257899757783.6736162315841; Wed, 26 Apr 2017 18:51:39 -0700 (PDT) Received: from localhost ([::1]:57810 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3Yao-00033o-FR for importer@patchew.org; Wed, 26 Apr 2017 21:51:38 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33615) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3YW0-0007UA-4p for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:41 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d3YVz-00044n-83 for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:40 -0400 Received: from mx1.redhat.com ([209.132.183.28]:40084) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1d3YVw-000427-Lq; Wed, 26 Apr 2017 21:46:36 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9432067EA7; Thu, 27 Apr 2017 01:46:35 +0000 (UTC) Received: from red.redhat.com (ovpn-123-177.rdu2.redhat.com [10.10.123.177]) by smtp.corp.redhat.com (Postfix) with ESMTP id D46BA18114; Thu, 27 Apr 2017 01:46:34 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 9432067EA7 Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=eblake@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 9432067EA7 From: Eric Blake To: qemu-devel@nongnu.org Date: Wed, 26 Apr 2017 20:46:15 -0500 Message-Id: <20170427014626.11553-7-eblake@redhat.com> In-Reply-To: <20170427014626.11553-1-eblake@redhat.com> References: <20170427014626.11553-1-eblake@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Thu, 27 Apr 2017 01:46:35 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v10 06/17] qemu-io: Don't open-code QEMU_IS_ALIGNED X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, qemu-block@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Manual comparison against 0x1ff is not as clean as using our alignment macros from osdep.h. Suggested-by: Philippe Mathieu-Daud=C3=A9 Signed-off-by: Eric Blake Reviewed-by: Max Reitz --- v10: new patch --- qemu-io-cmds.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/qemu-io-cmds.c b/qemu-io-cmds.c index 21af9e6..fabc394 100644 --- a/qemu-io-cmds.c +++ b/qemu-io-cmds.c @@ -740,12 +740,12 @@ static int read_f(BlockBackend *blk, int argc, char *= *argv) } if (bflag) { - if (offset & 0x1ff) { + if (!QEMU_IS_ALIGNED(offset, BDRV_SECTOR_SIZE)) { printf("offset %" PRId64 " is not sector aligned\n", offset); return 0; } - if (count & 0x1ff) { + if (!QEMU_IS_ALIGNED(count, BDRV_SECTOR_SIZE)) { printf("count %"PRId64" is not sector aligned\n", count); return 0; @@ -1050,13 +1050,13 @@ static int write_f(BlockBackend *blk, int argc, cha= r **argv) } if (bflag || cflag) { - if (offset & 0x1ff) { + if (!QEMU_IS_ALIGNED(offset, BDRV_SECTOR_SIZE)) { printf("offset %" PRId64 " is not sector aligned\n", offset); return 0; } - if (count & 0x1ff) { + if (!QEMU_IS_ALIGNED(count, BDRV_SECTOR_SIZE)) { printf("count %"PRId64" is not sector aligned\n", count); return 0; @@ -1769,7 +1769,7 @@ static int alloc_f(BlockBackend *blk, int argc, char = **argv) if (offset < 0) { print_cvtnum_err(offset, argv[1]); return 0; - } else if (offset & 0x1ff) { + } else if (!QEMU_IS_ALIGNED(offset, BDRV_SECTOR_SIZE)) { printf("offset %" PRId64 " is not sector aligned\n", offset); return 0; --=20 2.9.3 From nobody Sat May 4 12:39:44 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1493258030405161.13334836118372; Wed, 26 Apr 2017 18:53:50 -0700 (PDT) Received: from localhost ([::1]:57819 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3Ycu-0005FE-Vn for importer@patchew.org; Wed, 26 Apr 2017 21:53:49 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33653) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3YW1-0007Wb-Mo for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:44 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d3YW0-00045j-IE for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:41 -0400 Received: from mx1.redhat.com ([209.132.183.28]:54038) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1d3YVx-00043e-Kq; Wed, 26 Apr 2017 21:46:37 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 82030C04B956; Thu, 27 Apr 2017 01:46:36 +0000 (UTC) Received: from red.redhat.com (ovpn-123-177.rdu2.redhat.com [10.10.123.177]) by smtp.corp.redhat.com (Postfix) with ESMTP id C85E218114; Thu, 27 Apr 2017 01:46:35 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 82030C04B956 Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=eblake@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 82030C04B956 From: Eric Blake To: qemu-devel@nongnu.org Date: Wed, 26 Apr 2017 20:46:16 -0500 Message-Id: <20170427014626.11553-8-eblake@redhat.com> In-Reply-To: <20170427014626.11553-1-eblake@redhat.com> References: <20170427014626.11553-1-eblake@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Thu, 27 Apr 2017 01:46:36 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v10 07/17] qemu-io: Switch 'alloc' command to byte-based length X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, qemu-block@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" For the 'alloc' command, accepting an offset in bytes but a length in sectors, and reporting output in sectors, is confusing. Do everything in bytes, and adjust the expected output accordingly. Signed-off-by: Eric Blake Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Max Reitz --- v10: rebase to code cleanup v9: new patch --- qemu-io-cmds.c | 30 ++++++++++++++++++------------ tests/qemu-iotests/019.out | 8 ++++---- tests/qemu-iotests/common.pattern | 2 +- 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/qemu-io-cmds.c b/qemu-io-cmds.c index fabc394..34f6707 100644 --- a/qemu-io-cmds.c +++ b/qemu-io-cmds.c @@ -1760,7 +1760,7 @@ out: static int alloc_f(BlockBackend *blk, int argc, char **argv) { BlockDriverState *bs =3D blk_bs(blk); - int64_t offset, sector_num, nb_sectors, remaining; + int64_t offset, sector_num, nb_sectors, remaining, bytes; char s1[64]; int num, ret; int64_t sum_alloc; @@ -1776,18 +1776,24 @@ static int alloc_f(BlockBackend *blk, int argc, cha= r **argv) } if (argc =3D=3D 3) { - nb_sectors =3D cvtnum(argv[2]); - if (nb_sectors < 0) { - print_cvtnum_err(nb_sectors, argv[2]); + bytes =3D cvtnum(argv[2]); + if (bytes < 0) { + print_cvtnum_err(bytes, argv[2]); return 0; - } else if (nb_sectors > INT_MAX) { - printf("length argument cannot exceed %d, given %s\n", - INT_MAX, argv[2]); + } else if (bytes > INT_MAX * BDRV_SECTOR_SIZE) { + printf("length argument cannot exceed %llu, given %s\n", + INT_MAX * BDRV_SECTOR_SIZE, argv[2]); return 0; } } else { - nb_sectors =3D 1; + bytes =3D BDRV_SECTOR_SIZE; } + if (!QEMU_IS_ALIGNED(bytes, BDRV_SECTOR_SIZE)) { + printf("bytes %" PRId64 " is not sector aligned\n", + bytes); + return 0; + } + nb_sectors =3D bytes >> BDRV_SECTOR_BITS; remaining =3D nb_sectors; sum_alloc =3D 0; @@ -1811,8 +1817,8 @@ static int alloc_f(BlockBackend *blk, int argc, char = **argv) cvtstr(offset, s1, sizeof(s1)); - printf("%"PRId64"/%"PRId64" sectors allocated at offset %s\n", - sum_alloc, nb_sectors, s1); + printf("%"PRId64"/%"PRId64" bytes allocated at offset %s\n", + sum_alloc << BDRV_SECTOR_BITS, nb_sectors << BDRV_SECTOR_BITS, = s1); return 0; } @@ -1822,8 +1828,8 @@ static const cmdinfo_t alloc_cmd =3D { .argmin =3D 1, .argmax =3D 2, .cfunc =3D alloc_f, - .args =3D "off [sectors]", - .oneline =3D "checks if a sector is present in the file", + .args =3D "offset [bytes]", + .oneline =3D "checks if offset is allocated in the file", }; diff --git a/tests/qemu-iotests/019.out b/tests/qemu-iotests/019.out index 0124264..17a7c03 100644 --- a/tests/qemu-iotests/019.out +++ b/tests/qemu-iotests/019.out @@ -542,8 +542,8 @@ Testing conversion with -B TEST_DIR/t.IMGFMT.base Checking if backing clusters are allocated when they shouldn't -0/128 sectors allocated at offset 1 MiB -0/128 sectors allocated at offset 4.001 GiB +0/65536 bytes allocated at offset 1 MiB +0/65536 bytes allocated at offset 4.001 GiB Reading =3D=3D=3D IO: pattern 42 @@ -1086,8 +1086,8 @@ Testing conversion with -o backing_file=3DTEST_DIR/t.= IMGFMT.base Checking if backing clusters are allocated when they shouldn't -0/128 sectors allocated at offset 1 MiB -0/128 sectors allocated at offset 4.001 GiB +0/65536 bytes allocated at offset 1 MiB +0/65536 bytes allocated at offset 4.001 GiB Reading =3D=3D=3D IO: pattern 42 diff --git a/tests/qemu-iotests/common.pattern b/tests/qemu-iotests/common.= pattern index ddfbca1..34f4a8d 100644 --- a/tests/qemu-iotests/common.pattern +++ b/tests/qemu-iotests/common.pattern @@ -18,7 +18,7 @@ function do_is_allocated() { local start=3D$1 - local size=3D$(( $2 / 512)) + local size=3D$2 local step=3D$3 local count=3D$4 --=20 2.9.3 From nobody Sat May 4 12:39:44 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1493258217160212.55326625966188; Wed, 26 Apr 2017 18:56:57 -0700 (PDT) Received: from localhost ([::1]:57839 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3Yfv-0007XT-LE for importer@patchew.org; Wed, 26 Apr 2017 21:56:55 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33707) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3YW4-0007a6-Se for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d3YW2-00047F-Bp for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:44 -0400 Received: from mx1.redhat.com ([209.132.183.28]:50604) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1d3YVz-00044S-3P; Wed, 26 Apr 2017 21:46:39 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 01FB6A08EC; Thu, 27 Apr 2017 01:46:37 +0000 (UTC) Received: from red.redhat.com (ovpn-123-177.rdu2.redhat.com [10.10.123.177]) by smtp.corp.redhat.com (Postfix) with ESMTP id BC28718114; Thu, 27 Apr 2017 01:46:36 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 01FB6A08EC Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx10.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=eblake@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 01FB6A08EC From: Eric Blake To: qemu-devel@nongnu.org Date: Wed, 26 Apr 2017 20:46:17 -0500 Message-Id: <20170427014626.11553-9-eblake@redhat.com> In-Reply-To: <20170427014626.11553-1-eblake@redhat.com> References: <20170427014626.11553-1-eblake@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.39]); Thu, 27 Apr 2017 01:46:38 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v10 08/17] qemu-io: Switch 'map' output to byte-based reporting X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, qemu-block@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Mixing byte offset and sector allocation counts is a bit confusing. Also, reporting n/m sectors, where m decreases according to the remaining size of the file, isn't really adding any useful information. Update the output to use byte counts, and adjust the affected tests (./check -qcow2 102, ./check -vpc 146). Signed-off-by: Eric Blake Reviewed-by: Max Reitz --- v10: rebase to updated test 179 v9: new patch --- qemu-io-cmds.c | 5 ++--- tests/qemu-iotests/102.out | 4 ++-- tests/qemu-iotests/146.out | 30 +++++++++++++++--------------- tests/qemu-iotests/179.out | 22 +++++++++++----------- 4 files changed, 30 insertions(+), 31 deletions(-) diff --git a/qemu-io-cmds.c b/qemu-io-cmds.c index 34f6707..40a3f2d 100644 --- a/qemu-io-cmds.c +++ b/qemu-io-cmds.c @@ -1895,9 +1895,8 @@ static int map_f(BlockBackend *blk, int argc, char **= argv) retstr =3D ret ? " allocated" : "not allocated"; cvtstr(offset << 9ULL, s1, sizeof(s1)); - printf("[% 24" PRId64 "] % 8" PRId64 "/% 8" PRId64 " sectors %s " - "at offset %s (%d)\n", - offset << 9ULL, num, nb_sectors, retstr, s1, ret); + printf("[% 24" PRId64 "] % 16" PRId64 " bytes %s at offset %s (%d)= \n", + offset << 9ULL, num << 9ULL, retstr, s1, ret); offset +=3D num; nb_sectors -=3D num; diff --git a/tests/qemu-iotests/102.out b/tests/qemu-iotests/102.out index eecde16..0e0ae4c 100644 --- a/tests/qemu-iotests/102.out +++ b/tests/qemu-iotests/102.out @@ -6,7 +6,7 @@ Formatting 'TEST_DIR/t.IMGFMT', fmt=3DIMGFMT size=3D65536 wrote 65536/65536 bytes at offset 0 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) Image resized. -[ 0] 128/ 128 sectors allocated at offs= et 0 bytes (1) +[ 0] 65536 bytes allocated at offset = 0 bytes (1) Offset Length Mapped to File =3D=3D=3D Testing map on an image file truncated outside of qemu =3D=3D=3D @@ -17,5 +17,5 @@ wrote 65536/65536 bytes at offset 0 Image resized. QEMU X.Y.Z monitor - type 'help' for more information (qemu) qemu-io drv0 map -[ 0] 128/ 128 sectors allocated at offs= et 0 bytes (1) +[ 0] 65536 bytes allocated at offset = 0 bytes (1) *** done diff --git a/tests/qemu-iotests/146.out b/tests/qemu-iotests/146.out index 4f334d8..d4e2f62 100644 --- a/tests/qemu-iotests/146.out +++ b/tests/qemu-iotests/146.out @@ -2,39 +2,39 @@ QA output created by 146 =3D=3D=3D Testing VPC Autodetect =3D=3D=3D -[ 0] 266334240/ 266334240 sectors not allocated at = offset 0 bytes (0) +[ 0] 136363130880 bytes not allocated at offset = 0 bytes (0) =3D=3D=3D Testing VPC with current_size force =3D=3D=3D -[ 0] 266338304/ 266338304 sectors not allocated at = offset 0 bytes (0) +[ 0] 136365211648 bytes not allocated at offset = 0 bytes (0) =3D=3D=3D Testing VPC with chs force =3D=3D=3D -[ 0] 266334240/ 266334240 sectors not allocated at = offset 0 bytes (0) +[ 0] 136363130880 bytes not allocated at offset = 0 bytes (0) =3D=3D=3D Testing Hyper-V Autodetect =3D=3D=3D -[ 0] 266338304/ 266338304 sectors not allocated at = offset 0 bytes (0) +[ 0] 136365211648 bytes not allocated at offset = 0 bytes (0) =3D=3D=3D Testing Hyper-V with current_size force =3D=3D=3D -[ 0] 266338304/ 266338304 sectors not allocated at = offset 0 bytes (0) +[ 0] 136365211648 bytes not allocated at offset = 0 bytes (0) =3D=3D=3D Testing Hyper-V with chs force =3D=3D=3D -[ 0] 266334240/ 266334240 sectors not allocated at = offset 0 bytes (0) +[ 0] 136363130880 bytes not allocated at offset = 0 bytes (0) =3D=3D=3D Testing d2v Autodetect =3D=3D=3D -[ 0] 514560/ 514560 sectors allocated at offs= et 0 bytes (1) +[ 0] 263454720 bytes allocated at offset = 0 bytes (1) =3D=3D=3D Testing d2v with current_size force =3D=3D=3D -[ 0] 514560/ 514560 sectors allocated at offs= et 0 bytes (1) +[ 0] 263454720 bytes allocated at offset = 0 bytes (1) =3D=3D=3D Testing d2v with chs force =3D=3D=3D -[ 0] 514560/ 514560 sectors allocated at offs= et 0 bytes (1) +[ 0] 263454720 bytes allocated at offset = 0 bytes (1) =3D=3D=3D Testing Image create, default =3D=3D=3D @@ -42,15 +42,15 @@ Formatting 'TEST_DIR/IMGFMT-create-test.IMGFMT', fmt=3D= IMGFMT size=3D4294967296 =3D=3D=3D Read created image, default opts =3D=3D=3D=3D -[ 0] 8389584/ 8389584 sectors not allocated at offs= et 0 bytes (0) +[ 0] 4295467008 bytes not allocated at offset = 0 bytes (0) =3D=3D=3D Read created image, force_size_calc=3Dchs =3D=3D=3D=3D -[ 0] 8389584/ 8389584 sectors not allocated at offs= et 0 bytes (0) +[ 0] 4295467008 bytes not allocated at offset = 0 bytes (0) =3D=3D=3D Read created image, force_size_calc=3Dcurrent_size =3D=3D=3D=3D -[ 0] 8389584/ 8389584 sectors not allocated at offs= et 0 bytes (0) +[ 0] 4295467008 bytes not allocated at offset = 0 bytes (0) =3D=3D=3D Testing Image create, force_size =3D=3D=3D @@ -58,13 +58,13 @@ Formatting 'TEST_DIR/IMGFMT-create-test.IMGFMT', fmt=3D= IMGFMT size=3D4294967296 forc =3D=3D=3D Read created image, default opts =3D=3D=3D=3D -[ 0] 8388608/ 8388608 sectors not allocated at offs= et 0 bytes (0) +[ 0] 4294967296 bytes not allocated at offset = 0 bytes (0) =3D=3D=3D Read created image, force_size_calc=3Dchs =3D=3D=3D=3D -[ 0] 8388608/ 8388608 sectors not allocated at offs= et 0 bytes (0) +[ 0] 4294967296 bytes not allocated at offset = 0 bytes (0) =3D=3D=3D Read created image, force_size_calc=3Dcurrent_size =3D=3D=3D=3D -[ 0] 8388608/ 8388608 sectors not allocated at offs= et 0 bytes (0) +[ 0] 4294967296 bytes not allocated at offset = 0 bytes (0) *** done diff --git a/tests/qemu-iotests/179.out b/tests/qemu-iotests/179.out index 2c3071b..33e9e3d 100644 --- a/tests/qemu-iotests/179.out +++ b/tests/qemu-iotests/179.out @@ -44,17 +44,17 @@ wrote 2097152/2097152 bytes at offset 60817408 2 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) wrote 2097152/2097152 bytes at offset 62914560 2 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -[ 0] 4096/ 131072 sectors not allocated at offs= et 0 bytes (0) -[ 2097152] 4096/ 126976 sectors allocated at offs= et 2 MiB (1) -[ 4194304] 4096/ 122880 sectors not allocated at offs= et 4 MiB (0) -[ 6291456] 4096/ 118784 sectors allocated at offs= et 6 MiB (1) -[ 8388608] 4096/ 114688 sectors not allocated at offs= et 8 MiB (0) -[ 10485760] 4096/ 110592 sectors allocated at offs= et 10 MiB (1) -[ 12582912] 4096/ 106496 sectors not allocated at offs= et 12 MiB (0) -[ 14680064] 4096/ 102400 sectors allocated at offs= et 14 MiB (1) -[ 16777216] 4096/ 98304 sectors not allocated at offs= et 16 MiB (0) -[ 18874368] 77824/ 94208 sectors allocated at offs= et 18 MiB (1) -[ 58720256] 16384/ 16384 sectors not allocated at offs= et 56 MiB (0) +[ 0] 2097152 bytes not allocated at offset = 0 bytes (0) +[ 2097152] 2097152 bytes allocated at offset = 2 MiB (1) +[ 4194304] 2097152 bytes not allocated at offset = 4 MiB (0) +[ 6291456] 2097152 bytes allocated at offset = 6 MiB (1) +[ 8388608] 2097152 bytes not allocated at offset = 8 MiB (0) +[ 10485760] 2097152 bytes allocated at offset = 10 MiB (1) +[ 12582912] 2097152 bytes not allocated at offset = 12 MiB (0) +[ 14680064] 2097152 bytes allocated at offset = 14 MiB (1) +[ 16777216] 2097152 bytes not allocated at offset = 16 MiB (0) +[ 18874368] 39845888 bytes allocated at offset = 18 MiB (1) +[ 58720256] 8388608 bytes not allocated at offset = 56 MiB (0) [{ "start": 0, "length": 18874368, "depth": 1, "zero": true, "data": false= }, { "start": 18874368, "length": 2097152, "depth": 1, "zero": false, "data":= true, "offset": OFFSET}, { "start": 20971520, "length": 2097152, "depth": 1, "zero": true, "data": = false}, --=20 2.9.3 From nobody Sat May 4 12:39:44 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1493258403250105.77723762023459; Wed, 26 Apr 2017 19:00:03 -0700 (PDT) Received: from localhost ([::1]:57849 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3Yiv-0001Xs-TE for importer@patchew.org; Wed, 26 Apr 2017 22:00:01 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33783) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3YW7-0007d9-AW for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d3YW5-00049C-0u for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:47 -0400 Received: from mx1.redhat.com ([209.132.183.28]:58040) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1d3YVz-00044Y-HB; Wed, 26 Apr 2017 21:46:39 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6E737C05678E; Thu, 27 Apr 2017 01:46:38 +0000 (UTC) Received: from red.redhat.com (ovpn-123-177.rdu2.redhat.com [10.10.123.177]) by smtp.corp.redhat.com (Postfix) with ESMTP id B252B784A4; Thu, 27 Apr 2017 01:46:37 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 6E737C05678E Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=eblake@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 6E737C05678E From: Eric Blake To: qemu-devel@nongnu.org Date: Wed, 26 Apr 2017 20:46:18 -0500 Message-Id: <20170427014626.11553-10-eblake@redhat.com> In-Reply-To: <20170427014626.11553-1-eblake@redhat.com> References: <20170427014626.11553-1-eblake@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Thu, 27 Apr 2017 01:46:38 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v10 09/17] qcow2: Optimize write zero of unaligned tail cluster X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, qemu-block@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" We've already improved discards to operate efficiently on the tail of an unaligned qcow2 image; it's time to make a similar improvement to write zeroes. The special case is only valid at the tail cluster of a file, where we must recognize that any sectors beyond the image end would implicitly read as zero, and therefore should not penalize our logic for widening a partial cluster into writing the whole cluster as zero. Update test 154 to cover the new scenarios, using two images of intentionally differing length. While at it, fix the test to gracefully skip when run as ./check -qcow2 -o compat=3D0.10 154 since the older format lacks zero clusters already required earlier in the test. Signed-off-by: Eric Blake --- v10: rebase to better reporting of preallocated zero clusters v9: new patch --- block/qcow2.c | 7 +++ tests/qemu-iotests/154 | 112 +++++++++++++++++++++++++++++++++++++++++= +++- tests/qemu-iotests/154.out | 83 +++++++++++++++++++++++++++++++++ 3 files changed, 200 insertions(+), 2 deletions(-) diff --git a/block/qcow2.c b/block/qcow2.c index 5c1573c..8038793 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -2449,6 +2449,10 @@ static bool is_zero_sectors(BlockDriverState *bs, in= t64_t start, BlockDriverState *file; int64_t res; + if (start + count > bs->total_sectors) { + count =3D bs->total_sectors - start; + } + if (!count) { return true; } @@ -2467,6 +2471,9 @@ static coroutine_fn int qcow2_co_pwrite_zeroes(BlockD= riverState *bs, uint32_t tail =3D (offset + count) % s->cluster_size; trace_qcow2_pwrite_zeroes_start_req(qemu_coroutine_self(), offset, cou= nt); + if (offset + count =3D=3D bs->total_sectors * BDRV_SECTOR_SIZE) { + tail =3D 0; + } if (head || tail) { int64_t cl_start =3D (offset - head) >> BDRV_SECTOR_BITS; diff --git a/tests/qemu-iotests/154 b/tests/qemu-iotests/154 index 7ca7219..005f09f 100755 --- a/tests/qemu-iotests/154 +++ b/tests/qemu-iotests/154 @@ -2,7 +2,7 @@ # # qcow2 specific bdrv_pwrite_zeroes tests with backing files (complements = 034) # -# Copyright (C) 2016 Red Hat, Inc. +# Copyright (C) 2016-2017 Red Hat, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -42,7 +42,10 @@ _supported_proto file _supported_os Linux CLUSTER_SIZE=3D4k -size=3D128M +size=3D$((128 * 1024 * 1024)) + +# This test requires zero clusters, added in v3 images +_unsupported_imgopts compat=3D0.10 echo echo =3D=3D backing file contains zeros =3D=3D @@ -299,6 +302,111 @@ $QEMU_IO -c "read -P 0 75k 1k" "$TEST_IMG" | _filter_= qemu_io $QEMU_IMG map --output=3Djson "$TEST_IMG" | _filter_qemu_img_map +echo +echo =3D=3D unaligned image tail cluster, no allocation needed =3D=3D + +CLUSTER_SIZE=3D1024 TEST_IMG=3D"$TEST_IMG.base" _make_test_img $((size + 1= 024)) +_make_test_img -b "$TEST_IMG.base" $((size + 2048)) + +# With no backing file, write to all or part of unallocated partial cluster + +# Backing file: 128m: ... | 00 -- +$QEMU_IO -c "write -z $size 512" "$TEST_IMG.base" | _filter_qemu_io + +# Backing file: 128m: ... | -- 00 +$QEMU_IO -c "write -z $size 512" "$TEST_IMG.base" | _filter_qemu_io + +# Backing file: 128m: ... | 00 00 +$QEMU_IO -c "write -z $size 1024" "$TEST_IMG.base" | _filter_qemu_io + +# No offset should be allocated, although the cluster itself is considered +# allocated due to the zero flag +$QEMU_IO -c "alloc $size 1024" "$TEST_IMG.base" | _filter_qemu_io +$QEMU_IMG map --output=3Djson "$TEST_IMG.base" | _filter_qemu_img_map + +# With backing file that reads as zero, write to all or part of entire clu= ster + +# Backing file: 128m: ... | 00 00 +# Active layer: 128m: ... | 00 00 00 00 +$QEMU_IO -c "write -z $size 2048" "$TEST_IMG" | _filter_qemu_io +$QEMU_IMG map --output=3Djson "$TEST_IMG" | _filter_qemu_img_map + +# Backing file: 128m: ... | 00 00 +# Active layer: 128m: ... | 00 00 -- -- +$QEMU_IO -c "write -z $((size)) 1024" "$TEST_IMG" | _filter_qemu_io + +# Backing file: 128m: ... | 00 00 +# Active layer: 128m: ... | -- -- 00 00 +$QEMU_IO -c "write -z $((size + 1024)) 1024" "$TEST_IMG" | _filter_qemu_io + +# Backing file: 128m: ... | 00 00 +# Active layer: 128m: ... | -- 00 00 -- +$QEMU_IO -c "write -z $((size + 512)) 1024" "$TEST_IMG" | _filter_qemu_io + +# No offset should be allocated, although the cluster itself is considered +# allocated due to the zero flag +$QEMU_IO -c "alloc $size 2048" "$TEST_IMG" | _filter_qemu_io +$QEMU_IMG map --output=3Djson "$TEST_IMG" | _filter_qemu_img_map + +# Preallocated cluster is not freed when unmap is not requested + +# Backing file: 128m: ... | XX -- =3D> ... | XX 00 +$QEMU_IO -c "write $((size)) 512" "$TEST_IMG.base" | _filter_qemu_io +$QEMU_IO -c "write -z $((size + 512)) 512" "$TEST_IMG.base" | _filter_qemu= _io + +# Backing file: 128m: ... | XX 00 =3D> ... | 00 00 +$QEMU_IO -c "write -z $((size)) 1024" "$TEST_IMG.base" | _filter_qemu_io +$QEMU_IMG map --output=3Djson "$TEST_IMG.base" | _filter_qemu_img_map | + sed 's/"offset": [0-9]*/"offset": OFFSET/g' + +echo +echo =3D=3D unaligned image tail cluster, allocation required =3D=3D + +CLUSTER_SIZE=3D512 TEST_IMG=3D"$TEST_IMG.base" _make_test_img $((size + 10= 24)) +_make_test_img -b "$TEST_IMG.base" $((size + 2048)) + +# Write beyond backing file must COW +# Backing file: 128m: ... | XX -- +# Active layer: 128m: ... | -- -- 00 -- + +$QEMU_IO -c "write -P 1 $((size)) 512" "$TEST_IMG.base" | _filter_qemu_io +$QEMU_IO -c "write -z $((size + 1024)) 512" "$TEST_IMG" | _filter_qemu_io +$QEMU_IO -c "read -P 1 $((size)) 512" "$TEST_IMG" | _filter_qemu_io +$QEMU_IO -c "read -P 0 $((size + 512)) 1536" "$TEST_IMG" | _filter_qemu_io +$QEMU_IMG map --output=3Djson "$TEST_IMG" | _filter_qemu_img_map + +CLUSTER_SIZE=3D512 TEST_IMG=3D"$TEST_IMG.base" _make_test_img $((size + 10= 24)) +_make_test_img -b "$TEST_IMG.base" $((size + 2048)) + +# Writes at boundaries of (partial) cluster must not lose mid-cluster data +# Backing file: 128m: ... | -- XX +# Active layer: 128m: ... | 00 -- -- 00 + +$QEMU_IO -c "write -P 1 $((size + 512)) 512" "$TEST_IMG.base" | _filter_qe= mu_io +$QEMU_IO -c "write -z $((size)) 512" "$TEST_IMG" | _filter_qemu_io +$QEMU_IO -c "read -P 0 $((size)) 512" "$TEST_IMG" | _filter_qemu_io +$QEMU_IO -c "read -P 1 $((size + 512)) 512" "$TEST_IMG" | _filter_qemu_io +$QEMU_IO -c "read -P 0 $((size + 1024)) 1024" "$TEST_IMG" | _filter_qemu_io +$QEMU_IO -c "write -z $((size + 1536)) 512" "$TEST_IMG" | _filter_qemu_io +$QEMU_IO -c "read -P 0 $((size)) 512" "$TEST_IMG" | _filter_qemu_io +$QEMU_IO -c "read -P 1 $((size + 512)) 512" "$TEST_IMG" | _filter_qemu_io +$QEMU_IO -c "read -P 0 $((size + 1024)) 1024" "$TEST_IMG" | _filter_qemu_io +$QEMU_IMG map --output=3Djson "$TEST_IMG" | _filter_qemu_img_map + +CLUSTER_SIZE=3D512 TEST_IMG=3D"$TEST_IMG.base" _make_test_img $((size + 10= 24)) +_make_test_img -b "$TEST_IMG.base" $((size + 2048)) + +# Partial write must not lose data +# Backing file: 128m: ... | -- -- +# Active layer: 128m: ... | -- -- XX 00 + +$QEMU_IO -c "write -P 1 $((size + 1024)) 512" "$TEST_IMG" | _filter_qemu_io +$QEMU_IO -c "write -z $((size + 1536)) 512" "$TEST_IMG" | _filter_qemu_io +$QEMU_IO -c "read -P 0 $((size)) 1024" "$TEST_IMG" | _filter_qemu_io +$QEMU_IO -c "read -P 1 $((size + 1024)) 512" "$TEST_IMG" | _filter_qemu_io +$QEMU_IO -c "read -P 0 $((size + 1536)) 512" "$TEST_IMG" | _filter_qemu_io +$QEMU_IMG map --output=3Djson "$TEST_IMG" | _filter_qemu_img_map + # success, all done echo "*** done" rm -f $seq.full diff --git a/tests/qemu-iotests/154.out b/tests/qemu-iotests/154.out index da9eabd..f8a09af 100644 --- a/tests/qemu-iotests/154.out +++ b/tests/qemu-iotests/154.out @@ -282,4 +282,87 @@ read 1024/1024 bytes at offset 76800 { "start": 69632, "length": 4096, "depth": 0, "zero": true, "data": false}, { "start": 73728, "length": 4096, "depth": 0, "zero": false, "data": true,= "offset": 24576}, { "start": 77824, "length": 134139904, "depth": 1, "zero": true, "data": f= alse}] + +=3D=3D unaligned image tail cluster, no allocation needed =3D=3D +Formatting 'TEST_DIR/t.IMGFMT.base', fmt=3DIMGFMT size=3D134218752 +Formatting 'TEST_DIR/t.IMGFMT', fmt=3DIMGFMT size=3D134219776 backing_file= =3DTEST_DIR/t.IMGFMT.base +wrote 512/512 bytes at offset 134217728 +512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 512/512 bytes at offset 134217728 +512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 1024/1024 bytes at offset 134217728 +1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +1024/1024 bytes allocated at offset 128 MiB +[{ "start": 0, "length": 134218752, "depth": 0, "zero": true, "data": fals= e}] +wrote 2048/2048 bytes at offset 134217728 +2 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +[{ "start": 0, "length": 134217728, "depth": 1, "zero": true, "data": fals= e}, +{ "start": 134217728, "length": 2048, "depth": 0, "zero": true, "data": fa= lse}] +wrote 1024/1024 bytes at offset 134217728 +1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 1024/1024 bytes at offset 134218752 +1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 1024/1024 bytes at offset 134218240 +1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +2048/2048 bytes allocated at offset 128 MiB +[{ "start": 0, "length": 134217728, "depth": 1, "zero": true, "data": fals= e}, +{ "start": 134217728, "length": 2048, "depth": 0, "zero": true, "data": fa= lse}] +wrote 512/512 bytes at offset 134217728 +512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 512/512 bytes at offset 134218240 +512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 1024/1024 bytes at offset 134217728 +1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +[{ "start": 0, "length": 134217728, "depth": 0, "zero": true, "data": fals= e}, +{ "start": 134217728, "length": 1024, "depth": 0, "zero": true, "data": fa= lse, "offset": OFFSET}] + +=3D=3D unaligned image tail cluster, allocation required =3D=3D +Formatting 'TEST_DIR/t.IMGFMT.base', fmt=3DIMGFMT size=3D134218752 +Formatting 'TEST_DIR/t.IMGFMT', fmt=3DIMGFMT size=3D134219776 backing_file= =3DTEST_DIR/t.IMGFMT.base +wrote 512/512 bytes at offset 134217728 +512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 512/512 bytes at offset 134218752 +512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +read 512/512 bytes at offset 134217728 +512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +read 1536/1536 bytes at offset 134218240 +1.500 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +[{ "start": 0, "length": 134217728, "depth": 1, "zero": true, "data": fals= e}, +{ "start": 134217728, "length": 2048, "depth": 0, "zero": false, "data": t= rue, "offset": 20480}] +Formatting 'TEST_DIR/t.IMGFMT.base', fmt=3DIMGFMT size=3D134218752 +Formatting 'TEST_DIR/t.IMGFMT', fmt=3DIMGFMT size=3D134219776 backing_file= =3DTEST_DIR/t.IMGFMT.base +wrote 512/512 bytes at offset 134218240 +512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 512/512 bytes at offset 134217728 +512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +read 512/512 bytes at offset 134217728 +512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +read 512/512 bytes at offset 134218240 +512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +read 1024/1024 bytes at offset 134218752 +1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 512/512 bytes at offset 134219264 +512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +read 512/512 bytes at offset 134217728 +512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +read 512/512 bytes at offset 134218240 +512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +read 1024/1024 bytes at offset 134218752 +1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +[{ "start": 0, "length": 134217728, "depth": 1, "zero": true, "data": fals= e}, +{ "start": 134217728, "length": 2048, "depth": 0, "zero": false, "data": t= rue, "offset": 20480}] +Formatting 'TEST_DIR/t.IMGFMT.base', fmt=3DIMGFMT size=3D134218752 +Formatting 'TEST_DIR/t.IMGFMT', fmt=3DIMGFMT size=3D134219776 backing_file= =3DTEST_DIR/t.IMGFMT.base +wrote 512/512 bytes at offset 134218752 +512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 512/512 bytes at offset 134219264 +512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +read 1024/1024 bytes at offset 134217728 +1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +read 512/512 bytes at offset 134218752 +512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +read 512/512 bytes at offset 134219264 +512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +[{ "start": 0, "length": 134217728, "depth": 1, "zero": true, "data": fals= e}, +{ "start": 134217728, "length": 2048, "depth": 0, "zero": false, "data": t= rue, "offset": 20480}] *** done --=20 2.9.3 From nobody Sat May 4 12:39:44 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1493257749594556.9743605545302; Wed, 26 Apr 2017 18:49:09 -0700 (PDT) Received: from localhost ([::1]:57795 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3YYO-00010g-9k for importer@patchew.org; Wed, 26 Apr 2017 21:49:08 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33755) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3YW6-0007c3-Il for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d3YW5-00049V-3U for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:46 -0400 Received: from mx1.redhat.com ([209.132.183.28]:40136) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1d3YW0-00045J-ES; Wed, 26 Apr 2017 21:46:40 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 66E8167EAD; Thu, 27 Apr 2017 01:46:39 +0000 (UTC) Received: from red.redhat.com (ovpn-123-177.rdu2.redhat.com [10.10.123.177]) by smtp.corp.redhat.com (Postfix) with ESMTP id AB07418114; Thu, 27 Apr 2017 01:46:38 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 66E8167EAD Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=eblake@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 66E8167EAD From: Eric Blake To: qemu-devel@nongnu.org Date: Wed, 26 Apr 2017 20:46:19 -0500 Message-Id: <20170427014626.11553-11-eblake@redhat.com> In-Reply-To: <20170427014626.11553-1-eblake@redhat.com> References: <20170427014626.11553-1-eblake@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Thu, 27 Apr 2017 01:46:39 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v10 10/17] qcow2: Assert that cluster operations are aligned X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, qemu-block@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" We already audited (in commit 0c1bd469) that qcow2_discard_clusters() is only passed cluster-aligned start values; but we can further tighten the assertion that the only unaligned end value is at EOF. Recent commits have taken advantage of an unaligned tail cluster, for both discard and write zeroes. Signed-off-by: Eric Blake Reviewed-by: Max Reitz --- v10: rebase to context v9: rebase to master, by asserting that only tail cluster is unaligned v7, v8: only earlier half of series submitted for 2.9 v6: avoid assertion on non-cluster-aligned image, use s->cluster_sectors to avoid a shift, drop R-b v5: no change v4: new patch --- block/qcow2-cluster.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c index d542894..4f641a9 100644 --- a/block/qcow2-cluster.c +++ b/block/qcow2-cluster.c @@ -1572,11 +1572,10 @@ int qcow2_discard_clusters(BlockDriverState *bs, ui= nt64_t offset, end_offset =3D offset + (nb_sectors << BDRV_SECTOR_BITS); - /* The caller must cluster-align start; round end down except at EOF */ + /* Caller must pass aligned values, except at image end */ assert(QEMU_IS_ALIGNED(offset, s->cluster_size)); - if (end_offset !=3D bs->total_sectors * BDRV_SECTOR_SIZE) { - end_offset =3D start_of_cluster(s, end_offset); - } + assert(QEMU_IS_ALIGNED(end_offset, s->cluster_size) || + end_offset =3D=3D bs->total_sectors << BDRV_SECTOR_BITS); nb_clusters =3D size_to_clusters(s, end_offset - offset); @@ -1657,9 +1656,17 @@ int qcow2_zero_clusters(BlockDriverState *bs, uint64= _t offset, int nb_sectors, int flags) { BDRVQcow2State *s =3D bs->opaque; + uint64_t end_offset; uint64_t nb_clusters; int ret; + end_offset =3D offset + (nb_sectors << BDRV_SECTOR_BITS); + + /* Caller must pass aligned values, except at image end */ + assert(QEMU_IS_ALIGNED(offset, s->cluster_size)); + assert(QEMU_IS_ALIGNED(end_offset, s->cluster_size) || + end_offset =3D=3D bs->total_sectors << BDRV_SECTOR_BITS); + /* The zero flag is only supported by version 3 and newer */ if (s->qcow_version < 3) { return -ENOTSUP; --=20 2.9.3 From nobody Sat May 4 12:39:44 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1493258464748396.19851022707223; Wed, 26 Apr 2017 19:01:04 -0700 (PDT) Received: from localhost ([::1]:57859 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3Yjv-0002B9-Fi for importer@patchew.org; Wed, 26 Apr 2017 22:01:03 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33824) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3YW8-0007ei-Up for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:51 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d3YW7-0004Bq-AE for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:48 -0400 Received: from mx1.redhat.com ([209.132.183.28]:44716) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1d3YW1-000462-F7; Wed, 26 Apr 2017 21:46:41 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 66B0A6EF76; Thu, 27 Apr 2017 01:46:40 +0000 (UTC) Received: from red.redhat.com (ovpn-123-177.rdu2.redhat.com [10.10.123.177]) by smtp.corp.redhat.com (Postfix) with ESMTP id A08FB18114; Thu, 27 Apr 2017 01:46:39 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 66B0A6EF76 Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=eblake@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 66B0A6EF76 From: Eric Blake To: qemu-devel@nongnu.org Date: Wed, 26 Apr 2017 20:46:20 -0500 Message-Id: <20170427014626.11553-12-eblake@redhat.com> In-Reply-To: <20170427014626.11553-1-eblake@redhat.com> References: <20170427014626.11553-1-eblake@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Thu, 27 Apr 2017 01:46:40 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v10 11/17] qcow2: Discard/zero clusters by byte count X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, qemu-block@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Passing a byte offset, but sector count, when we ultimately want to operate on cluster granularity, is madness. Clean up the external interfaces to take both offset and count as bytes, while still keeping the assertion added previously that the caller must align the values to a cluster. Then rename things to make sure backports don't get confused by changed units: instead of qcow2_discard_clusters() and qcow2_zero_clusters(), we now have qcow2_cluster_discard() and qcow2_cluster_zeroize(). The internal functions still operate on clusters at a time, and return an int for number of cleared clusters; but on an image with 2M clusters, a single L2 table holds 256k entries that each represent a 2M cluster, totalling well over INT_MAX bytes if we ever had a request for that many bytes at once. All our callers currently limit themselves to 32-bit bytes (and therefore fewer clusters), but by making this function 64-bit clean, we have one less place to clean up if we later improve the block layer to support 64-bit bytes through all operations (with the block layer auto-fragmenting on behalf of more-limited drivers), rather than the current state where some interfaces are artificially limited to INT_MAX at a time. Signed-off-by: Eric Blake Reviewed-by: Max Reitz --- v10: squash in fixup accounting for unaligned file end v9: rebase to earlier changes, drop R-b v7, v8: only earlier half of series submitted for 2.9 v6: rebase due to context v5: s/count/byte/ to make the units obvious, and rework the math to ensure no 32-bit integer overflow on large clusters v4: improve function names, split assertion additions into earlier patch [no v3 or v2] v1: https://lists.gnu.org/archive/html/qemu-devel/2016-12/msg00339.html --- block/qcow2.h | 9 +++++---- block/qcow2-cluster.c | 40 +++++++++++++++++++++------------------- block/qcow2-snapshot.c | 7 +++---- block/qcow2.c | 21 +++++++++------------ 4 files changed, 38 insertions(+), 39 deletions(-) diff --git a/block/qcow2.h b/block/qcow2.h index 8731f24..03f23bf 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -547,10 +547,11 @@ uint64_t qcow2_alloc_compressed_cluster_offset(BlockD= riverState *bs, int compressed_size); int qcow2_alloc_cluster_link_l2(BlockDriverState *bs, QCowL2Meta *m); -int qcow2_discard_clusters(BlockDriverState *bs, uint64_t offset, - int nb_sectors, enum qcow2_discard_type type, bool full_discard); -int qcow2_zero_clusters(BlockDriverState *bs, uint64_t offset, int nb_sect= ors, - int flags); +int qcow2_cluster_discard(BlockDriverState *bs, uint64_t offset, + uint64_t bytes, enum qcow2_discard_type type, + bool full_discard); +int qcow2_cluster_zeroize(BlockDriverState *bs, uint64_t offset, + uint64_t bytes, int flags); int qcow2_expand_zero_clusters(BlockDriverState *bs, BlockDriverAmendStatusCB *status_cb, diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c index 4f641a9..a47aadc 100644 --- a/block/qcow2-cluster.c +++ b/block/qcow2-cluster.c @@ -1562,16 +1562,16 @@ static int discard_single_l2(BlockDriverState *bs, = uint64_t offset, return nb_clusters; } -int qcow2_discard_clusters(BlockDriverState *bs, uint64_t offset, - int nb_sectors, enum qcow2_discard_type type, bool full_discard) +int qcow2_cluster_discard(BlockDriverState *bs, uint64_t offset, + uint64_t bytes, enum qcow2_discard_type type, + bool full_discard) { BDRVQcow2State *s =3D bs->opaque; - uint64_t end_offset; + uint64_t end_offset =3D offset + bytes; uint64_t nb_clusters; + int64_t cleared; int ret; - end_offset =3D offset + (nb_sectors << BDRV_SECTOR_BITS); - /* Caller must pass aligned values, except at image end */ assert(QEMU_IS_ALIGNED(offset, s->cluster_size)); assert(QEMU_IS_ALIGNED(end_offset, s->cluster_size) || @@ -1583,13 +1583,15 @@ int qcow2_discard_clusters(BlockDriverState *bs, ui= nt64_t offset, /* Each L2 table is handled by its own loop iteration */ while (nb_clusters > 0) { - ret =3D discard_single_l2(bs, offset, nb_clusters, type, full_disc= ard); - if (ret < 0) { + cleared =3D discard_single_l2(bs, offset, nb_clusters, type, + full_discard); + if (cleared < 0) { + ret =3D cleared; goto fail; } - nb_clusters -=3D ret; - offset +=3D (ret * s->cluster_size); + nb_clusters -=3D cleared; + offset +=3D (cleared * s->cluster_size); } ret =3D 0; @@ -1652,16 +1654,15 @@ static int zero_single_l2(BlockDriverState *bs, uin= t64_t offset, return nb_clusters; } -int qcow2_zero_clusters(BlockDriverState *bs, uint64_t offset, int nb_sect= ors, - int flags) +int qcow2_cluster_zeroize(BlockDriverState *bs, uint64_t offset, + uint64_t bytes, int flags) { BDRVQcow2State *s =3D bs->opaque; - uint64_t end_offset; + uint64_t end_offset =3D offset + bytes; uint64_t nb_clusters; + int64_t cleared; int ret; - end_offset =3D offset + (nb_sectors << BDRV_SECTOR_BITS); - /* Caller must pass aligned values, except at image end */ assert(QEMU_IS_ALIGNED(offset, s->cluster_size)); assert(QEMU_IS_ALIGNED(end_offset, s->cluster_size) || @@ -1673,18 +1674,19 @@ int qcow2_zero_clusters(BlockDriverState *bs, uint6= 4_t offset, int nb_sectors, } /* Each L2 table is handled by its own loop iteration */ - nb_clusters =3D size_to_clusters(s, nb_sectors << BDRV_SECTOR_BITS); + nb_clusters =3D size_to_clusters(s, bytes); s->cache_discards =3D true; while (nb_clusters > 0) { - ret =3D zero_single_l2(bs, offset, nb_clusters, flags); - if (ret < 0) { + cleared =3D zero_single_l2(bs, offset, nb_clusters, flags); + if (cleared < 0) { + ret =3D cleared; goto fail; } - nb_clusters -=3D ret; - offset +=3D (ret * s->cluster_size); + nb_clusters -=3D cleared; + offset +=3D (cleared * s->cluster_size); } ret =3D 0; diff --git a/block/qcow2-snapshot.c b/block/qcow2-snapshot.c index 0324243..44243e0 100644 --- a/block/qcow2-snapshot.c +++ b/block/qcow2-snapshot.c @@ -440,10 +440,9 @@ int qcow2_snapshot_create(BlockDriverState *bs, QEMUSn= apshotInfo *sn_info) /* The VM state isn't needed any more in the active L1 table; in fact,= it * hurts by causing expensive COW for the next snapshot. */ - qcow2_discard_clusters(bs, qcow2_vm_state_offset(s), - align_offset(sn->vm_state_size, s->cluster_size) - >> BDRV_SECTOR_BITS, - QCOW2_DISCARD_NEVER, false); + qcow2_cluster_discard(bs, qcow2_vm_state_offset(s), + align_offset(sn->vm_state_size, s->cluster_size), + QCOW2_DISCARD_NEVER, false); #ifdef DEBUG_ALLOC { diff --git a/block/qcow2.c b/block/qcow2.c index 8038793..4d34610 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -2508,7 +2508,7 @@ static coroutine_fn int qcow2_co_pwrite_zeroes(BlockD= riverState *bs, trace_qcow2_pwrite_zeroes(qemu_coroutine_self(), offset, count); /* Whatever is left can use real zero clusters */ - ret =3D qcow2_zero_clusters(bs, offset, count >> BDRV_SECTOR_BITS, fla= gs); + ret =3D qcow2_cluster_zeroize(bs, offset, count, flags); qemu_co_mutex_unlock(&s->lock); return ret; @@ -2531,8 +2531,8 @@ static coroutine_fn int qcow2_co_pdiscard(BlockDriver= State *bs, } qemu_co_mutex_lock(&s->lock); - ret =3D qcow2_discard_clusters(bs, offset, count >> BDRV_SECTOR_BITS, - QCOW2_DISCARD_REQUEST, false); + ret =3D qcow2_cluster_discard(bs, offset, count, QCOW2_DISCARD_REQUEST, + false); qemu_co_mutex_unlock(&s->lock); return ret; } @@ -2839,9 +2839,8 @@ fail: static int qcow2_make_empty(BlockDriverState *bs) { BDRVQcow2State *s =3D bs->opaque; - uint64_t start_sector; - int sector_step =3D (QEMU_ALIGN_DOWN(INT_MAX, s->cluster_size) / - BDRV_SECTOR_SIZE); + uint64_t offset, end_offset; + int step =3D QEMU_ALIGN_DOWN(INT_MAX, s->cluster_size); int l1_clusters, ret =3D 0; l1_clusters =3D DIV_ROUND_UP(s->l1_size, s->cluster_size / sizeof(uint= 64_t)); @@ -2858,18 +2857,16 @@ static int qcow2_make_empty(BlockDriverState *bs) /* This fallback code simply discards every active cluster; this is sl= ow, * but works in all cases */ - for (start_sector =3D 0; start_sector < bs->total_sectors; - start_sector +=3D sector_step) + end_offset =3D bs->total_sectors * BDRV_SECTOR_SIZE; + for (offset =3D 0; offset < end_offset; offset +=3D step) { /* As this function is generally used after committing an external * snapshot, QCOW2_DISCARD_SNAPSHOT seems appropriate. Also, the * default action for this kind of discard is to pass the discard, * which will ideally result in an actually smaller image file, as * is probably desired. */ - ret =3D qcow2_discard_clusters(bs, start_sector * BDRV_SECTOR_SIZE, - MIN(sector_step, - bs->total_sectors - start_sector), - QCOW2_DISCARD_SNAPSHOT, true); + ret =3D qcow2_cluster_discard(bs, offset, MIN(step, end_offset - o= ffset), + QCOW2_DISCARD_SNAPSHOT, true); if (ret < 0) { break; } --=20 2.9.3 From nobody Sat May 4 12:39:44 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1493257899894522.0439498265881; Wed, 26 Apr 2017 18:51:39 -0700 (PDT) Received: from localhost ([::1]:57811 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3Yao-00033v-LU for importer@patchew.org; Wed, 26 Apr 2017 21:51:38 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33789) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3YW7-0007dH-GQ for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:48 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d3YW6-0004AK-7g for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:47 -0400 Received: from mx1.redhat.com ([209.132.183.28]:52572) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1d3YW2-00046d-Df; Wed, 26 Apr 2017 21:46:42 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 59BD985542; Thu, 27 Apr 2017 01:46:41 +0000 (UTC) Received: from red.redhat.com (ovpn-123-177.rdu2.redhat.com [10.10.123.177]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9989F18114; Thu, 27 Apr 2017 01:46:40 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 59BD985542 Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx04.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=eblake@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 59BD985542 From: Eric Blake To: qemu-devel@nongnu.org Date: Wed, 26 Apr 2017 20:46:21 -0500 Message-Id: <20170427014626.11553-13-eblake@redhat.com> In-Reply-To: <20170427014626.11553-1-eblake@redhat.com> References: <20170427014626.11553-1-eblake@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.28]); Thu, 27 Apr 2017 01:46:41 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v10 12/17] blkdebug: Sanity check block layer guarantees X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, qemu-block@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Commits 04ed95f4 and 1a62d0ac updated the block layer to auto-fragment any I/O to fit within device boundaries. Additionally, when using a minimum alignment of 4k, we want to ensure the block layer does proper read-modify-write rather than requesting I/O on a slice of a sector. Let's enforce that the contract is obeyed when using blkdebug. For now, blkdebug only allows alignment overrides, and just inherits other limits from whatever device it is wrapping, but a future patch will further enhance things. Signed-off-by: Eric Blake Reviewed-by: Kevin Wolf Reviewed-by: Max Reitz --- v10: no change v5-v9: no change v4: no change v3: rebase to byte-based interfaces v2: new patch --- block/blkdebug.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/block/blkdebug.c b/block/blkdebug.c index c795ae9..14d3fc5 100644 --- a/block/blkdebug.c +++ b/block/blkdebug.c @@ -431,6 +431,13 @@ blkdebug_co_preadv(BlockDriverState *bs, uint64_t offs= et, uint64_t bytes, BDRVBlkdebugState *s =3D bs->opaque; BlkdebugRule *rule =3D NULL; + /* Sanity check block layer guarantees */ + assert(QEMU_IS_ALIGNED(offset, bs->bl.request_alignment)); + assert(QEMU_IS_ALIGNED(bytes, bs->bl.request_alignment)); + if (bs->bl.max_transfer) { + assert(bytes <=3D bs->bl.max_transfer); + } + QSIMPLEQ_FOREACH(rule, &s->active_rules, active_next) { uint64_t inject_offset =3D rule->options.inject.offset; @@ -455,6 +462,13 @@ blkdebug_co_pwritev(BlockDriverState *bs, uint64_t off= set, uint64_t bytes, BDRVBlkdebugState *s =3D bs->opaque; BlkdebugRule *rule =3D NULL; + /* Sanity check block layer guarantees */ + assert(QEMU_IS_ALIGNED(offset, bs->bl.request_alignment)); + assert(QEMU_IS_ALIGNED(bytes, bs->bl.request_alignment)); + if (bs->bl.max_transfer) { + assert(bytes <=3D bs->bl.max_transfer); + } + QSIMPLEQ_FOREACH(rule, &s->active_rules, active_next) { uint64_t inject_offset =3D rule->options.inject.offset; --=20 2.9.3 From nobody Sat May 4 12:39:44 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1493258319626959.4460159013879; Wed, 26 Apr 2017 18:58:39 -0700 (PDT) Received: from localhost ([::1]:57845 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3Yha-0000bn-FY for importer@patchew.org; Wed, 26 Apr 2017 21:58:38 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33807) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3YW8-0007e4-4J for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d3YW6-0004B8-Oy for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:48 -0400 Received: from mx1.redhat.com ([209.132.183.28]:54130) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1d3YW3-00047Y-BY; Wed, 26 Apr 2017 21:46:43 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 4B00BC04B95A; Thu, 27 Apr 2017 01:46:42 +0000 (UTC) Received: from red.redhat.com (ovpn-123-177.rdu2.redhat.com [10.10.123.177]) by smtp.corp.redhat.com (Postfix) with ESMTP id 909BA18114; Thu, 27 Apr 2017 01:46:41 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 4B00BC04B95A Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=eblake@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 4B00BC04B95A From: Eric Blake To: qemu-devel@nongnu.org Date: Wed, 26 Apr 2017 20:46:22 -0500 Message-Id: <20170427014626.11553-14-eblake@redhat.com> In-Reply-To: <20170427014626.11553-1-eblake@redhat.com> References: <20170427014626.11553-1-eblake@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Thu, 27 Apr 2017 01:46:42 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v10 13/17] blkdebug: Refactor error injection X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, qemu-block@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Rather than repeat the logic at each caller of checking if a Rule exists that warrants an error injection, fold that logic into inject_error(); and rename it to rule_check() for legibility. This will help the next patch, which adds two more callers that need to check rules for the potential of injecting errors. Signed-off-by: Eric Blake Reviewed-by: Max Reitz --- v10: no change v9: no change v7-v8: not submitted (earlier half of series sent for 2.9) v6: new patch --- block/blkdebug.c | 74 +++++++++++++++++++++++++---------------------------= ---- 1 file changed, 33 insertions(+), 41 deletions(-) diff --git a/block/blkdebug.c b/block/blkdebug.c index 14d3fc5..db58db0 100644 --- a/block/blkdebug.c +++ b/block/blkdebug.c @@ -405,11 +405,30 @@ out: return ret; } -static int inject_error(BlockDriverState *bs, BlkdebugRule *rule) +static int rule_check(BlockDriverState *bs, uint64_t offset, uint64_t byte= s) { BDRVBlkdebugState *s =3D bs->opaque; - int error =3D rule->options.inject.error; - bool immediately =3D rule->options.inject.immediately; + BlkdebugRule *rule =3D NULL; + int error; + bool immediately; + + QSIMPLEQ_FOREACH(rule, &s->active_rules, active_next) { + uint64_t inject_offset =3D rule->options.inject.offset; + + if (inject_offset =3D=3D -1 || + (bytes && inject_offset >=3D offset && + inject_offset < offset + bytes)) + { + break; + } + } + + if (!rule || !rule->options.inject.error) { + return 0; + } + + immediately =3D rule->options.inject.immediately; + error =3D rule->options.inject.error; if (rule->options.inject.once) { QSIMPLEQ_REMOVE(&s->active_rules, rule, BlkdebugRule, active_next); @@ -428,8 +447,7 @@ static int coroutine_fn blkdebug_co_preadv(BlockDriverState *bs, uint64_t offset, uint64_t bytes, QEMUIOVector *qiov, int flags) { - BDRVBlkdebugState *s =3D bs->opaque; - BlkdebugRule *rule =3D NULL; + int err; /* Sanity check block layer guarantees */ assert(QEMU_IS_ALIGNED(offset, bs->bl.request_alignment)); @@ -438,18 +456,9 @@ blkdebug_co_preadv(BlockDriverState *bs, uint64_t offs= et, uint64_t bytes, assert(bytes <=3D bs->bl.max_transfer); } - QSIMPLEQ_FOREACH(rule, &s->active_rules, active_next) { - uint64_t inject_offset =3D rule->options.inject.offset; - - if (inject_offset =3D=3D -1 || - (inject_offset >=3D offset && inject_offset < offset + bytes)) - { - break; - } - } - - if (rule && rule->options.inject.error) { - return inject_error(bs, rule); + err =3D rule_check(bs, offset, bytes); + if (err) { + return err; } return bdrv_co_preadv(bs->file, offset, bytes, qiov, flags); @@ -459,8 +468,7 @@ static int coroutine_fn blkdebug_co_pwritev(BlockDriverState *bs, uint64_t offset, uint64_t bytes, QEMUIOVector *qiov, int flags) { - BDRVBlkdebugState *s =3D bs->opaque; - BlkdebugRule *rule =3D NULL; + int err; /* Sanity check block layer guarantees */ assert(QEMU_IS_ALIGNED(offset, bs->bl.request_alignment)); @@ -469,18 +477,9 @@ blkdebug_co_pwritev(BlockDriverState *bs, uint64_t off= set, uint64_t bytes, assert(bytes <=3D bs->bl.max_transfer); } - QSIMPLEQ_FOREACH(rule, &s->active_rules, active_next) { - uint64_t inject_offset =3D rule->options.inject.offset; - - if (inject_offset =3D=3D -1 || - (inject_offset >=3D offset && inject_offset < offset + bytes)) - { - break; - } - } - - if (rule && rule->options.inject.error) { - return inject_error(bs, rule); + err =3D rule_check(bs, offset, bytes); + if (err) { + return err; } return bdrv_co_pwritev(bs->file, offset, bytes, qiov, flags); @@ -488,17 +487,10 @@ blkdebug_co_pwritev(BlockDriverState *bs, uint64_t of= fset, uint64_t bytes, static int blkdebug_co_flush(BlockDriverState *bs) { - BDRVBlkdebugState *s =3D bs->opaque; - BlkdebugRule *rule =3D NULL; + int err =3D rule_check(bs, 0, 0); - QSIMPLEQ_FOREACH(rule, &s->active_rules, active_next) { - if (rule->options.inject.offset =3D=3D -1) { - break; - } - } - - if (rule && rule->options.inject.error) { - return inject_error(bs, rule); + if (err) { + return err; } return bdrv_co_flush(bs->file->bs); --=20 2.9.3 From nobody Sat May 4 12:39:44 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1493258264742732.6606614387917; Wed, 26 Apr 2017 18:57:44 -0700 (PDT) Received: from localhost ([::1]:57841 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3Ygh-0008Pw-DM for importer@patchew.org; Wed, 26 Apr 2017 21:57:43 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33864) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3YWA-0007gF-8h for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d3YW9-0004Cp-0K for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:50 -0400 Received: from mx1.redhat.com ([209.132.183.28]:53054) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1d3YW4-000484-Ip; Wed, 26 Apr 2017 21:46:44 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 73A7883F44; Thu, 27 Apr 2017 01:46:43 +0000 (UTC) Received: from red.redhat.com (ovpn-123-177.rdu2.redhat.com [10.10.123.177]) by smtp.corp.redhat.com (Postfix) with ESMTP id 816FF18114; Thu, 27 Apr 2017 01:46:42 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 73A7883F44 Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=eblake@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 73A7883F44 From: Eric Blake To: qemu-devel@nongnu.org Date: Wed, 26 Apr 2017 20:46:23 -0500 Message-Id: <20170427014626.11553-15-eblake@redhat.com> In-Reply-To: <20170427014626.11553-1-eblake@redhat.com> References: <20170427014626.11553-1-eblake@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Thu, 27 Apr 2017 01:46:43 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v10 14/17] blkdebug: Add pass-through write_zero and discard support X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, qemu-block@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" In order to test the effects of artificial geometry constraints on operations like write zero or discard, we first need blkdebug to manage these actions. It also allows us to inject errors on those operations, just like we can for read/write/flush. We can also test the contract promised by the block layer; namely, if a device has specified limits on alignment or maximum size, then those limits must be obeyed (for now, the blkdebug driver merely inherits limits from whatever it is wrapping, but the next patch will further enhance it to allow specific limit overrides). This patch intentionally refuses to service requests smaller than the requested alignments; this is because an upcoming patch adds a qemu-iotest to prove that the block layer is correctly handling fragmentation, but the test only works if there is a way to tell the difference at artificial alignment boundaries when blkdebug is using a larger-than-default alignment. If we let the blkdebug layer always defer to the underlying layer, which potentially has a smaller granularity, the iotest will be thwarted. Tested by setting up an NBD server with export 'foo', then invoking: $ ./qemu-io qemu-io> open -o driver=3Dblkdebug blkdebug::nbd://localhost:10809/foo qemu-io> d 0 15M qemu-io> w -z 0 15M Pre-patch, the server never sees the discard (it was silently eaten by the block layer); post-patch it is passed across the wire. Likewise, pre-patch the write is always passed with NBD_WRITE (with 15M of zeroes on the wire), while post-patch it can utilize NBD_WRITE_ZEROES (for less traffic). Signed-off-by: Eric Blake Reviewed-by: Max Reitz --- v10: no change v9: no change v7-v8: not submitted (earlier half of series sent for 2.9) v6: tighten check of unaligned requests, rebase on rule check refactoring, drop R-b v5: include 2017 copyright v4: correct error injection to respect byte range, tweak formatting v3: rebase to byte-based read/write, improve docs on why no partial write zero passthrough v2: new patch --- block/blkdebug.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 74 insertions(+) diff --git a/block/blkdebug.c b/block/blkdebug.c index db58db0..62d113c 100644 --- a/block/blkdebug.c +++ b/block/blkdebug.c @@ -1,6 +1,7 @@ /* * Block protocol for I/O error injection * + * Copyright (C) 2016-2017 Red Hat, Inc. * Copyright (c) 2010 Kevin Wolf * * Permission is hereby granted, free of charge, to any person obtaining a= copy @@ -382,6 +383,11 @@ static int blkdebug_open(BlockDriverState *bs, QDict *= options, int flags, goto out; } + bs->supported_write_flags =3D BDRV_REQ_FUA & + bs->file->bs->supported_write_flags; + bs->supported_zero_flags =3D (BDRV_REQ_FUA | BDRV_REQ_MAY_UNMAP) & + bs->file->bs->supported_zero_flags; + /* Set request alignment */ align =3D qemu_opt_get_size(opts, "align", 0); if (align < INT_MAX && is_power_of_2(align)) { @@ -496,6 +502,72 @@ static int blkdebug_co_flush(BlockDriverState *bs) return bdrv_co_flush(bs->file->bs); } +static int coroutine_fn blkdebug_co_pwrite_zeroes(BlockDriverState *bs, + int64_t offset, int coun= t, + BdrvRequestFlags flags) +{ + uint32_t align =3D MAX(bs->bl.request_alignment, + bs->bl.pwrite_zeroes_alignment); + int err; + + /* Only pass through requests that are larger than requested + * preferred alignment (so that we test the fallback to writes on + * unaligned portions), and check that the block layer never hands + * us anything unaligned that crosses an alignment boundary. */ + if (count < align) { + assert(QEMU_IS_ALIGNED(offset, align) || + QEMU_IS_ALIGNED(offset + count, align) || + DIV_ROUND_UP(offset, align) =3D=3D + DIV_ROUND_UP(offset + count, align)); + return -ENOTSUP; + } + assert(QEMU_IS_ALIGNED(offset, align)); + assert(QEMU_IS_ALIGNED(count, align)); + if (bs->bl.max_pwrite_zeroes) { + assert(count <=3D bs->bl.max_pwrite_zeroes); + } + + err =3D rule_check(bs, offset, count); + if (err) { + return err; + } + + return bdrv_co_pwrite_zeroes(bs->file, offset, count, flags); +} + +static int coroutine_fn blkdebug_co_pdiscard(BlockDriverState *bs, + int64_t offset, int count) +{ + uint32_t align =3D bs->bl.pdiscard_alignment; + int err; + + /* Only pass through requests that are larger than requested + * minimum alignment, and ensure that unaligned requests do not + * cross optimum discard boundaries. */ + if (count < bs->bl.request_alignment) { + assert(QEMU_IS_ALIGNED(offset, align) || + QEMU_IS_ALIGNED(offset + count, align) || + DIV_ROUND_UP(offset, align) =3D=3D + DIV_ROUND_UP(offset + count, align)); + return -ENOTSUP; + } + assert(QEMU_IS_ALIGNED(offset, bs->bl.request_alignment)); + assert(QEMU_IS_ALIGNED(count, bs->bl.request_alignment)); + if (align && count >=3D align) { + assert(QEMU_IS_ALIGNED(offset, align)); + assert(QEMU_IS_ALIGNED(count, align)); + } + if (bs->bl.max_pdiscard) { + assert(count <=3D bs->bl.max_pdiscard); + } + + err =3D rule_check(bs, offset, count); + if (err) { + return err; + } + + return bdrv_co_pdiscard(bs->file->bs, offset, count); +} static void blkdebug_close(BlockDriverState *bs) { @@ -750,6 +822,8 @@ static BlockDriver bdrv_blkdebug =3D { .bdrv_co_preadv =3D blkdebug_co_preadv, .bdrv_co_pwritev =3D blkdebug_co_pwritev, .bdrv_co_flush_to_disk =3D blkdebug_co_flush, + .bdrv_co_pwrite_zeroes =3D blkdebug_co_pwrite_zeroes, + .bdrv_co_pdiscard =3D blkdebug_co_pdiscard, .bdrv_debug_event =3D blkdebug_debug_event, .bdrv_debug_breakpoint =3D blkdebug_debug_breakpoint, --=20 2.9.3 From nobody Sat May 4 12:39:44 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1493258355135216.27567749258844; Wed, 26 Apr 2017 18:59:15 -0700 (PDT) Received: from localhost ([::1]:57846 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3Yi9-00010q-FM for importer@patchew.org; Wed, 26 Apr 2017 21:59:13 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33858) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3YWA-0007g0-0L for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d3YW9-0004Cy-2Y for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:50 -0400 Received: from mx1.redhat.com ([209.132.183.28]:59696) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1d3YW5-000490-Io; Wed, 26 Apr 2017 21:46:45 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6EF0019D39D; Thu, 27 Apr 2017 01:46:44 +0000 (UTC) Received: from red.redhat.com (ovpn-123-177.rdu2.redhat.com [10.10.123.177]) by smtp.corp.redhat.com (Postfix) with ESMTP id A9EFD18114; Thu, 27 Apr 2017 01:46:43 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 6EF0019D39D Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=eblake@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 6EF0019D39D From: Eric Blake To: qemu-devel@nongnu.org Date: Wed, 26 Apr 2017 20:46:24 -0500 Message-Id: <20170427014626.11553-16-eblake@redhat.com> In-Reply-To: <20170427014626.11553-1-eblake@redhat.com> References: <20170427014626.11553-1-eblake@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Thu, 27 Apr 2017 01:46:44 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v10 15/17] blkdebug: Simplify override logic X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, qemu-block@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Rather than store into a local variable, then copy to the struct if the value is valid, then reporting errors otherwise, it is simpler to just store into the struct and report errors if the value is invalid. This however requires that the struct store a 64-bit number, rather than a narrower type. Move the errno assignment into a label that will be reused from more places in the next patch. Signed-off-by: Eric Blake Reviewed-by: Max Reitz Reviewed-by: Kevin Wolf --- v10: no change v9: no change v7-v8: not submitted (earlier half of series sent for 2.9) v6: tweak error message, but R-b kept v5: no change v4: fix typo in commit message, move errno assignment v3: new patch --- block/blkdebug.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/block/blkdebug.c b/block/blkdebug.c index 62d113c..a1501eb 100644 --- a/block/blkdebug.c +++ b/block/blkdebug.c @@ -38,7 +38,7 @@ typedef struct BDRVBlkdebugState { int state; int new_state; - int align; + uint64_t align; /* For blkdebug_refresh_filename() */ char *config_file; @@ -353,7 +353,6 @@ static int blkdebug_open(BlockDriverState *bs, QDict *o= ptions, int flags, BDRVBlkdebugState *s =3D bs->opaque; QemuOpts *opts; Error *local_err =3D NULL; - uint64_t align; int ret; opts =3D qemu_opts_create(&runtime_opts, NULL, 0, &error_abort); @@ -389,12 +388,10 @@ static int blkdebug_open(BlockDriverState *bs, QDict = *options, int flags, bs->file->bs->supported_zero_flags; /* Set request alignment */ - align =3D qemu_opt_get_size(opts, "align", 0); - if (align < INT_MAX && is_power_of_2(align)) { - s->align =3D align; - } else if (align) { - error_setg(errp, "Invalid alignment"); - ret =3D -EINVAL; + s->align =3D qemu_opt_get_size(opts, "align", 0); + if (s->align && (s->align >=3D INT_MAX || !is_power_of_2(s->align))) { + error_setg(errp, "Cannot meet constraints with align %" PRIu64, + s->align); goto fail_unref; } @@ -402,6 +399,7 @@ static int blkdebug_open(BlockDriverState *bs, QDict *o= ptions, int flags, goto out; fail_unref: + ret =3D -EINVAL; bdrv_unref_child(bs, bs->file); out: if (ret < 0) { --=20 2.9.3 From nobody Sat May 4 12:39:44 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 149325816852686.24019798964775; Wed, 26 Apr 2017 18:56:08 -0700 (PDT) Received: from localhost ([::1]:57836 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3Yf9-00070v-6w for importer@patchew.org; Wed, 26 Apr 2017 21:56:07 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33904) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3YWD-0007ib-4L for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d3YWA-0004EP-Vw for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:53 -0400 Received: from mx1.redhat.com ([209.132.183.28]:35950) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1d3YW6-0004AG-O4; Wed, 26 Apr 2017 21:46:46 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 974917F6C5; Thu, 27 Apr 2017 01:46:45 +0000 (UTC) Received: from red.redhat.com (ovpn-123-177.rdu2.redhat.com [10.10.123.177]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9DB59784A4; Thu, 27 Apr 2017 01:46:44 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 974917F6C5 Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=eblake@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 974917F6C5 From: Eric Blake To: qemu-devel@nongnu.org Date: Wed, 26 Apr 2017 20:46:25 -0500 Message-Id: <20170427014626.11553-17-eblake@redhat.com> In-Reply-To: <20170427014626.11553-1-eblake@redhat.com> References: <20170427014626.11553-1-eblake@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Thu, 27 Apr 2017 01:46:45 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v10 16/17] blkdebug: Add ability to override unmap geometries X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, Markus Armbruster , qemu-block@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Make it easier to simulate various unusual hardware setups (for example, recent commits 3482b9b and b8d0a98 affect the Dell Equallogic iSCSI with its 15M preferred and maximum unmap and write zero sizing, or b2f95fe deals with the Linux loopback block device having a max_transfer of 64k), by allowing blkdebug to wrap any other device with further restrictions on various alignments. Signed-off-by: Eric Blake Reviewed-by: Max Reitz --- v10: no change v9: rebase to master (dropped #optional tags) v7-v8: not submitted (earlier half of series sent for 2.9) v6: more tweaks in docs and error messages v5: tweak docs regarding max-transfer minimum v4: relax 512 byte minimum now that blkdebug is byte-based, fix doc typo v3: improve legibility of bounds checking, improve docs v2: new patch --- qapi/block-core.json | 33 ++++++++++++++++-- block/blkdebug.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++++= +++- 2 files changed, 125 insertions(+), 4 deletions(-) diff --git a/qapi/block-core.json b/qapi/block-core.json index 87fb747..2082242 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -2430,8 +2430,33 @@ # # @config: filename of the configuration file # -# @align: required alignment for requests in bytes, -# must be power of 2, or 0 for default +# @align: required alignment for requests in bytes, must be +# positive power of 2, or 0 for default +# +# @max-transfer: maximum size for I/O transfers in bytes, must be +# positive multiple of @align and of the underlying +# file's request alignment (but need not be a power of +# 2), or 0 for default (since 2.10) +# +# @opt-write-zero: preferred alignment for write zero requests in bytes, +# must be positive multiple of @align and of the +# underlying file's request alignment (but need not be a +# power of 2), or 0 for default (since 2.10) +# +# @max-write-zero: maximum size for write zero requests in bytes, must be +# positive multiple of @align, of @opt-write-zero, and of +# the underlying file's request alignment (but need not +# be a power of 2), or 0 for default (since 2.10) +# +# @opt-discard: preferred alignment for discard requests in bytes, must +# be positive multiple of @align and of the underlying +# file's request alignment (but need not be a power of +# 2), or 0 for default (since 2.10) +# +# @max-discard: maximum size for discard requests in bytes, must be +# positive multiple of @align, of @opt-discard, and of +# the underlying file's request alignment (but need not +# be a power of 2), or 0 for default (since 2.10) # # @inject-error: array of error injection descriptions # @@ -2442,7 +2467,9 @@ { 'struct': 'BlockdevOptionsBlkdebug', 'data': { 'image': 'BlockdevRef', '*config': 'str', - '*align': 'int', + '*align': 'int', '*max-transfer': 'int32', + '*opt-write-zero': 'int32', '*max-write-zero': 'int32', + '*opt-discard': 'int32', '*max-discard': 'int32', '*inject-error': ['BlkdebugInjectErrorOptions'], '*set-state': ['BlkdebugSetStateOptions'] } } diff --git a/block/blkdebug.c b/block/blkdebug.c index a1501eb..4ccdceb 100644 --- a/block/blkdebug.c +++ b/block/blkdebug.c @@ -39,6 +39,11 @@ typedef struct BDRVBlkdebugState { int state; int new_state; uint64_t align; + uint64_t max_transfer; + uint64_t opt_write_zero; + uint64_t max_write_zero; + uint64_t opt_discard; + uint64_t max_discard; /* For blkdebug_refresh_filename() */ char *config_file; @@ -343,6 +348,31 @@ static QemuOptsList runtime_opts =3D { .type =3D QEMU_OPT_SIZE, .help =3D "Required alignment in bytes", }, + { + .name =3D "max-transfer", + .type =3D QEMU_OPT_SIZE, + .help =3D "Maximum transfer size in bytes", + }, + { + .name =3D "opt-write-zero", + .type =3D QEMU_OPT_SIZE, + .help =3D "Optimum write zero alignment in bytes", + }, + { + .name =3D "max-write-zero", + .type =3D QEMU_OPT_SIZE, + .help =3D "Maximum write zero size in bytes", + }, + { + .name =3D "opt-discard", + .type =3D QEMU_OPT_SIZE, + .help =3D "Optimum discard alignment in bytes", + }, + { + .name =3D "max-discard", + .type =3D QEMU_OPT_SIZE, + .help =3D "Maximum discard size in bytes", + }, { /* end of list */ } }, }; @@ -354,6 +384,7 @@ static int blkdebug_open(BlockDriverState *bs, QDict *o= ptions, int flags, QemuOpts *opts; Error *local_err =3D NULL; int ret; + uint64_t align; opts =3D qemu_opts_create(&runtime_opts, NULL, 0, &error_abort); qemu_opts_absorb_qdict(opts, options, &local_err); @@ -387,13 +418,61 @@ static int blkdebug_open(BlockDriverState *bs, QDict = *options, int flags, bs->supported_zero_flags =3D (BDRV_REQ_FUA | BDRV_REQ_MAY_UNMAP) & bs->file->bs->supported_zero_flags; - /* Set request alignment */ + /* Set alignment overrides */ s->align =3D qemu_opt_get_size(opts, "align", 0); if (s->align && (s->align >=3D INT_MAX || !is_power_of_2(s->align))) { error_setg(errp, "Cannot meet constraints with align %" PRIu64, s->align); goto fail_unref; } + align =3D MAX(s->align, bs->file->bs->bl.request_alignment); + + s->max_transfer =3D qemu_opt_get_size(opts, "max-transfer", 0); + if (s->max_transfer && + (s->max_transfer >=3D INT_MAX || + !QEMU_IS_ALIGNED(s->max_transfer, align))) { + error_setg(errp, "Cannot meet constraints with max-transfer %" PRI= u64, + s->max_transfer); + goto fail_unref; + } + + s->opt_write_zero =3D qemu_opt_get_size(opts, "opt-write-zero", 0); + if (s->opt_write_zero && + (s->opt_write_zero >=3D INT_MAX || + !QEMU_IS_ALIGNED(s->opt_write_zero, align))) { + error_setg(errp, "Cannot meet constraints with opt-write-zero %" P= RIu64, + s->opt_write_zero); + goto fail_unref; + } + + s->max_write_zero =3D qemu_opt_get_size(opts, "max-write-zero", 0); + if (s->max_write_zero && + (s->max_write_zero >=3D INT_MAX || + !QEMU_IS_ALIGNED(s->max_write_zero, + MAX(s->opt_write_zero, align)))) { + error_setg(errp, "Cannot meet constraints with max-write-zero %" P= RIu64, + s->max_write_zero); + goto fail_unref; + } + + s->opt_discard =3D qemu_opt_get_size(opts, "opt-discard", 0); + if (s->opt_discard && + (s->opt_discard >=3D INT_MAX || + !QEMU_IS_ALIGNED(s->opt_discard, align))) { + error_setg(errp, "Cannot meet constraints with opt-discard %" PRIu= 64, + s->opt_discard); + goto fail_unref; + } + + s->max_discard =3D qemu_opt_get_size(opts, "max-discard", 0); + if (s->max_discard && + (s->max_discard >=3D INT_MAX || + !QEMU_IS_ALIGNED(s->max_discard, + MAX(s->opt_discard, align)))) { + error_setg(errp, "Cannot meet constraints with max-discard %" PRIu= 64, + s->max_discard); + goto fail_unref; + } ret =3D 0; goto out; @@ -793,6 +872,21 @@ static void blkdebug_refresh_limits(BlockDriverState *= bs, Error **errp) if (s->align) { bs->bl.request_alignment =3D s->align; } + if (s->max_transfer) { + bs->bl.max_transfer =3D s->max_transfer; + } + if (s->opt_write_zero) { + bs->bl.pwrite_zeroes_alignment =3D s->opt_write_zero; + } + if (s->max_write_zero) { + bs->bl.max_pwrite_zeroes =3D s->max_write_zero; + } + if (s->opt_discard) { + bs->bl.pdiscard_alignment =3D s->opt_discard; + } + if (s->max_discard) { + bs->bl.max_pdiscard =3D s->max_discard; + } } static int blkdebug_reopen_prepare(BDRVReopenState *reopen_state, --=20 2.9.3 From nobody Sat May 4 12:39:44 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1493258037692786.2362409140591; Wed, 26 Apr 2017 18:53:57 -0700 (PDT) Received: from localhost ([::1]:57820 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3Yd2-0005Ks-9j for importer@patchew.org; Wed, 26 Apr 2017 21:53:56 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33916) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d3YWG-0007mn-N1 for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d3YWE-0004F7-T0 for qemu-devel@nongnu.org; Wed, 26 Apr 2017 21:46:56 -0400 Received: from mx1.redhat.com ([209.132.183.28]:58134) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1d3YW7-0004BU-Lh; Wed, 26 Apr 2017 21:46:47 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 90CC4C056800; Thu, 27 Apr 2017 01:46:46 +0000 (UTC) Received: from red.redhat.com (ovpn-123-177.rdu2.redhat.com [10.10.123.177]) by smtp.corp.redhat.com (Postfix) with ESMTP id D085818114; Thu, 27 Apr 2017 01:46:45 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 90CC4C056800 Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx08.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=eblake@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 90CC4C056800 From: Eric Blake To: qemu-devel@nongnu.org Date: Wed, 26 Apr 2017 20:46:26 -0500 Message-Id: <20170427014626.11553-18-eblake@redhat.com> In-Reply-To: <20170427014626.11553-1-eblake@redhat.com> References: <20170427014626.11553-1-eblake@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Thu, 27 Apr 2017 01:46:46 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH v10 17/17] tests: Add coverage for recent block geometry fixes X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, qemu-block@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Use blkdebug's new geometry constraints to emulate setups that have caused recent regression fixes: write zeroes asserting when running through a loopback block device with max-transfer smaller than cluster size, and discard rounding away portions of requests not aligned to preferred boundaries. Also, add coverage that the block layer is honoring max transfer limits. For now, a single iotest performs all actions, with the idea that we can add future blkdebug constraint test cases in the same file; but it can be split into multiple iotests if we find reason to run one portion of the test in more setups than what are possible in the other. For reference, the final portion of the test (checking whether discard passes as much as possible to the lowest layers of the stack) works as follows: qemu-io: discard 30M at 80000001, passed to blkdebug blkdebug: discard 511 bytes at 80000001, -ENOTSUP (smaller than blkdebug's 512 align) blkdebug: discard 14371328 bytes at 80000512, passed to qcow2 qcow2: discard 739840 bytes at 80000512, -ENOTSUP (smaller than qcow2's 1M align) qcow2: discard 13M bytes at 77M, succeeds blkdebug: discard 15M bytes at 90M, passed to qcow2 qcow2: discard 15M bytes at 90M, succeeds blkdebug: discard 1356800 bytes at 105M, passed to qcow2 qcow2: discard 1M at 105M, succeeds qcow2: discard 308224 bytes at 106M, -ENOTSUP (smaller than qcow2's 1M align) blkdebug: discard 1 byte at 111457280, -ENOTSUP (smaller than blkdebug's 512 align) Signed-off-by: Eric Blake Reviewed-by: Max Reitz --- [yes, I added tests 177 and 179 out of order during this series. Oh well; I'm tired of renumbering this one.] v10: no change, rebase to context v9: no change v7-v8: not submitted (earlier half of series sent for 2.9) v6: rebase to master by renumbering s/175/177/ v5: rebase to master by renumbering s/173/175/ v4: clean up some comments, nicer backing file creation, more commit message v3: make comments tied more to test at hand, rather than the particular hardware that led to the earlier patches being tested v2: new patch --- tests/qemu-iotests/177 | 114 +++++++++++++++++++++++++++++++++++++++++= ++++ tests/qemu-iotests/177.out | 49 +++++++++++++++++++ tests/qemu-iotests/group | 1 + 3 files changed, 164 insertions(+) create mode 100755 tests/qemu-iotests/177 create mode 100644 tests/qemu-iotests/177.out diff --git a/tests/qemu-iotests/177 b/tests/qemu-iotests/177 new file mode 100755 index 0000000..e4ddec7 --- /dev/null +++ b/tests/qemu-iotests/177 @@ -0,0 +1,114 @@ +#!/bin/bash +# +# Test corner cases with unusual block geometries +# +# Copyright (C) 2016-2017 Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# creator +owner=3Deblake@redhat.com + +seq=3D`basename $0` +echo "QA output created by $seq" + +here=3D`pwd` +status=3D1 # failure is the default! + +_cleanup() +{ + _cleanup_test_img +} +trap "_cleanup; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +_supported_fmt qcow2 +_supported_proto file + +CLUSTER_SIZE=3D1M +size=3D128M +options=3Ddriver=3Dblkdebug,image.driver=3Dqcow2 + +echo +echo "=3D=3D setting up files =3D=3D" + +TEST_IMG=3D"$TEST_IMG.base" _make_test_img $size +$QEMU_IO -c "write -P 11 0 $size" "$TEST_IMG.base" | _filter_qemu_io +_make_test_img -b "$TEST_IMG.base" +$QEMU_IO -c "write -P 22 0 $size" "$TEST_IMG" | _filter_qemu_io + +# Limited to 64k max-transfer +echo +echo "=3D=3D constrained alignment and max-transfer =3D=3D" +limits=3Dalign=3D4k,max-transfer=3D64k +$QEMU_IO -c "open -o $options,$limits blkdebug::$TEST_IMG" \ + -c "write -P 33 1000 128k" -c "read -P 33 1000 128k" | _filter_qe= mu_io + +echo +echo "=3D=3D write zero with constrained max-transfer =3D=3D" +limits=3Dalign=3D512,max-transfer=3D64k,opt-write-zero=3D$CLUSTER_SIZE +$QEMU_IO -c "open -o $options,$limits blkdebug::$TEST_IMG" \ + -c "write -z 8003584 2093056" | _filter_qemu_io + +# non-power-of-2 write-zero/discard alignments +echo +echo "=3D=3D non-power-of-2 write zeroes limits =3D=3D" + +limits=3Dalign=3D512,opt-write-zero=3D15M,max-write-zero=3D15M,opt-discard= =3D15M,max-discard=3D15M +$QEMU_IO -c "open -o $options,$limits blkdebug::$TEST_IMG" \ + -c "write -z 32M 32M" | _filter_qemu_io + +echo +echo "=3D=3D non-power-of-2 discard limits =3D=3D" + +limits=3Dalign=3D512,opt-write-zero=3D15M,max-write-zero=3D15M,opt-discard= =3D15M,max-discard=3D15M +$QEMU_IO -c "open -o $options,$limits blkdebug::$TEST_IMG" \ + -c "discard 80000001 30M" | _filter_qemu_io + +echo +echo "=3D=3D verify image content =3D=3D" + +function verify_io() +{ + if ($QEMU_IMG info -f "$IMGFMT" "$TEST_IMG" | + grep "compat: 0.10" > /dev/null); then + # For v2 images, discarded clusters are read from the backing file + discarded=3D11 + else + # Discarded clusters are zeroed for v3 or later + discarded=3D0 + fi + + echo read -P 22 0 1000 + echo read -P 33 1000 128k + echo read -P 22 132072 7871512 + echo read -P 0 8003584 2093056 + echo read -P 22 10096640 23457792 + echo read -P 0 32M 32M + echo read -P 22 64M 13M + echo read -P $discarded 77M 29M + echo read -P 22 106M 22M +} + +verify_io | $QEMU_IO "$TEST_IMG" | _filter_qemu_io + +_check_test_img + +# success, all done +echo "*** done" +status=3D0 diff --git a/tests/qemu-iotests/177.out b/tests/qemu-iotests/177.out new file mode 100644 index 0000000..e887542 --- /dev/null +++ b/tests/qemu-iotests/177.out @@ -0,0 +1,49 @@ +QA output created by 177 + +=3D=3D setting up files =3D=3D +Formatting 'TEST_DIR/t.IMGFMT.base', fmt=3DIMGFMT size=3D134217728 +wrote 134217728/134217728 bytes at offset 0 +128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +Formatting 'TEST_DIR/t.IMGFMT', fmt=3DIMGFMT size=3D134217728 backing_file= =3DTEST_DIR/t.IMGFMT.base +wrote 134217728/134217728 bytes at offset 0 +128 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) + +=3D=3D constrained alignment and max-transfer =3D=3D +wrote 131072/131072 bytes at offset 1000 +128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +read 131072/131072 bytes at offset 1000 +128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) + +=3D=3D write zero with constrained max-transfer =3D=3D +wrote 2093056/2093056 bytes at offset 8003584 +1.996 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) + +=3D=3D non-power-of-2 write zeroes limits =3D=3D +wrote 33554432/33554432 bytes at offset 33554432 +32 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) + +=3D=3D non-power-of-2 discard limits =3D=3D +discard 31457280/31457280 bytes at offset 80000001 +30 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) + +=3D=3D verify image content =3D=3D +read 1000/1000 bytes at offset 0 +1000 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +read 131072/131072 bytes at offset 1000 +128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +read 7871512/7871512 bytes at offset 132072 +7.507 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +read 2093056/2093056 bytes at offset 8003584 +1.996 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +read 23457792/23457792 bytes at offset 10096640 +22.371 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +read 33554432/33554432 bytes at offset 33554432 +32 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +read 13631488/13631488 bytes at offset 67108864 +13 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +read 30408704/30408704 bytes at offset 80740352 +29 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +read 23068672/23068672 bytes at offset 111149056 +22 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +No errors were found on the image. +*** done diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group index 11ba1d9..395c72a 100644 --- a/tests/qemu-iotests/group +++ b/tests/qemu-iotests/group @@ -169,5 +169,6 @@ 174 auto 175 auto quick 176 rw auto backing +177 rw auto quick 179 rw auto quick 181 rw auto migration --=20 2.9.3