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 6F3DF80E7E for ; Mon, 9 Nov 2026 14:03:17 +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 6A9E1xZo032548; Mon, 9 Nov 2026 17:02:00 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 6A9E1xZo032548 Authentication-Results: mail.openvz.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=virtuozzo.com header.i=@virtuozzo.com header.b="wHGVZrE7" Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.72]) by mail.openvz.org (8.14.4/8.14.4) with ESMTP id 6A9E1lHt032497 (version=TLSv1/SSLv3 cipher=AES128-GCM-SHA256 bits=128 verify=FAIL) for ; Mon, 9 Nov 2026 17:01:47 +0300 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.openvz.org 6A9E1lHt032497 Received: by mail-wr1-f72.google.com with SMTP id ffacd0b85a97d-490d2ac331bso817245f8f.0 for ; Mon, 09 Nov 2026 06:01:47 -0800 (PST) X-Forwarded-Encrypted: i=2; AL+hErEGx575GkW66EGMNI+nJjBqfrT96n057dk28oLLU5u2IGvBwQ+8Nfuh6hb7IVnLJ1VMJa9k7g==@openvz.org X-Gm-Message-State: APuU4Z+Ss5M0Vymi3GWm6Tmu5H4Jh4FUcme4GIs96gpdhV05KFDFncsf mjya7CDnuM8R9Qj+a/q6FA4YN2bZp5BSPCEdSTK2caTpJ7ObqRe+mFZqZiRA5HACHyiPXTdezc4 mVwRUgFI07TER5B56FdxzG9e/U0yPjwnpZOrDLcSMIv7vDnjOZQkSmA== X-Gm-Gg: AYBFou3js5vpCvZCjQHYwHRYUSVD6xwLOEDP7MPbuq5nwS5ZElUZuF9w/fUjqG6u9dV VQKt4bg5+t9BtxLo+wWt66VDOm6tQ4Zuh1We5aZ4WN04GiOA2drujMFspk5/fm3WPvYJfELGK5P DnC09K4e1Sc1zQU+bi3hhTff6rBPNjsG65u/ojaXknCmTvU+8rGTAp0JJ4Xrbr+j1ccDpcR4POv zazK3cPB/tZpB74891wVKzaIZCYn4wD4XueoLuKCP0qFc4hx3qrfTPfEvSeUFWJR5LmM7o3jmog nnNziq5qJqKKRkw9q4giPHCtjx2KRLCBlNC4FwDbdJuxBkbYnEXVXwfSmQv+ucRGxC4pJ7P0733 NZOK0TQwVbP4JUjNVRiITf4i8HIAR X-Received: by 2002:a05:6000:46cf:b0:490:9fe2:6a39 with SMTP id ffacd0b85a97d-497f9657704mr233253f8f.20.1794232906943; Mon, 09 Nov 2026 06:01:46 -0800 (PST) X-Received: by 2002:a05:6000:46cf:b0:490:9fe2:6a39 with SMTP id ffacd0b85a97d-497f9657704mr233195f8f.20.1794232906262; Mon, 09 Nov 2026 06:01:46 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1794232906; cv=none; d=google.com; s=arc-20260327; b=LlKPnOifPBWxc5i8IOQDn4EIQnEZ/lVSyqVVVPvdfACP0FQEbyVcuy0DEwA4z6F3D8 SwBfIDcdkwAGrjM0WXedUWU04V2TRA6FUZAqut9Ix4FOGI29K01Gtl5H0hSuCcKXVg+7 6z6QDrACxplEmzBlX1JjniR+V7x9/2Vj9IiK4vb5yk1AsxBsHIBp5wTwStcjv0AOfEU/ UpVsos7MgZTgUUmduwzB3QtLkzy/Kmw4Ffu+ELEzXmi3sXnK6okI/9caR3XYUJPEmSRW /xqJQVOUd8Ic0kr4uXQcjmERFSiGyjNBQfm6vHZM7MmlE7TqzuPJxInPkrktyoJPYVwW pncw== 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=mw9XSIrr1x3BQkPBP1X7VgCHoUfoXmMBq6qPZnumyoEBYMlPW+Y4nP8smppN7W//Am cFm98AdinP1z5zr9HfMA3NQ441S8QmfN/CwuOb20sIO5GAXC6bSaT+rBTKPKn/EBLRco EerxQuE1BdJe+frMyAYWywiIZr5yKoczL1hzgfo3VqDLOrjy2mpK3uUPMcIMthNxVM4J eB/CS4M/yC1EuYLUUFCCxrsankxEoygXz9/E8j1+oEzqBuoqGBBm+IzOkdyjq1qEoEdf u5/MBsAiYHbkPVk4VFdHMakYiI32SEvuL9uBbywHoyp5WRyvXzeMkQib3sfkzD17+FfP pGSg==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=relay header.b=wHGVZrE7; 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-495989871c6si8725375f8f.413.2026.11.09.06.01.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 09 Nov 2026 06:01:46 -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=wHGVZrE7; 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=wHGVZrE7BqmA mfXp4XiheBhfp18mZVFkl/On8TEwwlPWE2MJ3ipjdV6ucFpAPiFpeXh3pNUOGDEz7ux0vCW2Vzs6j 0+sTMSfoo5Q5I9vuVbQRZelPE4YPw7kPiXXulzYyrGVHfxvTrpj0NFaRQjphT+X6zZ/Mmt11K8NKn PvtZulnA4/Bl7fsXTTOG3/FVm8Kp9qRq/PR3PjqEpvrcBAONuCYMuKc3oSm4Rv20BzH7R8OV/AA/3 OQQUhU3s3+Gcv/H38riqnDpSLQzqOcIpGAH6+zs3BSUe5374Py4fsJfGaAfqtQAKzEhTSfUEJpoY6 gZ3qzHut3qFFZ7cZPk1AIQ==; 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 1xQPsL-005vFF-0f; Mon, 09 Nov 2026 15:01:37 +0100 From: Alexander Ivanov To: andrey.zhadchenko@virtuozzo.com Date: Mon, 9 Nov 2026 15:01:34 +0100 Message-ID: <20261109140143.1408038-2-alexander.ivanov@virtuozzo.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20261109140143.1408038-1-alexander.ivanov@virtuozzo.com> References: <20261109140143.1408038-1-alexander.ivanov@virtuozzo.com> MIME-Version: 1.0 X-OZ-Fwd: true Cc: devel@openvz.org Subject: [Devel] [PATCH hci-8.1 v11 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