diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2022-03-10 23:22:49 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:09:27 -0400 |
commit | d4d24a6509548a6457f185fddd927df7d148464a (patch) | |
tree | c77072c0485b34eef7648556ceb7f2345a4ce9cf /fs/bcachefs | |
parent | cc23255e9a9fcaf7423e0fe7e197605bf10a3f06 (diff) |
bcachefs: Delay setting path->should_be_locked
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs')
-rw-r--r-- | fs/bcachefs/btree_iter.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c index 1cfd2e9015b1..b18e4fcc46e5 100644 --- a/fs/bcachefs/btree_iter.c +++ b/fs/bcachefs/btree_iter.c @@ -427,8 +427,8 @@ bool bch2_btree_path_relock_intent(struct btree_trans *trans, return true; } -__flatten -static bool bch2_btree_path_relock(struct btree_trans *trans, +noinline __flatten +static bool __bch2_btree_path_relock(struct btree_trans *trans, struct btree_path *path, unsigned long trace_ip) { bool ret = btree_path_get_locks(trans, path, false); @@ -441,6 +441,14 @@ static bool bch2_btree_path_relock(struct btree_trans *trans, 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, struct btree_path *path, unsigned new_locks_want) @@ -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, pos, 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) BUG_ON(!iter->path->nodes_locked); out: if (iter->update_path) { - BUG_ON(!(iter->update_path->nodes_locked & 1)); - iter->update_path->should_be_locked = true; + if (unlikely(!bch2_btree_path_relock(trans, iter->update_path, _THIS_IP_))) { + 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; |