]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ext4, fscrypt: merge fscrypt_mergeable_bio_bh into io_submit_need_new_bio
authorChristoph Hellwig <hch@lst.de>
Mon, 2 Mar 2026 14:18:09 +0000 (06:18 -0800)
committerEric Biggers <ebiggers@kernel.org>
Mon, 9 Mar 2026 20:31:50 +0000 (13:31 -0700)
ext4 already has the inode and folio and can't have a NULL
folio->mapping in this path. Open code fscrypt_mergeable_bio_bh in
io_submit_need_new_bio based on these simplifying assumptions.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20260302141922.370070-5-hch@lst.de
Signed-off-by: Eric Biggers <ebiggers@kernel.org>
fs/crypto/inline_crypt.c
fs/ext4/page-io.c
include/linux/fscrypt.h

index c0852b920dbc22104e803a24b4222af042c071db..0da53956a9b12c3eed593ccc6e9d6968e6ab53e1 100644 (file)
@@ -406,29 +406,6 @@ bool fscrypt_mergeable_bio(struct bio *bio, const struct inode *inode,
 }
 EXPORT_SYMBOL_GPL(fscrypt_mergeable_bio);
 
-/**
- * fscrypt_mergeable_bio_bh() - test whether data can be added to a bio
- * @bio: the bio being built up
- * @next_bh: the next buffer_head for which I/O will be submitted
- *
- * Same as fscrypt_mergeable_bio(), except this takes a buffer_head instead of
- * an inode and block number directly.
- *
- * Return: true iff the I/O is mergeable
- */
-bool fscrypt_mergeable_bio_bh(struct bio *bio,
-                             const struct buffer_head *next_bh)
-{
-       const struct inode *inode;
-       u64 next_lblk;
-
-       if (!bh_get_inode_and_lblk_num(next_bh, &inode, &next_lblk))
-               return !bio->bi_crypt_context;
-
-       return fscrypt_mergeable_bio(bio, inode, next_lblk);
-}
-EXPORT_SYMBOL_GPL(fscrypt_mergeable_bio_bh);
-
 /**
  * fscrypt_dio_supported() - check whether DIO (direct I/O) is supported on an
  *                          inode, as far as encryption is concerned
index 58cdbd836fd62c4d9234aa8e59b03c842bb9422a..293314d7f236f0d83203a36df0e1705f4bee9b37 100644 (file)
@@ -440,11 +440,14 @@ static void io_submit_init_bio(struct ext4_io_submit *io,
 }
 
 static bool io_submit_need_new_bio(struct ext4_io_submit *io,
+                                  struct inode *inode,
+                                  struct folio *folio,
                                   struct buffer_head *bh)
 {
        if (bh->b_blocknr != io->io_next_block)
                return true;
-       if (!fscrypt_mergeable_bio_bh(io->io_bio, bh))
+       if (!fscrypt_mergeable_bio(io->io_bio, inode,
+                       (folio_pos(folio) + bh_offset(bh)) >> inode->i_blkbits))
                return true;
        return false;
 }
@@ -455,7 +458,7 @@ static void io_submit_add_bh(struct ext4_io_submit *io,
                             struct folio *io_folio,
                             struct buffer_head *bh)
 {
-       if (io->io_bio && io_submit_need_new_bio(io, bh)) {
+       if (io->io_bio && io_submit_need_new_bio(io, inode, folio, bh)) {
 submit_and_retry:
                ext4_io_submit(io);
        }
index 516aba5b858b54e36e9545c5d7cba3f7a87a233f..6af3c1907adc67692058871c19b95b004da2bcea 100644 (file)
@@ -876,9 +876,6 @@ void fscrypt_set_bio_crypt_ctx_bh(struct bio *bio,
 bool fscrypt_mergeable_bio(struct bio *bio, const struct inode *inode,
                           u64 next_lblk);
 
-bool fscrypt_mergeable_bio_bh(struct bio *bio,
-                             const struct buffer_head *next_bh);
-
 bool fscrypt_dio_supported(struct inode *inode);
 
 u64 fscrypt_limit_io_blocks(const struct inode *inode, u64 lblk, u64 nr_blocks);
@@ -906,12 +903,6 @@ static inline bool fscrypt_mergeable_bio(struct bio *bio,
        return true;
 }
 
-static inline bool fscrypt_mergeable_bio_bh(struct bio *bio,
-                                           const struct buffer_head *next_bh)
-{
-       return true;
-}
-
 static inline bool fscrypt_dio_supported(struct inode *inode)
 {
        return !fscrypt_needs_contents_encryption(inode);