summaryrefslogtreecommitdiff
path: root/fs/bcachefs/recovery.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2019-07-12 17:08:32 -0400
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-22 17:08:24 -0400
commite222d206f298dc2c689d8f8787c929451d4f909b (patch)
treee93d5021ddbd7303aa162b2a97ea7b944c7479f5 /fs/bcachefs/recovery.c
parentf516c87272c98186f12768e9589664ce7a910bf4 (diff)
downloadlwn-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.c36
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)