From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.openvz.org (mail.openvz.org [69.168.225.77]) by lore.virtuozzo.com (Postfix) with ESMTPS id DB818813D0 for ; Mon, 9 Nov 2026 12:00:27 +0000 (UTC) Received: from mail.openvz.org (localhost [127.0.0.1]) by mail.openvz.org (8.14.4/8.14.4) with ESMTP id 6A9BxEBE031358; Mon, 9 Nov 2026 14:59:15 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 6A9BxEBE031358 Authentication-Results: mail.openvz.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="gtZ+Et9h" Received: from mail-wm1-f71.google.com (mail-wm1-f71.google.com [209.85.128.71]) by mail.openvz.org (8.14.4/8.14.4) with ESMTP id 6A9Bx2s3031307 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=FAIL) for ; Mon, 9 Nov 2026 14:59:03 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 6A9Bx2s3031307 Received: by mail-wm1-f71.google.com with SMTP id 5b1f17b1804b1-4a1f03f2e8aso6720495e9.1 for ; Mon, 09 Nov 2026 03:59:03 -0800 (PST) X-Forwarded-Encrypted: i=2; AL+hErHGhCu8LaIZ0ipNatS3ijn6ykzEHxrPk1WeFp1iUDcfEz5ELAktKNwAg4t6MDoLQoERJMcomA==@openvz.org X-Gm-Message-State: APuU4Z+7QkKu9DtE6xEB18NKO4gqUsLoVDuc6L+l6oZc3yEcEZT8zXfe 89GH8JiahulHp8MAffFyKgydLp1Ph4NS0oeaTGI/qHG4M/GJqnb9/tF+EIf1rWRo4ksnbeszTZ/ P0b0yU4k3DhUmJFuSxbHXD8PVJ61N5Zs3YyiYYcXfEBbh4KEILWyTkA== X-Gm-Gg: AYBFou1hldcFq3ahPxWEkDhQvadr+5pOAm7sfy3vYxTAy/r79pXrPsuFZ9sCaJJaiPo wccIOPl6LFlADhNNNyeJDzBvjlkmjHLeSlQAfQ1XQFg564M+km3YwMV8p0BJvzeJlkLrDjMsUW3 nLCrD9ZdaNOKQBbrq51m+z16lJ9hxubGNTsFffpPNa0IK55Umh6TXMdOCXjoewltmVS6koviAlm c5aC1ek8m9M2MepjBhgPrOJZyaFnEs7eBBfZICCtSzFtZJUAhvv4XifpvP4vYDaCwjKm+jZfnmR x1wrYJs0B00olJlwUosJB7o2Io8t+DBvI347vG9/ClQuJsqZpIgDBpk2pSO9D7m4uTwwgX/TtLz Y12lDkAa+QJxzeWqbU+w6gjyb6JWW X-Received: by 2002:a05:600c:4e05:b0:4b8:4af2:88b3 with SMTP id 5b1f17b1804b1-4b963c6d91amr68314305e9.22.1794225542601; Mon, 09 Nov 2026 03:59:02 -0800 (PST) X-Received: by 2002:a05:600c:4e05:b0:4b8:4af2:88b3 with SMTP id 5b1f17b1804b1-4b963c6d91amr68313935e9.22.1794225542131; Mon, 09 Nov 2026 03:59:02 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1794225542; cv=none; d=google.com; s=arc-20260327; b=MdNMFKrJlogmP6rJP3Y/PlbhCQSol6m2XIKQ7KL5pX8OKnt73Z/1FFGOHr8g3KqU3z G+1r8d9yQs0kSzsEKXlQRFSwDWLoI1YVuVaqFJnvQcmJoOBwi+l2Fdx7qGkgxDNsCfQz yAbY7DTZBzntDzPcVmhw4yIV3/qSCgEaT6cyDrMYwH02WFjhQGfzeiExeajwVE6Cyigo Mpn0W5/gS4iUiIFObVHUHPinHx9qxWcz+vbkTCfMbEsZ4ZCMoSl13tfHzOUi1vZsMLbv V7/RxPs8BXF7SNeR6IxtdVgQ/5OiPLePS1W4ZmQD/03auM9fBASSj3mmlb1O0iRQdkP7 vqsw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature; bh=+jWujBFUS4dH0702LGIDbdh/t70yPiAKKWsh1FZS3ms=; fh=E3vCAgcov/hQ3XWh2CqQ9wok33eMAQJstV7H9y+Mjr8=; b=cgEv4s26Ojk7cJWyJfkfblZCZr4trmYKoAhCt+4Wr2lxxjWfGY17swnC87GiLctuaR 3/Jd2NXHxqj/KIozheHBNydPyMLyC75vjblCEOWjThCTGta4SzYzEoWic5e6QqtgEREW qpP1k/Lirm4MqoDmqe36BiSEiu0a3zIJoTVUlhLPBYXHEe1cyivxm/DCG18vglQUbtBg 0CMiIuMboSNJ8RfuTQrQI7xzovCOCAPg0+9+FpyxwkkMj+joMSIO6PPc4ommEIChi50q pq306MMODMK+LxrLTb5derasH4IynLrj2mRS7TXkXnrHZ5MxqySegRgsa9Hzo8vY4cwA TVLA==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=relay header.b=gtZ+Et9h; spf=pass (google.com: domain of alexander.ivanov@virtuozzo.com designates 130.117.225.111 as permitted sender) smtp.mailfrom=alexander.ivanov@virtuozzo.com; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=virtuozzo.com Received: from relay.virtuozzo.com (relay.virtuozzo.com. [130.117.225.111]) by mx.google.com with ESMTPS id ffacd0b85a97d-49596cb91f9si8064021f8f.144.2026.11.09.03.59.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 09 Nov 2026 03:59:02 -0800 (PST) Received-SPF: pass (google.com: domain of alexander.ivanov@virtuozzo.com designates 130.117.225.111 as permitted sender) client-ip=130.117.225.111; Authentication-Results: mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=relay header.b=gtZ+Et9h; spf=pass (google.com: domain of alexander.ivanov@virtuozzo.com designates 130.117.225.111 as permitted sender) smtp.mailfrom=alexander.ivanov@virtuozzo.com; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=virtuozzo.com DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=virtuozzo.com; s=relay; h=MIME-Version:Message-ID:Date:Subject:From: Content-Type; bh=+jWujBFUS4dH0702LGIDbdh/t70yPiAKKWsh1FZS3ms=; b=gtZ+Et9hq9w5 YlEgEbDv7ufJ29R7PQdak4agYazeN0mTkktAcPdFeGScmAU/PrdJ6zynWBWcLbzNEPes3nIFjf9fV rJOhHKLUWwM08aWgcR82M2m+Crwlqz/2AahlJvbO/xc+5H5/qikmZo8WhZRCMvQOImTCQOQS3Rl4A mLX3XaYReKFhCdaezqKISxAItcvJUa7eRJnUdyiDYFv+j6OGJAmZAxQacAyR8QzGn1IRsk92PXMpq T2vm0LHkqL1A1zFLju9sZ8Cq+xWm/oj034aSQ0ZJnDYg/WUBVtaLqXvBUSR7h8fg7cYM/c82RiRN2 Pw713tko8d2nOpdVxeb21A==; Received: from ch-vpn.virtuozzo.com ([130.117.225.6] helo=sky) by relay.virtuozzo.com with esmtps (TLS1.3) tls TLS_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1xQNxZ-003a4R-0p; Mon, 09 Nov 2026 12:58:53 +0100 From: Alexander Ivanov To: andrey.zhadchenko@virtuozzo.com Date: Mon, 9 Nov 2026 12:58:47 +0100 Message-ID: <20261109115856.1362416-2-alexander.ivanov@virtuozzo.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20261109115856.1362416-1-alexander.ivanov@virtuozzo.com> References: <20261109115856.1362416-1-alexander.ivanov@virtuozzo.com> MIME-Version: 1.0 X-OZ-Fwd: true Cc: devel@openvz.org Subject: [Devel] [PATCH hci-8.1 v10 01/10] dm-qcow2: add qcow2_md_page_read_sync() helper X-BeenThere: devel@openvz.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: OpenVZ development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: devel-bounces@openvz.org Errors-To: devel-bounces@openvz.org Add a helper, which returns an up to date md page from md cache, or allocates a new one, inserts it and reads it synchronously. On read failure the page is erased from cache and freed. Use it in qcow2_parse_header() instead of open-coded allocation and read of page 0. It will also be used by a later patch in the series. https://virtuozzo.atlassian.net/browse/VSTOR-148171 Feature: dm-qcow2: block device over QCOW2 files driver Signed-off-by: Alexander Ivanov Reviewed-by: Denis V. Lunev Reviewed-by: Andrey Zhadchenko --- drivers/md/dm-qcow2-target.c | 48 ++++++++++++++++++++++++++++++++---- drivers/md/dm-qcow2.h | 2 ++ 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/drivers/md/dm-qcow2-target.c b/drivers/md/dm-qcow2-target.c index 7c572bd66e1c..0cbbd8e4f493 100644 --- a/drivers/md/dm-qcow2-target.c +++ b/drivers/md/dm-qcow2-target.c @@ -418,6 +418,48 @@ int qcow2_alloc_and_insert_md_page(struct qcow2 *qcow2, u64 index, struct md_pag } ALLOW_ERROR_INJECTION(qcow2_alloc_and_insert_md_page, ERRNO); +/* + * Returns up to date md page from cache, or allocates + * a new one and reads it synchronously. Sets *md to NULL on error. + * + * The caller must ensure nobody else looks this page up until this + * returns (e.g., the device is suspended). A lookup before MD_UPTODATE + * is set queues its qio on md->wait_list, which is never woken here, + * and the page is freed with the qio still queued on read error. + * A cached page that is not MD_UPTODATE yet makes the insert fail. + */ +int qcow2_md_page_read_sync(struct qcow2 *qcow2, u64 id, struct md_page **md) +{ + int ret; + + spin_lock_irq(&qcow2->md_pages_lock); + *md = qcow2_md_page_find_or_postpone(qcow2, id, NULL); + spin_unlock_irq(&qcow2->md_pages_lock); + if (*md) + return 0; + + ret = qcow2_alloc_and_insert_md_page(qcow2, id, md); + if (ret) + goto err; + + ret = qcow2_rw_page_sync(READ, qcow2, id, (*md)->page); + if (ret) { + spin_lock_irq(&qcow2->md_pages_lock); + qcow2_md_page_erase(qcow2, *md); + spin_unlock_irq(&qcow2->md_pages_lock); + qcow2_free_md_page(*md); + goto err; + } + + spin_lock_irq(&qcow2->md_pages_lock); + (*md)->status |= MD_UPTODATE; + spin_unlock_irq(&qcow2->md_pages_lock); + return 0; +err: + *md = NULL; + return ret; +} + static void inflight_ref_exit0(struct percpu_ref *ref) { struct qcow2_target *tgt = container_of(ref, struct qcow2_target, @@ -851,13 +893,9 @@ static int qcow2_parse_header(struct dm_target *ti, struct qcow2 *qcow2, } qcow2->file_preallocated_area_start = qcow2->file_size; - ret = qcow2_alloc_and_insert_md_page(qcow2, 0, &md); - if (ret) - return ret; - ret = qcow2_rw_page_sync(READ, qcow2, md->id, md->page); + ret = qcow2_md_page_read_sync(qcow2, 0, &md); if (ret) return ret; - md->status |= MD_UPTODATE; raw_hdr = kmap(md->page); min_len = to_bytes(ti->len); diff --git a/drivers/md/dm-qcow2.h b/drivers/md/dm-qcow2.h index ad5286b16883..5abc7f5ad239 100644 --- a/drivers/md/dm-qcow2.h +++ b/drivers/md/dm-qcow2.h @@ -388,6 +388,8 @@ void do_qcow2_work(struct work_struct *ws); void do_qcow2_fsync_work(struct work_struct *ws); int qcow2_alloc_and_insert_md_page(struct qcow2 *qcow2, u64 index, struct md_page **md); +int qcow2_md_page_read_sync(struct qcow2 *qcow2, u64 id, + struct md_page **md); struct md_page *qcow2_md_page_find_or_postpone(struct qcow2 *qcow2, u64 id, struct qio **qio); struct md_page *qcow2_md_page_renumber(struct qcow2 *qcow2, u64 id, -- 2.53.0 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel