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