Fix infinite loop in cmd_list_journal

list_journal can print the entire contents of the journal, and non-dirty
entries don't get validated, so we have to account for that.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
Kent Overstreet 2025-05-25 17:05:55 -04:00
parent fa0a54c45c
commit 241bcd0183
2 changed files with 20 additions and 6 deletions

View File

@ -90,9 +90,13 @@ static bool entry_matches_transaction_filter(struct jset_entry *entry,
if (!entry->level &&
(entry->type == BCH_JSET_ENTRY_btree_keys ||
entry->type == BCH_JSET_ENTRY_overwrite))
jset_entry_for_each_key(entry, k)
jset_entry_for_each_key(entry, k) {
if (!k->k.u64s)
break;
if (bkey_matches_filter(filter, entry, k))
return true;
}
return false;
}
@ -105,10 +109,13 @@ static bool should_print_transaction(struct jset_entry *entry, struct jset_entry
bool have_log_messages = false;
bool have_non_log_messages = false;
darray_for_each(msg_filter, i)
if (!strncmp(*i, l->d, b))
return false;
if (msg_filter.nr) {
darray_for_each(msg_filter, i)
if (!strncmp(*i, l->d, b))
goto found;
return false;
}
found:
if (!key_filter.nr)
return true;
@ -140,10 +147,14 @@ static bool should_print_entry(struct jset_entry *entry, d_btree_id filter)
entry->type != BCH_JSET_ENTRY_overwrite)
return true;
jset_entry_for_each_key(entry, k)
jset_entry_for_each_key(entry, k) {
if (!k->k.u64s)
break;
darray_for_each(filter, id)
if (entry->btree_id == *id)
return true;
}
return false;
}

View File

@ -418,6 +418,9 @@ static void journal_entry_btree_keys_to_text(struct printbuf *out, struct bch_fs
bool first = true;
jset_entry_for_each_key(entry, k) {
if (!k->k.u64s)
break;
if (!first) {
prt_newline(out);
bch2_prt_jset_entry_type(out, entry->type);