From nobody Wed Feb 11 02:07:30 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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 1506073392885791.5799048496916; Fri, 22 Sep 2017 02:43:12 -0700 (PDT) Received: from localhost ([::1]:57579 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dvKUC-0002Ds-TU for importer@patchew.org; Fri, 22 Sep 2017 05:43:04 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39562) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dvKRL-00007A-52 for qemu-devel@nongnu.org; Fri, 22 Sep 2017 05:40:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dvKRG-0004O4-LS for qemu-devel@nongnu.org; Fri, 22 Sep 2017 05:40:07 -0400 Received: from mail-eopbgr00133.outbound.protection.outlook.com ([40.107.0.133]:5029 helo=EUR02-AM5-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dvKRA-00047J-UV; Fri, 22 Sep 2017 05:39:57 -0400 Received: from pavelb-Z68P-DS3.sw.ru (195.214.232.6) by VI1PR0802MB2559.eurprd08.prod.outlook.com (2603:10a6:800:ae::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.77.7; Fri, 22 Sep 2017 09:39:54 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=tidYJhJqqygs/9klXkhL+skaWuC7BEGhY0DjOlCTUi8=; b=Lwh4f70OrfujhG5xPosX8zT3AVicl+JsUvpjkWHtVNoyazj4mBaqa8aRVXw+q8e1IWwQRY5glDkin9PD+iILLvoqMlgd/4u3WVODjq5EjuQ25neR3erJn0sQuSBKdorC3evrnS5Xa+1axW5q3NIihVAGP+RKiRluM16GLIHsLSI= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=pbutsykin@virtuozzo.com; From: Pavel Butsykin To: qemu-block@nongnu.org, qemu-devel@nongnu.org Date: Fri, 22 Sep 2017 12:39:26 +0300 Message-Id: <20170922093926.9723-3-pbutsykin@virtuozzo.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20170922093926.9723-1-pbutsykin@virtuozzo.com> References: <20170922093926.9723-1-pbutsykin@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0401CA0046.eurprd04.prod.outlook.com (2603:10a6:3:19::14) To VI1PR0802MB2559.eurprd08.prod.outlook.com (2603:10a6:800:ae::9) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 5fb245d4-d1c9-44fa-a5d0-08d5019de21f X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(2017030254152)(300000503095)(300135400095)(2017052603199)(201703131423075)(201703031133081)(201702281549075)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095); SRVR:VI1PR0802MB2559; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0802MB2559; 3:xn7hJyvSpTEuh8X4gBSRkZvNx3TFtqHUKmH+EZTthxHmzXr3Npfl/dynqOax8KWWhJA1UU0wqoZzfiDB0M14oXf8Tb7aJEr6zCvauySaTIfoKbDV68J/6gsIKDXCFHFgqLdf6sgHnZNHQrNZlW1Ttj8lTqY9yjIaF+aqbi1XJfb18NrcRGl0HfM8cDGRHs6avNRg+WmJwK7fHUfF6qr3m5lo8WnN+SVX9LUmy8rRt5QfTzWCjAdB/8ot/icBUk3v; 25:6ZEAC8Pu5yZHEi4EexwTh/+079NGfQzTyCRgrJ1+Uc+WnTQUwa7uyRwf/SgRXnBkSUHgZfBLV72lsScAxESfyHhHdold6FoMpXLPQZXoJKX6ulasQnaZzinTNqmu5wXZL3xwg2w48oPT+e4JctgrfNyurtyK3r+moat5XwjGycEH/SBmlEALvuCojFMBxhrqqwSf/X5JH2twe1QWmzNWDzhHXLUjvUSmXJlyHLuv4FsCjsVVIiVICZ2VO1yxY5TKiJYA942Svo7ywoMiIYhUYFFDNQ5ScCojegZtssMfn8WK1sN6Hq3vMB6eUCzGB52PX3ju0QBQOvgSFmBIT/aCZw==; 31:Ho3YzhHVwoXBbAJPKwGf9xdbg9ChN+bTpLZAziDclCMIWZGxGqXIxQou7CQM+nWCqGfH/ZvUAkU7zVdjbJy1s0IFSzm/IOpDz6TdiMREr6E0i7drfdy0SlAUD+htanRD9hP+l/Wnrh+ildhq19jTgYW34cJFrmqEJ2WtYEgcPeL5m4hwjr1Z1L5Alqm+vtpB/7rwS24/dCZ76KGkH6DKKVcn+6bwCAryE0b95ZtGeb8= X-MS-TrafficTypeDiagnostic: VI1PR0802MB2559: X-Microsoft-Exchange-Diagnostics: 1; VI1PR0802MB2559; 20:JRUi9g9kjNhxnCHiq0AEMPeMT/ADGWp2KBYZQCDE9zax8g2t0MpUjNqKUzOsEobhEzSKjZgbXd8DidPuoCzTl43ehhLJOTRcs0A4FeXu6nz+Ro3Awe3ov4ohDM+lzyd02aYYfzKFpASTWkKxknkjT9N8Cp6wAdgD6OqfnQLeQBHF/Al5uT5I2sQebSRPHAuCHaLh4dowa//foUmoEEdJCZYSN5lFpCqXXPBw9+MoirkT9LIDB5yi/j5/UcZEMHrrnT4GzmbmJ2HVoAcM6pQPyc/vmYoQW6ULNhVW+QvOpMkNlF1IwC36CAtVPJU/EdOpbW0Y5yNoyK/6Z7Xrg4YN5m7fjkLmYwGgk9LCJvENFSJpztHU/RPAtVqgQAx2KgsqlvW2scD22xE91gh33MfeH0YVgMspu41RU2TRMpx6VUc=; 4:7akGjc7O7GLyFcIAYg7JjtGbanl1SIlbiZH8loeefqp037sg2VnECVegu/py8bncDNaKT/eQlB8S6sq5f+wuYMuNeRhRNGoPsC3jxXzDqEQzeffdchhJyCKk6Hic4ETy/RcNpIZPCLUEgXVMjxN240j+BiGqgUtJJX7gnN+K3I8OTG4qWUIZDFzP7boC19ORhNyKpDWyH/EVLhHjb+hO1ea1R9S2n4qEe6kBamtuM4zfeg4eBbbWujujn+OkqtUZ X-Exchange-Antispam-Report-Test: UriScan:; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(5005006)(8121501046)(93006095)(93001095)(100000703101)(100105400095)(3002001)(10201501046)(6041248)(20161123562025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123555025)(20161123564025)(20161123558100)(20161123560025)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:VI1PR0802MB2559; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:VI1PR0802MB2559; X-Forefront-PRVS: 0438F90F17 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(6009001)(346002)(376002)(199003)(189002)(25786009)(106356001)(81156014)(3846002)(81166006)(66066001)(86362001)(8936002)(6116002)(105586002)(7736002)(2950100002)(5660300001)(8676002)(48376002)(69596002)(50466002)(107886003)(189998001)(4326008)(50986999)(76176999)(6512007)(36756003)(2906002)(47776003)(5003940100001)(97736004)(305945005)(50226002)(16586007)(53416004)(16526017)(6506006)(101416001)(478600001)(53936002)(6666003)(1076002)(6486002)(33646002)(68736007)(316002); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR0802MB2559; H:pavelb-Z68P-DS3.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; 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; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0802MB2559; 23:CZR171aPA9xr4KKZsRO8JVRICObfsSRgrO5K+rq?= =?us-ascii?Q?m8mn6GmqkP/5CcGnuA2k4Af9x7uGPf2FBnJFrBPadQa0PMViKKRnABu33AAr?= =?us-ascii?Q?HjMmGPT8koBk8TDal/wZChB1FQJzHk6bNQA0ylvomQ4V86NNnKLrZ6ujOP5J?= =?us-ascii?Q?kd2CBN3NmH0z0z0uHrNi0V0hsL0mejGtMfktgIdpXroCNTQPK2iqi5HgaVfj?= =?us-ascii?Q?+RNZJzMUVQG96+f9Dgd4e5Y6Y0I3xRX/ZIKjOXI7Mv7iCz+hTApDLTl2Yyv+?= =?us-ascii?Q?HsfbTlgTfcOMYtPr5/aedxaKboWxrgsizxMNdxXrZWNflGksqgZT7Er79C6/?= =?us-ascii?Q?5sj7xYQaYqHoarKlxr9akgjRe91vz8eIHPbVNWlkLs4qCzVvuOkz73NQQ2uy?= =?us-ascii?Q?RgNiP3h/xR7kFobYxU0pLUnHDUQBKdm1dzHKXk2SJZJ+dXHVfkoMBKMeGmQX?= =?us-ascii?Q?lQjSJCnSlJRDQR5B9nyR0bhtEGSC5hK29iR1rCIzvLtW4nbkPgxcpEK34354?= =?us-ascii?Q?dWZRf5TizgFVPzEKQ6VsO7NT0/1Wsd7xlS9uY092n7o+7dLLMluBuAawu+6f?= =?us-ascii?Q?6yTihlR4J3jrGDhDVSKCNFIIuHodlb8zESpjOTL7cWEDexIO6mAUHqAyYZgL?= =?us-ascii?Q?+TnufOQERWpPkTrLpPrxjHNhhHWHbuqLTrUApHCyS4PCD1Md/11y6qSpUbQX?= =?us-ascii?Q?WWEGmMDS7XfMHCROVlmwrLD9hDxd6/lubZw7DP+SGCHdPIdasxSxajawL1d2?= =?us-ascii?Q?F4os3rAFKbPQG+06w/FH641TnCyZ78bh+q7i4kTCnFZW7eyby1lNlSe0S3ir?= =?us-ascii?Q?5o8cQFWgnaWt7izHCUshwhbUizx+NktV2eNAMGUyHPcT9+F7EHnb93PF8H1x?= =?us-ascii?Q?drOXl6KAnyu+LPuZQDltJZuFZV7gFdnTHsz36EJRVHxRvtZFyZ3ENGhazRbh?= =?us-ascii?Q?b37czmQfrRgW+J6TLJB671ImtRdpRpCIFEOUb8EEqGiwtjttYw4bJuRfyZ+I?= =?us-ascii?Q?tLjuTdhAWa2UKE9ZveQXAMYCxzuC9ffdIeLHyD64oNZzAO1dB08Y3GSxV/EL?= =?us-ascii?Q?O+GqsAZLf6hYry+5rQoIypNtj54bqx4gMKzY+LrVx42cSyoBJxus7+ojkL5y?= =?us-ascii?Q?f3xXnU5G8Hmo=3D?= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0802MB2559; 6:DN/y3Y5bCsfgj73BNouQ1CqzkNzB79KE+tQ0qpAfXdVBlCPrExop1+NIoC503CVGfvZ5AYj01J/2eWnnuMr7HXvQkWbVdCfRn6lLwF/ckenokMidOG3IIC85cisMPNgg1Cd6XEdnsM+vZUZLOj7fankSfS9exhbdoe5fiSQxlJ6sDqsxUymFFxnAWwuobWISL2JGP+H1FZcm/5w6+f008XRQggGkS4PVukwiJ/Z0CHq83wFdCtVf88iI1ENmMnJwGg2wTmAyqXTDBgChfNl9vFzroWZ0AcEAMjdvIWhWEGb/JfLyNeuPO7xVjt9nQxnOSmm1CqVP3rceUjwJirXphg==; 5:Mc+6sgJa2zOsOlwb0YV+x9dlbndDFOtkDpzhEGy6CtIePla5LsnXWAi/y9oRDm0IXAAo4YpYJNDORCR8mtbe5N7pgVCxuqsLIQkHWGGvSe3Zyuo25ZfbO5116Y4sWUstIgEHYXc+sZElQeLLmXt+4Q==; 24:91kTQsttp11cI8aDrFf0OCU510XhTEiPQUNuQ7pYGfWTJcPKTt/hpqn2bI8G16skc/cRqCMvzgkER8Qmr7vyskaIKiloO3tFyWDOWWhBtyU=; 7:pHLrCJ82TRCYpvtpDoIWf2Fwve0gYGu5At47hZNmbr8X6aLk4KhGoawYEJ4zXwqlJ2zFXxi4qbfnXOQs9ox+XvFFMfLp2BWqTLKOUzriEDWu19zjje/RAq4xYtiLpL8RL8WF+QGLDaQMZbpQEmmwbG2jQ91P9cEtv5DVPwazgdR9khADsEhApiv98cBxdDNhAmXPpefXNUyoX6xdNzNX6/03oqbkrdtF2R+N+yJm9Ik= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR0802MB2559; 20:E/ow1jWLmZqnvcz9VtNvSVqAMlwMVtYwxdq7D28eaDLQFoLOkprsudPK5xQ4HlpfWRY1JZjb/PKnCPq/XVzNUUM0Ky1NEh3qbyd3ptC6d3CW7jbLJJaMdxgTbKIlhr4w+bj8E3VFiwDKyjdov09z8fdB8D6Du76HzAslTNs7ocU= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Sep 2017 09:39:54.9261 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0802MB2559 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 40.107.0.133 Subject: [Qemu-devel] [PATCH v2 2/2] qcow2: truncate the tail of the image file after shrinking the image 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, pbutsykin@virtuozzo.com, mreitz@redhat.com, den@openvz.org, jsnow@redhat.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Now after shrinking the image, at the end of the image file, there might be= a tail that probably will never be used. So we can find the last used cluster= and cut the tail. Signed-off-by: Pavel Butsykin Reviewed-by: John Snow Reviewed-by: Max Reitz --- block/qcow2-refcount.c | 22 ++++++++++++++++++++++ block/qcow2.c | 23 +++++++++++++++++++++++ block/qcow2.h | 1 + 3 files changed, 46 insertions(+) diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c index 88d5a3f1ad..aa3fd6cf17 100644 --- a/block/qcow2-refcount.c +++ b/block/qcow2-refcount.c @@ -3181,3 +3181,25 @@ out: g_free(reftable_tmp); return ret; } + +int64_t qcow2_get_last_cluster(BlockDriverState *bs, int64_t size) +{ + BDRVQcow2State *s =3D bs->opaque; + int64_t i; + + for (i =3D size_to_clusters(s, size) - 1; i >=3D 0; i--) { + uint64_t refcount; + int ret =3D qcow2_get_refcount(bs, i, &refcount); + if (ret < 0) { + fprintf(stderr, "Can't get refcount for cluster %" PRId64 ": %= s\n", + i, strerror(-ret)); + return ret; + } + if (refcount > 0) { + return i; + } + } + qcow2_signal_corruption(bs, true, -1, -1, + "There are no references in the refcount table= ."); + return -EIO; +} diff --git a/block/qcow2.c b/block/qcow2.c index 8a4311d338..8dfb5393a7 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -3106,6 +3106,7 @@ static int qcow2_truncate(BlockDriverState *bs, int64= _t offset, new_l1_size =3D size_to_l1(s, offset); =20 if (offset < old_length) { + int64_t last_cluster, old_file_size; if (prealloc !=3D PREALLOC_MODE_OFF) { error_setg(errp, "Preallocation can't be used for shrinking an image= "); @@ -3134,6 +3135,28 @@ static int qcow2_truncate(BlockDriverState *bs, int6= 4_t offset, "Failed to discard unused refblocks"); return ret; } + + old_file_size =3D bdrv_getlength(bs->file->bs); + if (old_file_size < 0) { + error_setg_errno(errp, -old_file_size, + "Failed to inquire current file length"); + return old_file_size; + } + last_cluster =3D qcow2_get_last_cluster(bs, old_file_size); + if (last_cluster < 0) { + error_setg_errno(errp, -last_cluster, + "Failed to find the last cluster"); + return last_cluster; + } + if ((last_cluster + 1) * s->cluster_size < old_file_size) { + ret =3D bdrv_truncate(bs->file, (last_cluster + 1) * s->cluste= r_size, + PREALLOC_MODE_OFF, NULL); + if (ret < 0) { + error_setg_errno(errp, -ret, + "Failed to truncate the tail of the image= "); + return ret; + } + } } else { ret =3D qcow2_grow_l1_table(bs, new_l1_size, true); if (ret < 0) { diff --git a/block/qcow2.h b/block/qcow2.h index 5a289a81e2..782a206ecb 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -597,6 +597,7 @@ int qcow2_change_refcount_order(BlockDriverState *bs, i= nt refcount_order, BlockDriverAmendStatusCB *status_cb, void *cb_opaque, Error **errp); int qcow2_shrink_reftable(BlockDriverState *bs); +int64_t qcow2_get_last_cluster(BlockDriverState *bs, int64_t size); =20 /* qcow2-cluster.c functions */ int qcow2_grow_l1_table(BlockDriverState *bs, uint64_t min_size, --=20 2.14.1