On Fri, 5 Dec 2025, Dongsheng Yang wrote:

> 
> 在 12/5/2025 12:13 AM, Mikulas Patocka 写道:
> > 
> > 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
> 
> 
> It's a bug, if in-place updating for slot happen, there is a potential
> metadata corruption while powercut happening at the same time.
> 
> 
> so I will add
> 
> Cc: [email protected]      # 6.18
> 
> in V2.
> 
> > - 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.
> 
> 
> Good catch, I will send v2 to add the missing pmem_wmb().
> 
> 
> Thanx

OK. I staged all 3 patches and I'll send to Linus soon.

Mikulas

Reply via email to