]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.14-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 18 Nov 2014 19:43:48 +0000 (11:43 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 18 Nov 2014 19:43:48 +0000 (11:43 -0800)
added patches:
dm-thin-grab-a-virtual-cell-before-looking-up-the-mapping.patch

queue-3.14/dm-thin-grab-a-virtual-cell-before-looking-up-the-mapping.patch [new file with mode: 0644]
queue-3.14/series

diff --git a/queue-3.14/dm-thin-grab-a-virtual-cell-before-looking-up-the-mapping.patch b/queue-3.14/dm-thin-grab-a-virtual-cell-before-looking-up-the-mapping.patch
new file mode 100644 (file)
index 0000000..d7decef
--- /dev/null
@@ -0,0 +1,75 @@
+From c822ed967cba38505713d59ed40a114386ef6c01 Mon Sep 17 00:00:00 2001
+From: Joe Thornber <ejt@redhat.com>
+Date: Fri, 10 Oct 2014 09:41:09 +0100
+Subject: dm thin: grab a virtual cell before looking up the mapping
+
+From: Joe Thornber <ejt@redhat.com>
+
+commit c822ed967cba38505713d59ed40a114386ef6c01 upstream.
+
+Avoids normal IO racing with discard.
+
+Signed-off-by: Joe Thornber <ejt@redhat.com>
+Signed-off-by: Mike Snitzer <snitzer@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/md/dm-thin.c |   16 ++++++++++++----
+ 1 file changed, 12 insertions(+), 4 deletions(-)
+
+--- a/drivers/md/dm-thin.c
++++ b/drivers/md/dm-thin.c
+@@ -1704,6 +1704,14 @@ static int thin_bio_map(struct dm_target
+               return DM_MAPIO_SUBMITTED;
+       }
++      /*
++       * We must hold the virtual cell before doing the lookup, otherwise
++       * there's a race with discard.
++       */
++      build_virtual_key(tc->td, block, &key);
++      if (dm_bio_detain(tc->pool->prison, &key, bio, &cell1, &cell_result))
++              return DM_MAPIO_SUBMITTED;
++
+       r = dm_thin_find_block(td, block, 0, &result);
+       /*
+@@ -1727,13 +1735,10 @@ static int thin_bio_map(struct dm_target
+                        * shared flag will be set in their case.
+                        */
+                       thin_defer_bio(tc, bio);
++                      cell_defer_no_holder_no_free(tc, &cell1);
+                       return DM_MAPIO_SUBMITTED;
+               }
+-              build_virtual_key(tc->td, block, &key);
+-              if (dm_bio_detain(tc->pool->prison, &key, bio, &cell1, &cell_result))
+-                      return DM_MAPIO_SUBMITTED;
+-
+               build_data_key(tc->td, result.block, &key);
+               if (dm_bio_detain(tc->pool->prison, &key, bio, &cell2, &cell_result)) {
+                       cell_defer_no_holder_no_free(tc, &cell1);
+@@ -1754,6 +1759,7 @@ static int thin_bio_map(struct dm_target
+                        * of doing so.
+                        */
+                       handle_unserviceable_bio(tc->pool, bio);
++                      cell_defer_no_holder_no_free(tc, &cell1);
+                       return DM_MAPIO_SUBMITTED;
+               }
+               /* fall through */
+@@ -1764,6 +1770,7 @@ static int thin_bio_map(struct dm_target
+                * provide the hint to load the metadata into cache.
+                */
+               thin_defer_bio(tc, bio);
++              cell_defer_no_holder_no_free(tc, &cell1);
+               return DM_MAPIO_SUBMITTED;
+       default:
+@@ -1773,6 +1780,7 @@ static int thin_bio_map(struct dm_target
+                * pool is switched to fail-io mode.
+                */
+               bio_io_error(bio);
++              cell_defer_no_holder_no_free(tc, &cell1);
+               return DM_MAPIO_SUBMITTED;
+       }
+ }
index 53521802c7e3f95a456bd1ced94f281541b4c86d..ac2059d085b7332de82092aabc8cbdb867fc1ba4 100644 (file)
@@ -41,3 +41,4 @@ drm-radeon-add-missing-crtc-unlock-when-setting-up-the-mc.patch
 arm-8198-1-make-kuser-helpers-depend-on-mmu.patch
 arm-8191-1-decompressor-ensure-i-side-picks-up-relocated-code.patch
 pinctrl-dra-dt-bindings-fix-output-pull-up-down.patch
+dm-thin-grab-a-virtual-cell-before-looking-up-the-mapping.patch