On Mon, Feb 02, 2026 at 01:14:23PM -0800, Eric Biggers wrote:
> On Mon, Feb 02, 2026 at 07:06:29AM +0100, Christoph Hellwig wrote:
> > 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 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 second part avoids the need for a pointer in every inode for fsverity
> > and instead uses a rhashtable lookup, which is done once per read_folio
> > or ->readahead invocation plus for btrfs only 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 v5:
> >  - drop already merged patches
> >  - fix a bisection hazard for non-ENOENT error returns from
> >    generic_read_merkle_tree_page
> >  - don't recurse on invalidate_lock
> >  - refactor page_cache_ra_unbounded locking to support the above
> >  - refactor ext4 and f2fs fsverity readahead to remove the need for the
> >    first_folio branch in the main readpages loop
> 
> Applied to 
> https://git.kernel.org/pub/scm/fs/fsverity/linux.git/log/?h=for-next
> 
> (Though it's getting late for v6.20 / v7.0.  So if there are any
> additional issues reported, I may have to drop it.)

Unfortunately this silently conflicts with changes in the f2fs tree.
Resolution doesn't look too bad, but we'll need to handle this.
Christoph, Jaegeuk, and Chao, let me know if this looks okay:

diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index d9085d1236d97..081c441c59e71 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -2449,11 +2449,13 @@ static void ffs_detach_free(struct folio *folio)
        WARN_ON_ONCE(ffs->read_pages_pending != 0);
        kmem_cache_free(ffs_entry_slab, ffs);
 }
 
 static int f2fs_read_data_large_folio(struct inode *inode,
-               struct readahead_control *rac, struct folio *folio)
+                                     struct fsverity_info *vi,
+                                     struct readahead_control *rac,
+                                     struct folio *folio)
 {
        struct bio *bio = NULL;
        sector_t last_block_in_bio = 0;
        struct f2fs_map_blocks map = {0, };
        pgoff_t index, offset, next_pgofs = 0;
@@ -2519,13 +2521,12 @@ static int f2fs_read_data_large_folio(struct inode 
*inode,
                                ret = -EFSCORRUPTED;
                                goto err_out;
                        }
                } else {
                        folio_zero_range(folio, offset << PAGE_SHIFT, 
PAGE_SIZE);
-                       if (f2fs_need_verity(inode, index) &&
-                           !fsverity_verify_page(folio_file_page(folio,
-                                                               index))) {
+                       if (vi && !fsverity_verify_page(
+                                         vi, folio_file_page(folio, index))) {
                                ret = -EIO;
                                goto err_out;
                        }
                        continue;
                }
@@ -2552,14 +2553,14 @@ static int f2fs_read_data_large_folio(struct inode 
*inode,
 submit_and_realloc:
                        f2fs_submit_read_bio(F2FS_I_SB(inode), bio, DATA);
                        bio = NULL;
                }
                if (bio == NULL)
-                       bio = f2fs_grab_read_bio(inode, block_nr,
-                                       max_nr_pages,
-                                       f2fs_ra_op_flags(rac),
-                                       index, false);
+                       bio = f2fs_grab_read_bio(inode, vi, block_nr,
+                                                max_nr_pages,
+                                                f2fs_ra_op_flags(rac), index,
+                                                false);
 
                /*
                 * If the page is under writeback, we need to wait for
                 * its completion to see the correct decrypted data.
                 */
@@ -2627,11 +2628,11 @@ static int f2fs_mpage_readpages(struct inode *inode, 
struct fsverity_info *vi,
        struct address_space *mapping = rac ? rac->mapping : folio->mapping;
        unsigned max_nr_pages = nr_pages;
        int ret = 0;
 
        if (mapping_large_folio_support(mapping))
-               return f2fs_read_data_large_folio(inode, rac, folio);
+               return f2fs_read_data_large_folio(inode, vi, rac, folio);
 
 #ifdef CONFIG_F2FS_FS_COMPRESSION
        if (f2fs_compressed_file(inode)) {
                index = rac ? readahead_index(rac) : folio->index;
                max_nr_pages = round_up(index + nr_pages, cc.cluster_size) -


_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to