aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/bcache/btree.h
diff options
context:
space:
mode:
authorKent Overstreet <kmo@daterainc.com>2013-09-10 21:48:51 -0400
committerKent Overstreet <kmo@daterainc.com>2013-11-11 00:56:06 -0500
commit48dad8baf92fe8967d9e1358af1cfdda1d2d3298 (patch)
treec773b028b0123acb07b55690a3cfb1f3ea230587 /drivers/md/bcache/btree.h
parent5e6926daac267dd99552ae613f041a9e88bbf258 (diff)
bcache: Add btree_map() functions
Lots of stuff has been open coding its own btree traversal - which is generally pretty simple code, but there are a few subtleties. This adds new new functions, bch_btree_map_nodes() and bch_btree_map_keys(), which do the traversal for you. Everything that's open coding btree traversal now (with the exception of garbage collection) is slowly going to be converted to these two functions; being able to write other code at a higher level of abstraction is a big improvement w.r.t. overall code quality. Signed-off-by: Kent Overstreet <kmo@daterainc.com>
Diffstat (limited to 'drivers/md/bcache/btree.h')
-rw-r--r--drivers/md/bcache/btree.h37
1 files changed, 35 insertions, 2 deletions
diff --git a/drivers/md/bcache/btree.h b/drivers/md/bcache/btree.h
index fa9641aaed39..cafdeb01e219 100644
--- a/drivers/md/bcache/btree.h
+++ b/drivers/md/bcache/btree.h
@@ -400,9 +400,42 @@ static inline void wake_up_gc(struct cache_set *c)
400 wake_up_process(c->gc_thread); 400 wake_up_process(c->gc_thread);
401} 401}
402 402
403#define MAP_DONE 0
404#define MAP_CONTINUE 1
405
406#define MAP_ALL_NODES 0
407#define MAP_LEAF_NODES 1
408
409#define MAP_END_KEY 1
410
411typedef int (btree_map_nodes_fn)(struct btree_op *, struct btree *);
412int __bch_btree_map_nodes(struct btree_op *, struct cache_set *,
413 struct bkey *, btree_map_nodes_fn *, int);
414
415static inline int bch_btree_map_nodes(struct btree_op *op, struct cache_set *c,
416 struct bkey *from, btree_map_nodes_fn *fn)
417{
418 return __bch_btree_map_nodes(op, c, from, fn, MAP_ALL_NODES);
419}
420
421static inline int bch_btree_map_leaf_nodes(struct btree_op *op,
422 struct cache_set *c,
423 struct bkey *from,
424 btree_map_nodes_fn *fn)
425{
426 return __bch_btree_map_nodes(op, c, from, fn, MAP_LEAF_NODES);
427}
428
429typedef int (btree_map_keys_fn)(struct btree_op *, struct btree *,
430 struct bkey *);
431int bch_btree_map_keys(struct btree_op *, struct cache_set *,
432 struct bkey *, btree_map_keys_fn *, int);
433
434typedef bool (keybuf_pred_fn)(struct keybuf *, struct bkey *);
435
403void bch_keybuf_init(struct keybuf *); 436void bch_keybuf_init(struct keybuf *);
404void bch_refill_keybuf(struct cache_set *, struct keybuf *, struct bkey *, 437void bch_refill_keybuf(struct cache_set *, struct keybuf *,
405 keybuf_pred_fn *); 438 struct bkey *, keybuf_pred_fn *);
406bool bch_keybuf_check_overlapping(struct keybuf *, struct bkey *, 439bool bch_keybuf_check_overlapping(struct keybuf *, struct bkey *,
407 struct bkey *); 440 struct bkey *);
408void bch_keybuf_del(struct keybuf *, struct keybuf_key *); 441void bch_keybuf_del(struct keybuf *, struct keybuf_key *);