On Thu, Dec 4, 2025 at 10:57 AM Dongsheng Yang <[email protected]> wrote: > > From: Li Chen <[email protected]> > > The on-media cache_info index used sizeof(struct) instead of the > 4K metadata stride, so gc_percent updates from dmsetup message > were written between slots and lost after reboot. Use > PCACHE_CACHE_INFO_SIZE in get_cache_info_addr() and align > info_index with the slot returned by pcache_meta_find_latest(). > > Signed-off-by: Li Chen <[email protected]> > Signed-off-by: Dongsheng Yang <[email protected]> > --- > drivers/md/dm-pcache/cache.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/drivers/md/dm-pcache/cache.c b/drivers/md/dm-pcache/cache.c > index 9289c016b7c9..bcc4e509aa69 100644 > --- a/drivers/md/dm-pcache/cache.c > +++ b/drivers/md/dm-pcache/cache.c > @@ -8,9 +8,11 @@ > > struct kmem_cache *key_cache; > > -static inline struct pcache_cache_info *get_cache_info_addr(struct > pcache_cache *cache) > +static inline struct pcache_cache_info * > +get_cache_info_addr(struct pcache_cache *cache) > { > - return cache->cache_info_addr + cache->info_index; > + return (struct pcache_cache_info *)((char *)cache->cache_info_addr + > + (size_t)cache->info_index * > PCACHE_CACHE_INFO_SIZE); > } > > static void cache_info_write(struct pcache_cache *cache) > @@ -49,6 +51,8 @@ static int cache_info_init(struct pcache_cache *cache, > struct pcache_cache_optio > return -EINVAL; > } > > + cache->info_index = ((char *)cache_info_addr - (char > *)cache->cache_info_addr) / PCACHE_CACHE_INFO_SIZE; > + > return 0; > } > > -- > 2.43.0 >
Reviewed-by: Zheng Gu <[email protected]> Regards, Gu
