summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2025-01-19 17:04:46 -0500
committerKent Overstreet <kent.overstreet@linux.dev>2025-01-19 21:43:14 -0500
commit63db187a577599ddcbf569f905c930b2a52d063e (patch)
tree145e15899bafa45b0d50a280c2c499ac561f51b5
parentcb4af57eb5a0046c43df9141f8f0cc7aed9f49c0 (diff)
locking debugbcachefs-2025-01-20
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r--fs/bcachefs/btree_iter.c9
-rw-r--r--fs/bcachefs/btree_locking.h5
2 files changed, 11 insertions, 3 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c
index 367231ab1980..523ca8cb0e01 100644
--- a/fs/bcachefs/btree_iter.c
+++ b/fs/bcachefs/btree_iter.c
@@ -2234,8 +2234,13 @@ struct bkey_s_c btree_trans_peek_key_cache(struct btree_iter *iter, struct bpos
btree_iter_ip_allocated(iter));
ret = bch2_btree_path_traverse(trans, iter->key_cache_path,
- iter->flags|BTREE_ITER_cached) ?:
- bch2_btree_path_relock(trans, btree_iter_path(trans, iter), _THIS_IP_);
+ iter->flags|BTREE_ITER_cached);
+ if (unlikely(ret))
+ return bkey_s_c_err(ret);
+
+ BUG_ON(IS_ERR(trans->paths[iter->key_cache_path].l[0].b));
+
+ ret = bch2_btree_path_relock(trans, btree_iter_path(trans, iter), _THIS_IP_);
if (unlikely(ret))
return bkey_s_c_err(ret);
diff --git a/fs/bcachefs/btree_locking.h b/fs/bcachefs/btree_locking.h
index b54ef48eb8cc..396d7a52ed86 100644
--- a/fs/bcachefs/btree_locking.h
+++ b/fs/bcachefs/btree_locking.h
@@ -408,7 +408,10 @@ static inline int bch2_btree_path_upgrade(struct btree_trans *trans,
static inline void btree_path_set_should_be_locked(struct btree_trans *trans, struct btree_path *path)
{
- EBUG_ON(!btree_node_locked(path, path->level));
+ if (!btree_node_locked(path, path->level))
+ panic("trans %px path %px idx %zu err %s",
+ trans, path, path - trans->paths,
+ bch2_err_str(PTR_ERR_OR_ZERO(path->l[0].b)));
EBUG_ON(path->uptodate);
path->should_be_locked = true;