Final changes before pull request to Linus
[ext4-patch-queue.git] / provide-ext4_issue_zeroout
blobb4601c53539709e915d331a52327ad13ac90e809
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>
12 ---
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);
25  }
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)
30  {
31         struct ext4_crypto_ctx  *ctx;
32         struct page             *ciphertext_page = NULL;
33         struct bio              *bio;
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);
37         int                     ret, err = 0;
39  #if 0
40 diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
41 index 1d09345..353089c 100644
42 --- a/fs/ext4/ext4.h
43 +++ b/fs/ext4/ext4.h
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);
61  /* indirect.c */
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)
68  {
69         ext4_fsblk_t ee_pblock;
70         unsigned int ee_len;
71 -       int ret;
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);
80 -       if (ret > 0)
81 -               ret = 0;
83 -       return ret;
84 +       return ext4_issue_zeroout(inode, le32_to_cpu(ex->ee_block), ee_pblock,
85 +                                 ee_len);
86  }
88  /*
89 diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
90 index f160903..0f91105 100644
91 --- a/fs/ext4/inode.c
92 +++ b/fs/ext4/inode.c
93 @@ -383,6 +383,21 @@ static int __check_block_validity(struct inode *inode, const char *func,
94         return 0;
95  }
97 +int ext4_issue_zeroout(struct inode *inode, ext4_lblk_t lblk, ext4_fsblk_t pblk,
98 +                      ext4_lblk_t len)
100 +       int ret;
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);
106 +       if (ret > 0)
107 +               ret = 0;
109 +       return ret;
112  #define check_block_validity(inode, map)       \
113         __check_block_validity((inode), __func__, __LINE__, (map))