diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2019-07-12 17:08:32 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:08:24 -0400 |
commit | e222d206f298dc2c689d8f8787c929451d4f909b (patch) | |
tree | e93d5021ddbd7303aa162b2a97ea7b944c7479f5 /fs/bcachefs/recovery.c | |
parent | f516c87272c98186f12768e9589664ce7a910bf4 (diff) | |
download | lwn-e222d206f298dc2c689d8f8787c929451d4f909b.tar.gz lwn-e222d206f298dc2c689d8f8787c929451d4f909b.zip |
bcachefs: Fix ec_stripes_read()
Change it to not mark keys that will be overwritten by keys in the
journal - this fixes a bug where we pop an assertion in
bucket_set_stripe() because of a stale pointer - because the stripe that
has the stale pointer has been deleted.
This code could be factored out and used elsewhere, at some point.
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/recovery.c')
-rw-r--r-- | fs/bcachefs/recovery.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/fs/bcachefs/recovery.c b/fs/bcachefs/recovery.c index e0df2c0a4fdf..92867b5c078f 100644 --- a/fs/bcachefs/recovery.c +++ b/fs/bcachefs/recovery.c @@ -24,6 +24,42 @@ #define QSTR(n) { { { .len = strlen(n) } }, .name = n } +/* iterate over keys read from the journal: */ + +struct journal_iter bch2_journal_iter_init(struct journal_keys *keys, + enum btree_id id) +{ + return (struct journal_iter) { + .keys = keys, + .k = keys->d, + .btree_id = id, + }; +} + +struct bkey_s_c bch2_journal_iter_peek(struct journal_iter *iter) +{ + while (1) { + if (iter->k == iter->keys->d + iter->keys->nr) + return bkey_s_c_null; + + if (iter->k->btree_id == iter->btree_id) + return bkey_i_to_s_c(iter->k->k); + + iter->k++; + } + + return bkey_s_c_null; +} + +struct bkey_s_c bch2_journal_iter_next(struct journal_iter *iter) +{ + if (iter->k == iter->keys->d + iter->keys->nr) + return bkey_s_c_null; + + iter->k++; + return bch2_journal_iter_peek(iter); +} + /* sort and dedup all keys in the journal: */ static void journal_entries_free(struct list_head *list) |