bcachefs: Fix silent enum conversion error
authorKent Overstreet <kent.overstreet@linux.dev>
Sun, 10 Sep 2023 01:14:54 +0000 (21:14 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:10:12 +0000 (17:10 -0400)
This changes mark_btree_node_locked() to take an enum
btree_node_locked_type, not a six_lock_type, since BTREE_NODE_UNLOCKED
is -1 which may cause problems converting back and forth to
six_lock_type if short enums are in use.

With this change, we never store BTREE_NODE_UNLOCKED in a six_lock_type
enum.

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

index 98cf52c5e132fd22190b30109f6e5e799970abe8..1dbb4d7dfb4512270f70f08a07a040a91550a549 100644 (file)
@@ -689,7 +689,7 @@ void bch2_trans_node_add(struct btree_trans *trans, struct btree *b)
                        if (t != BTREE_NODE_UNLOCKED) {
                                btree_node_unlock(trans, path, b->c.level);
                                six_lock_increment(&b->c.lock, (enum six_lock_type) t);
-                               mark_btree_node_locked(trans, path, b->c.level, (enum six_lock_type) t);
+                               mark_btree_node_locked(trans, path, b->c.level, t);
                        }
 
                        bch2_btree_path_level_init(trans, path, b);
@@ -764,7 +764,8 @@ static inline int btree_path_lock_root(struct btree_trans *trans,
                        for (i = path->level + 1; i < BTREE_MAX_DEPTH; i++)
                                path->l[i].b = NULL;
 
-                       mark_btree_node_locked(trans, path, path->level, lock_type);
+                       mark_btree_node_locked(trans, path, path->level,
+                                              (enum btree_node_locked_type) lock_type);
                        bch2_btree_path_level_init(trans, path, b);
                        return 0;
                }
@@ -936,7 +937,8 @@ static __always_inline int btree_path_down(struct btree_trans *trans,
        if (btree_node_read_locked(path, level + 1))
                btree_node_unlock(trans, path, level + 1);
 
-       mark_btree_node_locked(trans, path, level, lock_type);
+       mark_btree_node_locked(trans, path, level,
+                              (enum btree_node_locked_type) lock_type);
        path->level = level;
        bch2_btree_path_level_init(trans, path, b);
 
index badb541f493f222e46113e15c5737fc1871e2bfc..505e7c365ab73da8a8a5a6a65f88f0da3efbf7a4 100644 (file)
@@ -252,7 +252,7 @@ bkey_cached_alloc(struct btree_trans *trans, struct btree_path *path,
 
                path->l[0].b = (void *) ck;
                path->l[0].lock_seq = six_lock_seq(&ck->c.lock);
-               mark_btree_node_locked(trans, path, 0, SIX_LOCK_intent);
+               mark_btree_node_locked(trans, path, 0, BTREE_NODE_INTENT_LOCKED);
 
                ret = bch2_btree_node_lock_write(trans, path, &ck->c);
                if (unlikely(ret)) {
@@ -330,7 +330,7 @@ btree_key_cache_create(struct btree_trans *trans, struct btree_path *path)
                        return ERR_PTR(-BCH_ERR_ENOMEM_btree_key_cache_create);
                }
 
-               mark_btree_node_locked(trans, path, 0, SIX_LOCK_intent);
+               mark_btree_node_locked(trans, path, 0, BTREE_NODE_INTENT_LOCKED);
        }
 
        ck->c.level             = 0;
@@ -478,7 +478,7 @@ retry:
                if (!ck)
                        goto retry;
 
-               mark_btree_node_locked(trans, path, 0, SIX_LOCK_intent);
+               mark_btree_node_locked(trans, path, 0, BTREE_NODE_INTENT_LOCKED);
                path->locks_want = 1;
        } else {
                enum six_lock_type lock_want = __btree_lock_want(path, 0);
@@ -496,7 +496,8 @@ retry:
                        goto retry;
                }
 
-               mark_btree_node_locked(trans, path, 0, lock_want);
+               mark_btree_node_locked(trans, path, 0,
+                                      (enum btree_node_locked_type) lock_want);
        }
 
        path->l[0].lock_seq     = six_lock_seq(&ck->c.lock);
@@ -578,7 +579,8 @@ retry:
                        goto retry;
                }
 
-               mark_btree_node_locked(trans, path, 0, lock_want);
+               mark_btree_node_locked(trans, path, 0,
+                                      (enum btree_node_locked_type) lock_want);
        }
 
        path->l[0].lock_seq     = six_lock_seq(&ck->c.lock);
