Fix dm-cache crash (rhbz 1168434)
This commit is contained in:
parent
8d48d44bc0
commit
e7d4b21c96
42
dm-cache-dirty-flag-was-mistakenly-being-cleared-whe.patch
Normal file
42
dm-cache-dirty-flag-was-mistakenly-being-cleared-whe.patch
Normal file
@ -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
|
||||||
|
|
40
dm-cache-fix-spurious-cell_defer-when-dealing-with-p.patch
Normal file
40
dm-cache-fix-spurious-cell_defer-when-dealing-with-p.patch
Normal file
@ -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
|
||||||
|
|
32
dm-cache-only-use-overwrite-optimisation-for-promoti.patch
Normal file
32
dm-cache-only-use-overwrite-optimisation-for-promoti.patch
Normal file
@ -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
|
||||||
|
|
11
kernel.spec
11
kernel.spec
@ -638,6 +638,11 @@ Patch26102: isofs-Fix-infinite-looping-over-CE-entries.patch
|
|||||||
#rhbz 1175261
|
#rhbz 1175261
|
||||||
Patch26103: blk-mq-Fix-uninitialized-kobject-at-CPU-hotplugging.patch
|
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
|
# git clone ssh://git.fedorahosted.org/git/kernel-arm64.git, git diff master...devel
|
||||||
Patch30000: kernel-arm64.patch
|
Patch30000: kernel-arm64.patch
|
||||||
|
|
||||||
@ -1384,6 +1389,11 @@ ApplyPatch isofs-Fix-infinite-looping-over-CE-entries.patch
|
|||||||
#rhbz 1175261
|
#rhbz 1175261
|
||||||
ApplyPatch blk-mq-Fix-uninitialized-kobject-at-CPU-hotplugging.patch
|
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}
|
%if 0%{?aarch64patches}
|
||||||
ApplyPatch kernel-arm64.patch
|
ApplyPatch kernel-arm64.patch
|
||||||
%ifnarch aarch64 # this is stupid, but i want to notice before secondary koji does.
|
%ifnarch aarch64 # this is stupid, but i want to notice before secondary koji does.
|
||||||
@ -2253,6 +2263,7 @@ fi
|
|||||||
# || ||
|
# || ||
|
||||||
%changelog
|
%changelog
|
||||||
* Thu Dec 18 2014 Josh Boyer <jwboyer@fedoraproject.org>
|
* Thu Dec 18 2014 Josh Boyer <jwboyer@fedoraproject.org>
|
||||||
|
- Fix dm-cache crash (rhbz 1168434)
|
||||||
- Fix blk-mq crash on CPU hotplug (rhbz 1175261)
|
- Fix blk-mq crash on CPU hotplug (rhbz 1175261)
|
||||||
|
|
||||||
* Wed Dec 17 2014 Josh Boyer <jwboyer@fedoraproject.org> - 3.18.1-1
|
* Wed Dec 17 2014 Josh Boyer <jwboyer@fedoraproject.org> - 3.18.1-1
|
||||||
|
Loading…
Reference in New Issue
Block a user