On Thu, 4 Dec 2025, Dongsheng Yang wrote:
> In dm-pcache, in order to ensure crash-consistency, a dual-copy scheme > is used to alternately update metadata, and there is a slot index that > records the current slot. However, in the write path the current > implementation writes directly to the current slot indexed by slot > index, and then advances the slot — which ends up overwriting the > existing slot, violating the crash-consistency guarantee. > > This patch fixes that behavior, preventing metadata from being > overwritten incorrectly. > > Signed-off-by: Dongsheng Yang <[email protected]> > --- > drivers/md/dm-pcache/cache.c | 8 ++++---- > drivers/md/dm-pcache/cache_segment.c | 8 ++++---- > 2 files changed, 8 insertions(+), 8 deletions(-) > > diff --git a/drivers/md/dm-pcache/cache.c b/drivers/md/dm-pcache/cache.c > index 698697a7a73c..9289c016b7c9 100644 > --- a/drivers/md/dm-pcache/cache.c > +++ b/drivers/md/dm-pcache/cache.c > @@ -21,10 +21,10 @@ static void cache_info_write(struct pcache_cache *cache) > cache_info->header.crc = pcache_meta_crc(&cache_info->header, > sizeof(struct > pcache_cache_info)); > > + cache->info_index = (cache->info_index + 1) % PCACHE_META_INDEX_MAX; > + > memcpy_flushcache(get_cache_info_addr(cache), cache_info, > sizeof(struct pcache_cache_info)); > - > - cache->info_index = (cache->info_index + 1) % PCACHE_META_INDEX_MAX; > } > > static void cache_info_init_default(struct pcache_cache *cache); I'm not sure whether this is bug or not - but memcpy_flushcache doesn't guarantee that the cache will be flushed (despite it's name) or that writes would be ordered. You need pmem_wmb(). I see that you are using it at other places. Mikulas
