Commit ee55b92a authored by Mikulas Patocka's avatar Mikulas Patocka Committed by Mike Snitzer
Browse files

dm writecache: flush origin device when writing and cache is full



Commit d53f1faf ("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.
Unfortunately, it doesn't forward flush requests to the origin device,
so that there is a bug where flushes are being ignored.

Fix this by adding 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: default avatarMikulas Patocka <mpatocka@redhat.com>
Fixes: d53f1faf ("dm writecache: do direct write if the cache is full")
Cc: stable@vger.kernel.org # v5.7+
Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
parent 293128b1
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -1297,8 +1297,12 @@ static int writecache_map(struct dm_target *ti, struct bio *bio)
			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 @@ static int writecache_map(struct dm_target *ti, struct bio *bio)
			}
			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) {
@@ -2484,7 +2488,7 @@ static int writecache_ctr(struct dm_target *ti, unsigned argc, char **argv)
		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;