mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-01 02:36:02 +00:00
bcachefs: Improve bch2_lru_delete() error messages
When we detect a filesystem inconsistency, we should include the relevent keys in the error message. This patch adds a parameter to pass the key with the lru entry to bch2_lru_delete(), so that it can be printed. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
This commit is contained in:
parent
5650bb46be
commit
0b09032653
@ -593,7 +593,7 @@ int bch2_trans_mark_alloc(struct btree_trans *trans,
|
||||
|
||||
if (old_lru != new_lru) {
|
||||
ret = bch2_lru_change(trans, new->k.p.inode, new->k.p.offset,
|
||||
old_lru, &new_lru);
|
||||
old_lru, &new_lru, old);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
@ -30,11 +30,13 @@ void bch2_lru_to_text(struct printbuf *out, struct bch_fs *c,
|
||||
pr_buf(out, "idx %llu", le64_to_cpu(lru->idx));
|
||||
}
|
||||
|
||||
int bch2_lru_delete(struct btree_trans *trans, u64 id, u64 idx, u64 time)
|
||||
int bch2_lru_delete(struct btree_trans *trans, u64 id, u64 idx, u64 time,
|
||||
struct bkey_s_c orig_k)
|
||||
{
|
||||
struct btree_iter iter;
|
||||
struct bkey_s_c k;
|
||||
u64 existing_idx;
|
||||
struct printbuf buf = PRINTBUF;
|
||||
int ret = 0;
|
||||
|
||||
if (!time)
|
||||
@ -50,18 +52,20 @@ int bch2_lru_delete(struct btree_trans *trans, u64 id, u64 idx, u64 time)
|
||||
goto err;
|
||||
|
||||
if (k.k->type != KEY_TYPE_lru) {
|
||||
bch2_bkey_val_to_text(&buf, trans->c, orig_k);
|
||||
bch2_trans_inconsistent(trans,
|
||||
"pointer to nonexistent lru %llu:%llu",
|
||||
id, time);
|
||||
"pointer to nonexistent lru %llu:%llu\n%s",
|
||||
id, time, buf.buf);
|
||||
ret = -EIO;
|
||||
goto err;
|
||||
}
|
||||
|
||||
existing_idx = le64_to_cpu(bkey_s_c_to_lru(k).v->idx);
|
||||
if (existing_idx != idx) {
|
||||
bch2_bkey_val_to_text(&buf, trans->c, orig_k);
|
||||
bch2_trans_inconsistent(trans,
|
||||
"lru %llu:%llu with wrong backpointer: got %llu, should be %llu",
|
||||
id, time, existing_idx, idx);
|
||||
"lru %llu:%llu with wrong backpointer: got %llu, should be %llu\n%s",
|
||||
id, time, existing_idx, idx, buf.buf);
|
||||
ret = -EIO;
|
||||
goto err;
|
||||
}
|
||||
@ -69,6 +73,7 @@ int bch2_lru_delete(struct btree_trans *trans, u64 id, u64 idx, u64 time)
|
||||
ret = bch2_btree_delete_at(trans, &iter, 0);
|
||||
err:
|
||||
bch2_trans_iter_exit(trans, &iter);
|
||||
printbuf_exit(&buf);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -114,12 +119,13 @@ int bch2_lru_set(struct btree_trans *trans, u64 lru_id, u64 idx, u64 *time)
|
||||
}
|
||||
|
||||
int bch2_lru_change(struct btree_trans *trans, u64 id, u64 idx,
|
||||
u64 old_time, u64 *new_time)
|
||||
u64 old_time, u64 *new_time,
|
||||
struct bkey_s_c k)
|
||||
{
|
||||
if (old_time == *new_time)
|
||||
return 0;
|
||||
|
||||
return bch2_lru_delete(trans, id, idx, old_time) ?:
|
||||
return bch2_lru_delete(trans, id, idx, old_time, k) ?:
|
||||
bch2_lru_set(trans, id, idx, new_time);
|
||||
}
|
||||
|
||||
|
@ -10,9 +10,9 @@ void bch2_lru_to_text(struct printbuf *, struct bch_fs *, struct bkey_s_c);
|
||||
.val_to_text = bch2_lru_to_text, \
|
||||
}
|
||||
|
||||
int bch2_lru_delete(struct btree_trans *, u64, u64, u64);
|
||||
int bch2_lru_delete(struct btree_trans *, u64, u64, u64, struct bkey_s_c);
|
||||
int bch2_lru_set(struct btree_trans *, u64, u64, u64 *);
|
||||
int bch2_lru_change(struct btree_trans *, u64, u64, u64, u64 *);
|
||||
int bch2_lru_change(struct btree_trans *, u64, u64, u64, u64 *, struct bkey_s_c);
|
||||
|
||||
int bch2_check_lrus(struct bch_fs *, bool);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user