From nobody Fri May 3 12:44:45 2024 Delivered-To: importer@patchew.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 ARC-Seal: i=1; a=rsa-sha256; t=1599151330; cv=none; d=zohomail.com; s=zohoarc; b=ht+z/q7lE0+d7sdbhqHZdwsc+isOcRfa0hkweZUQAdEVRcC2cxovfm10qli8TVY7uoJIbyPBabk2a409enMvlaTbMqsQokR+waiUaDHi1WomuWT2VMR2lKju1GxPhowft2LVDGLy+ydFyYhvSBvc38cQI7bT2t7vTpFqTckEqUQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1599151330; 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; bh=XozAt5iAiJDu6m4UDYneszmTL3ezoOj/nHGdHJn0fxE=; b=PoEgVD25CDnS6yCa/7L1DmtZwXK5p+FQymPTZdN8e5YeQ2m5PN/L1FXDzwfoVJksd1CRwtyXg4F0b/lgByDn6oCiagsgZbbOtEh9EZ/GPK76gdrdGYGt03VuK2WtCJxkzA11taFVYk603wIIYZ+6k7u+Zych4m/3heSmJr+flTc= 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1599151330786400.35514668587905; Thu, 3 Sep 2020 09:42:10 -0700 (PDT) Received: from localhost ([::1]:35418 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kDsJO-0000cl-2j for importer@patchew.org; Thu, 03 Sep 2020 12:42:10 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:42620) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kDsFZ-0002C1-Jk; Thu, 03 Sep 2020 12:38:13 -0400 Received: from fanzine.igalia.com ([178.60.130.6]:40614) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kDsFX-0003uw-7P; Thu, 03 Sep 2020 12:38:13 -0400 Received: from [81.0.33.67] (helo=perseus.local) by fanzine.igalia.com with esmtpsa (Cipher TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim) id 1kDsFV-0002F7-Ax; Thu, 03 Sep 2020 18:38:09 +0200 Received: from berto by perseus.local with local (Exim 4.92) (envelope-from ) id 1kDsFI-00082h-EG; Thu, 03 Sep 2020 18:37:56 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=XozAt5iAiJDu6m4UDYneszmTL3ezoOj/nHGdHJn0fxE=; b=K4bU6c/1pw+7gq8LqDO2W43NEylFVOPmuEgNZnTydFBUD57R2BD6B1RFo85gUDIz5cJQMR5RvPwCAfoEC2loHVd3UU/yXBmYhiW46pNMy2YufTmRYOjiQAcPZfiVdipL8iJfnxWpHsSDmK9OSSv8vI5tEt0TRLMK/TaKDS6c4/cm5fS9wuDLXunxzC0oprnXzTP4VjS49x9JskrMpPSW1gg+krFWUjKlXGgH1Cte3NXd7aJ1L2BRBe4EkyCKO2f+LzYl9EuwQHuph5vIaFSSq5bjFpPadwgd+HHpiT5wydTITDmJC+eiiRFI4adp/CzsT4Qox52FsDLsVli+sCAo7Q==; From: Alberto Garcia To: qemu-devel@nongnu.org Subject: [PATCH v2 1/3] qcow2: Fix removal of list members from BDRVQcow2State.cluster_allocs Date: Thu, 3 Sep 2020 18:37:47 +0200 Message-Id: <3440a1c4d53c4fe48312b478c96accb338cbef7c.1599150873.git.berto@igalia.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: References: MIME-Version: 1.0 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=178.60.130.6; envelope-from=berto@igalia.com; helo=fanzine.igalia.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/09/03 12:38:03 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x (no timestamps) [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, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no 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: 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) Content-Type: text/plain; charset="utf-8" When a write request needs to allocate new clusters (or change the L2 bitmap of existing ones) a QCowL2Meta structure is created so the L2 metadata can be later updated and any copy-on-write can be performed if necessary. A write request can span a region consisting of an arbitrary combination of previously unallocated and allocated clusters, and if the unallocated ones can be put contiguous to the existing ones then QEMU will do so in order to minimize the number of write operations. In practice this means that a write request has not just one but a number of QCowL2Meta structures. All of them are added to the cluster_allocs list that is stored in BDRVQcow2State and is used to detect overlapping requests. After the write request finishes all its associated QCowL2Meta are removed from that list. calculate_l2_meta() takes care of creating and putting those structures in the list, and qcow2_handle_l2meta() takes care of removing them. The problem is that the error path in handle_alloc() also tries to remove an item in that list, a remnant from the time when this was handled there (that code would not even be correct anymore because it only removes one struct and not all the ones from the same write request). This can trigger a double removal of the same item from the list, causing a crash. This is not easy to reproduce in practice because it requires that do_alloc_cluster_offset() fails after a successful previous allocation during the same write request, but it can be reproduced with the included test case. Signed-off-by: Alberto Garcia --- block/qcow2-cluster.c | 3 -- tests/qemu-iotests/305 | 74 ++++++++++++++++++++++++++++++++++++++ tests/qemu-iotests/305.out | 16 +++++++++ tests/qemu-iotests/group | 1 + 4 files changed, 91 insertions(+), 3 deletions(-) create mode 100755 tests/qemu-iotests/305 create mode 100644 tests/qemu-iotests/305.out diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c index 996b3314f4..25e38daa78 100644 --- a/block/qcow2-cluster.c +++ b/block/qcow2-cluster.c @@ -1709,9 +1709,6 @@ static int handle_alloc(BlockDriverState *bs, uint64_= t guest_offset, =20 out: qcow2_cache_put(s->l2_table_cache, (void **) &l2_slice); - if (ret < 0 && *m && (*m)->nb_clusters > 0) { - QLIST_REMOVE(*m, next_in_flight); - } return ret; } =20 diff --git a/tests/qemu-iotests/305 b/tests/qemu-iotests/305 new file mode 100755 index 0000000000..768818af4a --- /dev/null +++ b/tests/qemu-iotests/305 @@ -0,0 +1,74 @@ +#!/usr/bin/env bash +# +# Test the handling of errors in write requests with multiple allocations +# +# 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 cluster_size refcount_bits extended_l2 compat=3D0.10 = data_file + +echo '### Create the image' +_make_test_img -o refcount_bits=3D64,cluster_size=3D1k 1M + +# The reference counts of the clusters for the first 123k of this +# write request are stored in the first refcount block. The last +# cluster (guest offset 123k) is referenced in the second refcount +# block. +echo '### Fill the first refcount block and one data cluster from the seco= nd' +$QEMU_IO -c 'write 0 124k' "$TEST_IMG" | _filter_qemu_io + +echo '### Discard two of the last data clusters, leave one in the middle' +$QEMU_IO -c 'discard 121k 1k' "$TEST_IMG" | _filter_qemu_io +$QEMU_IO -c 'discard 123k 1k' "$TEST_IMG" | _filter_qemu_io + +echo '### Corrupt the offset of the second refcount block' +refcount_table_offset=3D$(peek_file_be "$TEST_IMG" 48 8) +poke_file "$TEST_IMG" $(($refcount_table_offset+14)) "\x06" + +# This tries to allocate the two clusters discarded earlier (guest +# offsets 121k and 123k). Their reference counts are in the first and +# second refcount blocks respectively, but only the first one can be +# allocated correctly because the second entry of the refcount table +# is corrupted. +echo '### Try to allocate the discarded clusters again' +$QEMU_IO -c 'write 121k 3k' "$TEST_IMG" | _filter_qemu_io + +# success, all done +echo "*** done" +rm -f $seq.full +status=3D0 diff --git a/tests/qemu-iotests/305.out b/tests/qemu-iotests/305.out new file mode 100644 index 0000000000..538019e726 --- /dev/null +++ b/tests/qemu-iotests/305.out @@ -0,0 +1,16 @@ +QA output created by 305 +### Create the image +Formatting 'TEST_DIR/t.IMGFMT', fmt=3DIMGFMT size=3D1048576 +### Fill the first refcount block and one data cluster from the second +wrote 126976/126976 bytes at offset 0 +124 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +### Discard two of the last data clusters, leave one in the middle +discard 1024/1024 bytes at offset 123904 +1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +discard 1024/1024 bytes at offset 125952 +1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +### Corrupt the offset of the second refcount block +### Try to allocate the discarded clusters again +qcow2: Marking image as corrupt: Refblock offset 0x20600 unaligned (reftab= le index: 0x1); further corruption events will be suppressed +write failed: Input/output error +*** done diff --git a/tests/qemu-iotests/group b/tests/qemu-iotests/group index 5cad015231..ff59cfd2d4 100644 --- a/tests/qemu-iotests/group +++ b/tests/qemu-iotests/group @@ -313,3 +313,4 @@ 302 quick 303 rw quick 304 rw quick +305 rw quick --=20 2.20.1 From nobody Fri May 3 12:44:45 2024 Delivered-To: importer@patchew.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 ARC-Seal: i=1; a=rsa-sha256; t=1599151254; cv=none; d=zohomail.com; s=zohoarc; b=SOj7JTRnwcLrxv5pgwqOC83+YkG/hzM0hdgRPrkvwnfelM3l3NH6paTqvzu3TCMMyJVdYxDgKhpij7tpf/+mum30KcMU5x8CGLs8FASrIvwYgIkcDUmTC/g94aJAQE6b8/WRGk57yg6KuJPR1Nm6RjK3rJVrkU0LGzOVzkFbKJY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1599151254; 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; bh=Dhx9hX0levtP/jPZ7VqO61MeCwOwD1gQmuwN0FfN37U=; b=XHLM1+uRBOeSJTr9iLPn+7v+Y14J9wWahA2ySH42zvzb+/VbvPSB8t5vmMqRP+BeP41oLz4w59r4VOS5U4Sxp7mk4Q8zt8XcRbVoo9OewEaQBLF/EHLY3iqjf2CiPIyoU75BiMxf/dzYxNFEkM/A13xFT5ntsM0ZCLBcC2+k7Ss= 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1599151254551861.8775791981855; Thu, 3 Sep 2020 09:40:54 -0700 (PDT) Received: from localhost ([::1]:58544 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kDsI9-0006uY-Qq for importer@patchew.org; Thu, 03 Sep 2020 12:40:53 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:42654) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kDsFb-0002Gu-9T; Thu, 03 Sep 2020 12:38:15 -0400 Received: from fanzine.igalia.com ([178.60.130.6]:40621) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kDsFZ-0003v1-3e; Thu, 03 Sep 2020 12:38:14 -0400 Received: from [81.0.33.67] (helo=perseus.local) by fanzine.igalia.com with esmtpsa (Cipher TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim) id 1kDsFW-0002F9-7T; Thu, 03 Sep 2020 18:38:10 +0200 Received: from berto by perseus.local with local (Exim 4.92) (envelope-from ) id 1kDsFJ-00082k-3l; Thu, 03 Sep 2020 18:37:57 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=Dhx9hX0levtP/jPZ7VqO61MeCwOwD1gQmuwN0FfN37U=; b=A8G6QCwUQ8YbT61yUHCGmYEOYfnCx3zQD6QUenQUm4r/uo1/ev1LgVa19lqYe1T2oJQJim+5/cxF+Y0h5s+PlhFI5s9hzghB9WIz2r/q+KGo4BU622D9uRDYdSe6CovkEJjp6zDlnowJebZS+0VAsU5Ph0ywZV6yEPV8KFq8p/hBvpUmjnHiQPQy0TRgZkYYgRAVQn8CYNJabAgtpxeM9zQ0+E54S5Cm6Bpa5xzTmyL7wYwtk4l2ucfyt5paF0YEg+Q/cDXLbggxdIdxtHAtArt+1BqA0c6zFHUIEiHfR33eEflC3EyPqsgTJfVKOSkiZrJN9cobriJg8nSYVtGwVw==; From: Alberto Garcia To: qemu-devel@nongnu.org Subject: [PATCH v2 2/3] qcow2: Don't check nb_clusters when removing l2meta from the list Date: Thu, 3 Sep 2020 18:37:48 +0200 Message-Id: X-Mailer: git-send-email 2.20.1 In-Reply-To: References: MIME-Version: 1.0 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=178.60.130.6; envelope-from=berto@igalia.com; helo=fanzine.igalia.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/09/03 12:38:03 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x (no timestamps) [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, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no 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: 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) Content-Type: text/plain; charset="utf-8" In the past, when a new cluster was allocated the l2meta structure was a variable in the stack so it was necessary to have a way to tell whether it had been initialized and contained valid data or not. The nb_clusters field was used for this purpose. Since commit f50f88b9fe this is no longer the case, l2meta (nowadays a pointer to a list) is only allocated when needed and nb_clusters is guaranteed to be > 0 so this check is unnecessary. Signed-off-by: Alberto Garcia --- block/qcow2.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/block/qcow2.c b/block/qcow2.c index da56b1a4df..54a7d2f475 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -2112,9 +2112,7 @@ static coroutine_fn int qcow2_handle_l2meta(BlockDriv= erState *bs, } =20 /* Take the request off the list of running requests */ - if (l2meta->nb_clusters !=3D 0) { - QLIST_REMOVE(l2meta, next_in_flight); - } + QLIST_REMOVE(l2meta, next_in_flight); =20 qemu_co_queue_restart_all(&l2meta->dependent_requests); =20 --=20 2.20.1 From nobody Fri May 3 12:44:45 2024 Delivered-To: importer@patchew.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 ARC-Seal: i=1; a=rsa-sha256; t=1599151233; cv=none; d=zohomail.com; s=zohoarc; b=TBae8TbWCEy0ZKkdLo3bFjmS3FitiqechSo3cVOrfUDfCUQfN3cH2l+SILb00XXC+lPzM7uR3L1EFmvYVt4HwtqEOoIveVxu8JQOJ7VN4meAgXMfBQ5pLYBiluBVyuFkS8ki6jnC2w4MvPAiGnGrRm6o7QWDHLdBqWaXiAwZPOY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1599151233; 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; bh=Chtlc5CuptQATyKkRPvXZLK+rkXSeQl8f2zRB9Ijl1E=; b=AAsQ/V8HrbaS9rjqfpxZY9VFR3rw1+sCUIfzeSqnK5vwzeklunPIO47NPsWJIHtI9R7GDhU7zmUBScY7hxXUYQ6iiogo9FYs5fSJ1HpChQo4UWt/s+GMjbOHJFsKRtVr4ONDrG4Uv16DeqOZA1N0+J4EbjMOj5ABiGw2kDzb7c8= 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1599151233827760.1503984175993; Thu, 3 Sep 2020 09:40:33 -0700 (PDT) Received: from localhost ([::1]:56566 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kDsHp-00062p-2m for importer@patchew.org; Thu, 03 Sep 2020 12:40:33 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:42670) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kDsFc-0002Kw-OE; Thu, 03 Sep 2020 12:38:16 -0400 Received: from fanzine.igalia.com ([178.60.130.6]:40627) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kDsFZ-0003v8-4O; Thu, 03 Sep 2020 12:38:16 -0400 Received: from [81.0.33.67] (helo=perseus.local) by fanzine.igalia.com with esmtpsa (Cipher TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim) id 1kDsFW-0002FF-Ob; Thu, 03 Sep 2020 18:38:10 +0200 Received: from berto by perseus.local with local (Exim 4.92) (envelope-from ) id 1kDsFJ-00082o-TM; Thu, 03 Sep 2020 18:37:57 +0200 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com; s=20170329; h=Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=Chtlc5CuptQATyKkRPvXZLK+rkXSeQl8f2zRB9Ijl1E=; b=VAE7/2IivqlWvSmDkU7gVZDMkdrTbWdMMTKZD13iJm9tMYBhtv0BdEQTF7sLEFs+Yj6uZ3xDNVJw71q8yaJW3Uxsv47/Eq0RuoRX8SnKpRNDIJtPbAWpYMpHimP4Y88YrPwhSjZBONBgrDETZDbaUZhe/paZ3OwdmhKHq9H5eOq4bQL7Pkmghb8b+iFqSVc/vIJfxlEq5eKpQ5nHt6DNwF03AH6k1hBSdFvvqQnlT9fgsAzKnaFR2SUKyaV95tKz0X4wDeyeJGph7sHYUyY9Qjm8Gb0Qr31gZdOHdJleDrHo4CKfw0vvOfsZjWwKMp/WIW0I1Uf0tJLxpXSe+5QteA==; From: Alberto Garcia To: qemu-devel@nongnu.org Subject: [PATCH v2 3/3] qcow2: Rewrite the documentation of qcow2_alloc_cluster_offset() Date: Thu, 3 Sep 2020 18:37:49 +0200 Message-Id: X-Mailer: git-send-email 2.20.1 In-Reply-To: References: MIME-Version: 1.0 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=178.60.130.6; envelope-from=berto@igalia.com; helo=fanzine.igalia.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/09/03 12:38:03 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x (no timestamps) [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, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no 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: 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) Content-Type: text/plain; charset="utf-8" The current text corresponds to an earlier, simpler version of this function and it does not explain how it works now. Signed-off-by: Alberto Garcia --- block/qcow2-cluster.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c index 25e38daa78..f1ce6afcf5 100644 --- a/block/qcow2-cluster.c +++ b/block/qcow2-cluster.c @@ -1713,18 +1713,22 @@ out: } =20 /* - * alloc_cluster_offset + * For a given area on the virtual disk defined by @offset and @bytes, + * find the corresponding area on the qcow2 image, allocating new + * clusters (or subclusters) if necessary. The result can span a + * combination of allocated and previously unallocated clusters. * - * For a given offset on the virtual disk, find the cluster offset in qcow2 - * file. If the offset is not found, allocate a new cluster. + * On return, @host_offset is set to the beginning of the requested + * area. This area is guaranteed to be contiguous on the qcow2 file + * but it can be smaller than initially requested. In this case @bytes + * is updated with the actual size. * - * If the cluster was already allocated, m->nb_clusters is set to 0 and - * other fields in m are meaningless. - * - * If the cluster is newly allocated, m->nb_clusters is set to the number = of - * contiguous clusters that have been allocated. In this case, the other - * fields of m are valid and contain information about the first allocated - * cluster. + * If any clusters or subclusters were allocated then @m contains a + * list with the information of all the affected regions. Note that + * this can happen regardless of whether this function succeeds or + * not. The caller is responsible for updating the L2 metadata of the + * allocated clusters (on success) or freeing them (on failure), and + * for clearing the contents of @m afterwards in both cases. * * If the request conflicts with another write request in flight, the coro= utine * is queued and will be reentered when the dependency has completed. --=20 2.20.1