From f38a26d52f4c07922329d6679ef0f7d1155da6b2 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Tue, 2 Jun 2020 19:41:47 -0400 Subject: bcachefs: Fix a deadlock in bch2_btree_node_get_sibling() There was a bad interaction with bch2_btree_iter_set_pos_same_leaf(), which can leave a btree node locked that is just outside iter->pos, breaking the lock ordering checks in __bch2_btree_node_lock(). Ideally we should get rid of this corner case, but for now fix it locally with verbose comments. Signed-off-by: Kent Overstreet --- fs/bcachefs/btree_iter.h | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) (limited to 'fs/bcachefs/btree_iter.h') diff --git a/fs/bcachefs/btree_iter.h b/fs/bcachefs/btree_iter.h index 841a5834f1a8..ab35fcd8b8b4 100644 --- a/fs/bcachefs/btree_iter.h +++ b/fs/bcachefs/btree_iter.h @@ -172,17 +172,10 @@ void bch2_btree_iter_set_pos_same_leaf(struct btree_iter *, struct bpos); void __bch2_btree_iter_set_pos(struct btree_iter *, struct bpos, bool); void bch2_btree_iter_set_pos(struct btree_iter *, struct bpos); -static inline int __btree_iter_cmp(enum btree_id id, - struct bpos pos, - const struct btree_iter *r) -{ - return cmp_int(id, r->btree_id) ?: bkey_cmp(pos, r->pos); -} - static inline int btree_iter_cmp(const struct btree_iter *l, const struct btree_iter *r) { - return __btree_iter_cmp(l->btree_id, l->pos, r); + return cmp_int(l->btree_id, r->btree_id) ?: bkey_cmp(l->pos, r->pos); } /* -- cgit v1.2.3