summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2021-09-05 00:22:32 -0400
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-22 17:09:11 -0400
commit22b383ad7e1928de8da14d66a7154a9bfebf9a46 (patch)
treeb2ba8316831f978f5f9b621003ee25cd81f24ebe
parentf48361b00c4e6854a66ebf32c11849d4762a239e (diff)
bcachefs: Kill retry loop in btree merge path
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r--fs/bcachefs/btree_update_interior.c34
-rw-r--r--fs/bcachefs/btree_update_interior.h6
2 files changed, 6 insertions, 34 deletions
diff --git a/fs/bcachefs/btree_update_interior.c b/fs/bcachefs/btree_update_interior.c
index f31db1310715..73a79563487d 100644
--- a/fs/bcachefs/btree_update_interior.c
+++ b/fs/bcachefs/btree_update_interior.c
@@ -1572,12 +1572,7 @@ int __bch2_foreground_maybe_merge(struct btree_trans *trans,
struct btree *b, *m, *n, *prev, *next, *parent;
struct bpos sib_pos;
size_t sib_u64s;
- int ret = 0, ret2 = 0;
-
-retry:
- ret = bch2_btree_path_traverse(trans, path, false);
- if (ret)
- return ret;
+ int ret = 0;
BUG_ON(!path->should_be_locked);
BUG_ON(!btree_node_locked(path, level));
@@ -1587,7 +1582,7 @@ retry:
if ((sib == btree_prev_sib && !bpos_cmp(b->data->min_key, POS_MIN)) ||
(sib == btree_next_sib && !bpos_cmp(b->data->max_key, SPOS_MAX))) {
b->sib_u64s[sib] = U16_MAX;
- goto out;
+ return 0;
}
sib_pos = sib == btree_prev_sib
@@ -1715,29 +1710,10 @@ retry:
bch2_btree_update_done(as);
out:
- bch2_trans_verify_locks(trans);
- if (sib_path)
- bch2_path_put(trans, sib_path, true);
-
- /*
- * Don't downgrade locks here: we're called after successful insert,
- * and the caller will downgrade locks after a successful insert
- * anyways (in case e.g. a split was required first)
- *
- * And we're also called when inserting into interior nodes in the
- * split path, and downgrading to read locks in there is potentially
- * confusing:
- */
- return ret ?: ret2;
err:
- if (sib_path)
- bch2_path_put(trans, sib_path, true);
- sib_path = NULL;
-
- if (ret == -EINTR && bch2_trans_relock(trans))
- goto retry;
-
- goto out;
+ bch2_path_put(trans, sib_path, true);
+ bch2_trans_verify_locks(trans);
+ return ret;
}
/**
diff --git a/fs/bcachefs/btree_update_interior.h b/fs/bcachefs/btree_update_interior.h
index c06cfcc66db7..8e03bd987d6d 100644
--- a/fs/bcachefs/btree_update_interior.h
+++ b/fs/bcachefs/btree_update_interior.h
@@ -129,11 +129,7 @@ static inline int bch2_foreground_maybe_merge_sibling(struct btree_trans *trans,
{
struct btree *b;
- if (path->uptodate >= BTREE_ITER_NEED_TRAVERSE)
- return 0;
-
- if (!bch2_btree_node_relock(trans, path, level))
- return 0;
+ EBUG_ON(!btree_node_locked(path, level));
b = path->l[level].b;
if (b->sib_u64s[sib] > trans->c->btree_foreground_merge_threshold)