bcachefs: btree_node_locked_type_nowrite()
authorKent Overstreet <kent.overstreet@linux.dev>
Thu, 22 May 2025 22:03:32 +0000 (18:03 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Fri, 23 May 2025 11:59:43 +0000 (07:59 -0400)
Small helper to improve locking assertions.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_locking.c
fs/bcachefs/btree_locking.h

index 59a366fdd24ced48b18f62e8a0f511235a403fe6..4745c2035d241e10a135d5b26aa806ddb4a2f216 100644 (file)
@@ -877,14 +877,11 @@ void __bch2_btree_path_verify_locks(struct btree_path *path)
 
        for (unsigned l = 0; l < BTREE_MAX_DEPTH; l++) {
                int want = btree_lock_want(path, l);
-               int have = btree_node_locked_type(path, l);
+               int have = btree_node_locked_type_nowrite(path, l);
 
                BUG_ON(!is_btree_node(path, l) && have != BTREE_NODE_UNLOCKED);
 
-               BUG_ON(is_btree_node(path, l) &&
-                      (want == BTREE_NODE_UNLOCKED ||
-                       have != BTREE_NODE_WRITE_LOCKED) &&
-                      want != have);
+               BUG_ON(is_btree_node(path, l) && want != have);
 
                BUG_ON(btree_node_locked(path, l) &&
                       path->l[l].lock_seq != six_lock_seq(&path->l[l].b->c.lock));
index 1bb28e21d021a16dc772622bbb57467e76fdc178..7e162982de178606e4bb72ab78710000ad6d42e8 100644 (file)
@@ -43,6 +43,15 @@ static inline int btree_node_locked_type(struct btree_path *path,
        return BTREE_NODE_UNLOCKED + ((path->nodes_locked >> (level << 1)) & 3);
 }
 
+static inline int btree_node_locked_type_nowrite(struct btree_path *path,
+                                                unsigned level)
+{
+       int have = btree_node_locked_type(path, level);
+       return have == BTREE_NODE_WRITE_LOCKED
+               ? BTREE_NODE_INTENT_LOCKED
+               : have;
+}
+
 static inline bool btree_node_write_locked(struct btree_path *path, unsigned l)
 {
        return btree_node_locked_type(path, l) == BTREE_NODE_WRITE_LOCKED;
@@ -366,8 +375,8 @@ static inline bool bch2_btree_node_relock_notrace(struct btree_trans *trans,
                                                  struct btree_path *path, unsigned level)
 {
        EBUG_ON(btree_node_locked(path, level) &&
-               !btree_node_write_locked(path, level) &&
-               btree_node_locked_type(path, level) != __btree_lock_want(path, level));
+               btree_node_locked_type_nowrite(path, level) !=
+               __btree_lock_want(path, level));
 
        return likely(btree_node_locked(path, level)) ||
                (!IS_ERR_OR_NULL(path->l[level].b) &&