summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosh Boyer <jwboyer@fedoraproject.org>2014-12-18 10:06:55 -0500
committerJosh Boyer <jwboyer@fedoraproject.org>2014-12-18 11:30:04 -0500
commite7d4b21c96bbb54a882e7141827d78d64209be8f (patch)
tree8baadd75f2efa28eef633d1692a35c8df15783b1
parent8d48d44bc0ba7ab6b4057800dd47e5d4e59c995e (diff)
downloadkernel-e7d4b21c96bbb54a882e7141827d78d64209be8f.tar.gz
kernel-e7d4b21c96bbb54a882e7141827d78d64209be8f.tar.xz
kernel-e7d4b21c96bbb54a882e7141827d78d64209be8f.zip
Fix dm-cache crash (rhbz 1168434)
-rw-r--r--dm-cache-dirty-flag-was-mistakenly-being-cleared-whe.patch42
-rw-r--r--dm-cache-fix-spurious-cell_defer-when-dealing-with-p.patch40
-rw-r--r--dm-cache-only-use-overwrite-optimisation-for-promoti.patch32
-rw-r--r--kernel.spec11
4 files changed, 125 insertions, 0 deletions
diff --git a/dm-cache-dirty-flag-was-mistakenly-being-cleared-whe.patch b/dm-cache-dirty-flag-was-mistakenly-being-cleared-whe.patch
new file mode 100644
index 000000000..e64136a27
--- /dev/null
+++ b/dm-cache-dirty-flag-was-mistakenly-being-cleared-whe.patch
@@ -0,0 +1,42 @@
+From: Joe Thornber <ejt@redhat.com>
+Date: Thu, 27 Nov 2014 12:26:46 +0000
+Subject: [PATCH] dm cache: dirty flag was mistakenly being cleared when
+ promoting via overwrite
+
+If the incoming bio is a WRITE and completely covers a block then we
+don't bother to do any copying for a promotion operation. Once this is
+done the cache block and origin block will be different, so we need to
+set it to 'dirty'.
+
+Signed-off-by: Joe Thornber <ejt@redhat.com>
+Signed-off-by: Mike Snitzer <snitzer@redhat.com>
+Cc: stable@vger.kernel.org
+---
+ drivers/md/dm-cache-target.c | 10 +++++++---
+ 1 file changed, 7 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c
+index 6f7086355691..387b93d81138 100644
+--- a/drivers/md/dm-cache-target.c
++++ b/drivers/md/dm-cache-target.c
+@@ -951,10 +951,14 @@ static void migration_success_post_commit(struct dm_cache_migration *mg)
+ }
+
+ } else {
+- clear_dirty(cache, mg->new_oblock, mg->cblock);
+- if (mg->requeue_holder)
++ if (mg->requeue_holder) {
++ clear_dirty(cache, mg->new_oblock, mg->cblock);
+ cell_defer(cache, mg->new_ocell, true);
+- else {
++ } else {
++ /*
++ * The block was promoted via an overwrite, so it's dirty.
++ */
++ set_dirty(cache, mg->new_oblock, mg->cblock);
+ bio_endio(mg->new_ocell->holder, 0);
+ cell_defer(cache, mg->new_ocell, false);
+ }
+--
+2.1.0
+
diff --git a/dm-cache-fix-spurious-cell_defer-when-dealing-with-p.patch b/dm-cache-fix-spurious-cell_defer-when-dealing-with-p.patch
new file mode 100644
index 000000000..05a6ebdca
--- /dev/null
+++ b/dm-cache-fix-spurious-cell_defer-when-dealing-with-p.patch
@@ -0,0 +1,40 @@
+From: Joe Thornber <ejt@redhat.com>
+Date: Fri, 28 Nov 2014 09:48:25 +0000
+Subject: [PATCH] dm cache: fix spurious cell_defer when dealing with partial
+ block at end of device
+
+We never bother caching a partial block that is at the back end of the
+origin device. No cell ever gets locked, but the calling code was
+assuming it was and trying to release it.
+
+Now the code only releases if the cell has been set to a non NULL
+value.
+
+Signed-off-by: Joe Thornber <ejt@redhat.com>
+Signed-off-by: Mike Snitzer <snitzer@redhat.com>
+Cc: stable@vger.kernel.org
+---
+ drivers/md/dm-cache-target.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c
+index 387b93d81138..da496cfb458d 100644
+--- a/drivers/md/dm-cache-target.c
++++ b/drivers/md/dm-cache-target.c
+@@ -2554,11 +2554,11 @@ static int __cache_map(struct cache *cache, struct bio *bio, struct dm_bio_priso
+ static int cache_map(struct dm_target *ti, struct bio *bio)
+ {
+ int r;
+- struct dm_bio_prison_cell *cell;
++ struct dm_bio_prison_cell *cell = NULL;
+ struct cache *cache = ti->private;
+
+ r = __cache_map(cache, bio, &cell);
+- if (r == DM_MAPIO_REMAPPED) {
++ if (r == DM_MAPIO_REMAPPED && cell) {
+ inc_ds(cache, bio, cell);
+ cell_defer(cache, cell, false);
+ }
+--
+2.1.0
+
diff --git a/dm-cache-only-use-overwrite-optimisation-for-promoti.patch b/dm-cache-only-use-overwrite-optimisation-for-promoti.patch
new file mode 100644
index 000000000..12a79113d
--- /dev/null
+++ b/dm-cache-only-use-overwrite-optimisation-for-promoti.patch
@@ -0,0 +1,32 @@
+From: Joe Thornber <ejt@redhat.com>
+Date: Thu, 27 Nov 2014 12:21:08 +0000
+Subject: [PATCH] dm cache: only use overwrite optimisation for promotion when
+ in writeback mode
+
+Overwrite causes the cache block and origin blocks to diverge, which
+is only allowed in writeback mode.
+
+Signed-off-by: Joe Thornber <ejt@redhat.com>
+Signed-off-by: Mike Snitzer <snitzer@redhat.com>
+Cc: stable@vger.kernel.org
+---
+ drivers/md/dm-cache-target.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c
+index 7130505c2425..6f7086355691 100644
+--- a/drivers/md/dm-cache-target.c
++++ b/drivers/md/dm-cache-target.c
+@@ -1070,7 +1070,8 @@ static void issue_copy(struct dm_cache_migration *mg)
+
+ avoid = is_discarded_oblock(cache, mg->new_oblock);
+
+- if (!avoid && bio_writes_complete_block(cache, bio)) {
++ if (writeback_mode(&cache->features) &&
++ !avoid && bio_writes_complete_block(cache, bio)) {
+ issue_overwrite(mg, bio);
+ return;
+ }
+--
+2.1.0
+
diff --git a/kernel.spec b/kernel.spec
index a033b8557..f76d75fe1 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -638,6 +638,11 @@ Patch26102: isofs-Fix-infinite-looping-over-CE-entries.patch
#rhbz 1175261
Patch26103: blk-mq-Fix-uninitialized-kobject-at-CPU-hotplugging.patch
+#rhbz 1168434
+Patch26104: dm-cache-only-use-overwrite-optimisation-for-promoti.patch
+Patch26105: dm-cache-dirty-flag-was-mistakenly-being-cleared-whe.patch
+Patch26106: dm-cache-fix-spurious-cell_defer-when-dealing-with-p.patch
+
# git clone ssh://git.fedorahosted.org/git/kernel-arm64.git, git diff master...devel
Patch30000: kernel-arm64.patch
@@ -1384,6 +1389,11 @@ ApplyPatch isofs-Fix-infinite-looping-over-CE-entries.patch
#rhbz 1175261
ApplyPatch blk-mq-Fix-uninitialized-kobject-at-CPU-hotplugging.patch
+#rhbz 1168434
+ApplyPatch dm-cache-only-use-overwrite-optimisation-for-promoti.patch
+ApplyPatch dm-cache-dirty-flag-was-mistakenly-being-cleared-whe.patch
+ApplyPatch dm-cache-fix-spurious-cell_defer-when-dealing-with-p.patch
+
%if 0%{?aarch64patches}
ApplyPatch kernel-arm64.patch
%ifnarch aarch64 # this is stupid, but i want to notice before secondary koji does.
@@ -2253,6 +2263,7 @@ fi
# || ||
%changelog
* Thu Dec 18 2014 Josh Boyer <jwboyer@fedoraproject.org>
+- Fix dm-cache crash (rhbz 1168434)
- Fix blk-mq crash on CPU hotplug (rhbz 1175261)
* Wed Dec 17 2014 Josh Boyer <jwboyer@fedoraproject.org> - 3.18.1-1