Commit d4d24a65 authored by Kent Overstreet's avatar Kent Overstreet Committed by Kent Overstreet

bcachefs: Delay setting path->should_be_locked

Signed-off-by: default avatarKent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent cc23255e
...@@ -427,8 +427,8 @@ bool bch2_btree_path_relock_intent(struct btree_trans *trans, ...@@ -427,8 +427,8 @@ bool bch2_btree_path_relock_intent(struct btree_trans *trans,
return true; return true;
} }
__flatten noinline __flatten
static bool bch2_btree_path_relock(struct btree_trans *trans, static bool __bch2_btree_path_relock(struct btree_trans *trans,
struct btree_path *path, unsigned long trace_ip) struct btree_path *path, unsigned long trace_ip)
{ {
bool ret = btree_path_get_locks(trans, path, false); bool ret = btree_path_get_locks(trans, path, false);
...@@ -441,6 +441,14 @@ static bool bch2_btree_path_relock(struct btree_trans *trans, ...@@ -441,6 +441,14 @@ static bool bch2_btree_path_relock(struct btree_trans *trans,
return ret; return ret;
} }
static inline bool bch2_btree_path_relock(struct btree_trans *trans,
struct btree_path *path, unsigned long trace_ip)
{
return btree_node_locked(path, path->level)
? true
: __bch2_btree_path_relock(trans, path, trace_ip);
}
bool __bch2_btree_path_upgrade(struct btree_trans *trans, bool __bch2_btree_path_upgrade(struct btree_trans *trans,
struct btree_path *path, struct btree_path *path,
unsigned new_locks_want) unsigned new_locks_want)
...@@ -2388,9 +2396,6 @@ struct bkey_s_c bch2_btree_iter_peek(struct btree_iter *iter) ...@@ -2388,9 +2396,6 @@ struct bkey_s_c bch2_btree_iter_peek(struct btree_iter *iter)
iter->update_path = bch2_btree_path_set_pos(trans, iter->update_path = bch2_btree_path_set_pos(trans,
iter->update_path, pos, iter->update_path, pos,
iter->flags & BTREE_ITER_INTENT); iter->flags & BTREE_ITER_INTENT);
BUG_ON(!(iter->update_path->nodes_locked & 1));
iter->update_path->should_be_locked = true;
} }
/* /*
...@@ -2428,8 +2433,12 @@ struct bkey_s_c bch2_btree_iter_peek(struct btree_iter *iter) ...@@ -2428,8 +2433,12 @@ struct bkey_s_c bch2_btree_iter_peek(struct btree_iter *iter)
BUG_ON(!iter->path->nodes_locked); BUG_ON(!iter->path->nodes_locked);
out: out:
if (iter->update_path) { if (iter->update_path) {
BUG_ON(!(iter->update_path->nodes_locked & 1)); if (unlikely(!bch2_btree_path_relock(trans, iter->update_path, _THIS_IP_))) {
iter->update_path->should_be_locked = true; k = bkey_s_c_err(-EINTR);
} else {
BUG_ON(!(iter->update_path->nodes_locked & 1));
iter->update_path->should_be_locked = true;
}
} }
iter->path->should_be_locked = true; iter->path->should_be_locked = true;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment