Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
---
- drivers/md/dm-crypt.c | 36 +++++++++++++++++++++++++++++++++---
- 1 file changed, 33 insertions(+), 3 deletions(-)
+ drivers/md/dm-crypt.c | 41 ++++++++++++++++++++++++++++++++++++-----
+ 1 file changed, 36 insertions(+), 5 deletions(-)
-Index: linux-3.10.4-fast/drivers/md/dm-crypt.c
+Index: linux-3.14/drivers/md/dm-crypt.c
===================================================================
---- linux-3.10.4-fast.orig/drivers/md/dm-crypt.c 2013-07-31 17:03:21.000000000 +0200
-+++ linux-3.10.4-fast/drivers/md/dm-crypt.c 2013-07-31 17:03:24.000000000 +0200
-@@ -118,6 +118,7 @@ struct crypt_config {
+--- linux-3.14.orig/drivers/md/dm-crypt.c 2014-04-04 20:59:46.000000000 +0200
++++ linux-3.14/drivers/md/dm-crypt.c 2014-04-04 21:04:40.000000000 +0200
+@@ -124,6 +124,7 @@ struct crypt_config {
mempool_t *req_pool;
mempool_t *page_pool;
struct bio_set *bs;
struct workqueue_struct *io_queue;
struct workqueue_struct *crypt_queue;
-@@ -780,24 +781,46 @@ static void crypt_free_buffer_pages(stru
+@@ -954,27 +955,51 @@ static void crypt_free_buffer_pages(stru
/*
* Generate a new unfragmented bio with the given size
* This should never violate the device limitations
struct bio *clone;
unsigned int nr_iovecs = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
- gfp_t gfp_mask = GFP_NOIO | __GFP_HIGHMEM;
+- unsigned i, len;
+ gfp_t gfp_mask = GFP_NOWAIT | __GFP_HIGHMEM;
- unsigned i, len;
++ unsigned i, len, remaining_size;
struct page *page;
+ struct bio_vec *bvec;
+retry:
+ if (unlikely(gfp_mask & __GFP_WAIT))
clone_init(io, clone);
++ remaining_size = size;
++
for (i = 0; i < nr_iovecs; i++) {
page = mempool_alloc(cc->page_pool, gfp_mask);
+ if (!page) {
+ goto retry;
+ }
- len = (size > PAGE_SIZE) ? PAGE_SIZE : size;
+- len = (size > PAGE_SIZE) ? PAGE_SIZE : size;
++ len = (remaining_size > PAGE_SIZE) ? PAGE_SIZE : remaining_size;
+
+ bvec = &clone->bi_io_vec[clone->bi_vcnt++];
+ bvec->bv_page = page;
+@@ -983,9 +1008,13 @@ static struct bio *crypt_alloc_buffer(st
-@@ -806,12 +829,17 @@ static struct bio *crypt_alloc_buffer(st
- mempool_free(page, cc->page_pool);
- crypt_free_buffer_pages(cc, clone);
- bio_put(clone);
-- return NULL;
-+ clone = NULL;
-+ goto return_clone;
- }
+ clone->bi_iter.bi_size += len;
- size -= len;
+- size -= len;
++ remaining_size -= len;
}
+return_clone:
return clone;
}
-@@ -1483,6 +1511,8 @@ static int crypt_ctr(struct dm_target *t
+@@ -1671,6 +1700,8 @@ static int crypt_ctr(struct dm_target *t
goto bad;
}