summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2021-08-05 12:37:51 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2021-08-05 12:37:56 -0400
commit3ab44d94521e01c09caac090003d9c7b6a35eb1e (patch)
treef3dfea94ee362add4233bff2def34bb23c74e595
parent6fd8b4b9fbaac9af88e094831ee9a22708d8bba8 (diff)
fixup! bcachefs: Zero out mem_ptr field in btree ptr keys from journal replay
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r--fs/bcachefs/recovery.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/fs/bcachefs/recovery.c b/fs/bcachefs/recovery.c
index 0f9d8abef3db..afb72648fe54 100644
--- a/fs/bcachefs/recovery.c
+++ b/fs/bcachefs/recovery.c
@@ -39,6 +39,20 @@ static void drop_alloc_keys(struct journal_keys *keys)
keys->nr = dst;
}
+/*
+ * Btree node pointers have a field to stack a pointer to the in memory btree
+ * node; we need to zero out this field when reading in btree nodes, or when
+ * reading in keys from the journal:
+ */
+static void zero_out_btree_mem_ptr(struct journal_keys *keys)
+{
+ struct journal_key *i;
+
+ for (i = keys->d; i < keys->d + keys->nr; i++)
+ if (i->k->k.type == KEY_TYPE_btree_ptr_v2)
+ bkey_i_to_btree_ptr_v2(i->k)->v.mem_ptr = 0;
+}
+
/* iterate over keys read from the journal: */
static int __journal_key_cmp(enum btree_id l_btree_id,
@@ -575,10 +589,6 @@ static int bch2_journal_replay(struct bch_fs *c,
sort(keys.d, keys.nr, sizeof(keys.d[0]), journal_sort_seq_cmp, NULL);
- for (i = keys.d; i < keys.d + keys.nr; i++)
- if (i->k->k.type == KEY_TYPE_btree_ptr_v2)
- bkey_i_to_btree_ptr_v2(i->k)->v.mem_ptr = 0;
-
if (keys.nr)
replay_now_at(j, keys.journal_seq_base);
@@ -1076,6 +1086,8 @@ use_clean:
drop_alloc_keys(&c->journal_keys);
}
+ zero_out_btree_mem_ptr(&c->journal_keys);
+
ret = journal_replay_early(c, clean, &c->journal_entries);
if (ret)
goto err;