On 2020/8/25 14:17, Hannes Reinecke wrote: > On 8/22/20 1:45 PM, Coly Li wrote: >> Currently although the bcache code has a framework for multiple caches >> in a cache set, but indeed the multiple caches never completed and users >> use md raid1 for multiple copies of the cached data. >> >> This patch does the following change in struct cache_set, to explicitly >> make a cache_set only have single cache, >> - Change pointer array "*cache[MAX_CACHES_PER_SET]" to a single pointer >> "*cache". >> - Remove pointer array "*cache_by_alloc[MAX_CACHES_PER_SET]". >> - Remove "caches_loaded". >> >> Now the code looks as exactly what it does in practic: only one cache is >> used in the cache set. >> >> Signed-off-by: Coly Li <colyli@xxxxxxx> >> --- >> drivers/md/bcache/alloc.c | 2 +- >> drivers/md/bcache/bcache.h | 8 +++----- >> drivers/md/bcache/super.c | 19 ++++++++----------- >> 3 files changed, 12 insertions(+), 17 deletions(-) >> >> diff --git a/drivers/md/bcache/alloc.c b/drivers/md/bcache/alloc.c >> index 4493ff57476d..3385f6add6df 100644 >> --- a/drivers/md/bcache/alloc.c >> +++ b/drivers/md/bcache/alloc.c >> @@ -501,7 +501,7 @@ int __bch_bucket_alloc_set(struct cache_set *c, >> unsigned int reserve, >> bkey_init(k); >> - ca = c->cache_by_alloc[0]; >> + ca = c->cache; >> b = bch_bucket_alloc(ca, reserve, wait); >> if (b == -1) >> goto err; >> diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h >> index 5ff6e9573935..aa112c1adba1 100644 >> --- a/drivers/md/bcache/bcache.h >> +++ b/drivers/md/bcache/bcache.h >> @@ -519,9 +519,7 @@ struct cache_set { >> struct cache_sb sb; >> - struct cache *cache[MAX_CACHES_PER_SET]; >> - struct cache *cache_by_alloc[MAX_CACHES_PER_SET]; >> - int caches_loaded; >> + struct cache *cache; >> struct bcache_device **devices; >> unsigned int devices_max_used; >> @@ -808,7 +806,7 @@ static inline struct cache *PTR_CACHE(struct >> cache_set *c, >> const struct bkey *k, >> unsigned int ptr) >> { >> - return c->cache[PTR_DEV(k, ptr)]; >> + return c->cache; >> } >> static inline size_t PTR_BUCKET_NR(struct cache_set *c, >> @@ -890,7 +888,7 @@ do { \ >> /* Looping macros */ >> #define for_each_cache(ca, cs, iter) \ >> - for (iter = 0; ca = cs->cache[iter], iter < (cs)->sb.nr_in_set; >> iter++) >> + for (iter = 0; ca = cs->cache, iter < 1; iter++) >> #define for_each_bucket(b, ca) \ >> for (b = (ca)->buckets + (ca)->sb.first_bucket; \ >> diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c >> index 7057ec48f3d1..e9ccfa17beb8 100644 >> --- a/drivers/md/bcache/super.c >> +++ b/drivers/md/bcache/super.c >> @@ -1675,7 +1675,7 @@ static void cache_set_free(struct closure *cl) >> for_each_cache(ca, c, i) >> if (ca) { >> ca->set = NULL; >> - c->cache[ca->sb.nr_this_dev] = NULL; >> + c->cache = NULL; >> kobject_put(&ca->kobj); >> } >> > Please kill 'for_each_cache()', too, and replace it by an if clause. Yes, it is done in next patch: [PATCH v2 03/12] bcache: remove for_each_cache() Thanks. Coly Li