// 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;
}
