On 6/15/21 7:49 AM, Coly Li wrote: > Currently the meta data bucket locations on cache device are reserved > after the meta data stored on NVDIMM pages, for the meta data layout > consistentcy temporarily. So these buckets are still marked as meta data > by SET_GC_MARK() in bch_btree_gc_finish(). > > When BCH_FEATURE_INCOMPAT_NVDIMM_META is set, the sb.d[] stores linear > address of NVDIMM pages and not bucket index anymore. Therefore we > should avoid to find bucket index from sb.d[], and directly use bucket > index from ca->sb.first_bucket to (ca->sb.first_bucket + > ca->sb.njournal_bucketsi) for setting the gc mark of journal bucket. > > Signed-off-by: Coly Li <colyli@xxxxxxx> > Cc: Jianpeng Ma <jianpeng.ma@xxxxxxxxx> > Cc: Qiaowei Ren <qiaowei.ren@xxxxxxxxx> > --- > drivers/md/bcache/btree.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c > index 183a58c89377..e0d7135669ca 100644 > --- a/drivers/md/bcache/btree.c > +++ b/drivers/md/bcache/btree.c > @@ -1761,8 +1761,10 @@ static void bch_btree_gc_finish(struct cache_set *c) > ca = c->cache; > ca->invalidate_needs_gc = 0; > > - for (k = ca->sb.d; k < ca->sb.d + ca->sb.keys; k++) > - SET_GC_MARK(ca->buckets + *k, GC_MARK_METADATA); > + /* Range [first_bucket, first_bucket + keys) is for journal buckets */ > + for (i = ca->sb.first_bucket; > + i < ca->sb.first_bucket + ca->sb.njournal_buckets; i++) > + SET_GC_MARK(ca->buckets + i, GC_MARK_METADATA); > > for (k = ca->prio_buckets; > k < ca->prio_buckets + prio_buckets(ca) * 2; k++) > Reviewed-by: Hannes Reinecke <hare@xxxxxxx> Cheers, Hannes -- Dr. Hannes Reinecke Kernel Storage Architect hare@xxxxxxx +49 911 74053 688 SUSE Software Solutions Germany GmbH, Maxfeldstr. 5, 90409 Nürnberg HRB 36809 (AG Nürnberg), GF: Felix Imendörffer