Commit ee763317 authored by Li Chen's avatar Li Chen Committed by Mikulas Patocka
Browse files

dm pcache: fix cache info indexing



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: default avatarLi Chen <chenl311@chinatelecom.cn>
Signed-off-by: default avatarDongsheng Yang <dongsheng.yang@linux.dev>
Signed-off-by: default avatarMikulas Patocka <mpatocka@redhat.com>
Reviewed-by: default avatarZheng Gu <cengku@gmail.com>
Cc: stable@vger.kernel.org	# 6.18
parent ebbb9034
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -10,7 +10,8 @@ struct kmem_cache *key_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 +50,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;
	}