]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
fscrypt: pass a byte offset to fscrypt_generate_dun
authorChristoph Hellwig <hch@lst.de>
Mon, 2 Mar 2026 14:18:11 +0000 (06:18 -0800)
committerEric Biggers <ebiggers@kernel.org>
Mon, 9 Mar 2026 20:31:50 +0000 (13:31 -0700)
Logical offsets into an inode are usually expressed as bytes in the VFS.
Switch fscrypt_generate_dun to that convention and remove the
ci_data_units_per_block_bits member in struct fscrypt_inode_info that
was only used to cache the DUN shift based on the logical block size
granularity.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20260302141922.370070-7-hch@lst.de
Signed-off-by: Eric Biggers <ebiggers@kernel.org>
fs/crypto/fscrypt_private.h
fs/crypto/inline_crypt.c
fs/crypto/keysetup.c

index 4e8e82a9ccf9a311133a963e367e327d421cbf02..8d3c278a7591eae6a264c61fc1621ca58ba836f1 100644 (file)
@@ -278,9 +278,6 @@ struct fscrypt_inode_info {
         */
        u8 ci_data_unit_bits;
 
-       /* Cached value: log2 of number of data units per FS block */
-       u8 ci_data_units_per_block_bits;
-
        /* Hashed inode number.  Only set for IV_INO_LBLK_32 */
        u32 ci_hashed_ino;
 
index 702d13d138aa4f7a3c81534fb61be1b39ec7375f..5279565e98468facc5641e18815906efe6ad6034 100644 (file)
@@ -268,14 +268,12 @@ bool __fscrypt_inode_uses_inline_crypto(const struct inode *inode)
 EXPORT_SYMBOL_GPL(__fscrypt_inode_uses_inline_crypto);
 
 static void fscrypt_generate_dun(const struct fscrypt_inode_info *ci,
-                                u64 lblk_num,
-                                u64 dun[BLK_CRYPTO_DUN_ARRAY_SIZE])
+                                loff_t pos, u64 dun[BLK_CRYPTO_DUN_ARRAY_SIZE])
 {
-       u64 index = lblk_num << ci->ci_data_units_per_block_bits;
        union fscrypt_iv iv;
        int i;
 
-       fscrypt_generate_iv(&iv, index, ci);
+       fscrypt_generate_iv(&iv, pos >> ci->ci_data_unit_bits, ci);
 
        BUILD_BUG_ON(FSCRYPT_MAX_IV_SIZE > BLK_CRYPTO_MAX_IV_SIZE);
        memset(dun, 0, BLK_CRYPTO_MAX_IV_SIZE);
@@ -309,7 +307,7 @@ void fscrypt_set_bio_crypt_ctx(struct bio *bio, const struct inode *inode,
                return;
        ci = fscrypt_get_inode_info_raw(inode);
 
-       fscrypt_generate_dun(ci, first_lblk, dun);
+       fscrypt_generate_dun(ci, first_lblk << inode->i_blkbits, dun);
        bio_crypt_set_ctx(bio, ci->ci_enc_key.blk_key, dun, gfp_mask);
 }
 EXPORT_SYMBOL_GPL(fscrypt_set_bio_crypt_ctx);
@@ -356,7 +354,7 @@ bool fscrypt_mergeable_bio(struct bio *bio, const struct inode *inode,
        if (bc->bc_key != ci->ci_enc_key.blk_key)
                return false;
 
-       fscrypt_generate_dun(ci, next_lblk, next_dun);
+       fscrypt_generate_dun(ci, next_lblk << inode->i_blkbits, next_dun);
        return bio_crypt_dun_is_contiguous(bc, bio->bi_iter.bi_size, next_dun);
 }
 EXPORT_SYMBOL_GPL(fscrypt_mergeable_bio);
index 40fa05688d3a1d4aa33d29e9508441faf4bca933..d83257e9945e8763c26ee16fadac480c349ce0ab 100644 (file)
@@ -609,8 +609,6 @@ fscrypt_setup_encryption_info(struct inode *inode,
 
        crypt_info->ci_data_unit_bits =
                fscrypt_policy_du_bits(&crypt_info->ci_policy, inode);
-       crypt_info->ci_data_units_per_block_bits =
-               inode->i_blkbits - crypt_info->ci_data_unit_bits;
 
        res = setup_file_encryption_key(crypt_info, need_dirhash_key, &mk);
        if (res)