summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2022-09-28 10:04:48 -0400
committerKent Overstreet <kent.overstreet@linux.dev>2022-10-03 23:55:54 -0400
commit5e93c5497ea78c5de38d5863881ab9cca78eca93 (patch)
tree39d3179f55c18489d274d0bd7e42fe5b2dae1de2
parent8ce10d733352e2995295cd01bcd263304fbecd59 (diff)
bcachefs: Fix bch2_backpointer_get_key()
We weren't returning -BCH_ERR_backpointer_to_overwritten_btree_node from bch2_backpointer_get_node - oops. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r--fs/bcachefs/backpointers.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/fs/bcachefs/backpointers.c b/fs/bcachefs/backpointers.c
index 029b1ec14283..955f3ee96cc0 100644
--- a/fs/bcachefs/backpointers.c
+++ b/fs/bcachefs/backpointers.c
@@ -529,14 +529,22 @@ struct bkey_s_c bch2_backpointer_get_key(struct btree_trans *trans,
bch2_trans_iter_exit(trans, iter);
if (bp.level) {
+ struct btree *b;
+
/*
* If a backpointer for a btree node wasn't found, it may be
* because it was overwritten by a new btree node that hasn't
* been written out yet - backpointer_get_node() checks for
* this:
*/
- bch2_backpointer_get_node(trans, iter, bucket, bp_offset, bp);
+ b = bch2_backpointer_get_node(trans, iter, bucket, bp_offset, bp);
+ if (!IS_ERR_OR_NULL(b))
+ return bkey_i_to_s_c(&b->key);
+
bch2_trans_iter_exit(trans, iter);
+
+ if (IS_ERR(b))
+ return bkey_s_c_err(PTR_ERR(b));
return bkey_s_c_null;
}