Logical offsets into an inode are usually expresssed 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 <[email protected]>
---
 fs/crypto/fscrypt_private.h |  3 ---
 fs/crypto/inline_crypt.c    | 10 ++++------
 fs/crypto/keysetup.c        |  2 --
 3 files changed, 4 insertions(+), 11 deletions(-)

diff --git a/fs/crypto/fscrypt_private.h b/fs/crypto/fscrypt_private.h
index 4e8e82a9ccf9..8d3c278a7591 100644
--- a/fs/crypto/fscrypt_private.h
+++ b/fs/crypto/fscrypt_private.h
@@ -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;
 
diff --git a/fs/crypto/inline_crypt.c b/fs/crypto/inline_crypt.c
index ed6e926226b5..1773dd7ea7cf 100644
--- a/fs/crypto/inline_crypt.c
+++ b/fs/crypto/inline_crypt.c
@@ -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);
@@ -401,7 +399,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);
diff --git a/fs/crypto/keysetup.c b/fs/crypto/keysetup.c
index 4bd3918f50e3..f8a96d729dfc 100644
--- a/fs/crypto/keysetup.c
+++ b/fs/crypto/keysetup.c
@@ -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)
-- 
2.47.3


Reply via email to