diff options
author | Kent Overstreet <kmo@daterainc.com> | 2014-03-05 01:42:42 +0100 |
---|---|---|
committer | Kent Overstreet <kmo@daterainc.com> | 2014-03-18 20:23:35 +0100 |
commit | 2a285686c109816ba71a00b9278262cf02648258 (patch) | |
tree | 83be424d1b213a72a36de69b7ed98357c28cbfca /drivers/md/bcache/btree.h | |
parent | bcache: Fix a race when freeing btree nodes (diff) | |
download | linux-2a285686c109816ba71a00b9278262cf02648258.tar.xz linux-2a285686c109816ba71a00b9278262cf02648258.zip |
bcache: btree locking rework
Add a new lock, b->write_lock, which is required to actually modify - or write -
a btree node; this lock is only held for short durations.
This means we can write out a btree node without taking b->lock, which _is_ held
for long durations - solving a deadlock when btree_flush_write() (from the
journalling code) is called with a btree node locked.
Right now just occurs in bch_btree_set_root(), but with an upcoming journalling
rework is going to happen a lot more.
This also turns b->lock is now more of a read/intent lock instead of a
read/write lock - but not completely, since it still blocks readers. May turn it
into a real intent lock at some point in the future.
Signed-off-by: Kent Overstreet <kmo@daterainc.com>
Diffstat (limited to 'drivers/md/bcache/btree.h')
-rw-r--r-- | drivers/md/bcache/btree.h | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/md/bcache/btree.h b/drivers/md/bcache/btree.h index def9dc4a822f..acebf26809cc 100644 --- a/drivers/md/bcache/btree.h +++ b/drivers/md/bcache/btree.h @@ -127,6 +127,8 @@ struct btree { struct cache_set *c; struct btree *parent; + struct mutex write_lock; + unsigned long flags; uint16_t written; /* would be nice to kill */ uint8_t level; @@ -236,6 +238,7 @@ static inline void rw_unlock(bool w, struct btree *b) } void bch_btree_node_read_done(struct btree *); +void __bch_btree_node_write(struct btree *, struct closure *); void bch_btree_node_write(struct btree *, struct closure *); void bch_btree_set_root(struct btree *); |