| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- // 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 "bcache_ondisk.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_LOG_LARGE_BUCKET_SIZE,
- "large_bucket"},
- {0, 0, NULL },
- };
- #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;
- }
|