summaryrefslogtreecommitdiff
path: root/libbcachefs/lru.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2022-04-10 14:41:57 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2022-04-10 14:41:57 -0400
commit5ee3f4d7b29d6ee5a2173816892770d5b030bbc0 (patch)
tree8bd9160ef52bdfb63fa8e8f643817bf6477e8bfd /libbcachefs/lru.c
parent8b23ea867a45ead0e97c95a72c8fee40058c5b95 (diff)
Update bcachefs sources to ad72553649 bcachefs: Fix a null ptr derefv0.21
Diffstat (limited to 'libbcachefs/lru.c')
-rw-r--r--libbcachefs/lru.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/libbcachefs/lru.c b/libbcachefs/lru.c
index 267f2f8f..ef4b4a9f 100644
--- a/libbcachefs/lru.c
+++ b/libbcachefs/lru.c
@@ -133,7 +133,7 @@ static int bch2_check_lru_key(struct btree_trans *trans,
struct bch_alloc_v4 a;
struct printbuf buf1 = PRINTBUF;
struct printbuf buf2 = PRINTBUF;
- u64 idx;
+ struct bpos alloc_pos;
int ret;
lru_k = bch2_btree_iter_peek(lru_iter);
@@ -144,10 +144,15 @@ static int bch2_check_lru_key(struct btree_trans *trans,
if (ret)
return ret;
- idx = le64_to_cpu(bkey_s_c_to_lru(lru_k).v->idx);
+ alloc_pos = POS(lru_k.k->p.inode,
+ le64_to_cpu(bkey_s_c_to_lru(lru_k).v->idx));
- bch2_trans_iter_init(trans, &iter, BTREE_ID_alloc,
- POS(lru_k.k->p.inode, idx), 0);
+ if (fsck_err_on(!bch2_dev_bucket_exists(c, alloc_pos), c,
+ "lru key points to nonexistent device:bucket %llu:%llu",
+ alloc_pos.inode, alloc_pos.offset))
+ return bch2_btree_delete_at(trans, lru_iter, 0);
+
+ bch2_trans_iter_init(trans, &iter, BTREE_ID_alloc, alloc_pos, 0);
k = bch2_btree_iter_peek_slot(&iter);
ret = bkey_err(k);
if (ret)