diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2017-12-21 18:00:30 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2017-12-21 18:06:45 -0500 |
commit | 1cf4d51dc4661f336f5318c176a3561ddf5bf04f (patch) | |
tree | 8b390ccd48361ba1408be6799d46e62c6382cc39 /libbcachefs/btree_iter.c | |
parent | 8acc54456e11ee0ec80ed0c6abb6d68abae60592 (diff) |
Update bcachefs sources to 14ce2a2031 bcachefs: fixes for building in userspace
Diffstat (limited to 'libbcachefs/btree_iter.c')
-rw-r--r-- | libbcachefs/btree_iter.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/libbcachefs/btree_iter.c b/libbcachefs/btree_iter.c index b0e64957..0b505a73 100644 --- a/libbcachefs/btree_iter.c +++ b/libbcachefs/btree_iter.c @@ -75,8 +75,8 @@ bool bch2_btree_node_relock(struct btree_iter *iter, unsigned level) { struct btree_iter *linked; struct btree *b = iter->nodes[level]; - enum btree_node_locked_type want = btree_lock_want(iter, level); - enum btree_node_locked_type have = btree_node_locked_type(iter, level); + int want = btree_lock_want(iter, level); + int have = btree_node_locked_type(iter, level); if (want == have) return true; @@ -108,6 +108,17 @@ success: return true; } +bool bch2_btree_iter_relock(struct btree_iter *iter) +{ + unsigned l; + + for (l = iter->level; l < iter->locks_want && iter->nodes[l]; l++) + if (!bch2_btree_node_relock(iter, l)) + return false; + + return true; +} + /* Slowpath: */ bool __bch2_btree_node_lock(struct btree *b, struct bpos pos, unsigned level, @@ -214,7 +225,6 @@ bool __bch2_btree_iter_set_locks_want(struct btree_iter *iter, unsigned new_locks_want) { struct btree_iter *linked; - unsigned l; /* Drop locks we don't want anymore: */ if (new_locks_want < iter->locks_want) @@ -228,12 +238,9 @@ bool __bch2_btree_iter_set_locks_want(struct btree_iter *iter, iter->locks_want = new_locks_want; btree_iter_drop_extra_locks(iter); - for (l = iter->level; l < iter->locks_want && iter->nodes[l]; l++) - if (!bch2_btree_node_relock(iter, l)) - goto fail; + if (bch2_btree_iter_relock(iter)) + return true; - return true; -fail: /* * Just an optimization: ancestor nodes must be locked before child * nodes, so set locks_want on iterators that might lock ancestors |