mirror of
https://github.com/torvalds/linux.git
synced 2024-11-27 06:31:52 +00:00
dm writecache: flush origin device when writing and cache is full
Commitd53f1fafec
("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: Mikulas Patocka <mpatocka@redhat.com> Fixes:d53f1fafec
("dm writecache: do direct write if the cache is full") Cc: stable@vger.kernel.org # v5.7+ Signed-off-by: Mike Snitzer <snitzer@redhat.com>
This commit is contained in:
parent
293128b1ef
commit
ee55b92a73
@ -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 @@ 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) {
|
||||
@ -2484,7 +2488,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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user