From nobody Fri Apr 19 19:17:42 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1555343843; cv=none; d=zoho.com; s=zohoarc; b=brN1nhtXFbvBteltlZ9wmInUGql2ScRKR+SNp/vQdmJV8nx0jSKJ3N+i+aBzvfoYBqY5pEa4Kv9AUV9LxDbV7tJd6kk96W1S9wta3L3owdW4Yyum4pbtLuu3iwQx4iyXX5ZrC9GJJB522Gi0ZILBCZc5XBv77doj7VmwXZS22Qc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1555343843; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=r8W0VB4vIlo/FQ3W3B4eMUP0OkIqN50/BbG9cw+ja5w=; b=ldC6LsEXt/A8Gjc2d55lLaOTpfIrYb9xwFjDkW7yKPEdW0NEdUeuPlAqahcdzdn4AWfnOnXUAN0oeuUZDfP/XFH01bUfiZ4ScEQ+3lPP4OsJj7ciSh/MY998Mi57sp0RUEvZ4WQgyvkQGIrbHvbV0wbUo+gXka0xTK4xaMbnSuo= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1555343843432833.994128371748; Mon, 15 Apr 2019 08:57:23 -0700 (PDT) Received: from localhost ([127.0.0.1]:52191 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hG3yx-0000dT-Eo for importer@patchew.org; Mon, 15 Apr 2019 11:57:19 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47647) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hG3x1-0007bi-4l for qemu-devel@nongnu.org; Mon, 15 Apr 2019 11:55:20 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hG3wz-0003Qf-5p for qemu-devel@nongnu.org; Mon, 15 Apr 2019 11:55:18 -0400 Received: from mx1.redhat.com ([209.132.183.28]:46898) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hG3wt-0003Ch-EJ; Mon, 15 Apr 2019 11:55:11 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 152163002713; Mon, 15 Apr 2019 15:55:10 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-117-113.ams2.redhat.com [10.36.117.113]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8401060123; Mon, 15 Apr 2019 15:55:06 +0000 (UTC) From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 15 Apr 2019 17:54:49 +0200 Message-Id: <20190415155452.5115-2-kwolf@redhat.com> In-Reply-To: <20190415155452.5115-1-kwolf@redhat.com> References: <20190415155452.5115-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.46]); Mon, 15 Apr 2019 15:55:10 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 1/4] qcow2: Avoid COW during metadata preallocation 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-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Limiting the allocation to INT_MAX bytes isn't particularly clever because it means that the final cluster will be a partial cluster which will be completed through a COW operation. This results in unnecessary data read and write requests which lead to an unwanted non-sparse filesystem block for metadata preallocation. Align the maximum allocation size down to the cluster size to avoid this situation. Cc: qemu-stable@nongnu.org Signed-off-by: Kevin Wolf Reviewed-by: Eric Blake --- block/qcow2.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/block/qcow2.c b/block/qcow2.c index d507ee0686..c8400e9712 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -2723,6 +2723,7 @@ static int qcow2_set_up_encryption(BlockDriverState *= bs, static int coroutine_fn preallocate_co(BlockDriverState *bs, uint64_t offs= et, uint64_t new_length) { + BDRVQcow2State *s =3D bs->opaque; uint64_t bytes; uint64_t host_offset =3D 0; unsigned int cur_bytes; @@ -2733,7 +2734,7 @@ static int coroutine_fn preallocate_co(BlockDriverSta= te *bs, uint64_t offset, bytes =3D new_length - offset; =20 while (bytes) { - cur_bytes =3D MIN(bytes, INT_MAX); + cur_bytes =3D MIN(bytes, QEMU_ALIGN_DOWN(INT_MAX, s->cluster_size)= ); ret =3D qcow2_alloc_cluster_offset(bs, offset, &cur_bytes, &host_offset, &meta); if (ret < 0) { --=20 2.20.1 From nobody Fri Apr 19 19:17:42 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1555343836; cv=none; d=zoho.com; s=zohoarc; b=G23ItAVVqzCfEXn791OA3YxdcaiPMpYM8gEylRKpeLuTk58d5UHy+zqF0jy6p94u4GsZwGPLtE7pE5UGfaohUaoUweCKYonU8IEZVwPkaoXtywrCtmEYVN6b0V+4cN1ExOomWwXR9x+j/K5Clj/EfaoDQn6600oBNTC3T9bi7eA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1555343836; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=3QXxwniWwxx4GwDROssemUhq547788AOUdzNASnLTPM=; b=PyJf9Iy8EpbvcjCdzKXbvMUDrm8X89RtOM4V61Xe2rozMYrVww0m5kL0gPam6nSM0GcPhXJyPgasoT9Nq2HIWVKQ4/OceoKEEN54ZXjiEuHkaZ+y9G5NsIFO38myRX/ldSXDydzxtbKqWbLlFkTkwXp70msJEYDCxRETCXazWiQ= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1555343836820154.72971728109405; Mon, 15 Apr 2019 08:57:16 -0700 (PDT) Received: from localhost ([127.0.0.1]:52189 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hG3yq-0000Xo-Tp for importer@patchew.org; Mon, 15 Apr 2019 11:57:12 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47703) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hG3x5-0007fq-7o for qemu-devel@nongnu.org; Mon, 15 Apr 2019 11:55:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hG3x3-0003Ug-1l for qemu-devel@nongnu.org; Mon, 15 Apr 2019 11:55:23 -0400 Received: from mx1.redhat.com ([209.132.183.28]:60395) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hG3wx-0003Nj-Av; Mon, 15 Apr 2019 11:55:15 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 71CA681E0F; Mon, 15 Apr 2019 15:55:14 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-117-113.ams2.redhat.com [10.36.117.113]) by smtp.corp.redhat.com (Postfix) with ESMTP id 605DA60123; Mon, 15 Apr 2019 15:55:10 +0000 (UTC) From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 15 Apr 2019 17:54:50 +0200 Message-Id: <20190415155452.5115-3-kwolf@redhat.com> In-Reply-To: <20190415155452.5115-1-kwolf@redhat.com> References: <20190415155452.5115-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Mon, 15 Apr 2019 15:55:14 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH for-4.0? 2/4] qcow2: Fix preallocation bdrv_pwrite to wrong file 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-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" With an external data file, preallocate_co() must write the final byte to the external data file, not to the qcow2 image file. This is harmless for preallocation of newly created images (only the qcow2 file size is increased to the virtual disk size while it should be much smaller), but with preallocated resize, it could in theory cause visible corruption if the metadata of the image is larger than the data (e.g. lots of bitmaps). Cc: qemu-stable@nongnu.org Signed-off-by: Kevin Wolf Reviewed-by: Eric Blake --- block/qcow2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/block/qcow2.c b/block/qcow2.c index c8400e9712..dfac74c264 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -2772,7 +2772,7 @@ static int coroutine_fn preallocate_co(BlockDriverSta= te *bs, uint64_t offset, */ if (host_offset !=3D 0) { uint8_t data =3D 0; - ret =3D bdrv_pwrite(bs->file, (host_offset + cur_bytes) - 1, + ret =3D bdrv_pwrite(s->data_file, (host_offset + cur_bytes) - 1, &data, 1); if (ret < 0) { return ret; --=20 2.20.1 From nobody Fri Apr 19 19:17:42 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1555343955; cv=none; d=zoho.com; s=zohoarc; b=GgLw87CKwe7r+z9bHhR+TMyizE92BHvEWfp86zWaZg5Ijdugsje1+HzUepKGRV0cP1sJUK35QCP49qTbD3bIvpL1wggAkhOdT9TaFAa4mcGaAti+75Xh7uRA85TRCafEhJeGH0iwhIrW7bbQYR+xF6a6tYXVYnRPlWWMuQ7G2U0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1555343955; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=Hh1hnOs0+HjCt7prkmNWu8qbonq6Qka876pQjWPZTy4=; b=SFHGLqNbvGFuC02ou1Wui4MhLVRgoLgWBFyIpsnbgPL3re7+eE31mQOX9EbDtgLVWm4P0Tls0hHhE2h9oxRnveYd1DvF1Lb750duwRRnNFq29ZNYqiO6oXSYZSVD35rUU4xNhQiXGWYApqgqxrQUsnVJM+9fvb9tnRqbbS+nd1k= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1555343955024868.1026359733872; Mon, 15 Apr 2019 08:59:15 -0700 (PDT) Received: from localhost ([127.0.0.1]:52213 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hG40l-000279-3q for importer@patchew.org; Mon, 15 Apr 2019 11:59:11 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47762) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hG3x7-0007iW-KE for qemu-devel@nongnu.org; Mon, 15 Apr 2019 11:55:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hG3x6-0003ZO-GU for qemu-devel@nongnu.org; Mon, 15 Apr 2019 11:55:25 -0400 Received: from mx1.redhat.com ([209.132.183.28]:33160) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hG3x3-0003RA-1I; Mon, 15 Apr 2019 11:55:21 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 557183092669; Mon, 15 Apr 2019 15:55:17 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-117-113.ams2.redhat.com [10.36.117.113]) by smtp.corp.redhat.com (Postfix) with ESMTP id BD58A60123; Mon, 15 Apr 2019 15:55:14 +0000 (UTC) From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 15 Apr 2019 17:54:51 +0200 Message-Id: <20190415155452.5115-4-kwolf@redhat.com> In-Reply-To: <20190415155452.5115-1-kwolf@redhat.com> References: <20190415155452.5115-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.43]); Mon, 15 Apr 2019 15:55:17 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 3/4] qcow2: Add errp to preallocate_co() 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-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" We'll add a bdrv_co_truncate() call in the next patch which can return an Error that we don't want to discard. So add an errp parameter to preallocate_co(). Cc: qemu-stable@nongnu.org Signed-off-by: Kevin Wolf Reviewed-by: Eric Blake --- block/qcow2.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/block/qcow2.c b/block/qcow2.c index dfac74c264..b4f9f5a240 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -2721,7 +2721,7 @@ static int qcow2_set_up_encryption(BlockDriverState *= bs, * Returns: 0 on success, -errno on failure. */ static int coroutine_fn preallocate_co(BlockDriverState *bs, uint64_t offs= et, - uint64_t new_length) + uint64_t new_length, Error **errp) { BDRVQcow2State *s =3D bs->opaque; uint64_t bytes; @@ -2738,6 +2738,7 @@ static int coroutine_fn preallocate_co(BlockDriverSta= te *bs, uint64_t offset, ret =3D qcow2_alloc_cluster_offset(bs, offset, &cur_bytes, &host_offset, &meta); if (ret < 0) { + error_setg_errno(errp, -ret, "Allocating clusters failed"); return ret; } =20 @@ -2746,6 +2747,7 @@ static int coroutine_fn preallocate_co(BlockDriverSta= te *bs, uint64_t offset, =20 ret =3D qcow2_alloc_cluster_link_l2(bs, meta); if (ret < 0) { + error_setg_errno(errp, -ret, "Mapping clusters failed"); qcow2_free_any_clusters(bs, meta->alloc_offset, meta->nb_clusters, QCOW2_DISCARD_N= EVER); return ret; @@ -2775,6 +2777,7 @@ static int coroutine_fn preallocate_co(BlockDriverSta= te *bs, uint64_t offset, ret =3D bdrv_pwrite(s->data_file, (host_offset + cur_bytes) - 1, &data, 1); if (ret < 0) { + error_setg_errno(errp, -ret, "Writing to EOF failed"); return ret; } } @@ -3748,9 +3751,8 @@ static int coroutine_fn qcow2_co_truncate(BlockDriver= State *bs, int64_t offset, break; =20 case PREALLOC_MODE_METADATA: - ret =3D preallocate_co(bs, old_length, offset); + ret =3D preallocate_co(bs, old_length, offset, errp); if (ret < 0) { - error_setg_errno(errp, -ret, "Preallocation failed"); goto fail; } break; @@ -3766,9 +3768,8 @@ static int coroutine_fn qcow2_co_truncate(BlockDriver= State *bs, int64_t offset, /* With a data file, preallocation means just allocating the metad= ata * and forwarding the truncate request to the data file */ if (has_data_file(bs)) { - ret =3D preallocate_co(bs, old_length, offset); + ret =3D preallocate_co(bs, old_length, offset, errp); if (ret < 0) { - error_setg_errno(errp, -ret, "Preallocation failed"); goto fail; } break; --=20 2.20.1 From nobody Fri Apr 19 19:17:42 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1555343937; cv=none; d=zoho.com; s=zohoarc; b=Zz5T7WhNBilBqMf/K5ElSOSqdcIv1ITrC7negsT1WlCGdfyCtChJ99Hsy+Lym3u1MkEty8MXKGBj+mY09r+eeUC167wc8x4d63/03njERko4FZw3nzF70D8kmjogblsiKJm/fsz1UVspH+PIOz6yjXFmOYMqCCxNkJ2JjaNcx4Q= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1555343937; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=d4KVP6YpyqNSg7wLo8HIDY4uMt95DS0oJlMXkCAPd3E=; b=QDIDd1QxzNKdYxwsZPUgQwBdpXAcF56DXTTCF/cdcz1l5de4pK1bDUIX2uEiHDkZWbn7XugZxFPTLaxVZEj7schOVPhsdwwJVcn6Fg5tGyAgS7Qp0oYvcWuRPTJvvPCRPz0UFPPAdRmo5SOpLXT15Ah25k8HcGklvk3/jBxRUZw= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 15553439377441015.3622583476283; Mon, 15 Apr 2019 08:58:57 -0700 (PDT) Received: from localhost ([127.0.0.1]:52207 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hG40T-0001sg-Bm for importer@patchew.org; Mon, 15 Apr 2019 11:58:53 -0400 Received: from eggs.gnu.org ([209.51.188.92]:47767) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hG3x7-0007if-Nb for qemu-devel@nongnu.org; Mon, 15 Apr 2019 11:55:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hG3x6-0003ZU-Gg for qemu-devel@nongnu.org; Mon, 15 Apr 2019 11:55:25 -0400 Received: from mx1.redhat.com ([209.132.183.28]:55840) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hG3x3-0003T7-6Y; Mon, 15 Apr 2019 11:55:21 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 26A5988AA3; Mon, 15 Apr 2019 15:55:19 +0000 (UTC) Received: from localhost.localdomain.com (ovpn-117-113.ams2.redhat.com [10.36.117.113]) by smtp.corp.redhat.com (Postfix) with ESMTP id A2AC260123; Mon, 15 Apr 2019 15:55:17 +0000 (UTC) From: Kevin Wolf To: qemu-block@nongnu.org Date: Mon, 15 Apr 2019 17:54:52 +0200 Message-Id: <20190415155452.5115-5-kwolf@redhat.com> In-Reply-To: <20190415155452.5115-1-kwolf@redhat.com> References: <20190415155452.5115-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Mon, 15 Apr 2019 15:55:19 +0000 (UTC) Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 4/4] qcow2: Fix full preallocation with external data file 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-devel@nongnu.org, mreitz@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" preallocate_co() already gave the data file the full size without forwarding the requested preallocation mode to the protocol. When bdrv_co_truncate() was called later with the preallocation mode, the file didn't actually grow any more, so the data file stayed unallocated even if full preallocation was requested. Pass the right preallocation mode to preallocate_co() and remove the second bdrv_co_truncate() to fix this. As a side effect, the ugly one-byte write in preallocate_co() is replaced with a truncate call, now leaving the last block unallocated on the protocol level as it should be. Cc: qemu-stable@nongnu.org Signed-off-by: Kevin Wolf Reviewed-by: Eric Blake --- block/qcow2.c | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/block/qcow2.c b/block/qcow2.c index b4f9f5a240..7fbef97aab 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -2721,11 +2721,13 @@ static int qcow2_set_up_encryption(BlockDriverState= *bs, * Returns: 0 on success, -errno on failure. */ static int coroutine_fn preallocate_co(BlockDriverState *bs, uint64_t offs= et, - uint64_t new_length, Error **errp) + uint64_t new_length, PreallocMode m= ode, + Error **errp) { BDRVQcow2State *s =3D bs->opaque; uint64_t bytes; uint64_t host_offset =3D 0; + int64_t file_length; unsigned int cur_bytes; int ret; QCowL2Meta *meta; @@ -2772,12 +2774,19 @@ static int coroutine_fn preallocate_co(BlockDriverS= tate *bs, uint64_t offset, * all of the allocated clusters (otherwise we get failing reads after * EOF). Extend the image to the last allocated sector. */ - if (host_offset !=3D 0) { - uint8_t data =3D 0; - ret =3D bdrv_pwrite(s->data_file, (host_offset + cur_bytes) - 1, - &data, 1); + file_length =3D bdrv_getlength(s->data_file->bs); + if (file_length < 0) { + error_setg_errno(errp, -file_length, "Could not get file size"); + return file_length; + } + + if (host_offset + cur_bytes > file_length) { + if (mode =3D=3D PREALLOC_MODE_METADATA) { + mode =3D PREALLOC_MODE_OFF; + } + ret =3D bdrv_co_truncate(s->data_file, host_offset + cur_bytes, mo= de, + errp); if (ret < 0) { - error_setg_errno(errp, -ret, "Writing to EOF failed"); return ret; } } @@ -3748,10 +3757,16 @@ static int coroutine_fn qcow2_co_truncate(BlockDriv= erState *bs, int64_t offset, =20 switch (prealloc) { case PREALLOC_MODE_OFF: + if (has_data_file(bs)) { + ret =3D bdrv_co_truncate(s->data_file, offset, prealloc, errp); + if (ret < 0) { + goto fail; + } + } break; =20 case PREALLOC_MODE_METADATA: - ret =3D preallocate_co(bs, old_length, offset, errp); + ret =3D preallocate_co(bs, old_length, offset, prealloc, errp); if (ret < 0) { goto fail; } @@ -3768,7 +3783,7 @@ static int coroutine_fn qcow2_co_truncate(BlockDriver= State *bs, int64_t offset, /* With a data file, preallocation means just allocating the metad= ata * and forwarding the truncate request to the data file */ if (has_data_file(bs)) { - ret =3D preallocate_co(bs, old_length, offset, errp); + ret =3D preallocate_co(bs, old_length, offset, prealloc, errp); if (ret < 0) { goto fail; } @@ -3883,16 +3898,6 @@ static int coroutine_fn qcow2_co_truncate(BlockDrive= rState *bs, int64_t offset, =20 bs->total_sectors =3D offset / BDRV_SECTOR_SIZE; =20 - if (has_data_file(bs)) { - if (prealloc =3D=3D PREALLOC_MODE_METADATA) { - prealloc =3D PREALLOC_MODE_OFF; - } - ret =3D bdrv_co_truncate(s->data_file, offset, prealloc, errp); - if (ret < 0) { - goto fail; - } - } - /* write updated header.size */ offset =3D cpu_to_be64(offset); ret =3D bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, size), --=20 2.20.1