add patch fix-potential-use-after-free-in-ext4_journal-stop
[ext4-patch-queue.git] / ext4_page_crypto-doesnt-need-ctx
blob4ca523a19adcec119860ace8a4cd39e18a4d0852
1 ext4 crypto: ext4_page_crypto() doesn't need a encryption context
3 Since ext4_page_crypto() doesn't need an encryption context (at least
4 not any more), this allows us to simplify a number function signature
5 and also allows us to avoid needing to allocate a context in
6 ext4_block_write_begin().  It also means we no longer need a separate
7 ext4_decrypt_one() function.
9 Signed-off-by: Theodore Ts'o <tytso@mit.edu>
10 ---
11  fs/ext4/crypto.c   | 28 +++++-----------------------
12  fs/ext4/ext4.h     |  3 +--
13  fs/ext4/inode.c    |  4 ++--
14  fs/ext4/readpage.c |  2 +-
15  4 files changed, 9 insertions(+), 28 deletions(-)
17 diff --git a/fs/ext4/crypto.c b/fs/ext4/crypto.c
18 index 4573155..3a5a7a2 100644
19 --- a/fs/ext4/crypto.c
20 +++ b/fs/ext4/crypto.c
21 @@ -253,8 +253,7 @@ typedef enum {
22         EXT4_ENCRYPT,
23  } ext4_direction_t;
25 -static int ext4_page_crypto(struct ext4_crypto_ctx *ctx,
26 -                           struct inode *inode,
27 +static int ext4_page_crypto(struct inode *inode,
28                             ext4_direction_t rw,
29                             pgoff_t index,
30                             struct page *src_page,
31 @@ -353,7 +352,7 @@ struct page *ext4_encrypt(struct inode *inode,
32         if (IS_ERR(ciphertext_page))
33                 goto errout;
34         ctx->w.control_page = plaintext_page;
35 -       err = ext4_page_crypto(ctx, inode, EXT4_ENCRYPT, plaintext_page->index,
36 +       err = ext4_page_crypto(inode, EXT4_ENCRYPT, plaintext_page->index,
37                                plaintext_page, ciphertext_page);
38         if (err) {
39                 ciphertext_page = ERR_PTR(err);
40 @@ -378,31 +377,14 @@ struct page *ext4_encrypt(struct inode *inode,
41   *
42   * Return: Zero on success, non-zero otherwise.
43   */
44 -int ext4_decrypt(struct ext4_crypto_ctx *ctx, struct page *page)
45 +int ext4_decrypt(struct page *page)
46  {
47         BUG_ON(!PageLocked(page));
49 -       return ext4_page_crypto(ctx, page->mapping->host,
50 +       return ext4_page_crypto(page->mapping->host,
51                                 EXT4_DECRYPT, page->index, page, page);
52  }
54 -/*
55 - * Convenience function which takes care of allocating and
56 - * deallocating the encryption context
57 - */
58 -int ext4_decrypt_one(struct inode *inode, struct page *page)
60 -       int ret;
62 -       struct ext4_crypto_ctx *ctx = ext4_get_crypto_ctx(inode);
64 -       if (IS_ERR(ctx))
65 -               return PTR_ERR(ctx);
66 -       ret = ext4_decrypt(ctx, page);
67 -       ext4_release_crypto_ctx(ctx);
68 -       return ret;
71  int ext4_encrypted_zeroout(struct inode *inode, struct ext4_extent *ex)
72  {
73         struct ext4_crypto_ctx  *ctx;
74 @@ -426,7 +408,7 @@ int ext4_encrypted_zeroout(struct inode *inode, struct ext4_extent *ex)
75         }
77         while (len--) {
78 -               err = ext4_page_crypto(ctx, inode, EXT4_ENCRYPT, lblk,
79 +               err = ext4_page_crypto(inode, EXT4_ENCRYPT, lblk,
80                                        ZERO_PAGE(0), ciphertext_page);
81                 if (err)
82                         goto errout;
83 diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
84 index 766b7f7..3f248c9 100644
85 --- a/fs/ext4/ext4.h
86 +++ b/fs/ext4/ext4.h
87 @@ -2063,8 +2063,7 @@ void ext4_release_crypto_ctx(struct ext4_crypto_ctx *ctx);
88  void ext4_restore_control_page(struct page *data_page);
89  struct page *ext4_encrypt(struct inode *inode,
90                           struct page *plaintext_page);
91 -int ext4_decrypt(struct ext4_crypto_ctx *ctx, struct page *page);
92 -int ext4_decrypt_one(struct inode *inode, struct page *page);
93 +int ext4_decrypt(struct page *page);
94  int ext4_encrypted_zeroout(struct inode *inode, struct ext4_extent *ex);
96  #ifdef CONFIG_EXT4_FS_ENCRYPTION
97 diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
98 index 612fbcf..ac2f0cf 100644
99 --- a/fs/ext4/inode.c
100 +++ b/fs/ext4/inode.c
101 @@ -965,7 +965,7 @@ static int ext4_block_write_begin(struct page *page, loff_t pos, unsigned len,
102         if (unlikely(err))
103                 page_zero_new_buffers(page, from, to);
104         else if (decrypt)
105 -               err = ext4_decrypt_one(inode, page);
106 +               err = ext4_decrypt(page);
107         return err;
109  #endif
110 @@ -3393,7 +3393,7 @@ static int __ext4_block_zero_page_range(handle_t *handle,
111                         /* We expect the key to be set. */
112                         BUG_ON(!ext4_has_encryption_key(inode));
113                         BUG_ON(blocksize != PAGE_CACHE_SIZE);
114 -                       WARN_ON_ONCE(ext4_decrypt_one(inode, page));
115 +                       WARN_ON_ONCE(ext4_decrypt(page));
116                 }
117         }
118         if (ext4_should_journal_data(inode)) {
119 diff --git a/fs/ext4/readpage.c b/fs/ext4/readpage.c
120 index e26803f..a91e4bf 100644
121 --- a/fs/ext4/readpage.c
122 +++ b/fs/ext4/readpage.c
123 @@ -62,7 +62,7 @@ static void completion_pages(struct work_struct *work)
124         bio_for_each_segment_all(bv, bio, i) {
125                 struct page *page = bv->bv_page;
127 -               int ret = ext4_decrypt(ctx, page);
128 +               int ret = ext4_decrypt(page);
129                 if (ret) {
130                         WARN_ON_ONCE(1);
131                         SetPageError(page);