Cover Letter Detail
Show a cover letter.
GET /api/covers/2226010/?format=api
{ "id": 2226010, "url": "http://patchwork.ozlabs.org/api/covers/2226010/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-ext4/cover/20260422021042.4157510-1-yi.zhang@huaweicloud.com/", "project": { "id": 8, "url": "http://patchwork.ozlabs.org/api/projects/8/?format=api", "name": "Linux ext4 filesystem development", "link_name": "linux-ext4", "list_id": "linux-ext4.vger.kernel.org", "list_email": "linux-ext4@vger.kernel.org", "web_url": null, "scm_url": null, "webscm_url": null, "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20260422021042.4157510-1-yi.zhang@huaweicloud.com>", "list_archive_url": null, "date": "2026-04-22T02:10:20", "name": "[v3,00/22] ext4: use iomap for regular file's buffered I/O path", "submitter": { "id": 85428, "url": "http://patchwork.ozlabs.org/api/people/85428/?format=api", "name": "Zhang Yi", "email": "yi.zhang@huaweicloud.com" }, "mbox": "http://patchwork.ozlabs.org/project/linux-ext4/cover/20260422021042.4157510-1-yi.zhang@huaweicloud.com/mbox/", "series": [ { "id": 500911, "url": "http://patchwork.ozlabs.org/api/series/500911/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-ext4/list/?series=500911", "date": "2026-04-22T02:10:23", "name": "ext4: use iomap for regular file's buffered I/O path", "version": 3, "mbox": "http://patchwork.ozlabs.org/series/500911/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/covers/2226010/comments/", "headers": { "Return-Path": "\n <SRS0=MB5c=CV=vger.kernel.org=linux-ext4+bounces-15971-patchwork-incoming=ozlabs.org@ozlabs.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "linux-ext4@vger.kernel.org" ], "Delivered-To": [ "patchwork-incoming@legolas.ozlabs.org", "patchwork-incoming@ozlabs.org" ], "Authentication-Results": [ "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=ozlabs.org\n (client-ip=2404:9400:2221:ea00::3; helo=mail.ozlabs.org;\n envelope-from=srs0=mb5c=cv=vger.kernel.org=linux-ext4+bounces-15971-patchwork-incoming=ozlabs.org@ozlabs.org;\n receiver=patchwork.ozlabs.org)", "gandalf.ozlabs.org;\n arc=pass smtp.remote-ip=\"2600:3c0a:e001:db::12fc:5321\"\n arc.chain=subspace.kernel.org", "gandalf.ozlabs.org;\n dmarc=none (p=none dis=none) header.from=huaweicloud.com", "gandalf.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=2600:3c0a:e001:db::12fc:5321; helo=sea.lore.kernel.org;\n envelope-from=linux-ext4+bounces-15971-patchwork-incoming=ozlabs.org@vger.kernel.org;\n receiver=ozlabs.org)", "smtp.subspace.kernel.org;\n arc=none smtp.client-ip=45.249.212.51", "smtp.subspace.kernel.org;\n dmarc=none (p=none dis=none) header.from=huaweicloud.com", "smtp.subspace.kernel.org;\n spf=pass smtp.mailfrom=huaweicloud.com" ], "Received": [ "from mail.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g0jct4fsXz1yD5\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 22 Apr 2026 12:20:46 +1000 (AEST)", "from mail.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3])\n\tby gandalf.ozlabs.org (Postfix) with ESMTP id 4g0jct471yz4w1l\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 22 Apr 2026 12:20:46 +1000 (AEST)", "by gandalf.ozlabs.org (Postfix)\n\tid 4g0jct40pZz4wK3; Wed, 22 Apr 2026 12:20:46 +1000 (AEST)", "from sea.lore.kernel.org (sea.lore.kernel.org\n [IPv6:2600:3c0a:e001:db::12fc:5321])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby gandalf.ozlabs.org (Postfix) with ESMTPS id 4g0jcp3jJwz4w1l\n\tfor <patchwork-incoming@ozlabs.org>; Wed, 22 Apr 2026 12:20:42 +1000 (AEST)", "from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sea.lore.kernel.org (Postfix) with ESMTP id 03721307284C\n\tfor <patchwork-incoming@ozlabs.org>; Wed, 22 Apr 2026 02:17:17 +0000 (UTC)", "from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 7E8C6311973;\n\tWed, 22 Apr 2026 02:17:02 +0000 (UTC)", "from dggsgout11.his.huawei.com (dggsgout11.his.huawei.com\n [45.249.212.51])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id B0ABC30C371;\n\tWed, 22 Apr 2026 02:16:58 +0000 (UTC)", "from mail.maildlp.com (unknown [172.19.163.198])\n\tby dggsgout11.his.huawei.com (SkyGuard) with ESMTPS id 4g0jWL2lm1zYQtkB;\n\tWed, 22 Apr 2026 10:15:58 +0800 (CST)", "from mail02.huawei.com (unknown [10.116.40.252])\n\tby mail.maildlp.com (Postfix) with ESMTP id 8F38B40605;\n\tWed, 22 Apr 2026 10:16:55 +0800 (CST)", "from huaweicloud.com (unknown [10.50.85.155])\n\tby APP3 (Coremail) with SMTP id _Ch0CgB3JL6PL+hpqkgUBQ--.2635S4;\n\tWed, 22 Apr 2026 10:16:54 +0800 (CST)" ], "ARC-Seal": [ "i=2; a=rsa-sha256; d=ozlabs.org; s=201707; t=1776824446; cv=pass;\n\tb=m7SlRqUPJ+XvE2FhGyIW8SkRo9ULN9oFoT7I0tkY77V3zDzPuaFU3jN+yo9jtLQjVpiWbCWXkfIBPOH7mCqrpQF1IbJ18h7EZSoinyFb04Jz4ikuCDoHMc4VCLe28pe8jAHJ0Z237EcN2yrJcsIh0RUWTbTtVqurM4bvTEdtyqwW0b1vaWYKCWWCuPYCIn+8Qfbl27UBeMAcgF7pedQTOZ/HVtUJTg5TEfx+kFlqdOj+sH2o7XpEaBPzxRNgn7qNDZfhstmGJIOGDDhq7A8GDEDkfXLJROn2oQn/zn+KwnCpH2zq1EVuuPmMFTPgWaiET0esRQj4eJOmdHpQrvZk/A==", "i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1776824222; cv=none;\n b=ZY4nGcwNqUA86sPFdlCVEeX/LyMr85Dx0hojtBptouLmcv7BV1fhbymlSzNkI+J42rAE8PfggErA1Zb4LGyP96FYdvvgn9lklQQQrOn3/R3uOjIjJwncuzNfzvRptdPR+gLGlJv8ID8VWIIxUwz1vRRr8c6JUrJ1T4H1gMp+hns=" ], "ARC-Message-Signature": [ "i=2; a=rsa-sha256; d=ozlabs.org; s=201707;\n\tt=1776824446; c=relaxed/relaxed;\n\tbh=oyX8VsaJi9olR3+d7HhuGwROceTIm/tBn9KzTqN1lPc=;\n\th=From:To:Cc:Subject:Date:Message-ID:MIME-Version;\n b=b1bhM4z4HCuOiDAHbiUP7tWJGLrQnm8U+B6YILfwEtTz5cnffXTAHu6F1ciUJ3++PYPaVc9GluG/FBksaFWqb4Se/fYf59tVBzyPd9HGYEBSitzQJEb2Ewexn2StU7Yw1QWrw4ISwaH0FG3EjTjUa7PIdPF6J6mc/sVTrCWmLlHa2BMbCm113pS/gSmb/8w62meTn8C/eFx/kKhXXY3k2MYhIQrOBBFRD/RZQGWOPipzh7fkV8f9bQqBdjI1qKM5Scw2exR+qHlBbdxvrpbcgFScIlnyQKZdbJugjs7unOxymyc5X7c8VW5fl8UHCdbPYezrNIatMpbqIfZXCojvlw==", "i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1776824222; c=relaxed/simple;\n\tbh=foZZc7LhXM+okm7MtMcgstr0CDEhD7vTkr7pjOua4lw=;\n\th=From:To:Cc:Subject:Date:Message-ID:MIME-Version;\n b=Qy6XR/7uYUrOT/UqW+i438c/ot+txqQunJ86dRS1sOr5lXStB23dPYDc5UhvtakneEXeV4ryH4isvT+SkccFNb81ZpITC+ZAEviFb/UOfcdTXBKvBcb5ufYReYfX3zaZL2tPXsoOb8Wn+ZZcUxuyLxiDzmXv0bGZXAVrpW3Y56Y=" ], "ARC-Authentication-Results": [ "i=2; gandalf.ozlabs.org;\n dmarc=none (p=none dis=none) header.from=huaweicloud.com;\n spf=pass (client-ip=2600:3c0a:e001:db::12fc:5321; helo=sea.lore.kernel.org;\n envelope-from=linux-ext4+bounces-15971-patchwork-incoming=ozlabs.org@vger.kernel.org;\n receiver=ozlabs.org) smtp.mailfrom=vger.kernel.org", "i=1; smtp.subspace.kernel.org;\n dmarc=none (p=none dis=none) header.from=huaweicloud.com;\n spf=pass smtp.mailfrom=huaweicloud.com; arc=none smtp.client-ip=45.249.212.51" ], "From": "Zhang Yi <yi.zhang@huaweicloud.com>", "To": "linux-ext4@vger.kernel.org,\n\tlinux-fsdevel@vger.kernel.org", "Cc": "linux-kernel@vger.kernel.org,\n\ttytso@mit.edu,\n\tadilger.kernel@dilger.ca,\n\tlibaokun@linux.alibaba.com,\n\tjack@suse.cz,\n\tojaswin@linux.ibm.com,\n\tritesh.list@gmail.com,\n\tdjwong@kernel.org,\n\thch@infradead.org,\n\tyi.zhang@huawei.com,\n\tyi.zhang@huaweicloud.com,\n\tyizhang089@gmail.com,\n\tyangerkun@huawei.com,\n\tyukuai@fnnas.com", "Subject": "[PATCH v3 00/22] ext4: use iomap for regular file's buffered I/O path", "Date": "Wed, 22 Apr 2026 10:10:20 +0800", "Message-ID": "<20260422021042.4157510-1-yi.zhang@huaweicloud.com>", "X-Mailer": "git-send-email 2.52.0", "Precedence": "bulk", "X-Mailing-List": "linux-ext4@vger.kernel.org", "List-Id": "<linux-ext4.vger.kernel.org>", "List-Subscribe": "<mailto:linux-ext4+subscribe@vger.kernel.org>", "List-Unsubscribe": "<mailto:linux-ext4+unsubscribe@vger.kernel.org>", "MIME-Version": "1.0", "Content-Transfer-Encoding": "8bit", "X-CM-TRANSID": "_Ch0CgB3JL6PL+hpqkgUBQ--.2635S4", "X-Coremail-Antispam": "1UD129KBjvJXoW3WF15ZF1xXF47KFWxCr1rWFg_yoWxuw4kpF\n\tZ8KFWftrnrXryxu397uw1xJr1jvan3XF43Gr4fJwn8ua15W3W8uFs29a1YvFWUGry7Ary0\n\tvr12yF1UC3W5ArJanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2\n\t9KBjDU0xBIdaVrnRJUUU9Y14x267AKxVW5JVWrJwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0\n\trVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK02\n\t1l84ACjcxK6xIIjxv20xvE14v26w1j6s0DM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26r4U\n\tJVWxJr1l84ACjcxK6I8E87Iv67AKxVW0oVCq3wA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_Gc\n\tCE3s1le2I262IYc4CY6c8Ij28IcVAaY2xG8wAqx4xG64xvF2IEw4CE5I8CrVC2j2WlYx0E\n\t2Ix0cI8IcVAFwI0_JrI_JrylYx0Ex4A2jsIE14v26r1j6r4UMcvjeVCFs4IE7xkEbVWUJV\n\tW8JwACjcxG0xvY0x0EwIxGrwACjI8F5VA0II8E6IAqYI8I648v4I1lFIxGxcIEc7CjxVA2\n\tY2ka0xkIwI1lc7CjxVAaw2AFwI0_Jw0_GFyl42xK82IYc2Ij64vIr41l4I8I3I0E4IkC6x\n\t0Yz7v_Jr0_Gr1lx2IqxVAqx4xG67AKxVWUJVWUGwC20s026x8GjcxK67AKxVWUGVWUWwC2\n\tzVAF1VAY17CE14v26r4a6rW5MIIYrxkI7VAKI48JMIIF0xvE2Ix0cI8IcVAFwI0_Jr0_JF\n\t4lIxAIcVC0I7IYx2IY6xkF7I0E14v26r4j6F4UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWU\n\tCwCI42IY6I8E87Iv67AKxVWUJVW8JwCI42IY6I8E87Iv6xkF7I0E14v26r4j6r4UJbIYCT\n\tnIWIevJa73UjIFyTuYvjfUFjjgDUUUU", "X-CM-SenderInfo": "d1lo6xhdqjqx5xdzvxpfor3voofrz/", "X-Spam-Status": "No, score=-1.1 required=5.0 tests=ARC_SIGNED,ARC_VALID,\n\tDMARC_MISSING,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,\n\tSPF_HELO_NONE,SPF_PASS autolearn=disabled version=4.0.1", "X-Spam-Checker-Version": "SpamAssassin 4.0.1 (2024-03-25) on gandalf.ozlabs.org" }, "content": "From: Zhang Yi <yi.zhang@huawei.com>\n\nThis series adds the iomap buffered I/O path support for regular files,\nbased on the latest upstream kernel. It implements the core iomap APIs\non ext4 and introduces the 'buffered_iomap' mount option to enable the\niomap buffered I/O path. It supports default features, default mount\noptions and bigalloc feature. However, it does not support online\ndefragmentation, inline data, fsverify, fscrypt, non-extent inodes, and\ndata=journal mode, it will fall to buffered_head I/O path automatically\nif these features and options are used.\n\nThis iomap buffered I/O path is not enabled by default because the\npreceding features are not supported. Users can explicitly enable or\ndisable it via 'buffered_iomap' and 'nobuffered_iomap' mount options.\n\nKey notes\n=========\n\n1. Lock ordering difference\n\n The lock ordering of folio lock and transaction start in the iomap\n path is the opposite of that in the buffer_head path.\n\n2. data=ordered mode is not used\n\n Two main reasons:\n a) The lock ordering of folio lock and transaction start for\n data=ordered mode is opposite to the iomap path, which would cause\n a deadlock.\n b) The iomap writeback path does not support partial folio submission\n (required by data=ordered mode when block size < folio size, and\n it is currently handled by ext4_bio_write_folio()), which would\n also cause a deadlock.\n\n To replace data=ordered mode functionality:\n\n - For append write: Always allocate unwritten extents (dioread_nolock\n behavior) to prevent stale data exposure.\n\n - For post-EOF partial block zeroing: Issue zeroing I/O immediately\n and wait for completion before updating i_disksize. On ordered I/O\n completion, set i_disksize = i_size to avoid lost updates in the\n truncate up case. (Jan suggested).\n\n - For online defragmentation: Not supported yet, needs further\n consideration.\n\n3. Always enable dioread_nolock\n\n Two main reasons:\n a) Since data=ordered mode cannot be used, allocating written blocks\n directly would expose stale data.\n b) To optimize writeback, we should allocate blocks based on writeback\n length rather than per-folio mapping. Direct written allocation\n would over-allocate blocks.\n\n dioread_nolock has been the default mount option for many years, and\n Jan pointed out that we may no longer need to disable it, so gradually\n remove this mount option in the future.\n\nSeries structure\n================\n\n - Patch 01-03: Simplify truncate operations and prepare for conversion.\n - Patch 04-18: Implement core iomap buffered read/write, writeback,\n mmap, and partial block zeroing paths.\n - Patch 19-22: Handle ordered I/O for zeroing post-EOF partial block.\n\nTesting and Performance\n=======================\n\nTested with xfstests-bld using -g auto, fast_commit, and 64k\nconfigurations. No new regressions were observed.\n\nFor the special case of zeroing post-EOF partial block, I add a new\ngeneric/790 to address this scenario.\n\n https://lore.kernel.org/fstests/20260422015246.4132376-1-yi.zhang@huaweicloud.com/\n\nPerformance tested with fio on a 150 GB memory-backed virtual machine\n(no much difference compared to v2, so no update):\n\n Buffered write (MiB/s)\n ===\n\n bs write cache uncached write\n bh iomap bh iomap\n 1k 423 403 36.3 57\n 4k 1067 1093 58.4 61\n 64k 4321 6488 869 1206\n 1M 4640 7378 3158 4818\n \n Buffered read (MiB/s)\n ===\n\n bs read hole read pre-cache read ondisk data\n bh iomap bh iomap bh iomap\n 1k 635 643 661 653 605 602 \n 4k 1987 2075 2128 2159 1761 1716\n 64k 6068 6267 9472 9545 4475 4451 \n 1M 5471 6072 8657 9191 4405 4467 \n\nLarge I/O write performance improved by approximately 30% to 50%.\nRead performance showed no significant difference.\n\nChanges sicne v2:\n - Rebased on the latest upstream kernel (7.1-rc1).\n - Added patches 01-03 to simplify truncate operations.\n - Added patch 13 to fix incorrect did_zero parameter in\n iomap_zero_range().\n - Added patches 19-22 to handle ordered I/O for zeroing post-EOF\n partial block.\n - Minor code and comment optimizations.\n\nChanges since v1:\n - Rebase this series on linux-next 20260122.\n - Refactor partial block zero range, stop passing handle to\n ext4_block_truncate_page() and ext4_zero_partial_blocks(), and move\n partial block zeroing operation outside an active journal transaction\n to prevent potential deadlocks because of the lock ordering of folio\n and transaction start.\n - Clarify the lock ordering of folio lock and transaction start, update\n the comments accordingly.\n - Fix some issues related to fast commit, pollute post-EOF folio.\n - Some minor code and comments optimizations.\n\nv2: https://lore.kernel.org/linux-ext4/20260203062523.3869120-1-yi.zhang@huawei.com/\nv1: https://lore.kernel.org/linux-ext4/20241022111059.2566137-1-yi.zhang@huaweicloud.com/\nRFC v4: https://lore.kernel.org/linux-ext4/20240410142948.2817554-1-yi.zhang@huaweicloud.com/\nRFC v3: https://lore.kernel.org/linux-ext4/20240127015825.1608160-1-yi.zhang@huaweicloud.com/\nRFC v2: https://lore.kernel.org/linux-ext4/20240102123918.799062-1-yi.zhang@huaweicloud.com/\nRFC v1: https://lore.kernel.org/linux-ext4/20231123125121.4064694-1-yi.zhang@huaweicloud.com/\n\nComments and suggestions are welcome!\n\nThanks,\nYi.\n\n\nZhang Yi (22):\n ext4: simplify size updating in ext4_setattr()\n ext4: factor out ext4_truncate_[up|down]()\n ext4: simplify error handling in ext4_setattr()\n ext4: add iomap address space operations for buffered I/O\n ext4: implement buffered read path using iomap\n ext4: pass out extent seq counter when mapping da blocks\n ext4: do not use data=ordered mode for inodes using buffered iomap\n path\n ext4: implement buffered write path using iomap\n ext4: implement writeback path using iomap\n ext4: implement mmap path using iomap\n iomap: correct the range of a partial dirty clear\n iomap: support invalidating partial folios\n iomap: fix incorrect did_zero setting in iomap_zero_iter()\n ext4: implement partial block zero range path using iomap\n ext4: add block mapping tracepoints for iomap buffered I/O path\n ext4: disable online defrag when inode using iomap buffered I/O path\n ext4: partially enable iomap for the buffered I/O path of regular\n files\n ext4: introduce a mount option for iomap buffered I/O path\n ext4: submit zeroed post-EOF data immediately in the iomap buffered\n I/O path\n ext4: wait for ordered I/O in the iomap buffered I/O path\n ext4: update i_disksize to i_size on ordered I/O completion\n ext4: add tracepoints for ordered I/O in the iomap buffered I/O path\n\n fs/ext4/ext4.h | 73 ++-\n fs/ext4/ext4_jbd2.c | 1 +\n fs/ext4/ext4_jbd2.h | 7 +-\n fs/ext4/extents.c | 9 +-\n fs/ext4/file.c | 20 +-\n fs/ext4/ialloc.c | 1 +\n fs/ext4/inode.c | 911 +++++++++++++++++++++++++++++++-----\n fs/ext4/move_extent.c | 11 +\n fs/ext4/page-io.c | 203 ++++++++\n fs/ext4/super.c | 55 ++-\n fs/iomap/buffered-io.c | 20 +-\n include/trace/events/ext4.h | 142 ++++++\n 12 files changed, 1313 insertions(+), 140 deletions(-)" }