Show a cover letter.

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

{
    "id": 2218281,
    "url": "http://patchwork.ozlabs.org/api/covers/2218281/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/linux-ext4/cover/20260331212827.2631020-1-aalbersh@kernel.org/",
    "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": "<20260331212827.2631020-1-aalbersh@kernel.org>",
    "list_archive_url": null,
    "date": "2026-03-31T21:28:01",
    "name": "[v6,00/22] fs-verity support for XFS with post EOF merkle tree",
    "submitter": {
        "id": 92821,
        "url": "http://patchwork.ozlabs.org/api/people/92821/?format=api",
        "name": "Andrey Albershteyn",
        "email": "aalbersh@kernel.org"
    },
    "mbox": "http://patchwork.ozlabs.org/project/linux-ext4/cover/20260331212827.2631020-1-aalbersh@kernel.org/mbox/",
    "series": [
        {
            "id": 498255,
            "url": "http://patchwork.ozlabs.org/api/series/498255/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/linux-ext4/list/?series=498255",
            "date": "2026-03-31T21:28:01",
            "name": "fs-verity support for XFS with post EOF merkle tree",
            "version": 6,
            "mbox": "http://patchwork.ozlabs.org/series/498255/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/covers/2218281/comments/",
    "headers": {
        "Return-Path": "\n <SRS0=8jEc=B7=vger.kernel.org=linux-ext4+bounces-15547-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 (2048-bit key;\n unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256\n header.s=k20201202 header.b=j81Lyhmt;\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=8jec=b7=vger.kernel.org=linux-ext4+bounces-15547-patchwork-incoming=ozlabs.org@ozlabs.org;\n receiver=patchwork.ozlabs.org)",
            "gandalf.ozlabs.org;\n arc=pass smtp.remote-ip=172.232.135.74 arc.chain=subspace.kernel.org",
            "gandalf.ozlabs.org;\n dmarc=pass (p=quarantine dis=none) header.from=kernel.org",
            "gandalf.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256\n header.s=k20201202 header.b=j81Lyhmt;\n\tdkim-atps=neutral",
            "gandalf.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=172.232.135.74; helo=sto.lore.kernel.org;\n envelope-from=linux-ext4+bounces-15547-patchwork-incoming=ozlabs.org@vger.kernel.org;\n receiver=ozlabs.org)",
            "smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.b=\"j81Lyhmt\"",
            "smtp.subspace.kernel.org;\n arc=none smtp.client-ip=10.30.226.201"
        ],
        "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 4flh7l56bpz1yCp\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 01 Apr 2026 08:28:51 +1100 (AEDT)",
            "from mail.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3])\n\tby gandalf.ozlabs.org (Postfix) with ESMTP id 4flh7j6l3yz4wSN\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 01 Apr 2026 08:28:49 +1100 (AEDT)",
            "by gandalf.ozlabs.org (Postfix)\n\tid 4flh7j6gHNz4wGx; Wed, 01 Apr 2026 08:28:49 +1100 (AEDT)",
            "from sto.lore.kernel.org (sto.lore.kernel.org [172.232.135.74])\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 4flh7d6P5zz4wT3\n\tfor <patchwork-incoming@ozlabs.org>; Wed, 01 Apr 2026 08:28:45 +1100 (AEDT)",
            "from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sto.lore.kernel.org (Postfix) with ESMTP id 95DA030257BE\n\tfor <patchwork-incoming@ozlabs.org>; Tue, 31 Mar 2026 21:28:39 +0000 (UTC)",
            "from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id BB7EE45348A;\n\tTue, 31 Mar 2026 21:28:35 +0000 (UTC)",
            "from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org\n [10.30.226.201])\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 7C62B41B36F;\n\tTue, 31 Mar 2026 21:28:35 +0000 (UTC)",
            "by smtp.kernel.org (Postfix) with ESMTPSA id 3F73EC19423;\n\tTue, 31 Mar 2026 21:28:31 +0000 (UTC)"
        ],
        "ARC-Seal": [
            "i=2; a=rsa-sha256; d=ozlabs.org; s=201707; t=1774992529; cv=pass;\n\tb=N/NIG6HybhpKneEOe36ZD4Q1YzY6WRdcH9JIOiWkTBdC5/v5s+cxP9qnFKu+7/1EvcDp/NJove+bajI3IS1w85cv+fWGtp5U3Z1Bk2/7ux7zJVdmD1HCshRz3KPUZJZx676y4ShXGPd4L6PTC3JnyKF8fCfpcDw4xQ1KpwhDSkxwftj53z7xj9PT9negedtJobxlqo6rRb4DQFlFyJ2EZnILE+CnD/7IJQtA/oTv1djS2d7aBgd3g/p7vvYkVdzoobZRbAF1NfxV2DG7XMUYeBZveQ/hVc/nECFwRxuCDLq+C+DNz6Fe3SAx3yRdXI/0k0V2hMFxq8G89niR2UQTuA==",
            "i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1774992515; cv=none;\n b=qoRRaEvwcvJVdB1yYLcMd9jSbXpctAZshVYIy6vV8kDkoJjYzl2eNAXspndVMHSIVuz+H86Ig1a5Ge100uHz22+QHMGwuudQjiM8GZHyqf+TnAEvEftVSKeZMV+NTykEaAfujQ5Q1xzcAo8l6HO2x3vkYAWxW4LTr41L0eBla4Q="
        ],
        "ARC-Message-Signature": [
            "i=2; a=rsa-sha256; d=ozlabs.org; s=201707;\n\tt=1774992529; c=relaxed/relaxed;\n\tbh=FsYdT8pCxsujKXn8tffY/D7eD9LAPlHPTG8IEGiejzQ=;\n\th=From:To:Cc:Subject:Date:Message-ID:MIME-Version;\n b=lahMyA+KoC/dKxr4icwyidwGJ/zYrXX3sBsfkq8V508XUho7t8TAySgrkSRYMUja3rjXdYXF57LF9Htu5C3zOfqrZj8EgK6s8TtDA6LOL9QN2F1G9hQzKqck1Zxx2aqJHcLvRlNCyBNEa9RI0GGgvsesPbGfLi3VkZUYVkJv24JuEKFK4Dls+HS7rEsO2L760w7o6Q2GcmvGmw658355FwkqkSwJNz4wO9kqoh0kdn71USSXrq74ABBJitd6WcGI4geavp88afoQGsm33WEjFmTx8EtWqHlh5EkTEAWZx05iMTEYy/5uWXFRFY806ykr17/y1YHabVpvtQ0eTJanRg==",
            "i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1774992515; c=relaxed/simple;\n\tbh=O5Wp6PIWIi6fK+QRdUlQ+iPXF6IQd4G/Ipxw8Y2h6F0=;\n\th=From:To:Cc:Subject:Date:Message-ID:MIME-Version;\n b=QyStKBJhAI8jcubJHFfnNNsot0XaIB2yEN7YK+064mQMxUoX11dkJs1Ej8mHec9E5BVUrOnOalZEvBuHxKJ1BbcQkhSom5Usxx1m4I5p4J/wWinZh3oU6M0AoyjB1lvjT9n57qOPtidbAhLeMWX/BQ4KUpzwfDBeaufaj8snzew="
        ],
        "ARC-Authentication-Results": [
            "i=2; gandalf.ozlabs.org;\n dmarc=pass (p=quarantine dis=none) header.from=kernel.org;\n dkim=pass (2048-bit key;\n unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256\n header.s=k20201202 header.b=j81Lyhmt; dkim-atps=neutral;\n spf=pass (client-ip=172.232.135.74; helo=sto.lore.kernel.org;\n envelope-from=linux-ext4+bounces-15547-patchwork-incoming=ozlabs.org@vger.kernel.org;\n receiver=ozlabs.org) smtp.mailfrom=vger.kernel.org",
            "i=1; smtp.subspace.kernel.org;\n dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.b=j81Lyhmt; arc=none smtp.client-ip=10.30.226.201"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;\n\ts=k20201202; t=1774992515;\n\tbh=O5Wp6PIWIi6fK+QRdUlQ+iPXF6IQd4G/Ipxw8Y2h6F0=;\n\th=From:To:Cc:Subject:Date:From;\n\tb=j81LyhmtnQk57aq/T0bkR8mecM61ZoxgbjIC2SVzJGKqxUFGcie7GwUQcUVrDq5pW\n\t 5/vBDNIT+3ZwJTWr6Tmk1w940+392Nsx15FB87hgmRi9hGu6R3UwpVurGIGNhlu12A\n\t zNhGSf9zrTFfDKr+bqXs+/LbyHcVLa3h23iotWoH0WgpEe+1v6vtEj9tZ8eUS2Bmqc\n\t NigNAl8Y/+un/h2bVvesejWgFj903U+f1Oe7k7CK2n0tK88dk5/YPhvwAs0lG3pKpx\n\t QLZD3a3Alo2ODAqo0YQaTbZ1GxUXjlWlAN5HJ64N7vHEEFNMwIPgkb1e3xnJOe4owc\n\t 7zB/IcQz7+uDg==",
        "From": "Andrey Albershteyn <aalbersh@kernel.org>",
        "To": "linux-xfs@vger.kernel.org,\n\tfsverity@lists.linux.dev,\n\tlinux-fsdevel@vger.kernel.org,\n\tebiggers@kernel.org",
        "Cc": "Andrey Albershteyn <aalbersh@kernel.org>,\n\thch@lst.de,\n\tlinux-ext4@vger.kernel.org,\n\tlinux-f2fs-devel@lists.sourceforge.net,\n\tlinux-btrfs@vger.kernel.org,\n\tdjwong@kernel.org,\n\tdavid@fromorbit.com",
        "Subject": "[PATCH v6 00/22] fs-verity support for XFS with post EOF merkle tree",
        "Date": "Tue, 31 Mar 2026 23:28:01 +0200",
        "Message-ID": "<20260331212827.2631020-1-aalbersh@kernel.org>",
        "X-Mailer": "git-send-email 2.51.2",
        "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-Spam-Status": "No, score=-1.2 required=5.0 tests=ARC_SIGNED,ARC_VALID,\n\tDKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DMARC_PASS,\n\tMAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=disabled\n\tversion=4.0.1",
        "X-Spam-Checker-Version": "SpamAssassin 4.0.1 (2024-03-25) on gandalf.ozlabs.org"
    },
    "content": "Hi all,\n\nThis patch series adds fs-verity support for XFS. This version stores\nmerkle tree beyond end of the file, the same way as ext4 does it. The\ndifference is that verity descriptor is stored at the next aligned 64k\nblock after the merkle tree last block. This is done due to sparse\nmerkle tree which doesn't store hashes of zero data blocks.\n\nThe patchset starts with a few fs-verity preparation patches. Then, a\nfew patches to allow iomap to work in post EOF region. The XFS fs-verity\nimplementation follows.\n\nThe tree is read by iomap into page cache at offset of next largest\nfolio past end of file. The same offset is used for on-disk.\n\nThis patchsets also synthesizes merkle tree block full of hashes of\nzeroed data blocks. This merkle blocks are not stored on disk, they are\nholes in the tree.\n\nTesting. The -g verity is passing for 1k, 8k and 4k with/without quota\non 4k and 64k page size systems. Tested -g quick for enabled/disabled\nfsverity.\n\nThis series based on v7.0-rc6 with patchset fs generated integrity\ninformation [1].\n\nkernel:\nhttps://git.kernel.org/pub/scm/linux/kernel/git/aalbersh/xfs-linux.git/log/?h=b4/fsverity\n\nxfsprogs:\nhttps://github.com/alberand/xfsprogs/tree/b4/fsverity\n\nxfstests:\nhttps://github.com/alberand/xfstests/tree/b4/fsverity\n\nCc: fsverity@lists.linux.dev\nCc: linux-fsdevel@vger.kernel.org\nCc: linux-xfs@vger.kernel.org\n\nCc: david@fromorbit.com\nCc: djwong@kernel.org\nCc: ebiggers@kernel.org\nCc: hch@lst.de\n\n[1]: https://lore.kernel.org/linux-xfs/20260223132021.292832-1-hch@lst.de/\n\n---\nChanges in v6:\n- Removed stub for fsverity_ensure_verity_info() as it's optimized out\n- Rename fsverity_folio_zero_hash() to fsverify_fill_zerohash()\n- Merge patches 8 to 10 into one\n- Merge patch gerating zero_hash and fsverity_fill_zerohash() into one\n- Add kerneldoc to fsverity_ensure_verity_info()\n- Add comments to iomap_block_needs_zeroing()\nChanges in v5:\n- Add fserror_report_data_lost() for data blocks in page spanning EOF\n- Issue fsverity metadata readahead in data readahead\n- iomap_fsverity_write() return type fix\n- Use of S_ISREG(mode)\n- Make 65536 #define instead of open-coded\n- Use transaction per unwritten extent removal\n- Fetch fsverity_info for all fsverity metadata\n- Revert fsverity_folio_zero_hash() stub as used in iomap\n- Extend cancel_unwritten to whole file range to remove cow leftovers\n- Drop delayed allocation on the COW fork on fsverity completion\nChanges in v4:\n- Use fserror interface in fsverity instead of fs callback\n- Hoist pagecache_read from f2fs/ext4 to fsverity\n- Refactor iomap code\n- Fetch fsverity_info only for file data and merkle tree holes\n- Do not disable preallocation, remove unwritten extents instead\n- Offload fsverity hash I/O to fsverity workqueue in read path\n- Store merkle tree at round_up(i_size, 64k)\n- Add a spacing between merkle tree and fsverity descriptor as next 64k\n  aligned block\n- Squash helpers into first user commits\n- Squash on-disk format changes into single commit\n- Drop different offset for pagecache/on-disk\n- Don't zero out pages in higher order folios in write path\n- Link to v3: https://lore.kernel.org/fsverity/20260217231937.1183679-1-aalbersh@kernel.org/T/#t\nChanges in v3:\n- Different on-disk and pagecache offset\n- Use read path ioends\n- Switch to hashtable fsverity info\n- Synthesize merkle tree blocks full of zeroes\n- Other minor refactors\n- Link to v2: https://lore.kernel.org/fsverity/20260114164210.GO15583@frogsfrogsfrogs/T/#t\nChanges in v2:\n- Move to VFS interface for merkle tree block reading\n- Drop patchset for per filesystem workqueues\n- Change how offsets of the descriptor and tree metadata is calculated\n- Store fs-verity descriptor in data fork side by side with merkle tree\n- Simplify iomap changes, remove interface for post eof read/write\n- Get rid of extended attribute implementation\n- Link to v1: https://lore.kernel.org/r/20250728-fsverity-v1-0-9e5443af0e34@kernel.org\n\nAndrey Albershteyn (20):\n  fsverity: report validation errors through fserror to fsnotify\n  fsverity: expose ensure_fsverity_info()\n  fsverity: generate and store zero-block hash\n  fsverity: pass digest size and hash of the empty block to ->write\n  fsverity: hoist pagecache_read from f2fs/ext4 to fsverity\n  iomap: introduce IOMAP_F_FSVERITY and teach writeback to handle\n    fsverity\n  iomap: teach iomap to read files with fsverity\n  iomap: introduce iomap_fsverity_write() for writing fsverity metadata\n  xfs: introduce fsverity on-disk changes\n  xfs: initialize fs-verity on file open\n  xfs: don't allow to enable DAX on fs-verity sealed inode\n  xfs: disable direct read path for fs-verity files\n  xfs: handle fsverity I/O in write/read path\n  xfs: use read ioend for fsverity data verification\n  xfs: add fs-verity support\n  xfs: remove unwritten extents after preallocations in fsverity\n    metadata\n  xfs: add fs-verity ioctls\n  xfs: introduce health state for corrupted fsverity metadata\n  xfs: add fsverity traces\n  xfs: enable ro-compat fs-verity flag\n\nDarrick J. Wong (2):\n  xfs: advertise fs-verity being available on filesystem\n  xfs: check and repair the verity inode flag state\n\n fs/btrfs/verity.c              |   6 +-\n fs/ext4/verity.c               |  36 +--\n fs/f2fs/verity.c               |  34 +--\n fs/iomap/buffered-io.c         | 109 +++++++-\n fs/iomap/trace.h               |   3 +-\n fs/verity/enable.c             |   4 +-\n fs/verity/fsverity_private.h   |   3 +\n fs/verity/open.c               |   8 +-\n fs/verity/pagecache.c          |  55 ++++\n fs/verity/verify.c             |   4 +\n fs/xfs/Makefile                |   1 +\n fs/xfs/libxfs/xfs_bmap.c       |   7 +\n fs/xfs/libxfs/xfs_format.h     |  35 ++-\n fs/xfs/libxfs/xfs_fs.h         |   2 +\n fs/xfs/libxfs/xfs_health.h     |   4 +-\n fs/xfs/libxfs/xfs_inode_buf.c  |   8 +\n fs/xfs/libxfs/xfs_inode_util.c |   2 +\n fs/xfs/libxfs/xfs_sb.c         |   4 +\n fs/xfs/scrub/attr.c            |   7 +\n fs/xfs/scrub/common.c          |  53 ++++\n fs/xfs/scrub/common.h          |   2 +\n fs/xfs/scrub/inode.c           |   7 +\n fs/xfs/scrub/inode_repair.c    |  36 +++\n fs/xfs/xfs_aops.c              |  62 ++++-\n fs/xfs/xfs_bmap_util.c         |   8 +\n fs/xfs/xfs_file.c              |  19 +-\n fs/xfs/xfs_fsverity.c          | 457 +++++++++++++++++++++++++++++++++\n fs/xfs/xfs_fsverity.h          |  28 ++\n fs/xfs/xfs_health.c            |   1 +\n fs/xfs/xfs_inode.h             |   6 +\n fs/xfs/xfs_ioctl.c             |  14 +\n fs/xfs/xfs_iomap.c             |  15 +-\n fs/xfs/xfs_iops.c              |   4 +\n fs/xfs/xfs_message.c           |   4 +\n fs/xfs/xfs_message.h           |   1 +\n fs/xfs/xfs_mount.h             |   4 +\n fs/xfs/xfs_super.c             |   7 +\n fs/xfs/xfs_trace.h             |  46 ++++\n include/linux/fsverity.h       |  29 ++-\n include/linux/iomap.h          |  13 +\n 40 files changed, 1054 insertions(+), 94 deletions(-)\n create mode 100644 fs/xfs/xfs_fsverity.c\n create mode 100644 fs/xfs/xfs_fsverity.h"
}