From: "Darrick J. Wong" <djwong@kernel.org>
To: Christoph Hellwig <hch@lst.de>
Cc: Eric Biggers <ebiggers@kernel.org>,
Al Viro <viro@zeniv.linux.org.uk>,
Christian Brauner <brauner@kernel.org>, Jan Kara <jack@suse.cz>,
David Sterba <dsterba@suse.com>, Theodore Ts'o <tytso@mit.edu>,
Jaegeuk Kim <jaegeuk@kernel.org>, Chao Yu <chao@kernel.org>,
Andrey Albershteyn <aalbersh@redhat.com>,
"Matthew Wilcox (Oracle)" <willy@infradead.org>,
linux-fsdevel@vger.kernel.org, linux-btrfs@vger.kernel.org,
linux-ext4@vger.kernel.org,
linux-f2fs-devel@lists.sourceforge.net, fsverity@lists.linux.dev
Subject: Re: [PATCH 06/11] fsverity: push out fsverity_info lookup
Date: Thu, 22 Jan 2026 13:45:51 -0800 [thread overview]
Message-ID: <20260122214551.GF5910@frogsfrogsfrogs> (raw)
In-Reply-To: <20260122082214.452153-7-hch@lst.de>
On Thu, Jan 22, 2026 at 09:22:02AM +0100, Christoph Hellwig wrote:
> Pass a struct fsverity_info to the verification and readahead helpers,
> and push the lookup into the callers. Right now this is a very
> dumb almost mechanic move that open codes a lot of fsverity_info_addr()
> calls int the file systems. The subsequent patches will clean this up.
>
> This prepares for reducing the number of fsverity_info lookups, which
> will allow to amortize them better when using a more expensive lookup
> method.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
> fs/btrfs/extent_io.c | 4 +++-
> fs/buffer.c | 4 +++-
> fs/ext4/readpage.c | 11 ++++++++---
> fs/f2fs/compress.c | 4 +++-
> fs/f2fs/data.c | 15 +++++++++++----
> fs/verity/verify.c | 26 ++++++++++++++------------
> include/linux/fsverity.h | 24 +++++++++++++++---------
> 7 files changed, 57 insertions(+), 31 deletions(-)
>
> diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
> index a4b74023618d..6e65e2cdf950 100644
> --- a/fs/btrfs/extent_io.c
> +++ b/fs/btrfs/extent_io.c
> @@ -484,7 +484,8 @@ static bool btrfs_verify_folio(struct folio *folio, u64 start, u32 len)
> btrfs_folio_test_uptodate(fs_info, folio, start, len) ||
> start >= i_size_read(folio->mapping->host))
> return true;
> - return fsverity_verify_folio(folio);
> + return fsverity_verify_folio(*fsverity_info_addr(folio->mapping->host),
<shudder>
At least that goes away in a few patches so
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
--D
> + folio);
> }
>
> static void end_folio_read(struct folio *folio, bool uptodate, u64 start, u32 len)
> @@ -578,6 +579,7 @@ static void end_bbio_data_read(struct btrfs_bio *bbio)
> struct folio_iter fi;
>
> ASSERT(!bio_flagged(bio, BIO_CLONED));
> +
> bio_for_each_folio_all(fi, &bbio->bio) {
> bool uptodate = !bio->bi_status;
> struct folio *folio = fi.folio;
> diff --git a/fs/buffer.c b/fs/buffer.c
> index 838c0c571022..3982253b6805 100644
> --- a/fs/buffer.c
> +++ b/fs/buffer.c
> @@ -309,9 +309,11 @@ static void verify_bh(struct work_struct *work)
> struct postprocess_bh_ctx *ctx =
> container_of(work, struct postprocess_bh_ctx, work);
> struct buffer_head *bh = ctx->bh;
> + struct inode *inode = bh->b_folio->mapping->host;
> bool valid;
>
> - valid = fsverity_verify_blocks(bh->b_folio, bh->b_size, bh_offset(bh));
> + valid = fsverity_verify_blocks(*fsverity_info_addr(inode), bh->b_folio,
> + bh->b_size, bh_offset(bh));
> end_buffer_async_read(bh, valid);
> kfree(ctx);
> }
> diff --git a/fs/ext4/readpage.c b/fs/ext4/readpage.c
> index 574584123b8a..02f918cf1945 100644
> --- a/fs/ext4/readpage.c
> +++ b/fs/ext4/readpage.c
> @@ -96,6 +96,7 @@ static void verity_work(struct work_struct *work)
> struct bio_post_read_ctx *ctx =
> container_of(work, struct bio_post_read_ctx, work);
> struct bio *bio = ctx->bio;
> + struct inode *inode = bio_first_folio_all(bio)->mapping->host;
>
> /*
> * fsverity_verify_bio() may call readahead() again, and although verity
> @@ -108,7 +109,7 @@ static void verity_work(struct work_struct *work)
> mempool_free(ctx, bio_post_read_ctx_pool);
> bio->bi_private = NULL;
>
> - fsverity_verify_bio(bio);
> + fsverity_verify_bio(*fsverity_info_addr(inode), bio);
>
> __read_end_io(bio);
> }
> @@ -244,7 +245,8 @@ int ext4_mpage_readpages(struct inode *inode,
>
> if (first_folio) {
> if (ext4_need_verity(inode, folio->index))
> - fsverity_readahead(folio, nr_pages);
> + fsverity_readahead(*fsverity_info_addr(inode),
> + folio, nr_pages);
> first_folio = false;
> }
>
> @@ -335,8 +337,11 @@ int ext4_mpage_readpages(struct inode *inode,
> folio_zero_segment(folio, first_hole << blkbits,
> folio_size(folio));
> if (first_hole == 0) {
> + struct fsverity_info *vi =
> + *fsverity_info_addr(folio->mapping->host);
> +
> if (ext4_need_verity(inode, folio->index) &&
> - !fsverity_verify_folio(folio))
> + !fsverity_verify_folio(vi, folio))
> goto set_error_page;
> folio_end_read(folio, true);
> continue;
> diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c
> index 7b68bf22989d..0c269b875e0c 100644
> --- a/fs/f2fs/compress.c
> +++ b/fs/f2fs/compress.c
> @@ -1814,7 +1814,9 @@ static void f2fs_verify_cluster(struct work_struct *work)
> if (!rpage)
> continue;
>
> - if (fsverity_verify_page(rpage))
> + if (fsverity_verify_page(
> + *fsverity_info_addr(rpage->mapping->host),
> + rpage))
> SetPageUptodate(rpage);
> else
> ClearPageUptodate(rpage);
> diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
> index 49bdc7e771f2..bca1e34d327a 100644
> --- a/fs/f2fs/data.c
> +++ b/fs/f2fs/data.c
> @@ -185,15 +185,19 @@ static void f2fs_verify_bio(struct work_struct *work)
>
> bio_for_each_folio_all(fi, bio) {
> struct folio *folio = fi.folio;
> + struct fsverity_info *vi =
> + *fsverity_info_addr(folio->mapping->host);
>
> if (!f2fs_is_compressed_page(folio) &&
> - !fsverity_verify_page(&folio->page)) {
> + !fsverity_verify_page(vi, &folio->page)) {
> bio->bi_status = BLK_STS_IOERR;
> break;
> }
> }
> } else {
> - fsverity_verify_bio(bio);
> + struct inode *inode = bio_first_folio_all(bio)->mapping->host;
> +
> + fsverity_verify_bio(*fsverity_info_addr(inode), bio);
> }
>
> f2fs_finish_read_bio(bio, true);
> @@ -2121,7 +2125,9 @@ static int f2fs_read_single_page(struct inode *inode, struct folio *folio,
> zero_out:
> folio_zero_segment(folio, 0, folio_size(folio));
> if (f2fs_need_verity(inode, index) &&
> - !fsverity_verify_folio(folio)) {
> + !fsverity_verify_folio(
> + *fsverity_info_addr(folio->mapping->host),
> + folio)) {
> ret = -EIO;
> goto out;
> }
> @@ -2386,7 +2392,8 @@ static int f2fs_mpage_readpages(struct inode *inode,
>
> if (first_folio) {
> if (f2fs_need_verity(inode, folio->index))
> - fsverity_readahead(folio, nr_pages);
> + fsverity_readahead(*fsverity_info_addr(inode),
> + folio, nr_pages);
> first_folio = false;
> }
>
> diff --git a/fs/verity/verify.c b/fs/verity/verify.c
> index 7ccd906e2b28..74792cd8b037 100644
> --- a/fs/verity/verify.c
> +++ b/fs/verity/verify.c
> @@ -71,6 +71,7 @@ EXPORT_SYMBOL_GPL(fsverity_readahead);
>
> /**
> * fsverity_readahead() - kick off readahead on fsverity hashes
> + * @vi: fsverity_info for the inode to be read
> * @folio: first folio that is being read
> * @nr_pages: number of data pages to read
> *
> @@ -78,12 +79,11 @@ EXPORT_SYMBOL_GPL(fsverity_readahead);
> * ->read_folio and ->readahead methods to ensure that the hashes are
> * already cached on completion of the file data read if possible.
> */
> -void fsverity_readahead(struct folio *folio, unsigned long nr_pages)
> +void fsverity_readahead(struct fsverity_info *vi, struct folio *folio,
> + unsigned long nr_pages)
> {
> - struct inode *inode = folio->mapping->host;
> -
> - return __fsverity_readahead(inode, *fsverity_info_addr(inode),
> - folio_pos(folio), nr_pages);
> + return __fsverity_readahead(folio->mapping->host, vi, folio_pos(folio),
> + nr_pages);
> }
>
> /*
> @@ -319,10 +319,9 @@ static bool verify_data_block(struct inode *inode, struct fsverity_info *vi,
>
> static void
> fsverity_init_verification_context(struct fsverity_verification_context *ctx,
> - struct inode *inode)
> + struct inode *inode,
> + struct fsverity_info *vi)
> {
> - struct fsverity_info *vi = *fsverity_info_addr(inode);
> -
> ctx->inode = inode;
> ctx->vi = vi;
> ctx->num_pending = 0;
> @@ -403,6 +402,7 @@ static bool fsverity_add_data_blocks(struct fsverity_verification_context *ctx,
>
> /**
> * fsverity_verify_blocks() - verify data in a folio
> + * @vi: fsverity_info for the inode to be read
> * @folio: the folio containing the data to verify
> * @len: the length of the data to verify in the folio
> * @offset: the offset of the data to verify in the folio
> @@ -413,11 +413,12 @@ static bool fsverity_add_data_blocks(struct fsverity_verification_context *ctx,
> *
> * Return: %true if the data is valid, else %false.
> */
> -bool fsverity_verify_blocks(struct folio *folio, size_t len, size_t offset)
> +bool fsverity_verify_blocks(struct fsverity_info *vi, struct folio *folio,
> + size_t len, size_t offset)
> {
> struct fsverity_verification_context ctx;
>
> - fsverity_init_verification_context(&ctx, folio->mapping->host);
> + fsverity_init_verification_context(&ctx, folio->mapping->host, vi);
>
> if (fsverity_add_data_blocks(&ctx, folio, len, offset) &&
> fsverity_verify_pending_blocks(&ctx))
> @@ -430,6 +431,7 @@ EXPORT_SYMBOL_GPL(fsverity_verify_blocks);
> #ifdef CONFIG_BLOCK
> /**
> * fsverity_verify_bio() - verify a 'read' bio that has just completed
> + * @vi: fsverity_info for the inode to be read
> * @bio: the bio to verify
> *
> * Verify the bio's data against the file's Merkle tree. All bio data segments
> @@ -442,13 +444,13 @@ EXPORT_SYMBOL_GPL(fsverity_verify_blocks);
> * filesystems) must instead call fsverity_verify_page() directly on each page.
> * All filesystems must also call fsverity_verify_page() on holes.
> */
> -void fsverity_verify_bio(struct bio *bio)
> +void fsverity_verify_bio(struct fsverity_info *vi, struct bio *bio)
> {
> struct inode *inode = bio_first_folio_all(bio)->mapping->host;
> struct fsverity_verification_context ctx;
> struct folio_iter fi;
>
> - fsverity_init_verification_context(&ctx, inode);
> + fsverity_init_verification_context(&ctx, inode, vi);
>
> bio_for_each_folio_all(fi, bio) {
> if (!fsverity_add_data_blocks(&ctx, fi.folio, fi.length,
> diff --git a/include/linux/fsverity.h b/include/linux/fsverity.h
> index 862fea8a2eb1..c044285b6aff 100644
> --- a/include/linux/fsverity.h
> +++ b/include/linux/fsverity.h
> @@ -197,8 +197,9 @@ int fsverity_ioctl_read_metadata(struct file *filp, const void __user *uarg);
>
> /* verify.c */
>
> -bool fsverity_verify_blocks(struct folio *folio, size_t len, size_t offset);
> -void fsverity_verify_bio(struct bio *bio);
> +bool fsverity_verify_blocks(struct fsverity_info *vi, struct folio *folio,
> + size_t len, size_t offset);
> +void fsverity_verify_bio(struct fsverity_info *vi, struct bio *bio);
> void fsverity_enqueue_verify_work(struct work_struct *work);
>
> #else /* !CONFIG_FS_VERITY */
> @@ -251,14 +252,16 @@ static inline int fsverity_ioctl_read_metadata(struct file *filp,
>
> /* verify.c */
>
> -static inline bool fsverity_verify_blocks(struct folio *folio, size_t len,
> +static inline bool fsverity_verify_blocks(struct fsverity_info *vi,
> + struct folio *folio, size_t len,
> size_t offset)
> {
> WARN_ON_ONCE(1);
> return false;
> }
>
> -static inline void fsverity_verify_bio(struct bio *bio)
> +static inline void fsverity_verify_bio(struct fsverity_info *vi,
> + struct bio *bio)
> {
> WARN_ON_ONCE(1);
> }
> @@ -270,14 +273,16 @@ static inline void fsverity_enqueue_verify_work(struct work_struct *work)
>
> #endif /* !CONFIG_FS_VERITY */
>
> -static inline bool fsverity_verify_folio(struct folio *folio)
> +static inline bool fsverity_verify_folio(struct fsverity_info *vi,
> + struct folio *folio)
> {
> - return fsverity_verify_blocks(folio, folio_size(folio), 0);
> + return fsverity_verify_blocks(vi, folio, folio_size(folio), 0);
> }
>
> -static inline bool fsverity_verify_page(struct page *page)
> +static inline bool fsverity_verify_page(struct fsverity_info *vi,
> + struct page *page)
> {
> - return fsverity_verify_blocks(page_folio(page), PAGE_SIZE, 0);
> + return fsverity_verify_blocks(vi, page_folio(page), PAGE_SIZE, 0);
> }
>
> /**
> @@ -319,7 +324,8 @@ static inline int fsverity_file_open(struct inode *inode, struct file *filp)
> }
>
> void fsverity_cleanup_inode(struct inode *inode);
> -void fsverity_readahead(struct folio *folio, unsigned long nr_pages);
> +void fsverity_readahead(struct fsverity_info *vi, struct folio *folio,
> + unsigned long nr_pages);
>
> struct page *generic_read_merkle_tree_page(struct inode *inode, pgoff_t index);
> void generic_readahead_merkle_tree(struct inode *inode, pgoff_t index,
> --
> 2.47.3
>
>
WARNING: multiple messages have this Message-ID (diff)
From: "Darrick J. Wong via Linux-f2fs-devel" <linux-f2fs-devel@lists.sourceforge.net>
To: Christoph Hellwig <hch@lst.de>
Cc: fsverity@lists.linux.dev, Christian Brauner <brauner@kernel.org>,
Jan Kara <jack@suse.cz>, Andrey Albershteyn <aalbersh@redhat.com>,
"Matthew Wilcox \(Oracle\)" <willy@infradead.org>,
linux-f2fs-devel@lists.sourceforge.net,
Eric Biggers <ebiggers@kernel.org>,
linux-fsdevel@vger.kernel.org, Al Viro <viro@zeniv.linux.org.uk>,
Jaegeuk Kim <jaegeuk@kernel.org>, David Sterba <dsterba@suse.com>,
Theodore Ts'o <tytso@mit.edu>,
linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org
Subject: Re: [f2fs-dev] [PATCH 06/11] fsverity: push out fsverity_info lookup
Date: Thu, 22 Jan 2026 13:45:51 -0800 [thread overview]
Message-ID: <20260122214551.GF5910@frogsfrogsfrogs> (raw)
In-Reply-To: <20260122082214.452153-7-hch@lst.de>
On Thu, Jan 22, 2026 at 09:22:02AM +0100, Christoph Hellwig wrote:
> Pass a struct fsverity_info to the verification and readahead helpers,
> and push the lookup into the callers. Right now this is a very
> dumb almost mechanic move that open codes a lot of fsverity_info_addr()
> calls int the file systems. The subsequent patches will clean this up.
>
> This prepares for reducing the number of fsverity_info lookups, which
> will allow to amortize them better when using a more expensive lookup
> method.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
> fs/btrfs/extent_io.c | 4 +++-
> fs/buffer.c | 4 +++-
> fs/ext4/readpage.c | 11 ++++++++---
> fs/f2fs/compress.c | 4 +++-
> fs/f2fs/data.c | 15 +++++++++++----
> fs/verity/verify.c | 26 ++++++++++++++------------
> include/linux/fsverity.h | 24 +++++++++++++++---------
> 7 files changed, 57 insertions(+), 31 deletions(-)
>
> diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
> index a4b74023618d..6e65e2cdf950 100644
> --- a/fs/btrfs/extent_io.c
> +++ b/fs/btrfs/extent_io.c
> @@ -484,7 +484,8 @@ static bool btrfs_verify_folio(struct folio *folio, u64 start, u32 len)
> btrfs_folio_test_uptodate(fs_info, folio, start, len) ||
> start >= i_size_read(folio->mapping->host))
> return true;
> - return fsverity_verify_folio(folio);
> + return fsverity_verify_folio(*fsverity_info_addr(folio->mapping->host),
<shudder>
At least that goes away in a few patches so
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
--D
> + folio);
> }
>
> static void end_folio_read(struct folio *folio, bool uptodate, u64 start, u32 len)
> @@ -578,6 +579,7 @@ static void end_bbio_data_read(struct btrfs_bio *bbio)
> struct folio_iter fi;
>
> ASSERT(!bio_flagged(bio, BIO_CLONED));
> +
> bio_for_each_folio_all(fi, &bbio->bio) {
> bool uptodate = !bio->bi_status;
> struct folio *folio = fi.folio;
> diff --git a/fs/buffer.c b/fs/buffer.c
> index 838c0c571022..3982253b6805 100644
> --- a/fs/buffer.c
> +++ b/fs/buffer.c
> @@ -309,9 +309,11 @@ static void verify_bh(struct work_struct *work)
> struct postprocess_bh_ctx *ctx =
> container_of(work, struct postprocess_bh_ctx, work);
> struct buffer_head *bh = ctx->bh;
> + struct inode *inode = bh->b_folio->mapping->host;
> bool valid;
>
> - valid = fsverity_verify_blocks(bh->b_folio, bh->b_size, bh_offset(bh));
> + valid = fsverity_verify_blocks(*fsverity_info_addr(inode), bh->b_folio,
> + bh->b_size, bh_offset(bh));
> end_buffer_async_read(bh, valid);
> kfree(ctx);
> }
> diff --git a/fs/ext4/readpage.c b/fs/ext4/readpage.c
> index 574584123b8a..02f918cf1945 100644
> --- a/fs/ext4/readpage.c
> +++ b/fs/ext4/readpage.c
> @@ -96,6 +96,7 @@ static void verity_work(struct work_struct *work)
> struct bio_post_read_ctx *ctx =
> container_of(work, struct bio_post_read_ctx, work);
> struct bio *bio = ctx->bio;
> + struct inode *inode = bio_first_folio_all(bio)->mapping->host;
>
> /*
> * fsverity_verify_bio() may call readahead() again, and although verity
> @@ -108,7 +109,7 @@ static void verity_work(struct work_struct *work)
> mempool_free(ctx, bio_post_read_ctx_pool);
> bio->bi_private = NULL;
>
> - fsverity_verify_bio(bio);
> + fsverity_verify_bio(*fsverity_info_addr(inode), bio);
>
> __read_end_io(bio);
> }
> @@ -244,7 +245,8 @@ int ext4_mpage_readpages(struct inode *inode,
>
> if (first_folio) {
> if (ext4_need_verity(inode, folio->index))
> - fsverity_readahead(folio, nr_pages);
> + fsverity_readahead(*fsverity_info_addr(inode),
> + folio, nr_pages);
> first_folio = false;
> }
>
> @@ -335,8 +337,11 @@ int ext4_mpage_readpages(struct inode *inode,
> folio_zero_segment(folio, first_hole << blkbits,
> folio_size(folio));
> if (first_hole == 0) {
> + struct fsverity_info *vi =
> + *fsverity_info_addr(folio->mapping->host);
> +
> if (ext4_need_verity(inode, folio->index) &&
> - !fsverity_verify_folio(folio))
> + !fsverity_verify_folio(vi, folio))
> goto set_error_page;
> folio_end_read(folio, true);
> continue;
> diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c
> index 7b68bf22989d..0c269b875e0c 100644
> --- a/fs/f2fs/compress.c
> +++ b/fs/f2fs/compress.c
> @@ -1814,7 +1814,9 @@ static void f2fs_verify_cluster(struct work_struct *work)
> if (!rpage)
> continue;
>
> - if (fsverity_verify_page(rpage))
> + if (fsverity_verify_page(
> + *fsverity_info_addr(rpage->mapping->host),
> + rpage))
> SetPageUptodate(rpage);
> else
> ClearPageUptodate(rpage);
> diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
> index 49bdc7e771f2..bca1e34d327a 100644
> --- a/fs/f2fs/data.c
> +++ b/fs/f2fs/data.c
> @@ -185,15 +185,19 @@ static void f2fs_verify_bio(struct work_struct *work)
>
> bio_for_each_folio_all(fi, bio) {
> struct folio *folio = fi.folio;
> + struct fsverity_info *vi =
> + *fsverity_info_addr(folio->mapping->host);
>
> if (!f2fs_is_compressed_page(folio) &&
> - !fsverity_verify_page(&folio->page)) {
> + !fsverity_verify_page(vi, &folio->page)) {
> bio->bi_status = BLK_STS_IOERR;
> break;
> }
> }
> } else {
> - fsverity_verify_bio(bio);
> + struct inode *inode = bio_first_folio_all(bio)->mapping->host;
> +
> + fsverity_verify_bio(*fsverity_info_addr(inode), bio);
> }
>
> f2fs_finish_read_bio(bio, true);
> @@ -2121,7 +2125,9 @@ static int f2fs_read_single_page(struct inode *inode, struct folio *folio,
> zero_out:
> folio_zero_segment(folio, 0, folio_size(folio));
> if (f2fs_need_verity(inode, index) &&
> - !fsverity_verify_folio(folio)) {
> + !fsverity_verify_folio(
> + *fsverity_info_addr(folio->mapping->host),
> + folio)) {
> ret = -EIO;
> goto out;
> }
> @@ -2386,7 +2392,8 @@ static int f2fs_mpage_readpages(struct inode *inode,
>
> if (first_folio) {
> if (f2fs_need_verity(inode, folio->index))
> - fsverity_readahead(folio, nr_pages);
> + fsverity_readahead(*fsverity_info_addr(inode),
> + folio, nr_pages);
> first_folio = false;
> }
>
> diff --git a/fs/verity/verify.c b/fs/verity/verify.c
> index 7ccd906e2b28..74792cd8b037 100644
> --- a/fs/verity/verify.c
> +++ b/fs/verity/verify.c
> @@ -71,6 +71,7 @@ EXPORT_SYMBOL_GPL(fsverity_readahead);
>
> /**
> * fsverity_readahead() - kick off readahead on fsverity hashes
> + * @vi: fsverity_info for the inode to be read
> * @folio: first folio that is being read
> * @nr_pages: number of data pages to read
> *
> @@ -78,12 +79,11 @@ EXPORT_SYMBOL_GPL(fsverity_readahead);
> * ->read_folio and ->readahead methods to ensure that the hashes are
> * already cached on completion of the file data read if possible.
> */
> -void fsverity_readahead(struct folio *folio, unsigned long nr_pages)
> +void fsverity_readahead(struct fsverity_info *vi, struct folio *folio,
> + unsigned long nr_pages)
> {
> - struct inode *inode = folio->mapping->host;
> -
> - return __fsverity_readahead(inode, *fsverity_info_addr(inode),
> - folio_pos(folio), nr_pages);
> + return __fsverity_readahead(folio->mapping->host, vi, folio_pos(folio),
> + nr_pages);
> }
>
> /*
> @@ -319,10 +319,9 @@ static bool verify_data_block(struct inode *inode, struct fsverity_info *vi,
>
> static void
> fsverity_init_verification_context(struct fsverity_verification_context *ctx,
> - struct inode *inode)
> + struct inode *inode,
> + struct fsverity_info *vi)
> {
> - struct fsverity_info *vi = *fsverity_info_addr(inode);
> -
> ctx->inode = inode;
> ctx->vi = vi;
> ctx->num_pending = 0;
> @@ -403,6 +402,7 @@ static bool fsverity_add_data_blocks(struct fsverity_verification_context *ctx,
>
> /**
> * fsverity_verify_blocks() - verify data in a folio
> + * @vi: fsverity_info for the inode to be read
> * @folio: the folio containing the data to verify
> * @len: the length of the data to verify in the folio
> * @offset: the offset of the data to verify in the folio
> @@ -413,11 +413,12 @@ static bool fsverity_add_data_blocks(struct fsverity_verification_context *ctx,
> *
> * Return: %true if the data is valid, else %false.
> */
> -bool fsverity_verify_blocks(struct folio *folio, size_t len, size_t offset)
> +bool fsverity_verify_blocks(struct fsverity_info *vi, struct folio *folio,
> + size_t len, size_t offset)
> {
> struct fsverity_verification_context ctx;
>
> - fsverity_init_verification_context(&ctx, folio->mapping->host);
> + fsverity_init_verification_context(&ctx, folio->mapping->host, vi);
>
> if (fsverity_add_data_blocks(&ctx, folio, len, offset) &&
> fsverity_verify_pending_blocks(&ctx))
> @@ -430,6 +431,7 @@ EXPORT_SYMBOL_GPL(fsverity_verify_blocks);
> #ifdef CONFIG_BLOCK
> /**
> * fsverity_verify_bio() - verify a 'read' bio that has just completed
> + * @vi: fsverity_info for the inode to be read
> * @bio: the bio to verify
> *
> * Verify the bio's data against the file's Merkle tree. All bio data segments
> @@ -442,13 +444,13 @@ EXPORT_SYMBOL_GPL(fsverity_verify_blocks);
> * filesystems) must instead call fsverity_verify_page() directly on each page.
> * All filesystems must also call fsverity_verify_page() on holes.
> */
> -void fsverity_verify_bio(struct bio *bio)
> +void fsverity_verify_bio(struct fsverity_info *vi, struct bio *bio)
> {
> struct inode *inode = bio_first_folio_all(bio)->mapping->host;
> struct fsverity_verification_context ctx;
> struct folio_iter fi;
>
> - fsverity_init_verification_context(&ctx, inode);
> + fsverity_init_verification_context(&ctx, inode, vi);
>
> bio_for_each_folio_all(fi, bio) {
> if (!fsverity_add_data_blocks(&ctx, fi.folio, fi.length,
> diff --git a/include/linux/fsverity.h b/include/linux/fsverity.h
> index 862fea8a2eb1..c044285b6aff 100644
> --- a/include/linux/fsverity.h
> +++ b/include/linux/fsverity.h
> @@ -197,8 +197,9 @@ int fsverity_ioctl_read_metadata(struct file *filp, const void __user *uarg);
>
> /* verify.c */
>
> -bool fsverity_verify_blocks(struct folio *folio, size_t len, size_t offset);
> -void fsverity_verify_bio(struct bio *bio);
> +bool fsverity_verify_blocks(struct fsverity_info *vi, struct folio *folio,
> + size_t len, size_t offset);
> +void fsverity_verify_bio(struct fsverity_info *vi, struct bio *bio);
> void fsverity_enqueue_verify_work(struct work_struct *work);
>
> #else /* !CONFIG_FS_VERITY */
> @@ -251,14 +252,16 @@ static inline int fsverity_ioctl_read_metadata(struct file *filp,
>
> /* verify.c */
>
> -static inline bool fsverity_verify_blocks(struct folio *folio, size_t len,
> +static inline bool fsverity_verify_blocks(struct fsverity_info *vi,
> + struct folio *folio, size_t len,
> size_t offset)
> {
> WARN_ON_ONCE(1);
> return false;
> }
>
> -static inline void fsverity_verify_bio(struct bio *bio)
> +static inline void fsverity_verify_bio(struct fsverity_info *vi,
> + struct bio *bio)
> {
> WARN_ON_ONCE(1);
> }
> @@ -270,14 +273,16 @@ static inline void fsverity_enqueue_verify_work(struct work_struct *work)
>
> #endif /* !CONFIG_FS_VERITY */
>
> -static inline bool fsverity_verify_folio(struct folio *folio)
> +static inline bool fsverity_verify_folio(struct fsverity_info *vi,
> + struct folio *folio)
> {
> - return fsverity_verify_blocks(folio, folio_size(folio), 0);
> + return fsverity_verify_blocks(vi, folio, folio_size(folio), 0);
> }
>
> -static inline bool fsverity_verify_page(struct page *page)
> +static inline bool fsverity_verify_page(struct fsverity_info *vi,
> + struct page *page)
> {
> - return fsverity_verify_blocks(page_folio(page), PAGE_SIZE, 0);
> + return fsverity_verify_blocks(vi, page_folio(page), PAGE_SIZE, 0);
> }
>
> /**
> @@ -319,7 +324,8 @@ static inline int fsverity_file_open(struct inode *inode, struct file *filp)
> }
>
> void fsverity_cleanup_inode(struct inode *inode);
> -void fsverity_readahead(struct folio *folio, unsigned long nr_pages);
> +void fsverity_readahead(struct fsverity_info *vi, struct folio *folio,
> + unsigned long nr_pages);
>
> struct page *generic_read_merkle_tree_page(struct inode *inode, pgoff_t index);
> void generic_readahead_merkle_tree(struct inode *inode, pgoff_t index,
> --
> 2.47.3
>
>
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
next prev parent reply other threads:[~2026-01-22 21:45 UTC|newest]
Thread overview: 105+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-22 8:21 fsverity cleanups, speedup and memory usage optimization v2 Christoph Hellwig
2026-01-22 8:21 ` [f2fs-dev] " Christoph Hellwig
2026-01-22 8:21 ` [PATCH 01/11] fs,fsverity: reject size changes on fsverity files in setattr_prepare Christoph Hellwig
2026-01-22 8:21 ` [f2fs-dev] [PATCH 01/11] fs, fsverity: " Christoph Hellwig
2026-01-22 9:12 ` [PATCH 01/11] fs,fsverity: " Jan Kara
2026-01-22 9:12 ` [f2fs-dev] [PATCH 01/11] fs, fsverity: " Jan Kara
2026-01-22 21:21 ` [PATCH 01/11] fs,fsverity: " Darrick J. Wong
2026-01-22 21:21 ` [f2fs-dev] [PATCH 01/11] fs, fsverity: " Darrick J. Wong via Linux-f2fs-devel
2026-01-22 8:21 ` [PATCH 02/11] fs,fsverity: clear out fsverity_info from common code Christoph Hellwig
2026-01-22 8:21 ` [f2fs-dev] [PATCH 02/11] fs, fsverity: " Christoph Hellwig
2026-01-22 9:15 ` [PATCH 02/11] fs,fsverity: " Jan Kara
2026-01-22 9:15 ` [f2fs-dev] [PATCH 02/11] fs, fsverity: " Jan Kara
2026-01-22 21:22 ` [PATCH 02/11] fs,fsverity: " Darrick J. Wong
2026-01-22 21:22 ` [f2fs-dev] [PATCH 02/11] fs, fsverity: " Darrick J. Wong via Linux-f2fs-devel
2026-01-22 8:21 ` [PATCH 03/11] fsverity: pass struct file to ->write_merkle_tree_block Christoph Hellwig
2026-01-22 8:21 ` [f2fs-dev] " Christoph Hellwig
2026-01-22 10:04 ` Andrey Albershteyn
2026-01-22 10:04 ` [f2fs-dev] " Andrey Albershteyn via Linux-f2fs-devel
2026-01-22 21:23 ` Darrick J. Wong
2026-01-22 21:23 ` [f2fs-dev] " Darrick J. Wong via Linux-f2fs-devel
2026-01-22 8:22 ` [PATCH 04/11] fsverity: start consolidating pagecache code Christoph Hellwig
2026-01-22 8:22 ` [f2fs-dev] " Christoph Hellwig
2026-01-22 9:18 ` Jan Kara
2026-01-22 9:18 ` [f2fs-dev] " Jan Kara
2026-01-22 10:12 ` Andrey Albershteyn
2026-01-22 10:12 ` [f2fs-dev] " Andrey Albershteyn via Linux-f2fs-devel
2026-01-22 21:27 ` Darrick J. Wong
2026-01-22 21:27 ` [f2fs-dev] " Darrick J. Wong via Linux-f2fs-devel
2026-01-23 5:12 ` Christoph Hellwig
2026-01-23 5:12 ` [f2fs-dev] " Christoph Hellwig
2026-01-23 7:21 ` Darrick J. Wong
2026-01-23 7:21 ` [f2fs-dev] " Darrick J. Wong via Linux-f2fs-devel
2026-01-24 19:27 ` Eric Biggers
2026-01-24 19:27 ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2026-01-26 4:27 ` Christoph Hellwig
2026-01-26 4:27 ` [f2fs-dev] " Christoph Hellwig
2026-01-22 8:22 ` [PATCH 05/11] fsverity: kick off hash readahead at data I/O submission time Christoph Hellwig
2026-01-22 8:22 ` [f2fs-dev] " Christoph Hellwig
2026-01-22 21:42 ` Darrick J. Wong
2026-01-22 21:42 ` [f2fs-dev] " Darrick J. Wong via Linux-f2fs-devel
2026-01-23 5:14 ` Christoph Hellwig
2026-01-23 5:14 ` [f2fs-dev] " Christoph Hellwig
2026-01-23 7:22 ` Darrick J. Wong
2026-01-23 7:22 ` [f2fs-dev] " Darrick J. Wong via Linux-f2fs-devel
2026-01-24 20:53 ` Eric Biggers
2026-01-24 20:53 ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2026-01-26 4:30 ` Christoph Hellwig
2026-01-26 4:30 ` [f2fs-dev] " Christoph Hellwig
2026-01-22 8:22 ` [PATCH 06/11] fsverity: push out fsverity_info lookup Christoph Hellwig
2026-01-22 8:22 ` [f2fs-dev] " Christoph Hellwig
2026-01-22 21:45 ` Darrick J. Wong [this message]
2026-01-22 21:45 ` Darrick J. Wong via Linux-f2fs-devel
2026-01-24 21:19 ` Eric Biggers
2026-01-24 21:19 ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2026-01-26 4:33 ` Christoph Hellwig
2026-01-26 4:33 ` [f2fs-dev] " Christoph Hellwig
2026-01-22 8:22 ` [PATCH 07/11] fs: consolidate fsverity_info lookup in buffer.c Christoph Hellwig
2026-01-22 8:22 ` [f2fs-dev] " Christoph Hellwig
2026-01-22 21:49 ` Darrick J. Wong
2026-01-22 21:49 ` [f2fs-dev] " Darrick J. Wong via Linux-f2fs-devel
2026-01-23 5:15 ` Christoph Hellwig
2026-01-23 5:15 ` [f2fs-dev] " Christoph Hellwig
2026-01-23 7:23 ` Darrick J. Wong
2026-01-23 7:23 ` [f2fs-dev] " Darrick J. Wong via Linux-f2fs-devel
2026-01-23 7:24 ` Christoph Hellwig
2026-01-23 7:24 ` [f2fs-dev] " Christoph Hellwig
2026-01-22 8:22 ` [PATCH 08/11] ext4: consolidate fsverity_info lookup Christoph Hellwig
2026-01-22 8:22 ` [f2fs-dev] " Christoph Hellwig
2026-01-22 21:54 ` Darrick J. Wong
2026-01-22 21:54 ` [f2fs-dev] " Darrick J. Wong via Linux-f2fs-devel
2026-01-23 5:18 ` Christoph Hellwig
2026-01-23 5:18 ` [f2fs-dev] " Christoph Hellwig
2026-01-23 7:25 ` Darrick J. Wong
2026-01-23 7:25 ` [f2fs-dev] " Darrick J. Wong via Linux-f2fs-devel
2026-01-22 8:22 ` [PATCH 09/11] f2fs: " Christoph Hellwig
2026-01-22 8:22 ` [f2fs-dev] " Christoph Hellwig
2026-01-22 8:22 ` [PATCH 10/11] btrfs: " Christoph Hellwig
2026-01-22 8:22 ` [f2fs-dev] " Christoph Hellwig
2026-01-22 8:22 ` [PATCH 11/11] fsverity: use a hashtable to find the fsverity_info Christoph Hellwig
2026-01-22 8:22 ` [f2fs-dev] " Christoph Hellwig
2026-01-22 22:04 ` Darrick J. Wong
2026-01-22 22:04 ` [f2fs-dev] " Darrick J. Wong via Linux-f2fs-devel
2026-01-23 5:27 ` Christoph Hellwig
2026-01-23 5:27 ` [f2fs-dev] " Christoph Hellwig
2026-01-23 7:27 ` Darrick J. Wong
2026-01-23 7:27 ` [f2fs-dev] " Darrick J. Wong via Linux-f2fs-devel
2026-01-23 7:30 ` Christoph Hellwig
2026-01-23 7:30 ` [f2fs-dev] " Christoph Hellwig
2026-01-25 1:31 ` Eric Biggers
2026-01-25 1:31 ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2026-01-25 21:48 ` Matthew Wilcox
2026-01-25 21:48 ` [f2fs-dev] " Matthew Wilcox
2026-01-26 4:44 ` Christoph Hellwig
2026-01-26 4:44 ` [f2fs-dev] " Christoph Hellwig
2026-01-26 20:12 ` Eric Biggers
2026-01-26 20:12 ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2026-01-28 21:38 ` Matthew Wilcox
2026-01-28 21:38 ` [f2fs-dev] " Matthew Wilcox
2026-01-28 22:14 ` Eric Biggers
2026-01-28 22:14 ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2026-01-26 4:43 ` Christoph Hellwig
2026-01-26 4:43 ` [f2fs-dev] " Christoph Hellwig
2026-01-22 15:42 ` fsverity cleanups, speedup and memory usage optimization v2 David Sterba
2026-01-22 15:42 ` [f2fs-dev] " David Sterba
-- strict thread matches above, loose matches on Subject: below --
2026-02-02 6:06 fsverity speedup and memory usage optimization v5 Christoph Hellwig
2026-02-02 6:06 ` [PATCH 06/11] fsverity: push out fsverity_info lookup Christoph Hellwig
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260122214551.GF5910@frogsfrogsfrogs \
--to=djwong@kernel.org \
--cc=aalbersh@redhat.com \
--cc=brauner@kernel.org \
--cc=chao@kernel.org \
--cc=dsterba@suse.com \
--cc=ebiggers@kernel.org \
--cc=fsverity@lists.linux.dev \
--cc=hch@lst.de \
--cc=jack@suse.cz \
--cc=jaegeuk@kernel.org \
--cc=linux-btrfs@vger.kernel.org \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-f2fs-devel@lists.sourceforge.net \
--cc=linux-fsdevel@vger.kernel.org \
--cc=tytso@mit.edu \
--cc=viro@zeniv.linux.org.uk \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.