Merge tag 'ext4_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso...
[cascardo/linux.git] / fs / ext4 / readpage.c
index 2ced5a8..bfc7f4d 100644 (file)
 
 #include "ext4.h"
 
-/*
- * Call ext4_decrypt on every single page, reusing the encryption
- * context.
- */
-static void completion_pages(struct work_struct *work)
-{
-#ifdef CONFIG_EXT4_FS_ENCRYPTION
-       struct ext4_crypto_ctx *ctx =
-               container_of(work, struct ext4_crypto_ctx, r.work);
-       struct bio      *bio    = ctx->r.bio;
-       struct bio_vec  *bv;
-       int             i;
-
-       bio_for_each_segment_all(bv, bio, i) {
-               struct page *page = bv->bv_page;
-
-               int ret = ext4_decrypt(page);
-               if (ret) {
-                       WARN_ON_ONCE(1);
-                       SetPageError(page);
-               } else
-                       SetPageUptodate(page);
-               unlock_page(page);
-       }
-       ext4_release_crypto_ctx(ctx);
-       bio_put(bio);
-#else
-       BUG();
-#endif
-}
-
 static inline bool ext4_bio_encrypted(struct bio *bio)
 {
 #ifdef CONFIG_EXT4_FS_ENCRYPTION
@@ -104,14 +73,10 @@ static void mpage_end_io(struct bio *bio)
        int i;
 
        if (ext4_bio_encrypted(bio)) {
-               struct ext4_crypto_ctx *ctx = bio->bi_private;
-
                if (bio->bi_error) {
-                       ext4_release_crypto_ctx(ctx);
+                       fscrypt_release_ctx(bio->bi_private);
                } else {
-                       INIT_WORK(&ctx->r.work, completion_pages);
-                       ctx->r.bio = bio;
-                       queue_work(ext4_read_workqueue, &ctx->r.work);
+                       fscrypt_decrypt_bio_pages(bio->bi_private, bio);
                        return;
                }
        }
@@ -135,7 +100,6 @@ int ext4_mpage_readpages(struct address_space *mapping,
                         unsigned nr_pages)
 {
        struct bio *bio = NULL;
-       unsigned page_idx;
        sector_t last_block_in_bio = 0;
 
        struct inode *inode = mapping->host;
@@ -157,7 +121,7 @@ int ext4_mpage_readpages(struct address_space *mapping,
        map.m_len = 0;
        map.m_flags = 0;
 
-       for (page_idx = 0; nr_pages; page_idx++, nr_pages--) {
+       for (; nr_pages; nr_pages--) {
                int fully_mapped = 1;
                unsigned first_hole = blocks_per_page;
 
@@ -275,11 +239,11 @@ int ext4_mpage_readpages(struct address_space *mapping,
                        bio = NULL;
                }
                if (bio == NULL) {
-                       struct ext4_crypto_ctx *ctx = NULL;
+                       struct fscrypt_ctx *ctx = NULL;
 
                        if (ext4_encrypted_inode(inode) &&
                            S_ISREG(inode->i_mode)) {
-                               ctx = ext4_get_crypto_ctx(inode, GFP_NOFS);
+                               ctx = fscrypt_get_ctx(inode, GFP_NOFS);
                                if (IS_ERR(ctx))
                                        goto set_error_page;
                        }
@@ -287,7 +251,7 @@ int ext4_mpage_readpages(struct address_space *mapping,
                                min_t(int, nr_pages, BIO_MAX_PAGES));
                        if (!bio) {
                                if (ctx)
-                                       ext4_release_crypto_ctx(ctx);
+                                       fscrypt_release_ctx(ctx);
                                goto set_error_page;
                        }
                        bio->bi_bdev = bdev;