diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2016-10-25 14:41:06 -0800 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2017-01-18 21:40:50 -0900 |
commit | 1b8b300fee929123a1901786297e136d48fb5238 (patch) | |
tree | 592badd4efd656d2db75a92f1c3530e02d09842f | |
parent | d132e4a350154a17e64024972447501114aadf11 (diff) |
bcache: kill btree_lock_upgrade()
-rw-r--r-- | drivers/md/bcache/btree_iter.c | 57 |
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 |