]> git.pld-linux.org Git - packages/kernel.git/blobdiff - dm-crypt-fix-allocation-deadlock.patch
- build nopae kernel only on ix86
[packages/kernel.git] / dm-crypt-fix-allocation-deadlock.patch
index 9971e09be951e0c0fba2336f8ac3683d58c2ccad..80994da6eea369c4d499e51166ee70faaad7f38b 100644 (file)
@@ -17,14 +17,14 @@ to a blocking allocation with a mutex.
 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;
@@ -32,7 +32,7 @@ Index: linux-3.10.4-fast/drivers/md/dm-crypt.c
  
        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
@@ -55,9 +55,11 @@ Index: linux-3.10.4-fast/drivers/md/dm-crypt.c
        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))
@@ -70,6 +72,8 @@ Index: linux-3.10.4-fast/drivers/md/dm-crypt.c
  
        clone_init(io, clone);
  
++      remaining_size = size;
++
        for (i = 0; i < nr_iovecs; i++) {
                page = mempool_alloc(cc->page_pool, gfp_mask);
 +              if (!page) {
@@ -79,18 +83,17 @@ Index: linux-3.10.4-fast/drivers/md/dm-crypt.c
 +                      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:
@@ -100,7 +103,7 @@ Index: linux-3.10.4-fast/drivers/md/dm-crypt.c
        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;
        }
  
This page took 0.037339 seconds and 4 git commands to generate.