From nobody Sat Apr 12 15:43:33 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1588942716; cv=none; d=zohomail.com; s=zohoarc; b=HdcyZ23ilKoINdpmiuI1Fez6qs0Rh2YY+AxqSmlmIt+EpSsJILQr9Eod7dO/6kOdj8SVVXRKHFXaZecqs0iiRx7L+UA2G6RDg9f0O7nSBb856o4eMdPUktL/x+ZBlEzGGE2Yx9AIQUNN7DInSsZ331IyE4wyyICZTRwwrp3Dgac= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1588942716; h=Content-Type: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; bh=i7RxmXrWkhB3B0hao+JlSmpvKAKAKpecfjVU6sy9RK0=; b=h1WpJ0cOpaQN5NYGalb3gIB+OE7YRDY0k7VZ02YD6TEVQ5BiTwRzU4r5/7S6YbRmQXyVDXunLznzOl9wXxD08BdllKXsKBcG+c4r6tdMZqBJJFXA71TIQyFt25SLLLaXwnJllbaMNteSJCEkkD5Lxcx+EQnoHfyRGPDJMO7754A= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass 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 1588942716568555.2403387274173; Fri, 8 May 2020 05:58:36 -0700 (PDT) Received: from localhost ([::1]:38610 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jX2aJ-0005mQ-8f for importer@patchew.org; Fri, 08 May 2020 08:58:35 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49428) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jX2Kb-0000Gh-Od for qemu-devel@nongnu.org; Fri, 08 May 2020 08:42:22 -0400 Received: from us-smtp-1.mimecast.com ([207.211.31.81]:31409 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1jX2KU-0008IY-8l for qemu-devel@nongnu.org; Fri, 08 May 2020 08:42:20 -0400 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-507-LILeNVcpNH6H-yXH_McEFg-1; Fri, 08 May 2020 08:42: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 mimecast-mx01.redhat.com (Postfix) with ESMTPS id D79C9464; Fri, 8 May 2020 12:42:09 +0000 (UTC) Received: from linux.fritz.box.com (ovpn-113-190.ams2.redhat.com [10.36.113.190]) by smtp.corp.redhat.com (Postfix) with ESMTP id CFD8919167; Fri, 8 May 2020 12:42:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1588941733; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=i7RxmXrWkhB3B0hao+JlSmpvKAKAKpecfjVU6sy9RK0=; b=aSI/PzlfYPXNss96bcZvAuNA/2uDv3z5D5i1ObbSJN7D6rNG/sTNixPPmNgSPG8oyMV4mz 9Ji3YE44yFesszTy7t9i5c5dJtFhWI8ZmYIkBIMW3rqFGfHrKH8yEo5UuFJwoeZ94C7LxV xB3baWWhzAJ4aOm+fKW1w5DFs+sIIhY= X-MC-Unique: LILeNVcpNH6H-yXH_McEFg-1 From: Kevin Wolf To: qemu-block@nongnu.org Subject: [PULL 21/30] qcow2: Fix preallocation on block devices Date: Fri, 8 May 2020 14:41:26 +0200 Message-Id: <20200508124135.252565-22-kwolf@redhat.com> In-Reply-To: <20200508124135.252565-1-kwolf@redhat.com> References: <20200508124135.252565-1-kwolf@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.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; Received-SPF: pass client-ip=207.211.31.81; envelope-from=kwolf@redhat.com; helo=us-smtp-delivery-1.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/05/08 01:34:54 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_PASS=-0.001 autolearn=_AUTOLEARN X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, peter.maydell@linaro.org, qemu-devel@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" From: Max Reitz Calling bdrv_getlength() to get the pre-truncate file size will not really work on block devices, because they have always the same length, and trying to write beyond it will fail with a rather cryptic error message. Instead, we should use qcow2_get_last_cluster() and bdrv_getlength() only as a fallback. Before this patch: $ truncate -s 1G test.img $ sudo losetup -f --show test.img /dev/loop0 $ sudo qemu-img create -f qcow2 -o preallocation=3Dfull /dev/loop0 64M Formatting '/dev/loop0', fmt=3Dqcow2 size=3D67108864 cluster_size=3D65536 preallocation=3Dfull lazy_refcounts=3Doff refcount_bits=3D16 qemu-img: /dev/loop0: Could not resize image: Failed to resize refcount structures: No space left on device With this patch: $ sudo qemu-img create -f qcow2 -o preallocation=3Dfull /dev/loop0 64M Formatting '/dev/loop0', fmt=3Dqcow2 size=3D67108864 cluster_size=3D65536 preallocation=3Dfull lazy_refcounts=3Doff refcount_bits=3D16 qemu-img: /dev/loop0: Could not resize image: Failed to resize underlying file: Preallocation mode 'full' unsupported for this non-regular file So as you can see, it still fails, but now the problem is missing support on the block device level, so we at least get a better error message. Note that we cannot preallocate block devices on truncate by design, because we do not know what area to preallocate. Their length is always the same, the truncate operation does not change it. Signed-off-by: Max Reitz Message-Id: <20200505141801.1096763-1-mreitz@redhat.com> Signed-off-by: Kevin Wolf --- block/qcow2.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/block/qcow2.c b/block/qcow2.c index fc7d4b185e..11903fb547 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -4107,7 +4107,7 @@ static int coroutine_fn qcow2_co_truncate(BlockDriver= State *bs, int64_t offset, { int64_t allocation_start, host_offset, guest_offset; int64_t clusters_allocated; - int64_t old_file_size, new_file_size; + int64_t old_file_size, last_cluster, new_file_size; uint64_t nb_new_data_clusters, nb_new_l2_tables; =20 /* With a data file, preallocation means just allocating the metad= ata @@ -4127,7 +4127,13 @@ static int coroutine_fn qcow2_co_truncate(BlockDrive= rState *bs, int64_t offset, ret =3D old_file_size; goto fail; } - old_file_size =3D ROUND_UP(old_file_size, s->cluster_size); + + last_cluster =3D qcow2_get_last_cluster(bs, old_file_size); + if (last_cluster >=3D 0) { + old_file_size =3D (last_cluster + 1) * s->cluster_size; + } else { + old_file_size =3D ROUND_UP(old_file_size, s->cluster_size); + } =20 nb_new_data_clusters =3D DIV_ROUND_UP(offset - old_length, s->cluster_size); --=20 2.25.3