sector_t start;
 
        /*
-        * pool for per bio private data and
-        * for encryption buffer pages
+        * pool for per bio private data, crypto requests and
+        * encryption requeusts/buffer pages
         */
        mempool_t *io_pool;
+       mempool_t *req_pool;
        mempool_t *page_pool;
        struct bio_set *bs;
 
        sector_t iv_offset;
        unsigned int iv_size;
 
+       /*
+        * Layout of each crypto request:
+        *
+        *   struct ablkcipher_request
+        *      context
+        *      padding
+        *   struct dm_crypt_request
+        *      padding
+        *   IV
+        *
+        * The padding is added so that dm_crypt_request and the IV are
+        * correctly aligned.
+        */
+       unsigned int dmreq_start;
+       struct ablkcipher_request *req;
+
        char cipher[CRYPTO_MAX_ALG_NAME];
        char chainmode[CRYPTO_MAX_ALG_NAME];
        struct crypto_blkcipher *tfm;
                                         ctx->sector);
 }
 
+static void crypt_alloc_req(struct crypt_config *cc,
+                           struct convert_context *ctx)
+{
+       if (!cc->req)
+               cc->req = mempool_alloc(cc->req_pool, GFP_NOIO);
+}
+
 /*
  * Encrypt / decrypt data from one bio to another one (can be the same one)
  */
                goto bad_slab_pool;
        }
 
+       cc->dmreq_start = sizeof(struct ablkcipher_request);
+       cc->dmreq_start = ALIGN(cc->dmreq_start, crypto_tfm_ctx_alignment());
+
+       cc->req_pool = mempool_create_kmalloc_pool(MIN_IOS, cc->dmreq_start +
+                       sizeof(struct dm_crypt_request) + cc->iv_size);
+       if (!cc->req_pool) {
+               ti->error = "Cannot allocate crypt request mempool";
+               goto bad_req_pool;
+       }
+       cc->req = NULL;
+
        cc->page_pool = mempool_create_page_pool(MIN_POOL_PAGES, 0);
        if (!cc->page_pool) {
                ti->error = "Cannot allocate page mempool";
 bad_bs:
        mempool_destroy(cc->page_pool);
 bad_page_pool:
+       mempool_destroy(cc->req_pool);
+bad_req_pool:
        mempool_destroy(cc->io_pool);
 bad_slab_pool:
        if (cc->iv_gen_ops && cc->iv_gen_ops->dtr)
        destroy_workqueue(cc->io_queue);
        destroy_workqueue(cc->crypt_queue);
 
+       if (cc->req)
+               mempool_free(cc->req, cc->req_pool);
+
        bioset_free(cc->bs);
        mempool_destroy(cc->page_pool);
+       mempool_destroy(cc->req_pool);
        mempool_destroy(cc->io_pool);
 
        kfree(cc->iv_mode);