bcachefs: bch2_version_to_text()

Add a new helper for printing out metadata versions in a standard
format.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
Kent Overstreet 2023-06-28 19:53:05 -04:00
parent f33c58fc46
commit e3804b55e4
6 changed files with 37 additions and 20 deletions

View File

@ -11,11 +11,6 @@
#define x(t, n) [n] = #t,
const char * const bch2_metadata_versions[] = {
BCH_METADATA_VERSIONS()
NULL
};
const char * const bch2_error_actions[] = {
BCH_ERROR_ACTIONS()
NULL

View File

@ -8,7 +8,6 @@
#include <linux/sysfs.h>
#include "bcachefs_format.h"
extern const char * const bch2_metadata_versions[];
extern const char * const bch2_error_actions[];
extern const char * const bch2_sb_features[];
extern const char * const bch2_sb_compat[];

View File

@ -1146,17 +1146,22 @@ int bch2_fs_recovery(struct bch_fs *c)
goto err;
}
if (!c->opts.nochanges) {
if (c->sb.version < bcachefs_metadata_required_upgrade_below) {
bch_info(c, "version %s (%u) prior to %s (%u), upgrade and fsck required",
bch2_metadata_versions[c->sb.version],
c->sb.version,
bch2_metadata_versions[bcachefs_metadata_required_upgrade_below],
bcachefs_metadata_required_upgrade_below);
c->opts.version_upgrade = true;
c->opts.fsck = true;
c->opts.fix_errors = FSCK_OPT_YES;
}
if (!c->opts.nochanges &&
c->sb.version < bcachefs_metadata_required_upgrade_below) {
struct printbuf buf = PRINTBUF;
prt_str(&buf, "version ");
bch2_version_to_text(&buf, c->sb.version);
prt_str(&buf, " prior to ");
bch2_version_to_text(&buf, bcachefs_metadata_required_upgrade_below);
prt_str(&buf, ", upgrade and fsck required");
bch_info(c, "%s", buf.buf);
printbuf_exit(&buf);
c->opts.version_upgrade = true;
c->opts.fsck = true;
c->opts.fix_errors = FSCK_OPT_YES;
}
if (c->opts.fsck && c->opts.norecovery) {

View File

@ -26,6 +26,21 @@
static const struct blk_holder_ops bch2_sb_handle_bdev_ops = {
};
static const char * const bch2_metadata_versions[] = {
#define x(t, n) [n] = #t,
BCH_METADATA_VERSIONS()
#undef x
};
void bch2_version_to_text(struct printbuf *out, unsigned v)
{
const char *str = v < ARRAY_SIZE(bch2_metadata_versions)
? bch2_metadata_versions[v]
: "(unknown version)";
prt_printf(out, "%u: %s", v, str);
}
const char * const bch2_sb_fields[] = {
#define x(name, nr) #name,
BCH_SB_FIELDS()
@ -1510,12 +1525,12 @@ void bch2_sb_to_text(struct printbuf *out, struct bch_sb *sb,
prt_str(out, "Version:");
prt_tab(out);
prt_printf(out, "%s", bch2_metadata_versions[le16_to_cpu(sb->version)]);
bch2_version_to_text(out, le16_to_cpu(sb->version));
prt_newline(out);
prt_printf(out, "Oldest version on disk:");
prt_tab(out);
prt_printf(out, "%s", bch2_metadata_versions[le16_to_cpu(sb->version_min)]);
bch2_version_to_text(out, le16_to_cpu(sb->version_min));
prt_newline(out);
prt_printf(out, "Created:");

View File

@ -9,6 +9,8 @@
#include <asm/byteorder.h>
void bch2_version_to_text(struct printbuf *, unsigned);
struct bch_sb_field *bch2_sb_field_get(struct bch_sb *, enum bch_sb_field_type);
struct bch_sb_field *bch2_sb_field_resize(struct bch_sb_handle *,
enum bch_sb_field_type, unsigned);

View File

@ -877,7 +877,8 @@ static void print_mount_opts(struct bch_fs *c)
struct printbuf p = PRINTBUF;
bool first = true;
prt_printf(&p, "mounted version=%s", bch2_metadata_versions[c->sb.version]);
prt_str(&p, "mounted version ");
bch2_version_to_text(&p, c->sb.version);
if (c->opts.read_only) {
prt_str(&p, " opts=");