dm-writecache: fix missing flush to the origin device

The patch d53f1fafec9d086f1c5166436abefdaef30e0363 ("dm writecache: do
direct write if the cache is full") changed dm-writecache, so that it
writes directly to the origin device if the cache is full. Unfortunatelly,
it doesn't forward flush requests to the origin device, so that there is a
bug where flushes are being ignored.

This patch adds missing flush forwarding.

For PMEM mode, we fix this bug by disabling direct writes to the origin
device, because it performs better.

Signed-off-by: Mikulas Patocka <[email protected]>
Cc: [email protected]      # v5.7+
Fixes: d53f1fafec9d ("dm writecache: do direct write if the cache is full")

Index: linux/drivers/md/dm-writecache.c
===================================================================
--- linux.orig/drivers/md/dm-writecache.c
+++ linux/drivers/md/dm-writecache.c
@@ -1297,8 +1297,12 @@ static int writecache_map(struct dm_targ
                        writecache_flush(wc);
                        if (writecache_has_error(wc))
                                goto unlock_error;
+                       if (unlikely(wc->cleaner))
+                               goto unlock_remap_origin;
                        goto unlock_submit;
                } else {
+                       if (dm_bio_get_target_bio_nr(bio))
+                               goto unlock_remap_origin;
                        writecache_offload_bio(wc, bio);
                        goto unlock_return;
                }
@@ -1377,7 +1381,7 @@ read_next_block:
                        }
                        e = writecache_pop_from_freelist(wc, (sector_t)-1);
                        if (unlikely(!e)) {
-                               if (!found_entry) {
+                               if (!WC_MODE_PMEM(wc) && !found_entry) {
 direct_write:
                                        e = writecache_find_entry(wc, 
bio->bi_iter.bi_sector, WFE_RETURN_FOLLOWING);
                                        if (e) {
@@ -2479,7 +2483,7 @@ overflow:
                goto bad;
        }
 
-       ti->num_flush_bios = 1;
+       ti->num_flush_bios = WC_MODE_PMEM(wc) ? 1 : 2;
        ti->flush_supported = true;
        ti->num_discard_bios = 1;
 

--
dm-devel mailing list
[email protected]
https://listman.redhat.com/mailman/listinfo/dm-devel

Reply via email to