diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2016-11-07 07:42:55 -0900 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2017-01-18 21:40:59 -0900 |
commit | 6af30282294ef99c417a894b2b5893749409f63f (patch) | |
tree | acf886837d95e2756b98a5c3f29df89e4c437cf4 | |
parent | 12b4eba4f0ace926e56d68370cec73b9b4d8494b (diff) |
bcache: six_lock_downgrade()
-rw-r--r-- | drivers/md/bcache/btree_cache.c | 4 | ||||
-rw-r--r-- | drivers/md/bcache/btree_iter.c | 4 | ||||
-rw-r--r-- | drivers/md/bcache/six.c | 7 | ||||
-rw-r--r-- | drivers/md/bcache/six.h | 1 |
4 files changed, 10 insertions, 6 deletions
diff --git a/drivers/md/bcache/btree_cache.c b/drivers/md/bcache/btree_cache.c index 074eb6867355..ffd05fa61c77 100644 --- a/drivers/md/bcache/btree_cache.c +++ b/drivers/md/bcache/btree_cache.c @@ -607,9 +607,7 @@ static noinline struct btree *bch_btree_node_fill(struct btree_iter *iter, six_unlock_write(&b->lock); if (lock_type == SIX_LOCK_read) - BUG_ON(!six_trylock_convert(&b->lock, - SIX_LOCK_intent, - SIX_LOCK_read)); + six_lock_downgrade(&b->lock); return b; } diff --git a/drivers/md/bcache/btree_iter.c b/drivers/md/bcache/btree_iter.c index 0f8049867f19..197778addb02 100644 --- a/drivers/md/bcache/btree_iter.c +++ b/drivers/md/bcache/btree_iter.c @@ -218,9 +218,7 @@ static void btree_iter_drop_extra_locks(struct btree_iter *iter) if (l > iter->level) { btree_node_unlock(iter, l); } else if (btree_node_intent_locked(iter, l)) { - BUG_ON(!six_trylock_convert(&iter->nodes[l]->lock, - SIX_LOCK_intent, - SIX_LOCK_read)); + six_lock_downgrade(&iter->nodes[l]->lock); iter->nodes_intent_locked ^= 1 << l; } } diff --git a/drivers/md/bcache/six.c b/drivers/md/bcache/six.c index 7999d46d64d3..1bb8bfcccd69 100644 --- a/drivers/md/bcache/six.c +++ b/drivers/md/bcache/six.c @@ -387,3 +387,10 @@ void six_lock_increment(struct six_lock *lock, enum six_lock_type type) atomic64_add(l[type].lock_val, &lock->state.counter); } + +/* Convert from intent to read: */ +void six_lock_downgrade(struct six_lock *lock) +{ + six_lock_increment(lock, SIX_LOCK_read); + six_unlock_intent(lock); +} diff --git a/drivers/md/bcache/six.h b/drivers/md/bcache/six.h index b7dc9bb9cfb3..01ed3385c14b 100644 --- a/drivers/md/bcache/six.h +++ b/drivers/md/bcache/six.h @@ -104,6 +104,7 @@ void six_unlock_type(struct six_lock *, enum six_lock_type); bool six_trylock_convert(struct six_lock *, enum six_lock_type, enum six_lock_type); void six_lock_increment(struct six_lock *, enum six_lock_type); +void six_lock_downgrade(struct six_lock *); #define __SIX_VAL(field, _v) (((union six_lock_state) { .field = _v }).v) |