summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2022-04-12 00:23:39 +0300
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-23 00:09:31 +0300
commit9b93596c33f6c23de96c05dce82b9aead271a286 (patch)
treeb8b27140d3b4eaeede1384c7d8a26ab926553d59
parent7003589dabcdfd10345ede31044ce5e13ee65e7f (diff)
downloadlinux-9b93596c33f6c23de96c05dce82b9aead271a286.tar.xz
bcachefs: Improve error message when alloc key doesn't match lru entry
Error messages should always print out the full key when available - this gives us a starting point when looking through the journal to debug what went wrong. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r--fs/bcachefs/alloc_background.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/fs/bcachefs/alloc_background.c b/fs/bcachefs/alloc_background.c
index 17b147d15320..1e6283b55e3b 100644
--- a/fs/bcachefs/alloc_background.c
+++ b/fs/bcachefs/alloc_background.c
@@ -1082,6 +1082,7 @@ static int invalidate_one_bucket(struct btree_trans *trans, struct bch_dev *ca)
struct bkey_s_c k;
struct bkey_i_alloc_v4 *a;
u64 bucket, idx;
+ struct printbuf buf = PRINTBUF;
int ret;
bch2_trans_iter_init(trans, &lru_iter, BTREE_ID_lru,
@@ -1107,10 +1108,16 @@ static int invalidate_one_bucket(struct btree_trans *trans, struct bch_dev *ca)
if (ret)
goto out;
- if (bch2_trans_inconsistent_on(idx != alloc_lru_idx(a->v), trans,
- "invalidating bucket with wrong lru idx (got %llu should be %llu",
- idx, alloc_lru_idx(a->v)))
+ if (idx != alloc_lru_idx(a->v)) {
+ pr_buf(&buf, "alloc key does not point back to lru entry when invalidating bucket:\n ");
+
+ bch2_bkey_val_to_text(&buf, c, bkey_i_to_s_c(&a->k_i));
+ pr_buf(&buf, "\n ");
+ bch2_bkey_val_to_text(&buf, c, k);
+ bch2_trans_inconsistent(trans, "%s", buf.buf);
+ ret = -EINVAL;
goto out;
+ }
SET_BCH_ALLOC_V4_NEED_INC_GEN(&a->v, false);
a->v.gen++;
@@ -1125,6 +1132,7 @@ static int invalidate_one_bucket(struct btree_trans *trans, struct bch_dev *ca)
out:
bch2_trans_iter_exit(trans, &alloc_iter);
bch2_trans_iter_exit(trans, &lru_iter);
+ printbuf_exit(&buf);
return ret;
}