Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ca763d0a authored by Joe Thornber's avatar Joe Thornber Committed by Mike Snitzer
Browse files

dm cache: fix corruption seen when using cache > 2TB



A rounding bug due to compiler generated temporary being 32bit was found
in remap_to_cache().  A localized cast in remap_to_cache() fixes the
corruption but this preferred fix (changing from uint32_t to sector_t)
eliminates potential for future rounding errors elsewhere.

Cc: stable@vger.kernel.org
Signed-off-by: default avatarJoe Thornber <ejt@redhat.com>
Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
parent 105db599
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -248,7 +248,7 @@ struct cache {
	/*
	 * Fields for converting from sectors to blocks.
	 */
	uint32_t sectors_per_block;
	sector_t sectors_per_block;
	int sectors_per_block_shift;

	spinlock_t lock;
@@ -3547,11 +3547,11 @@ static void cache_status(struct dm_target *ti, status_type_t type,

		residency = policy_residency(cache->policy);

		DMEMIT("%u %llu/%llu %u %llu/%llu %u %u %u %u %u %u %lu ",
		DMEMIT("%u %llu/%llu %llu %llu/%llu %u %u %u %u %u %u %lu ",
		       (unsigned)DM_CACHE_METADATA_BLOCK_SIZE,
		       (unsigned long long)(nr_blocks_metadata - nr_free_blocks_metadata),
		       (unsigned long long)nr_blocks_metadata,
		       cache->sectors_per_block,
		       (unsigned long long)cache->sectors_per_block,
		       (unsigned long long) from_cblock(residency),
		       (unsigned long long) from_cblock(cache->cache_size),
		       (unsigned) atomic_read(&cache->stats.read_hit),