diff options
author | Kent Overstreet <kmo@daterainc.com> | 2013-09-10 21:48:51 -0400 |
---|---|---|
committer | Kent Overstreet <kmo@daterainc.com> | 2013-11-11 00:56:06 -0500 |
commit | 48dad8baf92fe8967d9e1358af1cfdda1d2d3298 (patch) | |
tree | c773b028b0123acb07b55690a3cfb1f3ea230587 /drivers/md/bcache/btree.h | |
parent | 5e6926daac267dd99552ae613f041a9e88bbf258 (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.h | 37 |
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 | |||
411 | typedef int (btree_map_nodes_fn)(struct btree_op *, struct btree *); | ||
412 | int __bch_btree_map_nodes(struct btree_op *, struct cache_set *, | ||
413 | struct bkey *, btree_map_nodes_fn *, int); | ||
414 | |||
415 | static 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 | |||
421 | static 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 | |||
429 | typedef int (btree_map_keys_fn)(struct btree_op *, struct btree *, | ||
430 | struct bkey *); | ||
431 | int bch_btree_map_keys(struct btree_op *, struct cache_set *, | ||
432 | struct bkey *, btree_map_keys_fn *, int); | ||
433 | |||
434 | typedef bool (keybuf_pred_fn)(struct keybuf *, struct bkey *); | ||
435 | |||
403 | void bch_keybuf_init(struct keybuf *); | 436 | void bch_keybuf_init(struct keybuf *); |
404 | void bch_refill_keybuf(struct cache_set *, struct keybuf *, struct bkey *, | 437 | void bch_refill_keybuf(struct cache_set *, struct keybuf *, |
405 | keybuf_pred_fn *); | 438 | struct bkey *, keybuf_pred_fn *); |
406 | bool bch_keybuf_check_overlapping(struct keybuf *, struct bkey *, | 439 | bool bch_keybuf_check_overlapping(struct keybuf *, struct bkey *, |
407 | struct bkey *); | 440 | struct bkey *); |
408 | void bch_keybuf_del(struct keybuf *, struct keybuf_key *); | 441 | void bch_keybuf_del(struct keybuf *, struct keybuf_key *); |