index 22e2cd3914a524c574bbf9e07451a5d13df7d159..6231e9ffc5d7497b693febe166e64560a6f024c9 100644 (file)
@@ -91,7 +91,7 @@ static inline void mark_btree_node_unlocked(struct btree_path *path,
 static inline void mark_btree_node_locked(struct btree_trans *trans,
                                          struct btree_path *path,
                                          unsigned level,
-                                         enum six_lock_type type)
+                                         enum btree_node_locked_type type)
 {
        mark_btree_node_locked_noreset(path, level, (enum btree_node_locked_type) type);
 #ifdef CONFIG_BCACHEFS_LOCK_TIME_STATS
index c741150e68af971d144e752df543078bf1396bf8..73c950d2788efe8be9882760de7e4a40eb0b51c4 100644 (file)
@@ -680,7 +680,7 @@ err:
                 */
                bch2_trans_unlock(&trans);
                btree_node_lock_nopath_nofail(&trans, &b->c, SIX_LOCK_intent);
-               mark_btree_node_locked(&trans, path, b->c.level, SIX_LOCK_intent);
+               mark_btree_node_locked(&trans, path, b->c.level, BTREE_NODE_INTENT_LOCKED);
                path->l[b->c.level].lock_seq = six_lock_seq(&b->c.lock);
                path->l[b->c.level].b = b;
 
@@ -1513,12 +1513,12 @@ static int btree_split(struct btree_update *as, struct btree_trans *trans,
 
                path1 = get_unlocked_mut_path(trans, path->btree_id, n1->c.level, n1->key.k.p);
                six_lock_increment(&n1->c.lock, SIX_LOCK_intent);
-               mark_btree_node_locked(trans, path1, n1->c.level, SIX_LOCK_intent);
+               mark_btree_node_locked(trans, path1, n1->c.level, BTREE_NODE_INTENT_LOCKED);
                bch2_btree_path_level_init(trans, path1, n1);
 
                path2 = get_unlocked_mut_path(trans, path->btree_id, n2->c.level, n2->key.k.p);
                six_lock_increment(&n2->c.lock, SIX_LOCK_intent);
-               mark_btree_node_locked(trans, path2, n2->c.level, SIX_LOCK_intent);
+               mark_btree_node_locked(trans, path2, n2->c.level, BTREE_NODE_INTENT_LOCKED);
                bch2_btree_path_level_init(trans, path2, n2);
 
                /*
@@ -1539,7 +1539,7 @@ static int btree_split(struct btree_update *as, struct btree_trans *trans,
                        path2->locks_want++;
                        BUG_ON(btree_node_locked(path2, n3->c.level));
                        six_lock_increment(&n3->c.lock, SIX_LOCK_intent);
-                       mark_btree_node_locked(trans, path2, n3->c.level, SIX_LOCK_intent);
+                       mark_btree_node_locked(trans, path2, n3->c.level, BTREE_NODE_INTENT_LOCKED);
                        bch2_btree_path_level_init(trans, path2, n3);
 
                        n3->sib_u64s[0] = U16_MAX;
@@ -1563,7 +1563,7 @@ static int btree_split(struct btree_update *as, struct btree_trans *trans,
 
                path1 = get_unlocked_mut_path(trans, path->btree_id, n1->c.level, n1->key.k.p);
                six_lock_increment(&n1->c.lock, SIX_LOCK_intent);
-               mark_btree_node_locked(trans, path1, n1->c.level, SIX_LOCK_intent);
+               mark_btree_node_locked(trans, path1, n1->c.level, BTREE_NODE_INTENT_LOCKED);
                bch2_btree_path_level_init(trans, path1, n1);
 
                if (parent)
@@ -1890,7 +1890,7 @@ int __bch2_foreground_maybe_merge(struct btree_trans *trans,
 
        new_path = get_unlocked_mut_path(trans, path->btree_id, n->c.level, n->key.k.p);
        six_lock_increment(&n->c.lock, SIX_LOCK_intent);
-       mark_btree_node_locked(trans, new_path, n->c.level, SIX_LOCK_intent);
+       mark_btree_node_locked(trans, new_path, n->c.level, BTREE_NODE_INTENT_LOCKED);
        bch2_btree_path_level_init(trans, new_path, n);
 
        bkey_init(&delete.k);
@@ -1967,7 +1967,7 @@ int bch2_btree_node_rewrite(struct btree_trans *trans,
 
        new_path = get_unlocked_mut_path(trans, iter->btree_id, n->c.level, n->key.k.p);
        six_lock_increment(&n->c.lock, SIX_LOCK_intent);
-       mark_btree_node_locked(trans, new_path, n->c.level, SIX_LOCK_intent);
+       mark_btree_node_locked(trans, new_path, n->c.level, BTREE_NODE_INTENT_LOCKED);
        bch2_btree_path_level_init(trans, new_path, n);
 
        trace_and_count(c, btree_node_rewrite, c, b);