summaryrefslogtreecommitdiff
path: root/fs/bcachefs/btree_update_interior.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2021-10-07 21:56:56 +0300
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-23 00:09:13 +0300
commitd697b9abbae2f2c387aaa4e702afe12e31984a18 (patch)
treea2f0f29eb3c6051d10c8128d92b968541a648fc5 /fs/bcachefs/btree_update_interior.c
parent502027a8b2c0f0d46daf948cd1315694a46294e3 (diff)
downloadlinux-d697b9abbae2f2c387aaa4e702afe12e31984a18.tar.xz
bcachefs: More btree iterator fixes
- check for getting to the end of the btree in bch2_path_verify_locks and __btree_path_traverse_all(), this fixes an infinite loop in __btree_path_traverse_all(). - relax requirement in bch2_btree_node_upgrade() that we must want an intent lock, this fixes bugs with paths that point to interior nodes (nonzero level). - bch2_btree_node_update_key(): fix it to upgrade the path to an intent lock, if necessary Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Diffstat (limited to 'fs/bcachefs/btree_update_interior.c')
-rw-r--r--fs/bcachefs/btree_update_interior.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/fs/bcachefs/btree_update_interior.c b/fs/bcachefs/btree_update_interior.c
index 978bb56275de..4ca2de360b22 100644
--- a/fs/bcachefs/btree_update_interior.c
+++ b/fs/bcachefs/btree_update_interior.c
@@ -1945,9 +1945,16 @@ int bch2_btree_node_update_key(struct btree_trans *trans, struct btree_iter *ite
{
struct bch_fs *c = trans->c;
struct btree *new_hash = NULL;
+ struct btree_path *path = iter->path;
struct closure cl;
int ret = 0;
+ if (!btree_node_intent_locked(path, b->c.level) &&
+ !bch2_btree_path_upgrade(trans, path, b->c.level + 1)) {
+ btree_trans_restart(trans);
+ return -EINTR;
+ }
+
closure_init_stack(&cl);
/*
@@ -1966,8 +1973,10 @@ int bch2_btree_node_update_key(struct btree_trans *trans, struct btree_iter *ite
new_hash = bch2_btree_node_mem_alloc(c);
}
+ path->intent_ref++;
ret = __bch2_btree_node_update_key(trans, iter, b, new_hash,
new_key, skip_triggers);
+ --path->intent_ref;
if (new_hash) {
mutex_lock(&c->btree_cache.lock);