The new writethrough strategy for dm-cache issues a bio to the origin device, remaps the bio to the cache device, and issues the bio to the cache device. However, the block layer modifies bi_sector and bi_size, so we need to preserve these or else nothing gets written to the cache (bi_size == 0). This fixes the problem where someone writes a block through the cache, but a subsequent reread (from the cache) returns old contents. Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx> --- drivers/md/dm-cache-target.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c index 66120bd..0db0ad2 100644 --- a/drivers/md/dm-cache-target.c +++ b/drivers/md/dm-cache-target.c @@ -205,6 +205,8 @@ struct per_bio_data { struct cache *cache; dm_cblock_t cblock; bio_end_io_t *saved_bi_end_io; + unsigned int bi_size; + sector_t bi_sector; }; struct dm_cache_migration { @@ -643,6 +645,8 @@ static void writethrough_endio(struct bio *bio, int err) return; } + bio->bi_sector = pb->bi_sector; + bio->bi_size = pb->bi_size; remap_to_cache(pb->cache, bio, pb->cblock); /* @@ -667,6 +671,12 @@ static void remap_to_origin_then_cache(struct cache *cache, struct bio *bio, pb->cache = cache; pb->cblock = cblock; pb->saved_bi_end_io = bio->bi_end_io; + /* + * The block layer modifies bi_size and bi_sector, so we must save + * them for when we re-issue the bio against the cache device. + */ + pb->bi_size = bio->bi_size; + pb->bi_sector = bio->bi_sector; bio->bi_end_io = writethrough_endio; remap_to_origin_clear_discard(pb->cache, bio, oblock); -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel