aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/bcache/btree.h
diff options
context:
space:
mode:
authorKent Overstreet <kmo@daterainc.com>2013-07-24 17:20:19 -0700
committerKent Overstreet <kmo@daterainc.com>2013-11-10 21:55:57 -0800
commitd6fd3b11cea82346837957feab25b0be48aa424c (patch)
tree992f1de98ba935284feac7569eea7d86dcf5bdd7 /drivers/md/bcache/btree.h
parentbcache: Remove unnecessary check in should_split() (diff)
downloadlinux-dev-d6fd3b11cea82346837957feab25b0be48aa424c.tar.xz
linux-dev-d6fd3b11cea82346837957feab25b0be48aa424c.zip
bcache: Explicitly track btree node's parent
This is prep work for the reworked btree insertion code. The way we set b->parent is ugly and hacky... the problem is, when btree_split() or garbage collection splits or rewrites a btree node, the parent changes for all its (potentially already cached) children. I may change this later and add some code to look through the btree node cache and find all our cached child nodes and change the parent pointer then... Signed-off-by: Kent Overstreet <kmo@daterainc.com>
Diffstat (limited to 'drivers/md/bcache/btree.h')
-rw-r--r--drivers/md/bcache/btree.h16
1 files changed, 10 insertions, 6 deletions
diff --git a/drivers/md/bcache/btree.h b/drivers/md/bcache/btree.h
index 8a1c7e6bbbe3..6d2fb7550706 100644
--- a/drivers/md/bcache/btree.h
+++ b/drivers/md/bcache/btree.h
@@ -125,6 +125,7 @@ struct btree {
unsigned long seq;
struct rw_semaphore lock;
struct cache_set *c;
+ struct btree *parent;
unsigned long flags;
uint16_t written; /* would be nice to kill */
@@ -327,12 +328,13 @@ static inline void rw_unlock(bool w, struct btree *b)
({ \
int _r, l = (b)->level - 1; \
bool _w = l <= (op)->lock; \
- struct btree *_b = bch_btree_node_get((b)->c, key, l, op); \
- if (!IS_ERR(_b)) { \
- _r = bch_btree_ ## fn(_b, op, ##__VA_ARGS__); \
- rw_unlock(_w, _b); \
+ struct btree *_child = bch_btree_node_get((b)->c, key, l, op); \
+ if (!IS_ERR(_child)) { \
+ _child->parent = (b); \
+ _r = bch_btree_ ## fn(_child, op, ##__VA_ARGS__); \
+ rw_unlock(_w, _child); \
} else \
- _r = PTR_ERR(_b); \
+ _r = PTR_ERR(_child); \
_r; \
})
@@ -350,8 +352,10 @@ static inline void rw_unlock(bool w, struct btree *b)
bool _w = insert_lock(op, _b); \
rw_lock(_w, _b, _b->level); \
if (_b == (c)->root && \
- _w == insert_lock(op, _b)) \
+ _w == insert_lock(op, _b)) { \
+ _b->parent = NULL; \
_r = bch_btree_ ## fn(_b, op, ##__VA_ARGS__); \
+ } \
rw_unlock(_w, _b); \
bch_cannibalize_unlock(c, &(op)->cl); \
} while (_r == -EINTR); \