diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2018-06-12 14:57:05 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2018-07-01 03:02:46 -0400 |
commit | 6f1358d41ffc4d3d93bac63b62b9c110de26caf8 (patch) | |
tree | 639a37fefde4586a9ee6e6a53e273a7a64b7e8ae /fs/bcachefs/btree_iter.c | |
parent | f293925453aa0a992e4f80fef2f0104e0fe28e40 (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.c | 33 |
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); |