bcachefs: Path must be locked if trans->locked && should_be_locked

If path->should_be_locked is true, that means user code (of the btree
API) has seen, in this transaction, something guarded by the node this
path has locked, and we have to keep it locked until the end of the
transaction.

Assert that we're not violating this; should_be_locked should also be
cleared only in _very_ special situations.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
Kent Overstreet
2024-04-09 23:53:57 -04:00
parent 22e921a6f9
commit b41ac97fe0
3 changed files with 11 additions and 8 deletions

View File

@@ -1979,6 +1979,7 @@ struct btree *bch2_btree_iter_next_node(struct btree_trans *trans, struct btree_
/* got to end? */
if (!btree_path_node(path, path->level + 1)) {
path->should_be_locked = false;
btree_path_set_level_up(trans, path);
return NULL;
}

View File

@@ -50,6 +50,7 @@ static inline void btree_path_set_dirty(struct btree_trans *trans,
struct btree_path *path,
enum btree_path_uptodate u)
{
BUG_ON(path->should_be_locked && trans->locked && !trans->restarted);
path->uptodate = max_t(unsigned, path->uptodate, u);
}

View File

@@ -882,14 +882,15 @@ int __bch2_trans_mutex_lock(struct btree_trans *trans,
void __bch2_btree_path_verify_locks(struct btree_trans *trans, struct btree_path *path)
{
/*
* A path may be uptodate and yet have nothing locked if and only if
* there is no node at path->level, which generally means we were
* iterating over all nodes and got to the end of the btree
*/
BUG_ON(path->uptodate == BTREE_ITER_UPTODATE &&
btree_path_node(path, path->level) &&
!path->nodes_locked);
if (!path->nodes_locked && btree_path_node(path, path->level)) {
/*
* A path may be uptodate and yet have nothing locked if and only if
* there is no node at path->level, which generally means we were
* iterating over all nodes and got to the end of the btree
*/
BUG_ON(path->uptodate == BTREE_ITER_UPTODATE);
BUG_ON(path->should_be_locked && trans->locked && !trans->restarted);
}
if (!path->nodes_locked)
return;