summaryrefslogtreecommitdiff
path: root/fs/bcachefs/btree_iter.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2018-06-12 14:57:05 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2018-07-01 03:02:46 -0400
commit6f1358d41ffc4d3d93bac63b62b9c110de26caf8 (patch)
tree639a37fefde4586a9ee6e6a53e273a7a64b7e8ae /fs/bcachefs/btree_iter.c
parentf293925453aa0a992e4f80fef2f0104e0fe28e40 (diff)
bcachefs: bch2_btree_iter_traverse() no longer has to go up for intent locks
Diffstat (limited to 'fs/bcachefs/btree_iter.c')
-rw-r--r--fs/bcachefs/btree_iter.c33
1 files changed, 6 insertions, 27 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c
index a776869f3c78..09f360712a23 100644
--- a/fs/bcachefs/btree_iter.c
+++ b/fs/bcachefs/btree_iter.c
@@ -281,13 +281,9 @@ void bch2_btree_iter_verify_locks(struct btree_iter *iter)
__flatten
static bool __bch2_btree_iter_relock(struct btree_iter *iter)
{
- if (iter->uptodate < BTREE_ITER_NEED_RELOCK)
- return true;
-
- if (iter->uptodate > BTREE_ITER_NEED_TRAVERSE)
- return false;
-
- return btree_iter_get_locks(iter, false);
+ return iter->uptodate >= BTREE_ITER_NEED_RELOCK
+ ? btree_iter_get_locks(iter, false)
+ : true;
}
bool bch2_btree_iter_relock(struct btree_iter *iter)
@@ -990,24 +986,10 @@ int __must_check __bch2_btree_iter_traverse(struct btree_iter *iter)
if (unlikely(iter->level >= BTREE_MAX_DEPTH))
return 0;
- iter->flags &= ~BTREE_ITER_AT_END_OF_LEAF;
+ if (__bch2_btree_iter_relock(iter))
+ return 0;
- /* make sure we have all the intent locks we need - ugh */
- if (unlikely(iter->l[iter->level].b &&
- iter->level + 1 < iter->locks_want)) {
- unsigned i;
-
- for (i = iter->level + 1;
- i < iter->locks_want && iter->l[i].b;
- i++)
- if (!bch2_btree_node_relock(iter, i)) {
- while (iter->level < BTREE_MAX_DEPTH &&
- iter->l[iter->level].b &&
- iter->level + 1 < iter->locks_want)
- btree_iter_up(iter);
- break;
- }
- }
+ iter->flags &= ~BTREE_ITER_AT_END_OF_LEAF;
/*
* XXX: correctly using BTREE_ITER_UPTODATE should make using check_pos
@@ -1057,9 +1039,6 @@ int __must_check bch2_btree_iter_traverse(struct btree_iter *iter)
{
int ret;
- if (__bch2_btree_iter_relock(iter))
- return 0;
-
ret = __bch2_btree_iter_traverse(iter);
if (unlikely(ret))
ret = btree_iter_traverse_error(iter, ret);