Show a cover letter.

GET /api/1.2/covers/2211741/?format=api
HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2211741,
    "url": "http://patchwork.ozlabs.org/api/1.2/covers/2211741/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/linux-ext4/cover/20260317084624.457185-1-me@linux.beauty/",
    "project": {
        "id": 8,
        "url": "http://patchwork.ozlabs.org/api/1.2/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": "<20260317084624.457185-1-me@linux.beauty>",
    "list_archive_url": null,
    "date": "2026-03-17T08:46:15",
    "name": "[RFC,v5,0/7] ext4: fast commit: snapshot inode state for FC log",
    "submitter": {
        "id": 84264,
        "url": "http://patchwork.ozlabs.org/api/1.2/people/84264/?format=api",
        "name": "Li Chen",
        "email": "me@linux.beauty"
    },
    "mbox": "http://patchwork.ozlabs.org/project/linux-ext4/cover/20260317084624.457185-1-me@linux.beauty/mbox/",
    "series": [
        {
            "id": 496215,
            "url": "http://patchwork.ozlabs.org/api/1.2/series/496215/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/linux-ext4/list/?series=496215",
            "date": "2026-03-17T08:46:15",
            "name": "ext4: fast commit: snapshot inode state for FC log",
            "version": 5,
            "mbox": "http://patchwork.ozlabs.org/series/496215/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/covers/2211741/comments/",
    "headers": {
        "Return-Path": "\n <SRS0=DhE6=BR=vger.kernel.org=linux-ext4+bounces-15097-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\tdkim=pass (1024-bit key;\n unprotected) header.d=linux.beauty header.i=me@linux.beauty\n header.a=rsa-sha256 header.s=zmail header.b=MmYMkBBC;\n\tdkim-atps=neutral",
            "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=dhe6=br=vger.kernel.org=linux-ext4+bounces-15097-patchwork-incoming=ozlabs.org@ozlabs.org;\n receiver=patchwork.ozlabs.org)",
            "gandalf.ozlabs.org;\n arc=pass smtp.remote-ip=172.105.105.114\n arc.chain=\"subspace.kernel.org:zohomail.com\"",
            "gandalf.ozlabs.org;\n dmarc=pass (p=none dis=none) header.from=linux.beauty",
            "gandalf.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=linux.beauty header.i=me@linux.beauty\n header.a=rsa-sha256 header.s=zmail header.b=MmYMkBBC;\n\tdkim-atps=neutral",
            "gandalf.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=172.105.105.114; helo=tor.lore.kernel.org;\n envelope-from=linux-ext4+bounces-15097-patchwork-incoming=ozlabs.org@vger.kernel.org;\n receiver=ozlabs.org)",
            "smtp.subspace.kernel.org;\n\tdkim=pass (1024-bit key) header.d=linux.beauty header.i=me@linux.beauty\n header.b=\"MmYMkBBC\"",
            "smtp.subspace.kernel.org;\n arc=pass smtp.client-ip=136.143.188.15",
            "smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=linux.beauty",
            "smtp.subspace.kernel.org;\n spf=pass smtp.mailfrom=linux.beauty"
        ],
        "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 server-signature ECDSA (secp384r1 raw public key)\n server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fZlvC27H3z1xqn\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 17 Mar 2026 19:47:03 +1100 (AEDT)",
            "from mail.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3])\n\tby gandalf.ozlabs.org (Postfix) with ESMTP id 4fZlvB2s5Yz4w9T\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 17 Mar 2026 19:47:02 +1100 (AEDT)",
            "by gandalf.ozlabs.org (Postfix)\n\tid 4fZlvB2lXcz4w9k; Tue, 17 Mar 2026 19:47:02 +1100 (AEDT)",
            "from tor.lore.kernel.org (tor.lore.kernel.org [172.105.105.114])\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 4fZlv56PDyz4w9T\n\tfor <patchwork-incoming@ozlabs.org>; Tue, 17 Mar 2026 19:46:57 +1100 (AEDT)",
            "from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby tor.lore.kernel.org (Postfix) with ESMTP id 251F33025145\n\tfor <patchwork-incoming@ozlabs.org>; Tue, 17 Mar 2026 08:46:56 +0000 (UTC)",
            "from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id DCE8439C648;\n\tTue, 17 Mar 2026 08:46:52 +0000 (UTC)",
            "from sender4-op-o15.zoho.com (sender4-op-o15.zoho.com\n [136.143.188.15])\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 D3AC725A2C6;\n\tTue, 17 Mar 2026 08:46:50 +0000 (UTC)",
            "by mx.zohomail.com with SMTPS id 1773737196851456.3272384599427;\n\tTue, 17 Mar 2026 01:46:36 -0700 (PDT)"
        ],
        "ARC-Seal": [
            "i=3; a=rsa-sha256; d=ozlabs.org; s=201707; t=1773737222; cv=pass;\n\tb=eUbWZ+35RA0h2DwttwfAPypXQhlpmL/CJSad8mNsvw1W4lqfRJI+N3vQc6CckwlnJzlpo6yO6iXgoBwLR5Yhy90MJPBRquRM6fnRwha7ShMbzF/2UPc1qjrbkmT9ddk2b55pvO79LQqQQa53NkY07H1uZbAsRHg7gtHooGSctULSfkh7cKTgw0kcJnXPqnVcdlsoYLOb8LuQrPmJ/XeIT9una5zwyOtPYc/bGF4Q+r4u+9wRZyXep/I5yHBOeUdmPg85y8AKHXpBjjpgCMwTmeaMmhgBbm5U7V5DH5/xo22qiA8yxOK2qBPK4HyZRDiZmMhODVCevezQFLmUBQFAJg==",
            "i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1773737212; cv=pass;\n b=MvB94j8qJDrrveFJ9O56qimH6Ua7aOf4mWXGtkXpUjqnkfj5ZBBft4wtiVt3cyWYMFQiaMQXBCLMMie/zWeHRgOOSM32GS4Qky7VKDZVZ4SR2wgU5S+PiMGemjrzztSxK0yINtB3ZAo0ODvgLIzzaVWlVPWrKTd9lvXdqCDFHVE=",
            "i=1; a=rsa-sha256; t=1773737199; cv=none;\n\td=zohomail.com; s=zohoarc;\n\tb=UdPJlk/vzE0xaLErWh9bcCgDnrUce05XF7Hv8uVzwb96jkdQJFORrRdEc3jANyErd/LYfqO0zWcxxj5DzNsasPUiPZz0GgseNJdRcipLgt3KzQkIrpeFs/haohBSe8zVtXjGrGcx7fTdJHUJ91Mtw3gBeI56AYhXpfHVct5azw8="
        ],
        "ARC-Message-Signature": [
            "i=3; a=rsa-sha256; d=ozlabs.org; s=201707;\n\tt=1773737222; c=relaxed/relaxed;\n\tbh=fLJIQAAt5xHN9p781jAFKEe7AE08plu24BBTw9o/6pg=;\n\th=From:To:Cc:Subject:Date:Message-ID:MIME-Version;\n b=Zt7eztfTCsvht/nf1n70v+acY6/rjudMox2rVjO82U7oCdMlrADnMBjmM1AlHWTsQXoFjrm30D61Avoi85IRn3RrqewRXe+9wq7Tm6nEuvW01yGw6uaGNH5/7BAXjtZ1eoesJvaOCDlqjMECwuqOeLsm0efGtMBHdbUWHwlG2en3H5K52Vj3aB0e3RhkKlYFeALwuj/bi9APctb7zXVtLbTPsIRhfj+yjET3uAyiKPFA7u/xDzGufeD1y4AzliV709Lg/NMrmLTlJNhnCdGsjMMTUC0U0XMsRiTPeUWrmh1urNj/95U7bz97fQhMdoT6b6ItXWXgLm4LWsJJcocx5w==",
            "i=2; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1773737212; c=relaxed/simple;\n\tbh=aup1IqZo9UMazhxj1av/hE/2NVMwmtq/EKHwIvmWTNM=;\n\th=From:To:Cc:Subject:Date:Message-ID:MIME-Version;\n b=PWodmHrZhXVqTHVXSIV/TZapb/KWLw50IgdK9qwFOk07Aej81efTs6VtYqIP5orLJ899RmI4qge7+JOn3xDsbQyeFO/RlawjDFO9h0zNGACzCFwyuRad2hM2brhfOI/TyS7Fx0HUdqPszsGSpmERvf1fQCgBDIT4X0GrJdCfibc=",
            "i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com;\n s=zohoarc;\n\tt=1773737199;\n h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:MIME-Version:Message-ID:Subject:Subject:To:To:Message-Id:Reply-To;\n\tbh=fLJIQAAt5xHN9p781jAFKEe7AE08plu24BBTw9o/6pg=;\n\tb=j8L0XjmZ5jNq71lzSbHlCkASYJ/xyMbzLPDHgGgB5iuD93RJLO+76DT/GXZKM1eVbqnz08cF4C5p/ty7cJcVjD0jRRnhGEciYRveS4W4146AMbk4HjUO8T9cdTECq5WEQoxibzNyL5LnJFU11WDfy2eJappdVd1b8x5oDr41lIQ="
        ],
        "ARC-Authentication-Results": [
            "i=3; gandalf.ozlabs.org;\n dmarc=pass (p=none dis=none) header.from=linux.beauty;\n dkim=pass (1024-bit key;\n unprotected) header.d=linux.beauty header.i=me@linux.beauty\n header.a=rsa-sha256 header.s=zmail header.b=MmYMkBBC; dkim-atps=neutral;\n spf=pass (client-ip=172.105.105.114; helo=tor.lore.kernel.org;\n envelope-from=linux-ext4+bounces-15097-patchwork-incoming=ozlabs.org@vger.kernel.org;\n receiver=ozlabs.org) smtp.mailfrom=vger.kernel.org",
            "i=2; smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=linux.beauty;\n spf=pass smtp.mailfrom=linux.beauty;\n dkim=pass (1024-bit key) header.d=linux.beauty header.i=me@linux.beauty\n header.b=MmYMkBBC; arc=pass smtp.client-ip=136.143.188.15",
            "i=1; mx.zohomail.com;\n\tdkim=pass  header.i=linux.beauty;\n\tspf=pass  smtp.mailfrom=me@linux.beauty;\n\tdmarc=pass header.from=<me@linux.beauty>"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; t=1773737199;\n\ts=zmail; d=linux.beauty; i=me@linux.beauty;\n\th=From:From:To:To:Cc:Cc:Subject:Subject:Date:Date:Message-ID:MIME-Version:Content-Transfer-Encoding:Message-Id:Reply-To;\n\tbh=fLJIQAAt5xHN9p781jAFKEe7AE08plu24BBTw9o/6pg=;\n\tb=MmYMkBBCxhuxKWISiZ8S16509Tldi+H6KOD4siBVhvqZuurho+nNXDECzXAjMn4P\n\tkA3uyUD6lbBVj5O2Fx8zO+Lzd2SaSJPhJKyF5uYYUr7HqCYUce+fuiwKGw+DHKYWlYj\n\t12sHgYGyfWJyWC+ZviSw93nvmeupLrLoj3SKVww0=",
        "From": "Li Chen <me@linux.beauty>",
        "To": "Zhang Yi <yi.zhang@huaweicloud.com>,\n\tTheodore Ts'o <tytso@mit.edu>,\n\tAndreas Dilger <adilger.kernel@dilger.ca>",
        "Cc": "Steven Rostedt <rostedt@goodmis.org>,\n\tMasami Hiramatsu <mhiramat@kernel.org>,\n\tMathieu Desnoyers <mathieu.desnoyers@efficios.com>,\n\tlinux-ext4@vger.kernel.org,\n\tlinux-trace-kernel@vger.kernel.org,\n\tlinux-kernel@vger.kernel.org",
        "Subject": "[RFC v5 0/7] ext4: fast commit: snapshot inode state for FC log",
        "Date": "Tue, 17 Mar 2026 16:46:15 +0800",
        "Message-ID": "<20260317084624.457185-1-me@linux.beauty>",
        "X-Mailer": "git-send-email 2.53.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-ZohoMailClient": "External",
        "X-Spam-Status": "No, score=-1.2 required=5.0 tests=ARC_SIGNED,ARC_VALID,\n\tDKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DMARC_PASS,\n\tHEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE,\n\tSPF_PASS autolearn=disabled version=4.0.1",
        "X-Spam-Checker-Version": "SpamAssassin 4.0.1 (2024-03-25) on gandalf.ozlabs.org"
    },
    "content": "Hi,\n\n(This RFC v5 series is based on linux-next tag next-20260106 plus the\nprerequisite patch \"ext4: fast commit: make s_fc_lock reclaim-safe\":\nhttps://lore.kernel.org/all/20260106120621.440126-1-me@linux.beauty/)\n\nZhang Yi in RFC v3 review pointed out that postponing lockdep assertions only\nmasks the issue, and that sleeping in ext4_fc_track_inode() while holding\ni_data_sem can form a real ABBA deadlock if the fast commit writer also needs\ni_data_sem while the inode is in FC_COMMITTING.\n\nZhang Yi suggested two possible directions to address the root cause:\n\n1. \"Ha, the solution seems to have already been listed in the TODOs in\nfast_commit.c.\n\n  Change ext4_fc_commit() to lookup logical to physical mapping using extent\n  status tree. This would get rid of the need to call ext4_fc_track_inode()\n  before acquiring i_data_sem. To do that we would need to ensure that\n  modified extents from the extent status tree are not evicted from memory.\"\n\n2. \"Alternatively, recording the mapped range of tracking might also be\nfeasible.\"\n\nThis series implements a hybrid way: it implements approach 2 by snapshotting inode image\nand mapped ranges at commit time, and consuming only snapshots during log\nwriting.\n\nApproach 2 still needs a mapping source while building the snapshot\n(logical-to-physical and unwritten/hole semantics). Calling ext4_map_blocks()\nthere would take i_data_sem and can block inside the\njbd2_journal_lock_updates() window, which risks deadlocks or unbounded stalls.\nSo the snapshot path uses approach 1's extent status lookups as a best-effort\nmapping source to avoid ext4_map_blocks().\n\nI did not fully implement approach 1 (making extent status lookups\nauthoritative by preventing reclaim of needed entries) because that would need\nadditional pinning/integration under memory pressure and a larger correctness\nsurface. Instead, the extent status tree is treated as a cache and the\nsnapshot path falls back to full commit on cache misses or unstable mappings\n(e.g. delayed allocation).\n\nLock inversion / deadlock model (before):\n\nCPU0 (metadata update)               CPU1 (fast commit)\n--------------------               -----------------\n... hold i_data_sem (A)             mutex_lock(s_fc_lock) (B)\n    ext4_fc_track_inode()             ext4_fc_write_inode_data()\n      mutex_lock(s_fc_lock) (B)         ext4_map_blocks()\n      wait FC_COMMITTING (sleep)          down_read(i_data_sem) (A)\n\nThis creates i_data_sem (A) -> s_fc_lock (B) on update paths, and\ns_fc_lock (B) -> i_data_sem (A) on commit paths. Once CPU0 sleeps while\nholding (A), CPU1 can block on (A) while holding (B), completing the ABBA\ncycle.\n\nNew model (this series):\n\nCPU0 (metadata update)               CPU1 (fast commit)\n--------------------               -----------------\n... maybe hold i_data_sem (A)        jbd2_journal_lock_updates()\n    ext4_fc_track_*()                 snapshot inode + ranges (no map_blocks)\n      mutex_lock(s_fc_lock) (B)       jbd2_journal_unlock_updates()\n      if FC_COMMITTING: set FC_REQUEUE s_fc_lock (B)\n      no sleep                         write FC log from snapshots only\n                                    cleanup: clear COMMITTING, requeue if set\n\nThe commit path no longer takes i_data_sem while holding s_fc_lock, and\ntracking no longer sleeps waiting for FC_COMMITTING. If an inode is updated\nduring a fast commit, EXT4_STATE_FC_REQUEUE records that fact and the inode\nis moved to FC_Q_STAGING for the next commit.\nThe only remaining FC_COMMITTING waiter is ext4_fc_del(), which drops\ns_fc_lock before sleeping.\n\nThis series snapshots the on-disk inode and tracked data ranges while journal\nupdates are locked and existing handles are drained. The log writing phase then\nserializes only snapshots, so it no longer needs to call ext4_map_blocks() and\ntake i_data_sem under s_fc_lock. This is done in two steps: patch 1 drops\next4_map_blocks() from log writing by introducing commit-time snapshots, and\npatch 5 drops ext4_map_blocks() from the snapshot path by using the extent\nstatus cache. The snapshot also records whether a mapped extent is unwritten,\nso the ADD_RANGE records (and replay) preserve unwritten semantics.\n\nSnapshotting runs under jbd2_journal_lock_updates(). Since a cache miss in\next4_get_inode_loc() can start synchronous inode table I/O and stall handle\nstarts for milliseconds, patch 1 uses ext4_get_inode_loc_noio() and falls back\nto full commit if the inode table block is not present or not uptodate.\n\next4_fc_track_inode() also stops waiting for FC_COMMITTING. Updates during an\nongoing fast commit are marked with EXT4_STATE_FC_REQUEUE and are replayed in\nthe next fast commit, while ext4_fc_del() waits for FC_COMMITTING so an inode\ncannot be removed while the commit thread is still using it.\n\nThe extent status tree is a cache, not an authoritative source, so the snapshot\npath falls back to full commit on cache misses or unstable mappings (e.g.\ndelayed allocation). This includes cases where extent status entries are not\npresent (or have been reclaimed) under memory pressure. The snapshot path does\nnot try to rebuild mappings by calling ext4_map_blocks(); instead it simply\nmarks the transaction fast commit ineligible.\n\nTo keep the updates-locked window bounded, the snapshot path caps the number of\nsnapshotted inodes and ranges per fast commit (currently 1024 inodes and 2048\nranges) and falls back to full commit when the cap is exceeded. The series also\nhandles the journal inode i_data_sem lockdep false positive via subclassing;\njournal inode mapping may still take i_data_sem even when data inode mapping is\navoided.\n\nPatch 6 adds the ext4_fc_lock_updates tracepoint to quantify the updates-locked\nwindow and snapshot fallback reasons. Patch 7 extends\n/proc/fs/ext4/<sb_id>/fc_info with best-effort snapshot counters. If the /proc\ninterface is undesirable, I can drop patch 7 and keep the tracepoint only, or\ndrop even both.\n\nTesting and measurement were done on a QEMU/KVM guest with virtio-pmem + dax\n(ext4 -O fast_commit, mounted dax,noatime). The workload does python3 500x\n{4K write + fsync}, fallocate 256M, and python3 500x {creat + fsync(dir)}.\nOver 3 cold boots, ext4_fc_lock_updates reported locked_ns p50 2.88-2.92 us,\np99 <= 6.71 us, and max <= 102.71 us, with snap_err always 0. Under stress-ng\nmemory pressure (stress-ng --vm 4 --vm-bytes 75% --timeout 60s), locked_ns p50\n2.94 us, p99 <= 4.97 us, and max <= 20.07 us. The fc_info snapshot failure\ncounters stayed at 0.\nThese hold times are in the low microseconds range, and the caps keep the\nworst case bounded.\n\nComments and guidance are very welcome. Please let me know if there are any\nconcerns about correctness, corner cases, or better approaches.\n\nRFC v4 -> RFC v5:\n- Patch 6: Make ext4_fc_lock_updates snap_err human readable via\n  TRACE_DEFINE_ENUM() + __print_symbolic(), using a single TRACE_SNAP_ERR\n  mapping while keeping the enum values stable for tooling.\n\nRFC v3 -> RFC v4:\n- Replace lockdep_assert movement with removing the wait in\n  ext4_fc_track_inode() and using EXT4_STATE_FC_REQUEUE to capture updates\n  during an ongoing fast commit.\n- Replace dropping s_fc_lock around log writing with commit-time snapshots of\n  inode image and mapped ranges (recording the mapped range of tracking as\n  suggested by Zhang Yi) so log writing consumes only snapshots.\n- Avoid inode table I/O under jbd2_journal_lock_updates() via\n  ext4_get_inode_loc_noio() and fallback to full commit on cache misses.\n- Use the extent status cache for snapshot mappings and fall back to full\n  commit on cache misses or unstable mappings (e.g. delayed allocation).\n- Add tracepoint and /proc snapshot stats to quantify the updates-locked window\n  and snapshot fallback reasons.\n\nRFC v2 -> RFC v3:\n- rebase on top of\n  https://lore.kernel.org/linux-ext4/20251223131342.287864-1-me@linux.beauty/T/#u\n\nRFC v1 -> RFC v2:\n- patch 1: move comments to correct place\n- patch 2: add it to patchset.\n- add missing RFC prefix\n\nRFC v1: https://lore.kernel.org/linux-ext4/20251222032655.87056-1-me@linux.beauty/T/#u\nRFC v2: https://lore.kernel.org/linux-ext4/20251222151906.24607-1-me@linux.beauty/T/#t\nRFC v3: https://lore.kernel.org/linux-ext4/20251224032943.134063-1-me@linux.beauty/\nRFC v4: https://lore.kernel.org/all/20260120112538.132774-1-me@linux.beauty/t/#m9a6c8f2391c6dc67471e918a0577b130e7633e49\n\nThanks,\nLi Chen (7):\n  ext4: fast commit: snapshot inode state before writing log\n  ext4: lockdep: handle i_data_sem subclassing for special inodes\n  ext4: fast commit: avoid waiting for FC_COMMITTING\n  ext4: fast commit: avoid self-deadlock in inode snapshotting\n  ext4: fast commit: avoid i_data_sem by dropping ext4_map_blocks() in\n    snapshots\n  ext4: fast commit: add lock_updates tracepoint\n  ext4: fast commit: export snapshot stats in fc_info\n\n fs/ext4/ext4.h              |  73 +++-\n fs/ext4/fast_commit.c       | 703 +++++++++++++++++++++++++++++-------\n fs/ext4/inode.c             |  51 +++\n fs/ext4/super.c             |   9 +\n include/trace/events/ext4.h |  61 ++++\n 5 files changed, 763 insertions(+), 134 deletions(-)"
}