From nobody Mon Apr 29 14:34:16 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.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 (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 15101433493531021.1387290224886; Wed, 8 Nov 2017 04:15:49 -0800 (PST) Received: from localhost ([::1]:59174 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eCPGm-0005OT-G2 for importer@patchew.org; Wed, 08 Nov 2017 07:15:48 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43258) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eCPEc-0004Kf-6e for qemu-devel@nongnu.org; Wed, 08 Nov 2017 07:13:38 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eCPEY-0007F2-Td for qemu-devel@nongnu.org; Wed, 08 Nov 2017 07:13:34 -0500 Received: from fanzine.igalia.com ([91.117.99.155]:44052) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eCPEY-0007E0-HZ; Wed, 08 Nov 2017 07:13:30 -0500 Received: from [194.100.51.2] (helo=perseus.local) by fanzine.igalia.com with esmtpsa (Cipher TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim) id 1eCPEV-0007Kr-4H; Wed, 08 Nov 2017 13:13:27 +0100 Received: from berto by perseus.local with local (Exim 4.89) (envelope-from ) id 1eCPED-0001xy-0D; Wed, 08 Nov 2017 14:13:09 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=References:In-Reply-To:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=VueMlRo4qLujimntC5/J4PvqzAC5OLrgRCwJKRPvi+o=; b=HzwQdTdbqOphUjHCCdT0EHPOX9YTYNnvIe7qHtK4HB6BT8sbQ7Cos8arUMOzVfOfifzllroBKK/MBz5QUZBHx8CLg39vzeqC6gqh0NXWFfDXqCTBA/19omWMmWGvhGhHLNXbtiVncggr9WMCBYdgxI7EEsAejL1jItgwAW8kGfiKg1HeE1o12UXzfe2o84gk7Fzz9C2hZHrTaVPAZ3y/0K2HBfnDUCbry0uhuS1RhIhoGDVhtaVddAcq/uRvwN7V3bL28+IzPt84eNGVrO8QWZa4VZyN3RYlNbtgG8QjSIKNTOjuBQczrtFgsjiC67MintO028j/ZEpkuq7kiQfo4g==; From: Alberto Garcia To: qemu-devel@nongnu.org Date: Wed, 8 Nov 2017 14:13:06 +0200 Message-Id: <0b1b95340ecdfbc6927e36adf2fd42ae6198747a.1510143008.git.berto@igalia.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: References: In-Reply-To: References: X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x (no timestamps) [generic] [fuzzy] X-Received-From: 91.117.99.155 Subject: [Qemu-devel] [PATCH 1/1] qcow2: Check that corrupted images can be repaired in iotest 060 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: Kevin Wolf , Alberto Garcia , qemu-block@nongnu.org, Max Reitz 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 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" We just fixed a few bugs that caused QEMU to crash when trying to write to corrupted qcow2 images, and iotest 060 was expanded to test all those scenarios. In almost all cases the corrupted images can be repaired using qemu-img, so this patch verifies that. Signed-off-by: Alberto Garcia Reviewed-by: Eric Blake --- tests/qemu-iotests/060 | 10 ++++++++ tests/qemu-iotests/060.out | 64 ++++++++++++++++++++++++++++++++++++++++++= ++++ 2 files changed, 74 insertions(+) diff --git a/tests/qemu-iotests/060 b/tests/qemu-iotests/060 index 66a8fa4aea..fae08b03bf 100755 --- a/tests/qemu-iotests/060 +++ b/tests/qemu-iotests/060 @@ -248,6 +248,8 @@ echo _make_test_img 64M poke_file "$TEST_IMG" "$rt_offset" "\x00\x00\x00\x00\x00\x00\x00\x0= 0" $QEMU_IO -c "write 0 64k" "$TEST_IMG" | _filter_qemu_io +# Repair the image +_check_test_img -r all =20 echo echo "=3D=3D=3D Testing empty refcount table with valid L1 and L2 tables = =3D=3D=3D" @@ -259,6 +261,8 @@ poke_file "$TEST_IMG" "$rt_offset" "\x00\x00\x00= \x00\x00\x00\x00\x00" # allocation with an explicit offset (using qcow2_alloc_clusters_at()) # causing a refcount block to be allocated at offset 0 $QEMU_IO -c "write 0 128k" "$TEST_IMG" | _filter_qemu_io +# Repair the image +_check_test_img -r all =20 echo echo "=3D=3D=3D Testing empty refcount block =3D=3D=3D" @@ -266,6 +270,8 @@ echo _make_test_img 64M poke_file "$TEST_IMG" "$rb_offset" "\x00\x00\x00\x00\x00\x00\x00\x0= 0" $QEMU_IO -c "write 0 64k" "$TEST_IMG" | _filter_qemu_io +# Repair the image +_check_test_img -r all =20 echo echo "=3D=3D=3D Testing empty refcount block with compressed write =3D=3D= =3D" @@ -276,6 +282,8 @@ poke_file "$TEST_IMG" "$rb_offset" "\x00\x00\x00= \x00\x00\x00\x00\x00" # The previous write already allocated an L2 table, so now this new # write will try to allocate a compressed data cluster at offset 0. $QEMU_IO -c "write -c 0k 64k" "$TEST_IMG" | _filter_qemu_io +# Repair the image +_check_test_img -r all =20 echo echo "=3D=3D=3D Testing zero refcount table size =3D=3D=3D" @@ -283,6 +291,8 @@ echo _make_test_img 64M poke_file "$TEST_IMG" "56" "\x00\x00\x00\x00" $QEMU_IO -c "write 0 64k" "$TEST_IMG" 2>&1 | _filter_testdir | _filter_img= fmt +# Repair the image +_check_test_img -r all =20 echo echo "=3D=3D=3D Testing incorrect refcount table offset =3D=3D=3D" diff --git a/tests/qemu-iotests/060.out b/tests/qemu-iotests/060.out index cfd78f87a9..62c22701b8 100644 --- a/tests/qemu-iotests/060.out +++ b/tests/qemu-iotests/060.out @@ -187,6 +187,18 @@ read failed: Input/output error Formatting 'TEST_DIR/t.IMGFMT', fmt=3DIMGFMT size=3D67108864 qcow2: Marking image as corrupt: Preventing invalid write on metadata (ove= rlaps with refcount table); further corruption events will be suppressed write failed: Input/output error +ERROR cluster 0 refcount=3D0 reference=3D1 +ERROR cluster 1 refcount=3D0 reference=3D1 +ERROR cluster 3 refcount=3D0 reference=3D1 +Rebuilding refcount structure +Repairing cluster 1 refcount=3D1 reference=3D0 +The following inconsistencies were found and repaired: + + 0 leaked clusters + 3 corruptions + +Double checking the fixed image now... +No errors were found on the image. =20 =3D=3D=3D Testing empty refcount table with valid L1 and L2 tables =3D=3D= =3D =20 @@ -195,12 +207,40 @@ wrote 65536/65536 bytes at offset 0 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) qcow2: Marking image as corrupt: Preventing invalid allocation of refcount= block at offset 0; further corruption events will be suppressed write failed: Input/output error +ERROR cluster 0 refcount=3D0 reference=3D1 +ERROR cluster 1 refcount=3D0 reference=3D1 +ERROR cluster 3 refcount=3D0 reference=3D1 +ERROR cluster 4 refcount=3D0 reference=3D1 +ERROR cluster 5 refcount=3D0 reference=3D1 +Rebuilding refcount structure +Repairing cluster 1 refcount=3D1 reference=3D0 +The following inconsistencies were found and repaired: + + 0 leaked clusters + 5 corruptions + +Double checking the fixed image now... +No errors were found on the image. =20 =3D=3D=3D Testing empty refcount block =3D=3D=3D =20 Formatting 'TEST_DIR/t.IMGFMT', fmt=3DIMGFMT size=3D67108864 qcow2: Marking image as corrupt: Preventing invalid allocation of L2 table= at offset 0; further corruption events will be suppressed write failed: Input/output error +ERROR cluster 0 refcount=3D0 reference=3D1 +ERROR cluster 1 refcount=3D0 reference=3D1 +ERROR cluster 2 refcount=3D0 reference=3D1 +ERROR cluster 3 refcount=3D0 reference=3D1 +Rebuilding refcount structure +Repairing cluster 1 refcount=3D1 reference=3D0 +Repairing cluster 2 refcount=3D1 reference=3D0 +The following inconsistencies were found and repaired: + + 0 leaked clusters + 4 corruptions + +Double checking the fixed image now... +No errors were found on the image. =20 =3D=3D=3D Testing empty refcount block with compressed write =3D=3D=3D =20 @@ -209,11 +249,35 @@ wrote 65536/65536 bytes at offset 65536 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) qcow2: Marking image as corrupt: Preventing invalid allocation of compress= ed cluster at offset 0; further corruption events will be suppressed write failed: Input/output error +ERROR cluster 0 refcount=3D0 reference=3D1 +ERROR cluster 1 refcount=3D0 reference=3D1 +ERROR cluster 2 refcount=3D0 reference=3D1 +ERROR cluster 3 refcount=3D0 reference=3D1 +Rebuilding refcount structure +Repairing cluster 1 refcount=3D1 reference=3D0 +Repairing cluster 2 refcount=3D1 reference=3D0 +The following inconsistencies were found and repaired: + + 0 leaked clusters + 4 corruptions + +Double checking the fixed image now... +No errors were found on the image. =20 =3D=3D=3D Testing zero refcount table size =3D=3D=3D =20 Formatting 'TEST_DIR/t.IMGFMT', fmt=3DIMGFMT size=3D67108864 can't open device TEST_DIR/t.IMGFMT: Image does not contain a reference co= unt table +ERROR cluster 0 refcount=3D0 reference=3D1 +ERROR cluster 3 refcount=3D0 reference=3D1 +Rebuilding refcount structure +The following inconsistencies were found and repaired: + + 0 leaked clusters + 2 corruptions + +Double checking the fixed image now... +No errors were found on the image. =20 =3D=3D=3D Testing incorrect refcount table offset =3D=3D=3D =20 --=20 2.11.0