1 ext4: provide ext4_issue_zeroout()
3 From: Jan Kara <jack@suse.com>
5 Create new function ext4_issue_zeroout() to zeroout contiguous (both
6 logically and physically) part of inode data. We will need to issue
7 zeroout when extent structure is not readily available and this function
8 will allow us to do it without making up fake extent structures.
10 Signed-off-by: Jan Kara <jack@suse.com>
11 Signed-off-by: Theodore Ts'o <tytso@mit.edu>
13 fs/ext4/crypto.c | 6 ++----
14 fs/ext4/ext4.h | 5 ++++-
15 fs/ext4/extents.c | 12 ++----------
16 fs/ext4/inode.c | 15 +++++++++++++++
17 4 files changed, 23 insertions(+), 15 deletions(-)
19 diff --git a/fs/ext4/crypto.c b/fs/ext4/crypto.c
20 index af06830..c802120 100644
21 --- a/fs/ext4/crypto.c
22 +++ b/fs/ext4/crypto.c
23 @@ -384,14 +384,12 @@ int ext4_decrypt(struct page *page)
24 EXT4_DECRYPT, page->index, page, page);
27 -int ext4_encrypted_zeroout(struct inode *inode, struct ext4_extent *ex)
28 +int ext4_encrypted_zeroout(struct inode *inode, ext4_lblk_t lblk,
29 + ext4_fsblk_t pblk, ext4_lblk_t len)
31 struct ext4_crypto_ctx *ctx;
32 struct page *ciphertext_page = NULL;
34 - ext4_lblk_t lblk = ex->ee_block;
35 - ext4_fsblk_t pblk = ext4_ext_pblock(ex);
36 - unsigned int len = ext4_ext_get_actual_len(ex);
40 diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
41 index 1d09345..353089c 100644
44 @@ -2204,7 +2204,8 @@ void ext4_restore_control_page(struct page *data_page);
45 struct page *ext4_encrypt(struct inode *inode,
46 struct page *plaintext_page);
47 int ext4_decrypt(struct page *page);
48 -int ext4_encrypted_zeroout(struct inode *inode, struct ext4_extent *ex);
49 +int ext4_encrypted_zeroout(struct inode *inode, ext4_lblk_t lblk,
50 + ext4_fsblk_t pblk, ext4_lblk_t len);
52 #ifdef CONFIG_EXT4_FS_ENCRYPTION
53 int ext4_init_crypto(void);
54 @@ -2458,6 +2459,8 @@ extern int ext4_filemap_fault(struct vm_area_struct *vma, struct vm_fault *vmf);
55 extern qsize_t *ext4_get_reserved_space(struct inode *inode);
56 extern void ext4_da_update_reserve_space(struct inode *inode,
57 int used, int quota_claim);
58 +extern int ext4_issue_zeroout(struct inode *inode, ext4_lblk_t lblk,
59 + ext4_fsblk_t pblk, ext4_lblk_t len);
62 extern int ext4_ind_map_blocks(handle_t *handle, struct inode *inode,
63 diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
64 index 393a676..34db78d 100644
65 --- a/fs/ext4/extents.c
66 +++ b/fs/ext4/extents.c
67 @@ -3119,19 +3119,11 @@ static int ext4_ext_zeroout(struct inode *inode, struct ext4_extent *ex)
69 ext4_fsblk_t ee_pblock;
73 ee_len = ext4_ext_get_actual_len(ex);
74 ee_pblock = ext4_ext_pblock(ex);
76 - if (ext4_encrypted_inode(inode))
77 - return ext4_encrypted_zeroout(inode, ex);
79 - ret = sb_issue_zeroout(inode->i_sb, ee_pblock, ee_len, GFP_NOFS);
84 + return ext4_issue_zeroout(inode, le32_to_cpu(ex->ee_block), ee_pblock,
89 diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
90 index f160903..0f91105 100644
93 @@ -383,6 +383,21 @@ static int __check_block_validity(struct inode *inode, const char *func,
97 +int ext4_issue_zeroout(struct inode *inode, ext4_lblk_t lblk, ext4_fsblk_t pblk,
102 + if (ext4_encrypted_inode(inode))
103 + return ext4_encrypted_zeroout(inode, lblk, pblk, len);
105 + ret = sb_issue_zeroout(inode->i_sb, pblk, len, GFP_NOFS);
112 #define check_block_validity(inode, map) \
113 __check_block_validity((inode), __func__, __LINE__, (map))