While the pblk argument to fscrypt_zeroout_range_inline_crypt is
declared as a sector_t it actually is interpreted as a logical block
size unit, which is highly unusual.  Switch to passing the 512 byte
units that sector_t is defined for.

Signed-off-by: Christoph Hellwig <[email protected]>
Reviewed-by: Eric Biggers <[email protected]>
---
 fs/crypto/bio.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/fs/crypto/bio.c b/fs/crypto/bio.c
index 5f5599020e94..68b0424d879a 100644
--- a/fs/crypto/bio.c
+++ b/fs/crypto/bio.c
@@ -48,7 +48,7 @@ bool fscrypt_decrypt_bio(struct bio *bio)
 EXPORT_SYMBOL(fscrypt_decrypt_bio);
 
 static int fscrypt_zeroout_range_inline_crypt(const struct inode *inode,
-                                             pgoff_t lblk, sector_t pblk,
+                                             pgoff_t lblk, sector_t sector,
                                              unsigned int len)
 {
        const unsigned int blockbits = inode->i_blkbits;
@@ -67,8 +67,7 @@ static int fscrypt_zeroout_range_inline_crypt(const struct 
inode *inode,
 
                if (num_pages == 0) {
                        fscrypt_set_bio_crypt_ctx(bio, inode, lblk, GFP_NOFS);
-                       bio->bi_iter.bi_sector =
-                                       pblk << (blockbits - SECTOR_SHIFT);
+                       bio->bi_iter.bi_sector = sector;
                }
                ret = bio_add_page(bio, ZERO_PAGE(0), bytes_this_page, 0);
                if (WARN_ON_ONCE(ret != bytes_this_page)) {
@@ -78,7 +77,7 @@ static int fscrypt_zeroout_range_inline_crypt(const struct 
inode *inode,
                num_pages++;
                len -= blocks_this_page;
                lblk += blocks_this_page;
-               pblk += blocks_this_page;
+               sector += (bytes_this_page >> SECTOR_SHIFT);
                if (num_pages == BIO_MAX_VECS || !len ||
                    !fscrypt_mergeable_bio(bio, inode, lblk)) {
                        err = submit_bio_wait(bio);
@@ -132,7 +131,7 @@ int fscrypt_zeroout_range(const struct inode *inode, 
pgoff_t lblk,
                return 0;
 
        if (fscrypt_inode_uses_inline_crypto(inode))
-               return fscrypt_zeroout_range_inline_crypt(inode, lblk, pblk,
+               return fscrypt_zeroout_range_inline_crypt(inode, lblk, sector,
                                                          len);
 
        BUILD_BUG_ON(ARRAY_SIZE(pages) > BIO_MAX_VECS);
-- 
2.47.3


Reply via email to