forked from Minki/linux
4a784266c6
Since bcache code was merged into mainline kerrnel, each cache set only as one single cache in it. The multiple caches framework is here but the code is far from completed. Considering the multiple copies of cached data can also be stored on e.g. md raid1 devices, it is unnecessary to support multiple caches in one cache set indeed. The previous preparation patches fix the dependencies of explicitly making a cache set only have single cache. Now we don't have to maintain an embedded partial super block in struct cache_set, the in-memory super block can be directly referenced from struct cache. This patch removes the embedded struct cache_sb from struct cache_set, and fixes all locations where the superb lock was referenced from this removed super block by referencing the in-memory super block of struct cache. Signed-off-by: Coly Li <colyli@suse.de> Reviewed-by: Hannes Reinecke <hare@suse.de> Signed-off-by: Jens Axboe <axboe@kernel.dk>
76 lines
1.8 KiB
C
76 lines
1.8 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Feature set bits and string conversion.
|
|
* Inspired by ext4's features compat/incompat/ro_compat related code.
|
|
*
|
|
* Copyright 2020 Coly Li <colyli@suse.de>
|
|
*
|
|
*/
|
|
#include <linux/bcache.h>
|
|
#include "bcache.h"
|
|
#include "features.h"
|
|
|
|
struct feature {
|
|
int compat;
|
|
unsigned int mask;
|
|
const char *string;
|
|
};
|
|
|
|
static struct feature feature_list[] = {
|
|
{BCH_FEATURE_INCOMPAT, BCH_FEATURE_INCOMPAT_LARGE_BUCKET,
|
|
"large_bucket"},
|
|
{0, 0, 0 },
|
|
};
|
|
|
|
#define compose_feature_string(type) \
|
|
({ \
|
|
struct feature *f; \
|
|
bool first = true; \
|
|
\
|
|
for (f = &feature_list[0]; f->compat != 0; f++) { \
|
|
if (f->compat != BCH_FEATURE_ ## type) \
|
|
continue; \
|
|
if (BCH_HAS_ ## type ## _FEATURE(&c->cache->sb, f->mask)) { \
|
|
if (first) { \
|
|
out += snprintf(out, buf + size - out, \
|
|
"["); \
|
|
} else { \
|
|
out += snprintf(out, buf + size - out, \
|
|
" ["); \
|
|
} \
|
|
} else if (!first) { \
|
|
out += snprintf(out, buf + size - out, " "); \
|
|
} \
|
|
\
|
|
out += snprintf(out, buf + size - out, "%s", f->string);\
|
|
\
|
|
if (BCH_HAS_ ## type ## _FEATURE(&c->cache->sb, f->mask)) \
|
|
out += snprintf(out, buf + size - out, "]"); \
|
|
\
|
|
first = false; \
|
|
} \
|
|
if (!first) \
|
|
out += snprintf(out, buf + size - out, "\n"); \
|
|
})
|
|
|
|
int bch_print_cache_set_feature_compat(struct cache_set *c, char *buf, int size)
|
|
{
|
|
char *out = buf;
|
|
compose_feature_string(COMPAT);
|
|
return out - buf;
|
|
}
|
|
|
|
int bch_print_cache_set_feature_ro_compat(struct cache_set *c, char *buf, int size)
|
|
{
|
|
char *out = buf;
|
|
compose_feature_string(RO_COMPAT);
|
|
return out - buf;
|
|
}
|
|
|
|
int bch_print_cache_set_feature_incompat(struct cache_set *c, char *buf, int size)
|
|
{
|
|
char *out = buf;
|
|
compose_feature_string(INCOMPAT);
|
|
return out - buf;
|
|
}
|