|
Hannes Reinecke |
e633b8 |
From: Mikulas Patocka <mpatocka@redhat.com>
|
|
Hannes Reinecke |
e633b8 |
Date: Tue, 15 Jun 2021 13:45:55 -0400
|
|
Hannes Reinecke |
e633b8 |
Subject: [PATCH] dm writecache: flush origin device when writing and cache is
|
|
Hannes Reinecke |
e633b8 |
full
|
|
Hannes Reinecke |
e633b8 |
Git-commit: ee55b92a7391bf871939330f662651b54be51b73
|
|
Hannes Reinecke |
e633b8 |
Patch-mainline: v5.14-rc1
|
|
Hannes Reinecke |
e633b8 |
References: git-fixes
|
|
Hannes Reinecke |
e633b8 |
|
|
Hannes Reinecke |
e633b8 |
Commit d53f1fafec9d086f1c5166436abefdaef30e0363 ("dm writecache: do
|
|
Hannes Reinecke |
e633b8 |
direct write if the cache is full") changed dm-writecache, so that it
|
|
Hannes Reinecke |
e633b8 |
writes directly to the origin device if the cache is full.
|
|
Hannes Reinecke |
e633b8 |
Unfortunately, it doesn't forward flush requests to the origin device,
|
|
Hannes Reinecke |
e633b8 |
so that there is a bug where flushes are being ignored.
|
|
Hannes Reinecke |
e633b8 |
|
|
Hannes Reinecke |
e633b8 |
Fix this by adding missing flush forwarding.
|
|
Hannes Reinecke |
e633b8 |
|
|
Hannes Reinecke |
e633b8 |
For PMEM mode, we fix this bug by disabling direct writes to the origin
|
|
Hannes Reinecke |
e633b8 |
device, because it performs better.
|
|
Hannes Reinecke |
e633b8 |
|
|
Hannes Reinecke |
e633b8 |
Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
|
|
Hannes Reinecke |
e633b8 |
Fixes: d53f1fafec9d ("dm writecache: do direct write if the cache is full")
|
|
Hannes Reinecke |
e633b8 |
Cc: stable@vger.kernel.org # v5.7+
|
|
Hannes Reinecke |
e633b8 |
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
|
|
Hannes Reinecke |
e633b8 |
Acked-by: Hannes Reinecke <hare@suse.com>
|
|
Hannes Reinecke |
e633b8 |
---
|
|
Hannes Reinecke |
e633b8 |
drivers/md/dm-writecache.c | 8 ++++++--
|
|
Hannes Reinecke |
e633b8 |
1 file changed, 6 insertions(+), 2 deletions(-)
|
|
Hannes Reinecke |
e633b8 |
|
|
Hannes Reinecke |
e633b8 |
diff --git a/drivers/md/dm-writecache.c b/drivers/md/dm-writecache.c
|
|
Hannes Reinecke |
e633b8 |
index 28bb6890fcf4..ddd368e0491d 100644
|
|
Hannes Reinecke |
e633b8 |
--- a/drivers/md/dm-writecache.c
|
|
Hannes Reinecke |
e633b8 |
+++ b/drivers/md/dm-writecache.c
|
|
Hannes Reinecke |
e633b8 |
@@ -1297,8 +1297,12 @@ static int writecache_map(struct dm_target *ti, struct bio *bio)
|
|
Hannes Reinecke |
e633b8 |
writecache_flush(wc);
|
|
Hannes Reinecke |
e633b8 |
if (writecache_has_error(wc))
|
|
Hannes Reinecke |
e633b8 |
goto unlock_error;
|
|
Hannes Reinecke |
e633b8 |
+ if (unlikely(wc->cleaner))
|
|
Hannes Reinecke |
e633b8 |
+ goto unlock_remap_origin;
|
|
Hannes Reinecke |
e633b8 |
goto unlock_submit;
|
|
Hannes Reinecke |
e633b8 |
} else {
|
|
Hannes Reinecke |
e633b8 |
+ if (dm_bio_get_target_bio_nr(bio))
|
|
Hannes Reinecke |
e633b8 |
+ goto unlock_remap_origin;
|
|
Hannes Reinecke |
e633b8 |
writecache_offload_bio(wc, bio);
|
|
Hannes Reinecke |
e633b8 |
goto unlock_return;
|
|
Hannes Reinecke |
e633b8 |
}
|
|
Hannes Reinecke |
e633b8 |
@@ -1377,7 +1381,7 @@ static int writecache_map(struct dm_target *ti, struct bio *bio)
|
|
Hannes Reinecke |
e633b8 |
}
|
|
Hannes Reinecke |
e633b8 |
e = writecache_pop_from_freelist(wc, (sector_t)-1);
|
|
Hannes Reinecke |
e633b8 |
if (unlikely(!e)) {
|
|
Hannes Reinecke |
e633b8 |
- if (!found_entry) {
|
|
Hannes Reinecke |
e633b8 |
+ if (!WC_MODE_PMEM(wc) && !found_entry) {
|
|
Hannes Reinecke |
e633b8 |
direct_write:
|
|
Hannes Reinecke |
e633b8 |
e = writecache_find_entry(wc, bio->bi_iter.bi_sector, WFE_RETURN_FOLLOWING);
|
|
Hannes Reinecke |
e633b8 |
if (e) {
|
|
Hannes Reinecke |
e633b8 |
@@ -2484,7 +2488,7 @@ static int writecache_ctr(struct dm_target *ti, unsigned argc, char **argv)
|
|
Hannes Reinecke |
e633b8 |
goto bad;
|
|
Hannes Reinecke |
e633b8 |
}
|
|
Hannes Reinecke |
e633b8 |
|
|
Hannes Reinecke |
e633b8 |
- ti->num_flush_bios = 1;
|
|
Hannes Reinecke |
e633b8 |
+ ti->num_flush_bios = WC_MODE_PMEM(wc) ? 1 : 2;
|
|
Hannes Reinecke |
e633b8 |
ti->flush_supported = true;
|
|
Hannes Reinecke |
e633b8 |
ti->num_discard_bios = 1;
|
|
Hannes Reinecke |
e633b8 |
|
|
Hannes Reinecke |
e633b8 |
--
|
|
Hannes Reinecke |
e633b8 |
2.29.2
|
|
Hannes Reinecke |
e633b8 |
|