From: Christoph Hellwig <hch@lst.de>
To: Eric Biggers <ebiggers@kernel.org>
Cc: "Theodore Y. Ts'o" <tytso@mit.edu>,
Jaegeuk Kim <jaegeuk@kernel.org>,
Andreas Dilger <adilger.kernel@dilger.ca>,
Chao Yu <chao@kernel.org>, Christian Brauner <brauner@kernel.org>,
"Darrick J. Wong" <djwong@kernel.org>,
linux-fscrypt@vger.kernel.org, linux-ext4@vger.kernel.org,
linux-f2fs-devel@lists.sourceforge.net,
linux-fsdevel@vger.kernel.org
Subject: [PATCH 12/14] fscrypt: pass a byte length to fscrypt_zeroout_range
Date: Mon, 2 Mar 2026 06:18:17 -0800 [thread overview]
Message-ID: <20260302141922.370070-13-hch@lst.de> (raw)
In-Reply-To: <20260302141922.370070-1-hch@lst.de>
Range lengths are usually expressed as bytes in the VFS, switch
fscrypt_zeroout_range to this convention.
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
fs/crypto/bio.c | 11 ++++++-----
fs/ext4/inode.c | 3 ++-
fs/f2fs/file.c | 2 +-
include/linux/fscrypt.h | 6 +++---
4 files changed, 12 insertions(+), 10 deletions(-)
diff --git a/fs/crypto/bio.c b/fs/crypto/bio.c
index a07ac8dcf851..93087635d987 100644
--- a/fs/crypto/bio.c
+++ b/fs/crypto/bio.c
@@ -115,12 +115,13 @@ static int fscrypt_zeroout_range_inline_crypt(const struct inode *inode,
* @inode: the file's inode
* @pos: the first file position (in bytes) to zero out
* @pblk: the first filesystem physical block to zero out
- * @len: number of blocks to zero out
+ * @len: bytes to zero out
*
* Zero out filesystem blocks in an encrypted regular file on-disk, i.e. write
* ciphertext blocks which decrypt to the all-zeroes block. The blocks must be
* both logically and physically contiguous. It's also assumed that the
- * filesystem only uses a single block device, ->s_bdev.
+ * filesystem only uses a single block device, ->s_bdev. @len must be a
+ * multiple of the file system logical block size.
*
* Note that since each block uses a different IV, this involves writing a
* different ciphertext to each block; we can't simply reuse the same one.
@@ -128,7 +129,7 @@ static int fscrypt_zeroout_range_inline_crypt(const struct inode *inode,
* Return: 0 on success; -errno on failure.
*/
int fscrypt_zeroout_range(const struct inode *inode, loff_t pos,
- sector_t pblk, unsigned int len)
+ sector_t pblk, u64 len)
{
const struct fscrypt_inode_info *ci = fscrypt_get_inode_info_raw(inode);
const unsigned int du_bits = ci->ci_data_unit_bits;
@@ -136,7 +137,7 @@ int fscrypt_zeroout_range(const struct inode *inode, loff_t pos,
const unsigned int du_per_page_bits = PAGE_SHIFT - du_bits;
const unsigned int du_per_page = 1U << du_per_page_bits;
u64 du_index = pos >> du_bits;
- u64 du_remaining = (u64)len << (inode->i_blkbits - du_bits);
+ u64 du_remaining = len >> du_bits;
sector_t sector = pblk << (inode->i_blkbits - SECTOR_SHIFT);
struct page *pages[16]; /* write up to 16 pages at a time */
unsigned int nr_pages;
@@ -150,7 +151,7 @@ int fscrypt_zeroout_range(const struct inode *inode, loff_t pos,
if (fscrypt_inode_uses_inline_crypto(inode))
return fscrypt_zeroout_range_inline_crypt(inode, pos, sector,
- (u64)len << inode->i_blkbits);
+ len);
BUILD_BUG_ON(ARRAY_SIZE(pages) > BIO_MAX_VECS);
nr_pages = min_t(u64, ARRAY_SIZE(pages),
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index 945613c95ffa..8ef61198e14c 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -406,7 +406,8 @@ int ext4_issue_zeroout(struct inode *inode, ext4_lblk_t lblk, ext4_fsblk_t pblk,
if (IS_ENCRYPTED(inode) && S_ISREG(inode->i_mode))
return fscrypt_zeroout_range(inode,
- (loff_t)lblk << inode->i_blkbits, pblk, len);
+ (loff_t)lblk << inode->i_blkbits, pblk,
+ (u64)len << inode->i_blkbits);
ret = sb_issue_zeroout(inode->i_sb, pblk, len, GFP_NOFS);
if (ret > 0)
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index 239c2666ceb5..8785f7c13657 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -4164,7 +4164,7 @@ static int f2fs_secure_erase(struct block_device *bdev, struct inode *inode,
if (IS_ENCRYPTED(inode))
ret = fscrypt_zeroout_range(inode,
(loff_t)off << inode->i_blkbits, block,
- len);
+ (u64)len << inode->i_blkbits);
else
ret = blkdev_issue_zeroout(bdev, sector, nr_sects,
GFP_NOFS, 0);
diff --git a/include/linux/fscrypt.h b/include/linux/fscrypt.h
index 9fc15e1fbe57..90ac62fda926 100644
--- a/include/linux/fscrypt.h
+++ b/include/linux/fscrypt.h
@@ -450,8 +450,8 @@ u64 fscrypt_fname_siphash(const struct inode *dir, const struct qstr *name);
/* bio.c */
bool fscrypt_decrypt_bio(struct bio *bio);
-int fscrypt_zeroout_range(const struct inode *inode, loff_t pos,
- sector_t pblk, unsigned int len);
+int fscrypt_zeroout_range(const struct inode *inode, loff_t pos, sector_t pblk,
+ u64 len);
/* hooks.c */
int fscrypt_file_open(struct inode *inode, struct file *filp);
@@ -756,7 +756,7 @@ static inline bool fscrypt_decrypt_bio(struct bio *bio)
}
static inline int fscrypt_zeroout_range(const struct inode *inode, loff_t pos,
- sector_t pblk, unsigned int len)
+ sector_t pblk, u64 len)
{
return -EOPNOTSUPP;
}
--
2.47.3
WARNING: multiple messages have this Message-ID (diff)
From: Christoph Hellwig <hch@lst.de>
To: Eric Biggers <ebiggers@kernel.org>
Cc: Christian Brauner <brauner@kernel.org>,
"Theodore Y. Ts'o" <tytso@mit.edu>,
"Darrick J. Wong" <djwong@kernel.org>,
linux-f2fs-devel@lists.sourceforge.net,
linux-fscrypt@vger.kernel.org,
Andreas Dilger <adilger.kernel@dilger.ca>,
linux-fsdevel@vger.kernel.org, Jaegeuk Kim <jaegeuk@kernel.org>,
linux-ext4@vger.kernel.org
Subject: [f2fs-dev] [PATCH 12/14] fscrypt: pass a byte length to fscrypt_zeroout_range
Date: Mon, 2 Mar 2026 06:18:17 -0800 [thread overview]
Message-ID: <20260302141922.370070-13-hch@lst.de> (raw)
In-Reply-To: <20260302141922.370070-1-hch@lst.de>
Range lengths are usually expressed as bytes in the VFS, switch
fscrypt_zeroout_range to this convention.
Signed-off-by: Christoph Hellwig <hch@lst.de>
---
fs/crypto/bio.c | 11 ++++++-----
fs/ext4/inode.c | 3 ++-
fs/f2fs/file.c | 2 +-
include/linux/fscrypt.h | 6 +++---
4 files changed, 12 insertions(+), 10 deletions(-)
diff --git a/fs/crypto/bio.c b/fs/crypto/bio.c
index a07ac8dcf851..93087635d987 100644
--- a/fs/crypto/bio.c
+++ b/fs/crypto/bio.c
@@ -115,12 +115,13 @@ static int fscrypt_zeroout_range_inline_crypt(const struct inode *inode,
* @inode: the file's inode
* @pos: the first file position (in bytes) to zero out
* @pblk: the first filesystem physical block to zero out
- * @len: number of blocks to zero out
+ * @len: bytes to zero out
*
* Zero out filesystem blocks in an encrypted regular file on-disk, i.e. write
* ciphertext blocks which decrypt to the all-zeroes block. The blocks must be
* both logically and physically contiguous. It's also assumed that the
- * filesystem only uses a single block device, ->s_bdev.
+ * filesystem only uses a single block device, ->s_bdev. @len must be a
+ * multiple of the file system logical block size.
*
* Note that since each block uses a different IV, this involves writing a
* different ciphertext to each block; we can't simply reuse the same one.
@@ -128,7 +129,7 @@ static int fscrypt_zeroout_range_inline_crypt(const struct inode *inode,
* Return: 0 on success; -errno on failure.
*/
int fscrypt_zeroout_range(const struct inode *inode, loff_t pos,
- sector_t pblk, unsigned int len)
+ sector_t pblk, u64 len)
{
const struct fscrypt_inode_info *ci = fscrypt_get_inode_info_raw(inode);
const unsigned int du_bits = ci->ci_data_unit_bits;
@@ -136,7 +137,7 @@ int fscrypt_zeroout_range(const struct inode *inode, loff_t pos,
const unsigned int du_per_page_bits = PAGE_SHIFT - du_bits;
const unsigned int du_per_page = 1U << du_per_page_bits;
u64 du_index = pos >> du_bits;
- u64 du_remaining = (u64)len << (inode->i_blkbits - du_bits);
+ u64 du_remaining = len >> du_bits;
sector_t sector = pblk << (inode->i_blkbits - SECTOR_SHIFT);
struct page *pages[16]; /* write up to 16 pages at a time */
unsigned int nr_pages;
@@ -150,7 +151,7 @@ int fscrypt_zeroout_range(const struct inode *inode, loff_t pos,
if (fscrypt_inode_uses_inline_crypto(inode))
return fscrypt_zeroout_range_inline_crypt(inode, pos, sector,
- (u64)len << inode->i_blkbits);
+ len);
BUILD_BUG_ON(ARRAY_SIZE(pages) > BIO_MAX_VECS);
nr_pages = min_t(u64, ARRAY_SIZE(pages),
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
index 945613c95ffa..8ef61198e14c 100644
--- a/fs/ext4/inode.c
+++ b/fs/ext4/inode.c
@@ -406,7 +406,8 @@ int ext4_issue_zeroout(struct inode *inode, ext4_lblk_t lblk, ext4_fsblk_t pblk,
if (IS_ENCRYPTED(inode) && S_ISREG(inode->i_mode))
return fscrypt_zeroout_range(inode,
- (loff_t)lblk << inode->i_blkbits, pblk, len);
+ (loff_t)lblk << inode->i_blkbits, pblk,
+ (u64)len << inode->i_blkbits);
ret = sb_issue_zeroout(inode->i_sb, pblk, len, GFP_NOFS);
if (ret > 0)
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index 239c2666ceb5..8785f7c13657 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -4164,7 +4164,7 @@ static int f2fs_secure_erase(struct block_device *bdev, struct inode *inode,
if (IS_ENCRYPTED(inode))
ret = fscrypt_zeroout_range(inode,
(loff_t)off << inode->i_blkbits, block,
- len);
+ (u64)len << inode->i_blkbits);
else
ret = blkdev_issue_zeroout(bdev, sector, nr_sects,
GFP_NOFS, 0);
diff --git a/include/linux/fscrypt.h b/include/linux/fscrypt.h
index 9fc15e1fbe57..90ac62fda926 100644
--- a/include/linux/fscrypt.h
+++ b/include/linux/fscrypt.h
@@ -450,8 +450,8 @@ u64 fscrypt_fname_siphash(const struct inode *dir, const struct qstr *name);
/* bio.c */
bool fscrypt_decrypt_bio(struct bio *bio);
-int fscrypt_zeroout_range(const struct inode *inode, loff_t pos,
- sector_t pblk, unsigned int len);
+int fscrypt_zeroout_range(const struct inode *inode, loff_t pos, sector_t pblk,
+ u64 len);
/* hooks.c */
int fscrypt_file_open(struct inode *inode, struct file *filp);
@@ -756,7 +756,7 @@ static inline bool fscrypt_decrypt_bio(struct bio *bio)
}
static inline int fscrypt_zeroout_range(const struct inode *inode, loff_t pos,
- sector_t pblk, unsigned int len)
+ sector_t pblk, u64 len)
{
return -EOPNOTSUPP;
}
--
2.47.3
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
next prev parent reply other threads:[~2026-03-02 14:19 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-02 14:18 fscrypt API cleanups v3 Christoph Hellwig
2026-03-02 14:18 ` [f2fs-dev] " Christoph Hellwig
2026-03-02 14:18 ` [PATCH 01/14] ext4: initialize the write hint in io_submit_init_bio Christoph Hellwig
2026-03-02 14:18 ` [f2fs-dev] " Christoph Hellwig
2026-03-02 14:18 ` [PATCH 02/14] ext4: open code fscrypt_set_bio_crypt_ctx_bh Christoph Hellwig
2026-03-02 14:18 ` [f2fs-dev] " Christoph Hellwig
2026-03-02 14:18 ` [PATCH 03/14] ext4: factor out a io_submit_need_new_bio helper Christoph Hellwig
2026-03-02 14:18 ` [f2fs-dev] " Christoph Hellwig
2026-03-02 14:18 ` [PATCH 04/14] ext4, fscrypt: merge fscrypt_mergeable_bio_bh into io_submit_need_new_bio Christoph Hellwig
2026-03-02 14:18 ` [f2fs-dev] " Christoph Hellwig
2026-03-02 14:18 ` [PATCH 05/14] fscrypt: move fscrypt_set_bio_crypt_ctx_bh to buffer.c Christoph Hellwig
2026-03-02 14:18 ` [f2fs-dev] " Christoph Hellwig
2026-03-02 14:18 ` [PATCH 06/14] fscrypt: pass a byte offset to fscrypt_generate_dun Christoph Hellwig
2026-03-02 14:18 ` [f2fs-dev] " Christoph Hellwig
2026-03-02 14:18 ` [PATCH 07/14] fscrypt: pass a byte offset to fscrypt_mergeable_bio Christoph Hellwig
2026-03-02 14:18 ` [f2fs-dev] " Christoph Hellwig
2026-03-02 14:18 ` [PATCH 08/14] fscrypt: pass a byte offset to fscrypt_set_bio_crypt_ctx Christoph Hellwig
2026-03-02 14:18 ` [f2fs-dev] " Christoph Hellwig
2026-03-02 14:18 ` [PATCH 09/14] fscrypt: pass a byte offset to fscrypt_zeroout_range_inline_crypt Christoph Hellwig
2026-03-02 14:18 ` [f2fs-dev] " Christoph Hellwig
2026-03-02 14:18 ` [PATCH 10/14] fscrypt: pass a byte length " Christoph Hellwig
2026-03-02 14:18 ` [f2fs-dev] " Christoph Hellwig
2026-03-02 14:18 ` [PATCH 11/14] fscrypt: pass a byte offset to fscrypt_zeroout_range Christoph Hellwig
2026-03-02 14:18 ` [f2fs-dev] " Christoph Hellwig
2026-03-02 14:18 ` Christoph Hellwig [this message]
2026-03-02 14:18 ` [f2fs-dev] [PATCH 12/14] fscrypt: pass a byte length " Christoph Hellwig
2026-03-02 14:18 ` [PATCH 13/14] fscrypt: pass a real sector_t " Christoph Hellwig
2026-03-02 14:18 ` [f2fs-dev] " Christoph Hellwig
2026-03-02 14:18 ` [PATCH 14/14] ext4: use a byte granularity cursor in ext4_mpage_readpages Christoph Hellwig
2026-03-02 14:18 ` [f2fs-dev] " Christoph Hellwig
2026-03-03 22:35 ` fscrypt API cleanups v3 Eric Biggers
2026-03-03 22:35 ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2026-03-09 20:43 ` Eric Biggers
2026-03-09 20:43 ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
-- strict thread matches above, loose matches on Subject: below --
2026-02-26 14:49 fscrypt API cleanups v2 Christoph Hellwig
2026-02-26 14:49 ` [PATCH 12/14] fscrypt: pass a byte length to fscrypt_zeroout_range Christoph Hellwig
2026-02-27 22:14 ` Eric Biggers
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260302141922.370070-13-hch@lst.de \
--to=hch@lst.de \
--cc=adilger.kernel@dilger.ca \
--cc=brauner@kernel.org \
--cc=chao@kernel.org \
--cc=djwong@kernel.org \
--cc=ebiggers@kernel.org \
--cc=jaegeuk@kernel.org \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-f2fs-devel@lists.sourceforge.net \
--cc=linux-fscrypt@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=tytso@mit.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.