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 +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 +Signed-off-by: Mike Snitzer +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 +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 +Signed-off-by: Mike Snitzer +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 +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 +Signed-off-by: Mike Snitzer +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 +- Fix dm-cache crash (rhbz 1168434) - Fix blk-mq crash on CPU hotplug (rhbz 1175261) * Wed Dec 17 2014 Josh Boyer - 3.18.1-1