summaryrefslogtreecommitdiff
path: root/libbcachefs/btree_iter.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2017-12-21 18:00:30 -0500
committerKent Overstreet <kent.overstreet@gmail.com>2017-12-21 18:06:45 -0500
commit1cf4d51dc4661f336f5318c176a3561ddf5bf04f (patch)
tree8b390ccd48361ba1408be6799d46e62c6382cc39 /libbcachefs/btree_iter.c
parent8acc54456e11ee0ec80ed0c6abb6d68abae60592 (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.c23
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