mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-09 19:39:56 +00:00
dm cache: fix resize crash if user doesn't reload cache table
commit5d07384a66upstream. A reload of the cache's DM table is needed during resize because otherwise a crash will occur when attempting to access smq policy entries associated with the portion of the cache that was recently extended. The reason is cache-size based data structures in the policy will not be resized, the only way to safely extend the cache is to allow for a proper cache policy initialization that occurs when the cache table is loaded. For example the smq policy's space_init(), init_allocator(), calc_hotspot_params() must be sized based on the extended cache size. The fix for this is to disallow cache resizes of this pattern: 1) suspend "cache" target's device 2) resize the fast device used for the cache 3) resume "cache" target's device Instead, the last step must be a full reload of the cache's DM table. Fixes:66a636356("dm cache: add stochastic-multi-queue (smq) policy") Cc: stable@vger.kernel.org Signed-off-by: Mike Snitzer <snitzer@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
f10b1cdb61
commit
226c5c8a54
@@ -3017,8 +3017,13 @@ static dm_cblock_t get_cache_dev_size(struct cache *cache)
|
|||||||
|
|
||||||
static bool can_resize(struct cache *cache, dm_cblock_t new_size)
|
static bool can_resize(struct cache *cache, dm_cblock_t new_size)
|
||||||
{
|
{
|
||||||
if (from_cblock(new_size) > from_cblock(cache->cache_size))
|
if (from_cblock(new_size) > from_cblock(cache->cache_size)) {
|
||||||
return true;
|
if (cache->sized) {
|
||||||
|
DMERR("%s: unable to extend cache due to missing cache table reload",
|
||||||
|
cache_device_name(cache));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We can't drop a dirty block when shrinking the cache.
|
* We can't drop a dirty block when shrinking the cache.
|
||||||
|
|||||||
Reference in New Issue
Block a user