fsverity cleanups, speedup and memory usage optimization v2

Christoph Hellwig
2026-01-22T08:22:24Z

Hi all,

this series has a hodge podge of fsverity enhances that I looked into as
part of the review of the xfs fsverity support series.

The first part calls fsverity code from VFS code instead of requiring
boilerplate in the file systems. The first patch fixes a bug in btrfs
as part of that, as btrfs was missing a check. An xfstests
test case for this was submitted already.

The middle part optimizes the fsverity read path by kicking off readahead
for the fsverity hashes from the data read submission context, which in my
simply testing showed huge benefits for sequential reads using dd.
I haven't been able to get fio to run on a preallocated fio file, but
I expect random read benefits would be significantly better than that
still.

The last part avoids the need for a pointer in every inode for fsverity
and instead uses a rhashtable lookup, which is once per read_folio or
->readahead invocation and for for btrfs another time for each bio
completion. Right now this does not increse the number of inodes in
each slab, but for ext4 we are getting very close to that (within
16 bytes by my count).

Changes since v1:
- reorder to keep the most controversial part last
- drop moving the open handling to common code (for now)
- factor the page cache read code into common code
- reduce the number of hash lookups
- add a barrier in the fsverity_active that pairs with the cmpxchg
that sets the inode flag.

Diffstat:
fs/attr.c | 12 ++
fs/btrfs/btrfs_inode.h | 4
fs/btrfs/extent_io.c | 37 +++++---
fs/btrfs/inode.c | 13 ---
fs/btrfs/verity.c | 11 --
fs/buffer.c | 25 ++---
fs/ext4/ext4.h | 4
fs/ext4/inode.c | 4
fs/ext4/readpage.c | 31 ++++---
fs/ext4/super.c | 4
fs/ext4/verity.c | 34 ++------
fs/f2fs/compress.c | 7 -
fs/f2fs/data.c | 73 +++++++++++------
fs/f2fs/f2fs.h | 12 --
fs/f2fs/file.c | 4
fs/f2fs/inode.c | 1
fs/f2fs/super.c | 3
fs/f2fs/verity.c | 34 ++------
fs/inode.c | 9 ++
fs/verity/Makefile | 3
fs/verity/enable.c | 39 +++++----
fs/verity/fsverity_private.h | 19 ++--
fs/verity/open.c | 80 ++++++++++---------
fs/verity/pagecache.c | 53 ++++++++++++
fs/verity/read_metadata.c | 10 +-
fs/verity/verify.c | 94 +++++++++++++++-------
include/linux/fsverity.h | 180 +++++++++++++++----------------------------
27 files changed, 422 insertions(+), 378 deletions(-)