summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2016-11-07 07:42:55 -0900
committerKent Overstreet <kent.overstreet@gmail.com>2017-01-18 21:40:59 -0900
commit6af30282294ef99c417a894b2b5893749409f63f (patch)
treeacf886837d95e2756b98a5c3f29df89e4c437cf4
parent12b4eba4f0ace926e56d68370cec73b9b4d8494b (diff)
bcache: six_lock_downgrade()
-rw-r--r--drivers/md/bcache/btree_cache.c4
-rw-r--r--drivers/md/bcache/btree_iter.c4
-rw-r--r--drivers/md/bcache/six.c7
-rw-r--r--drivers/md/bcache/six.h1
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)