#define JOURNAL_ENTRY_BAD 7
static void journal_entry_err_msg(struct printbuf *out,
+ u32 version,
struct jset *jset,
struct jset_entry *entry)
{
- prt_str(out, "invalid journal entry ");
- if (entry)
- prt_printf(out, "%s ", bch2_jset_entry_types[entry->type]);
-
- if (!jset)
- prt_printf(out, "in superblock");
- else if (!entry)
- prt_printf(out, "at seq %llu", le64_to_cpu(jset->seq));
- else
- prt_printf(out, "at offset %zi/%u seq %llu",
- (u64 *) entry - jset->_data,
- le32_to_cpu(jset->u64s),
- le64_to_cpu(jset->seq));
+ prt_str(out, "invalid journal entry, version=");
+ bch2_version_to_text(out, version);
+
+ if (entry) {
+ prt_str(out, " type=");
+ prt_str(out, bch2_jset_entry_types[entry->type]);
+ }
+
+ if (!jset) {
+ prt_printf(out, " in superblock");
+ } else {
+
+ prt_printf(out, " seq=%llu", le64_to_cpu(jset->seq));
+
+ if (entry)
+ prt_printf(out, " offset=%zi/%u",
+ (u64 *) entry - jset->_data,
+ le32_to_cpu(jset->u64s));
+ }
+
prt_str(out, ": ");
}
-#define journal_entry_err(c, jset, entry, msg, ...) \
+#define journal_entry_err(c, version, jset, entry, msg, ...) \
({ \
struct printbuf buf = PRINTBUF; \
\
- journal_entry_err_msg(&buf, jset, entry); \
+ journal_entry_err_msg(&buf, version, jset, entry); \
prt_printf(&buf, msg, ##__VA_ARGS__); \
\
switch (write) { \
true; \
})
-#define journal_entry_err_on(cond, c, jset, entry, msg, ...) \
- ((cond) ? journal_entry_err(c, jset, entry, msg, ##__VA_ARGS__) : false)
+#define journal_entry_err_on(cond, c, version, jset, entry, msg, ...) \
+ ((cond) ? journal_entry_err(c, version, jset, entry, msg, ##__VA_ARGS__) : false)
#define FSCK_DELETED_KEY 5
struct printbuf buf = PRINTBUF;
int ret = 0;
- if (journal_entry_err_on(!k->k.u64s, c, jset, entry, "k->u64s 0")) {
+ if (journal_entry_err_on(!k->k.u64s, c, version, jset, entry, "k->u64s 0")) {
entry->u64s = cpu_to_le16((u64 *) k - entry->_data);
journal_entry_null_range(vstruct_next(entry), next);
return FSCK_DELETED_KEY;
if (journal_entry_err_on((void *) bkey_next(k) >
(void *) vstruct_next(entry),
- c, jset, entry,
+ c, version, jset, entry,
"extends past end of journal entry")) {
entry->u64s = cpu_to_le16((u64 *) k - entry->_data);
journal_entry_null_range(vstruct_next(entry), next);
}
if (journal_entry_err_on(k->k.format != KEY_FORMAT_CURRENT,
- c, jset, entry,
+ c, version, jset, entry,
"bad format %u", k->k.format)) {
le16_add_cpu(&entry->u64s, -((u16) k->k.u64s));
memmove(k, bkey_next(k), next - (void *) bkey_next(k));
if (bch2_bkey_invalid(c, bkey_i_to_s_c(k),
__btree_node_type(level, btree_id), write, &buf)) {
printbuf_reset(&buf);
- prt_printf(&buf, "invalid journal entry %s at offset %zi/%u seq %llu:",
- bch2_jset_entry_types[entry->type],
- (u64 *) entry - jset->_data,
- le32_to_cpu(jset->u64s),
- le64_to_cpu(jset->seq));
+ journal_entry_err_msg(&buf, version, jset, entry);
prt_newline(&buf);
printbuf_indent_add(&buf, 2);
if (journal_entry_err_on(!entry->u64s ||
le16_to_cpu(entry->u64s) != k->k.u64s,
- c, jset, entry,
+ c, version, jset, entry,
"invalid btree root journal entry: wrong number of keys")) {
void *next = vstruct_next(entry);
/*
int ret = 0;
if (journal_entry_err_on(le16_to_cpu(entry->u64s) != 1,
- c, jset, entry,
+ c, version, jset, entry,
"invalid journal seq blacklist entry: bad size")) {
journal_entry_null_range(entry, vstruct_next(entry));
}
int ret = 0;
if (journal_entry_err_on(le16_to_cpu(entry->u64s) != 2,
- c, jset, entry,
+ c, version, jset, entry,
"invalid journal seq blacklist entry: bad size")) {
journal_entry_null_range(entry, vstruct_next(entry));
goto out;
if (journal_entry_err_on(le64_to_cpu(bl_entry->start) >
le64_to_cpu(bl_entry->end),
- c, jset, entry,
+ c, version, jset, entry,
"invalid journal seq blacklist entry: start > end")) {
journal_entry_null_range(entry, vstruct_next(entry));
}
int ret = 0;
if (journal_entry_err_on(bytes < sizeof(*u),
- c, jset, entry,
+ c, version, jset, entry,
"invalid journal entry usage: bad size")) {
journal_entry_null_range(entry, vstruct_next(entry));
return ret;
if (journal_entry_err_on(bytes < sizeof(*u) ||
bytes < sizeof(*u) + u->r.nr_devs,
- c, jset, entry,
+ c, version, jset, entry,
"invalid journal entry usage: bad size")) {
journal_entry_null_range(entry, vstruct_next(entry));
return ret;
int ret = 0;
if (journal_entry_err_on(bytes != sizeof(*clock),
- c, jset, entry, "bad size")) {
+ c, version, jset, entry, "bad size")) {
journal_entry_null_range(entry, vstruct_next(entry));
return ret;
}
if (journal_entry_err_on(clock->rw > 1,
- c, jset, entry, "bad rw")) {
+ c, version, jset, entry, "bad rw")) {
journal_entry_null_range(entry, vstruct_next(entry));
return ret;
}
int ret = 0;
if (journal_entry_err_on(bytes < expected,
- c, jset, entry, "bad size (%u < %u)",
+ c, version, jset, entry, "bad size (%u < %u)",
bytes, expected)) {
journal_entry_null_range(entry, vstruct_next(entry));
return ret;
dev = le32_to_cpu(u->dev);
if (journal_entry_err_on(!bch2_dev_exists2(c, dev),
- c, jset, entry, "bad dev")) {
+ c, version, jset, entry, "bad dev")) {
journal_entry_null_range(entry, vstruct_next(entry));
return ret;
}
if (journal_entry_err_on(u->pad,
- c, jset, entry, "bad pad")) {
+ c, version, jset, entry, "bad pad")) {
journal_entry_null_range(entry, vstruct_next(entry));
return ret;
}
int write)
{
struct jset_entry *entry;
+ unsigned version = le32_to_cpu(jset->version);
int ret = 0;
vstruct_for_each(jset, entry) {
- if (journal_entry_err_on(vstruct_next(entry) >
- vstruct_last(jset), c, jset, entry,
+ if (journal_entry_err_on(vstruct_next(entry) > vstruct_last(jset),
+ c, version, jset, entry,
"journal entry extends past end of jset")) {
jset->u64s = cpu_to_le32((u64 *) entry - jset->_data);
break;
}
ret = bch2_journal_entry_validate(c, jset, entry,
- le32_to_cpu(jset->version),
- JSET_BIG_ENDIAN(jset), write);
+ version, JSET_BIG_ENDIAN(jset), write);
if (ret)
break;
}
return JOURNAL_ENTRY_NONE;
version = le32_to_cpu(jset->version);
- if (journal_entry_err_on(!bch2_version_compatible(version), c, jset, NULL,
+ if (journal_entry_err_on(!bch2_version_compatible(version),
+ c, version, jset, NULL,
"%s sector %llu seq %llu: incompatible journal entry version %u.%u",
ca ? ca->name : c->name,
sector, le64_to_cpu(jset->seq),
}
if (journal_entry_err_on(!bch2_checksum_type_valid(c, JSET_CSUM_TYPE(jset)),
- c, jset, NULL,
+ c, version, jset, NULL,
"%s sector %llu seq %llu: journal entry with unknown csum type %llu",
ca ? ca->name : c->name,
sector, le64_to_cpu(jset->seq),
/* last_seq is ignored when JSET_NO_FLUSH is true */
if (journal_entry_err_on(!JSET_NO_FLUSH(jset) &&
le64_to_cpu(jset->last_seq) > le64_to_cpu(jset->seq),
- c, jset, NULL,
+ c, version, jset, NULL,
"invalid journal entry: last_seq > seq (%llu > %llu)",
le64_to_cpu(jset->last_seq),
le64_to_cpu(jset->seq))) {
return JOURNAL_ENTRY_NONE;
version = le32_to_cpu(jset->version);
- if (journal_entry_err_on(!bch2_version_compatible(version), c, jset, NULL,
+ if (journal_entry_err_on(!bch2_version_compatible(version),
+ c, version, jset, NULL,
"%s sector %llu seq %llu: unknown journal entry version %u.%u",
ca ? ca->name : c->name,
sector, le64_to_cpu(jset->seq),
return JOURNAL_ENTRY_REREAD;
if (journal_entry_err_on(bytes > bucket_sectors_left << 9,
- c, jset, NULL,
+ c, version, jset, NULL,
"%s sector %llu seq %llu: journal entry too big (%zu bytes)",
ca ? ca->name : c->name,
sector, le64_to_cpu(jset->seq), bytes))
}
if (journal_entry_err_on(le64_to_cpu(i->j.last_seq) > le64_to_cpu(i->j.seq),
- c, &i->j, NULL,
+ c, le32_to_cpu(i->j.version), &i->j, NULL,
"invalid journal entry: last_seq > seq (%llu > %llu)",
le64_to_cpu(i->j.last_seq),
le64_to_cpu(i->j.seq)))