From nobody Sun May 19 05:51:06 2024 Delivered-To: importer@patchew.org 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; Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1586263156; cv=none; d=zohomail.com; s=zohoarc; b=FKnIku0MHSCvjtNOPAxv644THH2CZ3LBuX6q+ktc5eo3xfPjcJ8ZUBHGdnLy2sonGrJmieb+5DoXXyVnADWRCznZuRu5+5MYr5rw4BGzWybMpIMwWht+78ZVMSdc83NYwhBWSTqx9MhqhRQdqCn3jfSfRhrbaam4QZ6L4LgPfdI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586263156; 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=kPwJwHZ3z+OCT5TCFv67flN31A3zPAPnGveuGE9sJE4=; b=CyhZQftiYfgK562ed6Fl0jcdabECC6WAcxKu6HxVqhcQhd5qqQMR8en1M+JAo22CfHkDQKoU5tWCqx6uJzog1CzJq0vrY2mmbrurR7QaSm3hMPC9VwClJIWhiSTxTVtdhQKe12T3ODQgg9eskdSD2QXkHDRSfua2sFRajUI6rhA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; 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=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 1586263156768719.018300275889; Tue, 7 Apr 2020 05:39:16 -0700 (PDT) Received: from localhost ([::1]:46710 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jLnVb-0000oO-CQ for importer@patchew.org; Tue, 07 Apr 2020 08:39:15 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:34682) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jLnUA-0007We-1u for qemu-devel@nongnu.org; Tue, 07 Apr 2020 08:37:48 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jLnU4-0006gS-8n for qemu-devel@nongnu.org; Tue, 07 Apr 2020 08:37:45 -0400 Received: from us-smtp-2.mimecast.com ([207.211.31.81]:51776 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jLnU4-0006fz-5L for qemu-devel@nongnu.org; Tue, 07 Apr 2020 08:37:40 -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-159-XcERFCZgO0SkKMFjTCHTag-1; Tue, 07 Apr 2020 08:37:34 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 330588017F6; Tue, 7 Apr 2020 12:37:33 +0000 (UTC) Received: from localhost (ovpn-114-84.ams2.redhat.com [10.36.114.84]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 24FB75DA7C; Tue, 7 Apr 2020 12:37:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1586263059; 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=kPwJwHZ3z+OCT5TCFv67flN31A3zPAPnGveuGE9sJE4=; b=cluc/4mCRLulvvC1FfBgH6OteuhdznnEga9NI5da2xvY5q0bfv2aXdROzjdPvrUg7omGQZ IDBNwtoZuslfkjae7Y4e7wuyR+5CzkMR4tBjHLLVcvfn20cTPkVJ8bftapEmCKqIgYjMYV qS1/lmvdnhmtqnsbjCCHQEmT9bgJccE= X-MC-Unique: XcERFCZgO0SkKMFjTCHTag-1 From: Max Reitz To: qemu-block@nongnu.org Subject: [PULL 1/5] qcow2: Forbid discard in qcow2 v2 images with backing files Date: Tue, 7 Apr 2020 14:37:23 +0200 Message-Id: <20200407123727.829933-2-mreitz@redhat.com> In-Reply-To: <20200407123727.829933-1-mreitz@redhat.com> References: <20200407123727.829933-1-mreitz@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com 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: 207.211.31.81 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: Kevin Wolf , Peter Maydell , qemu-devel@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) Content-Type: text/plain; charset="utf-8" From: Alberto Garcia A discard request deallocates the selected clusters so they read back as zeroes. This is done by clearing the cluster offset field and setting QCOW_OFLAG_ZERO in the L2 entry. This flag is however only supported when qcow_version >=3D 3. In older images the cluster is simply deallocated, exposing any possible stale data from the backing file. Since discard is an advisory operation it's safer to simply forbid it in this scenario. Note that we are adding this check to qcow2_co_pdiscard() and not to qcow2_cluster_discard() or discard_in_l2_slice() because the last two are also used by qcow2_snapshot_create() to discard the clusters used by the VM state. In this case there's no risk of exposing stale data to the guest and we really want that the clusters are always discarded. Signed-off-by: Alberto Garcia Message-Id: <20200331114345.29993-1-berto@igalia.com> Reviewed-by: Eric Blake Signed-off-by: Max Reitz --- block/qcow2.c | 6 +++ tests/qemu-iotests/046 | 10 ++-- tests/qemu-iotests/046.out | 12 +++-- tests/qemu-iotests/060 | 12 ++--- tests/qemu-iotests/060.out | 2 - tests/qemu-iotests/177 | 5 +- tests/qemu-iotests/290 | 97 ++++++++++++++++++++++++++++++++++++++ tests/qemu-iotests/290.out | 61 ++++++++++++++++++++++++ tests/qemu-iotests/group | 1 + 9 files changed, 187 insertions(+), 19 deletions(-) create mode 100755 tests/qemu-iotests/290 create mode 100644 tests/qemu-iotests/290.out diff --git a/block/qcow2.c b/block/qcow2.c index 2bb536b014..e8cbcc1ec1 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -3784,6 +3784,12 @@ static coroutine_fn int qcow2_co_pdiscard(BlockDrive= rState *bs, int ret; BDRVQcow2State *s =3D bs->opaque; =20 + /* If the image does not support QCOW_OFLAG_ZERO then discarding + * clusters could expose stale data from the backing file. */ + if (s->qcow_version < 3 && bs->backing) { + return -ENOTSUP; + } + if (!QEMU_IS_ALIGNED(offset | bytes, s->cluster_size)) { assert(bytes < s->cluster_size); /* Ignore partial clusters, except for the special case of the diff --git a/tests/qemu-iotests/046 b/tests/qemu-iotests/046 index a066eec605..ecbe5fc0f4 100755 --- a/tests/qemu-iotests/046 +++ b/tests/qemu-iotests/046 @@ -193,8 +193,8 @@ echo "=3D=3D Verify image content =3D=3D" verify_io() { if ($QEMU_IMG info -U -f "$IMGFMT" "$TEST_IMG" | grep "compat: 0.10" >= /dev/null); then - # For v2 images, discarded clusters are read from the backing file - # Keep the variable empty so that the backing file value can be us= ed as + # In v2 images clusters are not discarded when there is a backing = file. + # Keep the variable empty so that the previous value can be used as # the default below discarded=3D else @@ -230,14 +230,16 @@ verify_io() echo read -P 70 0x78000 0x6000 echo read -P 7 0x7e000 0x2000 =20 - echo read -P ${discarded:-8} 0x80000 0x6000 + echo read -P ${discarded:-89} 0x80000 0x1000 + echo read -P ${discarded:-8} 0x81000 0x5000 echo read -P 80 0x86000 0x2000 echo read -P ${discarded:-8} 0x88000 0x2000 echo read -P 81 0x8a000 0xe000 echo read -P 90 0x98000 0x6000 echo read -P 9 0x9e000 0x2000 =20 - echo read -P ${discarded:-10} 0xa0000 0x6000 + echo read -P ${discarded:-109} 0xa0000 0x1000 + echo read -P ${discarded:-10} 0xa1000 0x5000 echo read -P 100 0xa6000 0x2000 echo read -P ${discarded:-10} 0xa8000 0x2000 echo read -P 101 0xaa000 0xe000 diff --git a/tests/qemu-iotests/046.out b/tests/qemu-iotests/046.out index ca2c7404a9..70783041e2 100644 --- a/tests/qemu-iotests/046.out +++ b/tests/qemu-iotests/046.out @@ -187,8 +187,10 @@ read 24576/24576 bytes at offset 491520 24 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 8192/8192 bytes at offset 516096 8 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -read 24576/24576 bytes at offset 524288 -24 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +read 4096/4096 bytes at offset 524288 +4 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +read 20480/20480 bytes at offset 528384 +20 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 8192/8192 bytes at offset 548864 8 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 8192/8192 bytes at offset 557056 @@ -199,8 +201,10 @@ read 24576/24576 bytes at offset 622592 24 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 8192/8192 bytes at offset 647168 8 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -read 24576/24576 bytes at offset 655360 -24 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +read 4096/4096 bytes at offset 655360 +4 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +read 20480/20480 bytes at offset 659456 +20 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 8192/8192 bytes at offset 679936 8 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 8192/8192 bytes at offset 688128 diff --git a/tests/qemu-iotests/060 b/tests/qemu-iotests/060 index 043f12904a..32c0ecce9e 100755 --- a/tests/qemu-iotests/060 +++ b/tests/qemu-iotests/060 @@ -160,18 +160,16 @@ TEST_IMG=3D$BACKING_IMG _make_test_img 1G =20 $QEMU_IO -c 'write 0k 64k' "$BACKING_IMG" | _filter_qemu_io =20 -# compat=3D0.10 is required in order to make the following discard actually -# unallocate the sector rather than make it a zero sector - we want COW, a= fter -# all. -_make_test_img -o 'compat=3D0.10' -b "$BACKING_IMG" 1G +_make_test_img -b "$BACKING_IMG" 1G # Write two clusters, the second one enforces creation of an L2 table after # the first data cluster. $QEMU_IO -c 'write 0k 64k' -c 'write 512M 64k' "$TEST_IMG" | _filter_qemu_= io -# Discard the first cluster. This cluster will soon enough be reallocated = and +# Free the first cluster. This cluster will soon enough be reallocated and # used for COW. -$QEMU_IO -c 'discard 0k 64k' "$TEST_IMG" | _filter_qemu_io +poke_file "$TEST_IMG" "$l2_offset" "\x00\x00\x00\x00\x00\x00\x00\x00" +poke_file "$TEST_IMG" "$(($rb_offset+10))" "\x00\x00" # Now, corrupt the image by marking the second L2 table cluster as free. -poke_file "$TEST_IMG" '131084' "\x00\x00" # 0x2000c +poke_file "$TEST_IMG" "$(($rb_offset+12))" "\x00\x00" # Start a write operation requiring COW on the image stopping it right bef= ore # doing the read; then, trigger the corruption prevention by writing anyth= ing to # any unallocated cluster, leading to an attempt to overwrite the second L2 diff --git a/tests/qemu-iotests/060.out b/tests/qemu-iotests/060.out index d27692a33c..09caaea865 100644 --- a/tests/qemu-iotests/060.out +++ b/tests/qemu-iotests/060.out @@ -105,8 +105,6 @@ wrote 65536/65536 bytes at offset 0 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) wrote 65536/65536 bytes at offset 536870912 64 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -discard 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 write on metadata (ove= rlaps with active L2 table); further corruption events will be suppressed blkdebug: Suspended request '0' write failed: Input/output error diff --git a/tests/qemu-iotests/177 b/tests/qemu-iotests/177 index 752d29f8ad..eadc2c7ef6 100755 --- a/tests/qemu-iotests/177 +++ b/tests/qemu-iotests/177 @@ -89,8 +89,9 @@ 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 + # In v2 images clusters are not discarded when there is a backing = file + # so the previous value is read + discarded=3D22 else # Discarded clusters are zeroed for v3 or later discarded=3D0 diff --git a/tests/qemu-iotests/290 b/tests/qemu-iotests/290 new file mode 100755 index 0000000000..776b65e915 --- /dev/null +++ b/tests/qemu-iotests/290 @@ -0,0 +1,97 @@ +#!/usr/bin/env bash +# +# Test how 'qemu-io -c discard' behaves on v2 and v3 qcow2 images +# +# Copyright (C) 2020 Igalia, S.L. +# Author: Alberto Garcia +# +# 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=3Dberto@igalia.com + +seq=3D`basename $0` +echo "QA output created by $seq" + +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 +_unsupported_imgopts 'compat=3D0.10' refcount_bits data_file + +echo +echo "### Test 'qemu-io -c discard' on a QCOW2 image without a backing fil= e" +echo +for qcow2_compat in 0.10 1.1; do + echo "# Create an image with compat=3D$qcow2_compat without a backing = file" + _make_test_img -o "compat=3D$qcow2_compat" 128k + + echo "# Fill all clusters with data and then discard them" + $QEMU_IO -c 'write -P 0x01 0 128k' "$TEST_IMG" | _filter_qemu_io + $QEMU_IO -c 'discard 0 128k' "$TEST_IMG" | _filter_qemu_io + + echo "# Read the data from the discarded clusters" + $QEMU_IO -c 'read -P 0x00 0 128k' "$TEST_IMG" | _filter_qemu_io + + echo "# Output of qemu-img map" + $QEMU_IMG map "$TEST_IMG" | _filter_testdir +done + +echo +echo "### Test 'qemu-io -c discard' on a QCOW2 image with a backing file" +echo + +echo "# Create a backing image and fill it with data" +BACKING_IMG=3D"$TEST_IMG.base" +TEST_IMG=3D"$BACKING_IMG" _make_test_img 128k +$QEMU_IO -c 'write -P 0xff 0 128k' "$BACKING_IMG" | _filter_qemu_io + +for qcow2_compat in 0.10 1.1; do + echo "# Create an image with compat=3D$qcow2_compat and a backing file" + _make_test_img -o "compat=3D$qcow2_compat" -b "$BACKING_IMG" + + echo "# Fill all clusters with data and then discard them" + $QEMU_IO -c 'write -P 0x01 0 128k' "$TEST_IMG" | _filter_qemu_io + $QEMU_IO -c 'discard 0 128k' "$TEST_IMG" | _filter_qemu_io + + echo "# Read the data from the discarded clusters" + if [ "$qcow2_compat" =3D "1.1" ]; then + # In qcow2 v3 clusters are zeroed (with QCOW_OFLAG_ZERO) + $QEMU_IO -c 'read -P 0x00 0 128k' "$TEST_IMG" | _filter_qemu_io + else + # In qcow2 v2 if there's a backing image we cannot zero the cluste= rs + # without exposing the backing file data so discard does nothing + $QEMU_IO -c 'read -P 0x01 0 128k' "$TEST_IMG" | _filter_qemu_io + fi + + echo "# Output of qemu-img map" + $QEMU_IMG map "$TEST_IMG" | _filter_testdir +done + +# success, all done +echo "*** done" +rm -f $seq.full +status=3D0 diff --git a/tests/qemu-iotests/290.out b/tests/qemu-iotests/290.out new file mode 100644 index 0000000000..d2259c823b --- /dev/null +++ b/tests/qemu-iotests/290.out @@ -0,0 +1,61 @@ +QA output created by 290 + +### Test 'qemu-io -c discard' on a QCOW2 image without a backing file + +# Create an image with compat=3D0.10 without a backing file +Formatting 'TEST_DIR/t.IMGFMT', fmt=3DIMGFMT size=3D131072 +# Fill all clusters with data and then discard them +wrote 131072/131072 bytes at offset 0 +128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +discard 131072/131072 bytes at offset 0 +128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +# Read the data from the discarded clusters +read 131072/131072 bytes at offset 0 +128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +# Output of qemu-img map +Offset Length Mapped to File +# Create an image with compat=3D1.1 without a backing file +Formatting 'TEST_DIR/t.IMGFMT', fmt=3DIMGFMT size=3D131072 +# Fill all clusters with data and then discard them +wrote 131072/131072 bytes at offset 0 +128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +discard 131072/131072 bytes at offset 0 +128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +# Read the data from the discarded clusters +read 131072/131072 bytes at offset 0 +128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +# Output of qemu-img map +Offset Length Mapped to File + +### Test 'qemu-io -c discard' on a QCOW2 image with a backing file + +# Create a backing image and fill it with data +Formatting 'TEST_DIR/t.IMGFMT.base', fmt=3DIMGFMT size=3D131072 +wrote 131072/131072 bytes at offset 0 +128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +# Create an image with compat=3D0.10 and a backing file +Formatting 'TEST_DIR/t.IMGFMT', fmt=3DIMGFMT size=3D131072 backing_file=3D= TEST_DIR/t.IMGFMT.base +# Fill all clusters with data and then discard them +wrote 131072/131072 bytes at offset 0 +128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +discard 131072/131072 bytes at offset 0 +128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +# Read the data from the discarded clusters +read 131072/131072 bytes at offset 0 +128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +# Output of qemu-img map +Offset Length Mapped to File +0 0x20000 0x50000 TEST_DIR/t.qcow2 +# Create an image with compat=3D1.1 and a backing file +Formatting 'TEST_DIR/t.IMGFMT', fmt=3DIMGFMT size=3D131072 backing_file=3D= TEST_DIR/t.IMGFMT.base +# Fill all clusters with data and then discard them +wrote 131072/131072 bytes at offset 0 +128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +discard 131072/131072 bytes at offset 0 +128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +# Read the data from the discarded clusters +read 131072/131072 bytes at offset 0 +128 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +# Output of qemu-img map +Offset Length Mapped to File +*** done diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group index 79c6dfc85d..435dccd5af 100644 --- a/tests/qemu-iotests/group +++ b/tests/qemu-iotests/group @@ -296,3 +296,4 @@ 286 rw quick 288 quick 289 rw quick +290 rw auto quick --=20 2.25.1 From nobody Sun May 19 05:51:06 2024 Delivered-To: importer@patchew.org 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; Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1586263129; cv=none; d=zohomail.com; s=zohoarc; b=ZUPZqCr+39/XkPpRuxCpLAgb0rYqvtmIGaMrKoIoYU0Enth/xutecRvOufTF6UqoecAC/nd5W+zfr8dxd20GsQ0bEd+AIexNOlVFXbnVmGtuFNH9qFV9n5FoLVirrJSBeyFHiZ56wzIGX05cvK0IjW9Cu8ZET+azGkwMdiTAwec= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586263129; 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=lKH+gnzqiUbJPgjeEmnTWF0F/bRzuMD4YCHrY2ck3S4=; b=WhdKHv5+E7lF0faYSkBLzNBlf3+cczYYkaOMUbotMogkJ1gkVIo6qcyZ+ewpnlxZJ9gT3ghfOhyZIzNfFhc6BccHQJt/JGh1ZpulzB9qvXMy4FxgxbRsp7C3B/B6RcWL+ou4GcNkQazNs4lAEQOKqN5uub3cpfBaa7/otX0jCpo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; 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=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 1586263129907652.0531597271851; Tue, 7 Apr 2020 05:38:49 -0700 (PDT) Received: from localhost ([::1]:46706 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jLnVA-0000YT-21 for importer@patchew.org; Tue, 07 Apr 2020 08:38:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:34653) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jLnU5-0007WS-96 for qemu-devel@nongnu.org; Tue, 07 Apr 2020 08:37:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jLnU4-0006gK-5w for qemu-devel@nongnu.org; Tue, 07 Apr 2020 08:37:41 -0400 Received: from us-smtp-delivery-1.mimecast.com ([205.139.110.120]:60249 helo=us-smtp-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jLnU4-0006ft-1p for qemu-devel@nongnu.org; Tue, 07 Apr 2020 08:37:40 -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-338-tvwDbPj3O5KfI0lpfg7u5A-1; Tue, 07 Apr 2020 08:37:37 -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 491561007277; Tue, 7 Apr 2020 12:37:36 +0000 (UTC) Received: from localhost (ovpn-114-84.ams2.redhat.com [10.36.114.84]) by smtp.corp.redhat.com (Postfix) with ESMTPS id B018E9B905; Tue, 7 Apr 2020 12:37:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1586263059; 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=lKH+gnzqiUbJPgjeEmnTWF0F/bRzuMD4YCHrY2ck3S4=; b=DbIzRhVexfoMNpFNqN4+QB3Zu1dMXPgWFMEdCGK40RwCBR076OK5OkUN3Dexq9MzxDG99O 38xIsARXsKzDhVuow8Ohnyd8CLJtmNFXkV8DmyjmiPbCDTyn8tFhFLoLDkr5twCrLadoC3 Kr6ZFgR8XRy5cfr5VUJcGOE0W7wS3Xo= X-MC-Unique: tvwDbPj3O5KfI0lpfg7u5A-1 From: Max Reitz To: qemu-block@nongnu.org Subject: [PULL 2/5] qemu-img: Report convert errors by bytes, not sectors Date: Tue, 7 Apr 2020 14:37:24 +0200 Message-Id: <20200407123727.829933-3-mreitz@redhat.com> In-Reply-To: <20200407123727.829933-1-mreitz@redhat.com> References: <20200407123727.829933-1-mreitz@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 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 205.139.110.120 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: Kevin Wolf , Peter Maydell , qemu-devel@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) Content-Type: text/plain; charset="utf-8" From: Eric Blake Various qemu-img commands are inconsistent on whether they report status/errors in terms of bytes or sector offsets. The latter is confusing (especially as more places move to 4k block sizes), so let's switch everything to just use bytes everywhere. One iotest is impacted. Signed-off-by: Eric Blake Reviewed-by: Vladimir Sementsov-Ogievskiy Message-Id: <20200402135717.476398-1-eblake@redhat.com> Reviewed-by: Philippe Mathieu-Daud=C3=A9 Signed-off-by: Max Reitz --- qemu-img.c | 8 ++++---- tests/qemu-iotests/244.out | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/qemu-img.c b/qemu-img.c index b167376bd7..821cbf610e 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -1924,8 +1924,8 @@ retry: if (status =3D=3D BLK_DATA && !copy_range) { ret =3D convert_co_read(s, sector_num, n, buf); if (ret < 0) { - error_report("error while reading sector %" PRId64 - ": %s", sector_num, strerror(-ret)); + error_report("error while reading at byte %lld: %s", + sector_num * BDRV_SECTOR_SIZE, strerror(-ret)= ); s->ret =3D ret; } } else if (!s->min_sparse && status =3D=3D BLK_ZERO) { @@ -1953,8 +1953,8 @@ retry: ret =3D convert_co_write(s, sector_num, n, buf, status); } if (ret < 0) { - error_report("error while writing sector %" PRId64 - ": %s", sector_num, strerror(-ret)); + error_report("error while writing at byte %lld: %s", + sector_num * BDRV_SECTOR_SIZE, strerror(-ret)= ); s->ret =3D ret; } } diff --git a/tests/qemu-iotests/244.out b/tests/qemu-iotests/244.out index e6f4dc7993..56329deb4b 100644 --- a/tests/qemu-iotests/244.out +++ b/tests/qemu-iotests/244.out @@ -33,7 +33,7 @@ Convert to compressed target with data file: Formatting 'TEST_DIR/t.IMGFMT.src', fmt=3DIMGFMT size=3D67108864 wrote 1048576/1048576 bytes at offset 0 1 MiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -qemu-img: error while writing sector 0: Operation not supported +qemu-img: error while writing at byte 0: Operation not supported =20 Convert uncompressed, then write compressed data manually: Images are identical. --=20 2.25.1 From nobody Sun May 19 05:51:06 2024 Delivered-To: importer@patchew.org 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; Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1586263152; cv=none; d=zohomail.com; s=zohoarc; b=mUFh6KopRBjQlmfaKD/IDTaDSqnuCjFSk9pjG+EHTHYjwEyru+/cWKExpbkv+IKgJvHUa4xhg4e96V81BBt6MpPsNOurbqPFBYDJ1gam1tX6dAuv9laM7Uvs2S0p1+aVV4ROJadhtM3icS+YgOyLX8NXqF1/YWYZ87qmRpXEo4w= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586263152; 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=ese7sDnkOl2TttdL7Z3dDx9mHq1RyE6x+22JvmNhHBg=; b=VdULHNSsJwoirSbkhOxoTXaiGmX+g/xACmYxj0EnwyN+zdFQqRu6Wvy+KFu5hhJbXGE1ATFhG196rzdpLdvMI4c+0cijqtPFpBIWTDm/LfnPa5ylpuyVG1DpdCQqB6zXcghYI4nZMv+2Cq43EZWWEf4igS631lzpPSIAzTANBLg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; 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=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 1586263152704805.227927952357; Tue, 7 Apr 2020 05:39:12 -0700 (PDT) Received: from localhost ([::1]:46708 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jLnVX-0000jF-Ff for importer@patchew.org; Tue, 07 Apr 2020 08:39:11 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:34717) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jLnUB-0007Xd-6C for qemu-devel@nongnu.org; Tue, 07 Apr 2020 08:37:48 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jLnUA-0006mM-1u for qemu-devel@nongnu.org; Tue, 07 Apr 2020 08:37:47 -0400 Received: from us-smtp-delivery-1.mimecast.com ([207.211.31.120]:46483 helo=us-smtp-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jLnU6-0006kO-3x for qemu-devel@nongnu.org; Tue, 07 Apr 2020 08:37:45 -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-171-oBFHmciuO-yU0ksCRPLrIg-1; Tue, 07 Apr 2020 08:37:39 -0400 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 669651B18BC0; Tue, 7 Apr 2020 12:37:38 +0000 (UTC) Received: from localhost (ovpn-114-84.ams2.redhat.com [10.36.114.84]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 05FED5C28E; Tue, 7 Apr 2020 12:37:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1586263061; 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=ese7sDnkOl2TttdL7Z3dDx9mHq1RyE6x+22JvmNhHBg=; b=WBWqSfwsCjXgaZjTw1jSMPxFXqV7XxD49xmz6CcaWePjZ6KYvfR4CaZ0EDWHxGWDxjPtXE jGFy45l/Ab2SKFPdO4HTcEH1YvmuRGVtlAEY9dgy+jJZdof2fDWXAM1qUJc2BEWWXRoYI3 twZTaKnl0r5Zevb8ly/jR2tJ2fihy0Q= X-MC-Unique: oBFHmciuO-yU0ksCRPLrIg-1 From: Max Reitz To: qemu-block@nongnu.org Subject: [PULL 3/5] qcow2: Check request size in qcow2_co_pwritev_compressed_part() Date: Tue, 7 Apr 2020 14:37:25 +0200 Message-Id: <20200407123727.829933-4-mreitz@redhat.com> In-Reply-To: <20200407123727.829933-1-mreitz@redhat.com> References: <20200407123727.829933-1-mreitz@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com 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: 207.211.31.120 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: Kevin Wolf , Peter Maydell , qemu-devel@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) Content-Type: text/plain; charset="utf-8" From: Alberto Garcia When issuing a compressed write request the number of bytes must be a multiple of the cluster size or reach the end of the last cluster. With the current code such requests are allowed and we hit an assertion: $ qemu-img create -f qcow2 img.qcow2 1M $ qemu-io -c 'write -c 0 32k' img.qcow2 qemu-io: block/qcow2.c:4257: qcow2_co_pwritev_compressed_task: Assertion `bytes =3D=3D s->cluster_size || (bytes < s->cluster_size && (offset + bytes =3D=3D bs->total_sectors << BDRV_SECTOR_BITS)= )' failed. Aborted This patch fixes a regression introduced in 0d483dce38 Signed-off-by: Alberto Garcia Message-Id: <20200406143401.26854-1-berto@igalia.com> Reviewed-by: Andrey Shinkevich Reviewed-by: Vladimir Sementsov-Ogievskiy Signed-off-by: Max Reitz --- block/qcow2.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/block/qcow2.c b/block/qcow2.c index e8cbcc1ec1..b524b0c53f 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -4355,6 +4355,11 @@ qcow2_co_pwritev_compressed_part(BlockDriverState *b= s, return -EINVAL; } =20 + if (offset_into_cluster(s, bytes) && + (offset + bytes) !=3D (bs->total_sectors << BDRV_SECTOR_BITS)) { + return -EINVAL; + } + while (bytes && aio_task_pool_status(aio) =3D=3D 0) { uint64_t chunk_size =3D MIN(bytes, s->cluster_size); =20 --=20 2.25.1 From nobody Sun May 19 05:51:06 2024 Delivered-To: importer@patchew.org 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; Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1586263239; cv=none; d=zohomail.com; s=zohoarc; b=MsAtZwc6X9PtQEVydBEr1VIYrTo1bDmxGkGOKaaXjCIgpy7SyxkZeCKRwWsYayXxuWysPlnCduxtgNsAPAuO7Jp8QHo53deh9XPhKkqD+Tqm18rRx8IZTq0TCmRNk6vcph+P6SWYDsuqwczRGhE2swFugIIxOcjrzzm4zJvEGuc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586263239; 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=P9sMMcwTn/qfPhGYjkb+FTpCQd50xWJGCzLtpVpetcw=; b=gV5KaQxtl07yNZeEz/cTEp63xb1SJPiU2KGt0aP4lUDr+SUVq27GsiNlhl8qvt9xk3IJ8BYa8vf7VaxQ1gqagdoMlrcM2oVbaX1m4XeWPVihKOjSiGeRnRIbXhtq97OMWCzOyXeY1j7f+BV41S28tgNy9oTwcRXYWpp4+hRlvJM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; 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=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 1586263239855652.5463050450753; Tue, 7 Apr 2020 05:40:39 -0700 (PDT) Received: from localhost ([::1]:46738 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jLnWw-0003Vl-LR for importer@patchew.org; Tue, 07 Apr 2020 08:40:38 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:34720) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jLnUB-0007Xt-Ai for qemu-devel@nongnu.org; Tue, 07 Apr 2020 08:37:48 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jLnUA-0006nK-7J for qemu-devel@nongnu.org; Tue, 07 Apr 2020 08:37:47 -0400 Received: from us-smtp-1.mimecast.com ([205.139.110.61]:25272 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jLnUA-0006l5-1p for qemu-devel@nongnu.org; Tue, 07 Apr 2020 08:37:46 -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-392-9JvTchx-MiOWMdobkPiW8w-1; Tue, 07 Apr 2020 08:37:41 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id B6FE01B18BC6; Tue, 7 Apr 2020 12:37:40 +0000 (UTC) Received: from localhost (ovpn-114-84.ams2.redhat.com [10.36.114.84]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 340AC5DA7C; Tue, 7 Apr 2020 12:37:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1586263063; 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=P9sMMcwTn/qfPhGYjkb+FTpCQd50xWJGCzLtpVpetcw=; b=jDN9ytwXR6CNEYaKdiT3IuHhdxEaHsxJ3dAypUWOYG/7r/vP76clTgpi33NVRCPbYF4gXO texVjFOKSoymdZEmqZTnKDKN/K/dRG8d8XSPX5yH0Mcd5YxQ/xJYyxGIrJrnsFOdgAdxkw tJUVJmYCbzimTJTWgfXTfRbMyDdWeK0= X-MC-Unique: 9JvTchx-MiOWMdobkPiW8w-1 From: Max Reitz To: qemu-block@nongnu.org Subject: [PULL 4/5] iotests/common.pattern: Quote echos Date: Tue, 7 Apr 2020 14:37:26 +0200 Message-Id: <20200407123727.829933-5-mreitz@redhat.com> In-Reply-To: <20200407123727.829933-1-mreitz@redhat.com> References: <20200407123727.829933-1-mreitz@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 205.139.110.61 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: Kevin Wolf , Peter Maydell , qemu-devel@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) Content-Type: text/plain; charset="utf-8" From time to time, my shell decides to repace the bracketed numbers here by the numbers inside (i.e., "=3D=3D=3D Clusters to be compressed [1]" is printed as "=3D=3D=3D Clusters to be compressed 1"). That makes tests that use common.pattern fail. Prevent that from happening by quoting the arguments to all echos in common.pattern. Signed-off-by: Max Reitz Message-Id: <20200403101134.805871-1-mreitz@redhat.com> Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Eric Blake Signed-off-by: Max Reitz --- tests/qemu-iotests/common.pattern | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/tests/qemu-iotests/common.pattern b/tests/qemu-iotests/common.= pattern index 4f5e5bcea0..4caa5de187 100644 --- a/tests/qemu-iotests/common.pattern +++ b/tests/qemu-iotests/common.pattern @@ -23,7 +23,7 @@ do_is_allocated() { local count=3D$4 =20 for ((i=3D1;i<=3D$count;i++)); do - echo alloc $(( start + (i - 1) * step )) $size + echo "alloc $(( start + (i - 1) * step )) $size" done } =20 @@ -39,9 +39,9 @@ do_io() { local count=3D$5 local pattern=3D$6 =20 - echo =3D=3D=3D IO: pattern $pattern >&2 + echo "=3D=3D=3D IO: pattern $pattern" >&2 for ((i=3D1;i<=3D$count;i++)); do - echo $op -P $pattern $(( start + (i - 1) * step )) $size + echo "$op -P $pattern $(( start + (i - 1) * step )) $size" done } =20 @@ -110,31 +110,31 @@ io_test2() { # free - free - compressed =20 # Write the clusters to be compressed - echo =3D=3D=3D Clusters to be compressed [1] + echo '=3D=3D=3D Clusters to be compressed [1]' io_pattern writev $((offset + 4 * $cluster_size)) $cluster_size $((9 *= $cluster_size)) $num 165 - echo =3D=3D=3D Clusters to be compressed [2] + echo '=3D=3D=3D Clusters to be compressed [2]' io_pattern writev $((offset + 5 * $cluster_size)) $cluster_size $((9 *= $cluster_size)) $num 165 - echo =3D=3D=3D Clusters to be compressed [3] + echo '=3D=3D=3D Clusters to be compressed [3]' io_pattern writev $((offset + 8 * $cluster_size)) $cluster_size $((9 *= $cluster_size)) $num 165 =20 mv "$TEST_IMG" "$TEST_IMG.orig" $QEMU_IMG convert -f $IMGFMT -O $IMGFMT -c "$TEST_IMG.orig" "$TEST_IMG" =20 # Write the used clusters - echo =3D=3D=3D Used clusters [1] + echo '=3D=3D=3D Used clusters [1]' io_pattern writev $((offset + 0 * $cluster_size)) $cluster_size $((9 *= $cluster_size)) $num 165 - echo =3D=3D=3D Used clusters [2] + echo '=3D=3D=3D Used clusters [2]' io_pattern writev $((offset + 1 * $cluster_size)) $cluster_size $((9 *= $cluster_size)) $num 165 - echo =3D=3D=3D Used clusters [3] + echo '=3D=3D=3D Used clusters [3]' io_pattern writev $((offset + 3 * $cluster_size)) $cluster_size $((9 *= $cluster_size)) $num 165 =20 # Read them - echo =3D=3D=3D Read used/compressed clusters + echo '=3D=3D=3D Read used/compressed clusters' io_pattern readv $((offset + 0 * $cluster_size)) $((2 * $cluster_size)= ) $((9 * $cluster_size)) $num 165 io_pattern readv $((offset + 3 * $cluster_size)) $((3 * $cluster_size)= ) $((9 * $cluster_size)) $num 165 io_pattern readv $((offset + 8 * $cluster_size)) $((1 * $cluster_size)= ) $((9 * $cluster_size)) $num 165 =20 - echo =3D=3D=3D Read zeros + echo '=3D=3D=3D Read zeros' io_zero readv $((offset + 2 * $cluster_size)) $((1 * $cluster_size)) $= ((9 * $cluster_size)) $num io_zero readv $((offset + 6 * $cluster_size)) $((2 * $cluster_size)) $= ((9 * $cluster_size)) $num } --=20 2.25.1 From nobody Sun May 19 05:51:06 2024 Delivered-To: importer@patchew.org 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; Authentication-Results: mx.zohomail.com; dkim=fail; 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=fail(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1586263338; cv=none; d=zohomail.com; s=zohoarc; b=ABGW30aetJB6hEnNi85Q6IwnkogkuKIb2ElCdV1AhLXGkryegu6gaFLnkgDanzKSR8XFIZfr2eGk6BDnk5LSC4ulrxNKt179kSNyuo3vtYH/Q+zwnU07ZlUOpvimcdIV3cAJXA9lBX7KnFNvgk20tVbFzK3nDxqw4kDMH2PvgUo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586263338; 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=3MB19gN0vZWLt9OgTn+jP5Qog8pmeTpyEzT/aQfIsMs=; b=oHhcoZ9ukeKiVT71YsAO6ZuZR6eJjoBsgG8O6BbY6vDuVDz0mS5mD9+VpnTQfohx4zc60Vf/k909XTr9h1lgzxtj/nRaxwdAeU00i5aKwIP/a51ph7q4q0GwEdikQsHvSxFbabtzScF28ojn8plNWwvFTjaN09+xghmkkv/nVZE= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; 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=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 1586263338107193.54122819728548; Tue, 7 Apr 2020 05:42:18 -0700 (PDT) Received: from localhost ([::1]:46778 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jLnYW-00061N-Ta for importer@patchew.org; Tue, 07 Apr 2020 08:42:16 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:34802) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jLnUI-0007rR-R6 for qemu-devel@nongnu.org; Tue, 07 Apr 2020 08:37:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jLnUH-0006tV-Ea for qemu-devel@nongnu.org; Tue, 07 Apr 2020 08:37:54 -0400 Received: from us-smtp-1.mimecast.com ([205.139.110.61]:38610 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1jLnUH-0006tI-Bg for qemu-devel@nongnu.org; Tue, 07 Apr 2020 08:37:53 -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-122-CfZRONQOO3K2DARdoabNpw-1; Tue, 07 Apr 2020 08:37:47 -0400 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 245061B18BC2; Tue, 7 Apr 2020 12:37:46 +0000 (UTC) Received: from localhost (ovpn-114-84.ams2.redhat.com [10.36.114.84]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 2A6A3B19A0; Tue, 7 Apr 2020 12:37:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1586263073; 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=3MB19gN0vZWLt9OgTn+jP5Qog8pmeTpyEzT/aQfIsMs=; b=TnYyba9Oz2B63+0EADEhnFUKH1VFmGcDSY8IRC+kM5BNofSEi8aGd9C8HPKiK4rVEsmHHQ DsHQOxn/xid8/V2tq2TWyjb/OUhbampz/AwSrgs5aqlRaHjv5VeThFEbbNpeFYVttvy4ry gjDyhoXKK/qrX+qhybXtlTb83iX3jo8= X-MC-Unique: CfZRONQOO3K2DARdoabNpw-1 From: Max Reitz To: qemu-block@nongnu.org Subject: [PULL 5/5] xen-block: Fix double qlist remove and request leak Date: Tue, 7 Apr 2020 14:37:27 +0200 Message-Id: <20200407123727.829933-6-mreitz@redhat.com> In-Reply-To: <20200407123727.829933-1-mreitz@redhat.com> References: <20200407123727.829933-1-mreitz@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 205.139.110.61 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: Kevin Wolf , Peter Maydell , qemu-devel@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) Content-Type: text/plain; charset="utf-8" From: Anthony PERARD Commit a31ca6801c02 ("qemu/queue.h: clear linked list pointers on remove") revealed that a request was removed twice from a list, once in xen_block_finish_request() and a second time in xen_block_release_request() when both function are called from xen_block_complete_aio(). But also, the `requests_inflight' counter is decreased twice, and thus became negative. This is a bug that was introduced in bfd0d6366043 ("xen-block: improve response latency"), where a `finished' list was removed. That commit also introduced a leak of request in xen_block_do_aio(). That function calls xen_block_finish_request() but the request is never released after that. To fix both issue, we do two changes: - we squash finish_request() and release_request() together as we want to remove a request from 'inflight' list to add it to 'freelist'. - before releasing a request, we need to let the other end know the result, thus we should call xen_block_send_response() before releasing a request. The first change fixes the double QLIST_REMOVE() as we remove the extra call. The second change makes the leak go away because if we want to call finish_request(), we need to call a function that does all of finish, send response, and release. Fixes: bfd0d6366043 ("xen-block: improve response latency") Signed-off-by: Anthony PERARD Message-Id: <20200406140217.1441858-1-anthony.perard@citrix.com> Reviewed-by: Paul Durrant [mreitz: Amended commit message as per Paul's suggestions] Signed-off-by: Max Reitz --- hw/block/dataplane/xen-block.c | 48 ++++++++++++---------------------- 1 file changed, 16 insertions(+), 32 deletions(-) diff --git a/hw/block/dataplane/xen-block.c b/hw/block/dataplane/xen-block.c index 288a87a814..5f8f15778b 100644 --- a/hw/block/dataplane/xen-block.c +++ b/hw/block/dataplane/xen-block.c @@ -64,6 +64,8 @@ struct XenBlockDataPlane { AioContext *ctx; }; =20 +static int xen_block_send_response(XenBlockRequest *request); + static void reset_request(XenBlockRequest *request) { memset(&request->req, 0, sizeof(request->req)); @@ -115,23 +117,26 @@ out: return request; } =20 -static void xen_block_finish_request(XenBlockRequest *request) +static void xen_block_complete_request(XenBlockRequest *request) { XenBlockDataPlane *dataplane =3D request->dataplane; =20 - QLIST_REMOVE(request, list); - dataplane->requests_inflight--; -} + if (xen_block_send_response(request)) { + Error *local_err =3D NULL; =20 -static void xen_block_release_request(XenBlockRequest *request) -{ - XenBlockDataPlane *dataplane =3D request->dataplane; + xen_device_notify_event_channel(dataplane->xendev, + dataplane->event_channel, + &local_err); + if (local_err) { + error_report_err(local_err); + } + } =20 QLIST_REMOVE(request, list); + dataplane->requests_inflight--; reset_request(request); request->dataplane =3D dataplane; QLIST_INSERT_HEAD(&dataplane->freelist, request, list); - dataplane->requests_inflight--; } =20 /* @@ -246,7 +251,6 @@ static int xen_block_copy_request(XenBlockRequest *requ= est) } =20 static int xen_block_do_aio(XenBlockRequest *request); -static int xen_block_send_response(XenBlockRequest *request); =20 static void xen_block_complete_aio(void *opaque, int ret) { @@ -286,7 +290,6 @@ static void xen_block_complete_aio(void *opaque, int re= t) } =20 request->status =3D request->aio_errors ? BLKIF_RSP_ERROR : BLKIF_RSP_= OKAY; - xen_block_finish_request(request); =20 switch (request->req.operation) { case BLKIF_OP_WRITE: @@ -306,17 +309,8 @@ static void xen_block_complete_aio(void *opaque, int r= et) default: break; } - if (xen_block_send_response(request)) { - Error *local_err =3D NULL; =20 - xen_device_notify_event_channel(dataplane->xendev, - dataplane->event_channel, - &local_err); - if (local_err) { - error_report_err(local_err); - } - } - xen_block_release_request(request); + xen_block_complete_request(request); =20 if (dataplane->more_work) { qemu_bh_schedule(dataplane->bh); @@ -420,8 +414,8 @@ static int xen_block_do_aio(XenBlockRequest *request) return 0; =20 err: - xen_block_finish_request(request); request->status =3D BLKIF_RSP_ERROR; + xen_block_complete_request(request); return -1; } =20 @@ -575,17 +569,7 @@ static bool xen_block_handle_requests(XenBlockDataPlan= e *dataplane) break; }; =20 - if (xen_block_send_response(request)) { - Error *local_err =3D NULL; - - xen_device_notify_event_channel(dataplane->xendev, - dataplane->event_channel, - &local_err); - if (local_err) { - error_report_err(local_err); - } - } - xen_block_release_request(request); + xen_block_complete_request(request); continue; } =20 --=20 2.25.1