summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2016-10-25 14:41:06 -0800
committerKent Overstreet <kent.overstreet@gmail.com>2017-01-18 21:40:50 -0900
commit1b8b300fee929123a1901786297e136d48fb5238 (patch)
tree592badd4efd656d2db75a92f1c3530e02d09842f
parentd132e4a350154a17e64024972447501114aadf11 (diff)
bcache: kill btree_lock_upgrade()
-rw-r--r--drivers/md/bcache/btree_iter.c57
1 files changed, 15 insertions, 42 deletions
diff --git a/drivers/md/bcache/btree_iter.c b/drivers/md/bcache/btree_iter.c
index fa9cf8215267..60bac17f65e7 100644
--- a/drivers/md/bcache/btree_iter.c
+++ b/drivers/md/bcache/btree_iter.c
@@ -87,37 +87,40 @@ void __btree_node_lock_write(struct btree *b, struct btree_iter *iter)
six_lock_write(&b->lock);
}
-static bool btree_lock_upgrade(struct btree_iter *iter, unsigned level)
+bool 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);
- if (btree_node_intent_locked(iter, level))
+ if (want == have)
return true;
if (!is_btree_node(iter, level))
return false;
- if (btree_node_locked(iter, level)
- ? six_trylock_convert(&b->lock, SIX_LOCK_read, SIX_LOCK_intent)
- : six_relock_intent(&b->lock, iter->lock_seq[level]))
+ if (race_fault())
+ return false;
+
+ if (have != BTREE_NODE_UNLOCKED
+ ? six_trylock_convert(&b->lock, have, want)
+ : six_relock_type(&b->lock, want, iter->lock_seq[level]))
goto success;
for_each_linked_btree_iter(iter, linked)
if (linked->nodes[level] == b &&
- btree_node_intent_locked(linked, level) &&
+ btree_node_locked_type(linked, level) == want &&
iter->lock_seq[level] == b->lock.state.seq) {
btree_node_unlock(iter, level);
- six_lock_increment(&b->lock, SIX_LOCK_intent);
+ six_lock_increment(&b->lock, want);
goto success;
}
-
- trace_bcache_btree_upgrade_lock_fail(b, iter);
return false;
success:
- mark_btree_node_intent_locked(iter, level);
- trace_bcache_btree_upgrade_lock(b, iter);
+ mark_btree_node_unlocked(iter, level);
+ mark_btree_node_locked(iter, level, want);
return true;
}
@@ -130,7 +133,7 @@ bool bch_btree_iter_upgrade(struct btree_iter *iter)
for (i = iter->level;
i < min_t(int, iter->locks_want, BTREE_MAX_DEPTH);
i++)
- if (iter->nodes[i] && !btree_lock_upgrade(iter, i)) {
+ if (iter->nodes[i] && !btree_node_relock(iter, i)) {
do {
btree_node_unlock(iter, i);
@@ -158,36 +161,6 @@ int bch_btree_iter_unlock(struct btree_iter *iter)
return iter->error;
}
-bool btree_node_relock(struct btree_iter *iter, unsigned level)
-{
- struct btree_iter *linked;
- struct btree *b = iter->nodes[level];
- enum six_lock_type type = btree_lock_want(iter, level);
-
- if (btree_node_locked(iter, level))
- return true;
-
- if (race_fault())
- return false;
-
- if (is_btree_node(iter, level) &&
- six_relock_type(&b->lock, iter->lock_seq[level], type)) {
- mark_btree_node_locked(iter, level, type);
- return true;
- }
-
- for_each_linked_btree_iter(iter, linked)
- if (linked->nodes[level] == b &&
- btree_node_locked_type(linked, level) == type &&
- iter->lock_seq[level] == b->lock.state.seq) {
- six_lock_increment(&b->lock, type);
- mark_btree_node_locked(iter, level, type);
- return true;
- }
-
- return false;
-}
-
/* Btree iterator: */
#ifdef CONFIG_BCACHE_DEBUG