mirror of
https://github.com/koverstreet/bcachefs-tools.git
synced 2025-03-31 00:00:03 +03:00
cmd_list_journal: --transaction-filter now takes range
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
76538fa923
commit
da4bbf51d0
@ -28,6 +28,7 @@ static void list_journal_usage(void)
|
|||||||
" -a Read entire journal, not just dirty entries\n"
|
" -a Read entire journal, not just dirty entries\n"
|
||||||
" -n, --nr-entries=nr Number of journal entries to print, starting from the most recent\n"
|
" -n, --nr-entries=nr Number of journal entries to print, starting from the most recent\n"
|
||||||
" -t, --transaction-filter=bbpos Filter transactions not updating <bbpos>\n"
|
" -t, --transaction-filter=bbpos Filter transactions not updating <bbpos>\n"
|
||||||
|
" Or entries not matching the range <bbpos-bbpos>\n"
|
||||||
" -k, --key-filter=btree Filter keys not updating btree\n"
|
" -k, --key-filter=btree Filter keys not updating btree\n"
|
||||||
" -v, --verbose Verbose mode\n"
|
" -v, --verbose Verbose mode\n"
|
||||||
" -h, --help Display this help and exit\n"
|
" -h, --help Display this help and exit\n"
|
||||||
@ -50,28 +51,24 @@ static inline bool entry_is_transaction_start(struct jset_entry *entry)
|
|||||||
return entry->type == BCH_JSET_ENTRY_log && !entry->level;
|
return entry->type == BCH_JSET_ENTRY_log && !entry->level;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef DARRAY(struct bbpos) d_bbpos;
|
typedef DARRAY(struct bbpos_range) d_bbpos_range;
|
||||||
typedef DARRAY(enum btree_id) d_btree_id;
|
typedef DARRAY(enum btree_id) d_btree_id;
|
||||||
|
|
||||||
static bool bkey_matches_filter(d_bbpos filter, struct jset_entry *entry, struct bkey_i *k)
|
static bool bkey_matches_filter(d_bbpos_range filter, struct jset_entry *entry, struct bkey_i *k)
|
||||||
{
|
{
|
||||||
darray_for_each(filter, i) {
|
darray_for_each(filter, i) {
|
||||||
if (i->btree != entry->btree_id)
|
struct bbpos k_start = BBPOS(entry->btree_id, bkey_start_pos(&k->k));
|
||||||
continue;
|
struct bbpos k_end = BBPOS(entry->btree_id, k->k.p);
|
||||||
|
|
||||||
if (bkey_eq(i->pos, k->k.p))
|
if (bbpos_cmp(k_start, i->end) < 0 &&
|
||||||
return true;
|
bbpos_cmp(k_end, i->start) > 0)
|
||||||
|
|
||||||
if (btree_node_type_is_extents(i->btree) &&
|
|
||||||
bkey_ge(i->pos, bkey_start_pos(&k->k)) &&
|
|
||||||
bkey_lt(i->pos, k->k.p))
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool entry_matches_transaction_filter(struct jset_entry *entry,
|
static bool entry_matches_transaction_filter(struct jset_entry *entry,
|
||||||
d_bbpos filter)
|
d_bbpos_range filter)
|
||||||
{
|
{
|
||||||
if (entry->type == BCH_JSET_ENTRY_btree_root ||
|
if (entry->type == BCH_JSET_ENTRY_btree_root ||
|
||||||
entry->type == BCH_JSET_ENTRY_btree_keys ||
|
entry->type == BCH_JSET_ENTRY_btree_keys ||
|
||||||
@ -87,7 +84,7 @@ static bool entry_matches_transaction_filter(struct jset_entry *entry,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool should_print_transaction(struct jset_entry *entry, struct jset_entry *end,
|
static bool should_print_transaction(struct jset_entry *entry, struct jset_entry *end,
|
||||||
d_bbpos filter)
|
d_bbpos_range filter)
|
||||||
{
|
{
|
||||||
if (!filter.nr)
|
if (!filter.nr)
|
||||||
return true;
|
return true;
|
||||||
@ -122,7 +119,7 @@ static bool should_print_entry(struct jset_entry *entry, d_btree_id filter)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void journal_entries_print(struct bch_fs *c, unsigned nr_entries,
|
static void journal_entries_print(struct bch_fs *c, unsigned nr_entries,
|
||||||
d_bbpos transaction_filter,
|
d_bbpos_range transaction_filter,
|
||||||
d_btree_id key_filter)
|
d_btree_id key_filter)
|
||||||
{
|
{
|
||||||
struct journal_replay *p, **_p;
|
struct journal_replay *p, **_p;
|
||||||
@ -222,7 +219,7 @@ int cmd_list_journal(int argc, char *argv[])
|
|||||||
};
|
};
|
||||||
struct bch_opts opts = bch2_opts_empty();
|
struct bch_opts opts = bch2_opts_empty();
|
||||||
u32 nr_entries = U32_MAX;
|
u32 nr_entries = U32_MAX;
|
||||||
d_bbpos transaction_filter = { 0 };
|
d_bbpos_range transaction_filter = { 0 };
|
||||||
d_btree_id key_filter = { 0 };
|
d_btree_id key_filter = { 0 };
|
||||||
int opt;
|
int opt;
|
||||||
|
|
||||||
@ -247,7 +244,7 @@ int cmd_list_journal(int argc, char *argv[])
|
|||||||
opt_set(opts, read_entire_journal, true);
|
opt_set(opts, read_entire_journal, true);
|
||||||
break;
|
break;
|
||||||
case 't':
|
case 't':
|
||||||
darray_push(&transaction_filter, bbpos_parse(optarg));
|
darray_push(&transaction_filter, bbpos_range_parse(optarg));
|
||||||
break;
|
break;
|
||||||
case 'k':
|
case 'k':
|
||||||
darray_push(&key_filter, read_string_list_or_die(optarg, __bch2_btree_ids, "btree id"));
|
darray_push(&key_filter, read_string_list_or_die(optarg, __bch2_btree_ids, "btree id"));
|
||||||
|
@ -653,6 +653,18 @@ struct bbpos bbpos_parse(char *buf)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct bbpos_range bbpos_range_parse(char *buf)
|
||||||
|
{
|
||||||
|
char *s = buf;
|
||||||
|
char *start_str = strsep(&s, "-");
|
||||||
|
char *end_str = strsep(&s, "-");
|
||||||
|
|
||||||
|
struct bbpos start = bbpos_parse(start_str);
|
||||||
|
struct bbpos end = end_str ? bbpos_parse(end_str) : start;
|
||||||
|
|
||||||
|
return (struct bbpos_range) { .start = start, .end = end };
|
||||||
|
}
|
||||||
|
|
||||||
darray_str get_or_split_cmdline_devs(int argc, char *argv[])
|
darray_str get_or_split_cmdline_devs(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
darray_str ret = {};
|
darray_str ret = {};
|
||||||
|
@ -199,6 +199,13 @@ do { \
|
|||||||
struct bpos bpos_parse(char *);
|
struct bpos bpos_parse(char *);
|
||||||
struct bbpos bbpos_parse(char *);
|
struct bbpos bbpos_parse(char *);
|
||||||
|
|
||||||
|
struct bbpos_range {
|
||||||
|
struct bbpos start;
|
||||||
|
struct bbpos end;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct bbpos_range bbpos_range_parse(char *);
|
||||||
|
|
||||||
darray_str get_or_split_cmdline_devs(int argc, char *argv[]);
|
darray_str get_or_split_cmdline_devs(int argc, char *argv[]);
|
||||||
|
|
||||||
#endif /* _TOOLS_UTIL_H */
|
#endif /* _TOOLS_UTIL_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user