aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/bcache/bset.c
diff options
context:
space:
mode:
authorKent Overstreet <kmo@daterainc.com>2013-11-11 20:02:31 -0500
committerKent Overstreet <kmo@daterainc.com>2014-01-08 16:05:14 -0500
commit829a60b9055c319f3656a01eb8cb78b1b86232ef (patch)
treed6e709a97b9fc3274ef8de84cb52c2e3e0078807 /drivers/md/bcache/bset.c
parent89ebb4a28ba9efb5c9b18ba552e784021957b14a (diff)
bcache: Move insert_fixup() to btree_keys_ops
Now handling overlapping extents/keys is a method that's specific to what the btree node contains. Signed-off-by: Kent Overstreet <kmo@daterainc.com>
Diffstat (limited to 'drivers/md/bcache/bset.c')
-rw-r--r--drivers/md/bcache/bset.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/drivers/md/bcache/bset.c b/drivers/md/bcache/bset.c
index 2ff75f3199fa..4a7113236034 100644
--- a/drivers/md/bcache/bset.c
+++ b/drivers/md/bcache/bset.c
@@ -676,6 +676,8 @@ void bch_bset_build_written_tree(struct btree_keys *b)
676} 676}
677EXPORT_SYMBOL(bch_bset_build_written_tree); 677EXPORT_SYMBOL(bch_bset_build_written_tree);
678 678
679/* Insert */
680
679void bch_bset_fix_invalidated_key(struct btree_keys *b, struct bkey *k) 681void bch_bset_fix_invalidated_key(struct btree_keys *b, struct bkey *k)
680{ 682{
681 struct bset_tree *t; 683 struct bset_tree *t;
@@ -791,6 +793,54 @@ void bch_bset_insert(struct btree_keys *b, struct bkey *where,
791} 793}
792EXPORT_SYMBOL(bch_bset_insert); 794EXPORT_SYMBOL(bch_bset_insert);
793 795
796unsigned bch_btree_insert_key(struct btree_keys *b, struct bkey *k,
797 struct bkey *replace_key)
798{
799 unsigned status = BTREE_INSERT_STATUS_NO_INSERT;
800 struct bset *i = bset_tree_last(b)->data;
801 struct bkey *m, *prev = NULL;
802 struct btree_iter iter;
803
804 BUG_ON(b->ops->is_extents && !KEY_SIZE(k));
805
806 m = bch_btree_iter_init(b, &iter, b->ops->is_extents
807 ? PRECEDING_KEY(&START_KEY(k))
808 : PRECEDING_KEY(k));
809
810 if (b->ops->insert_fixup(b, k, &iter, replace_key))
811 return status;
812
813 status = BTREE_INSERT_STATUS_INSERT;
814
815 while (m != bset_bkey_last(i) &&
816 bkey_cmp(k, b->ops->is_extents ? &START_KEY(m) : m) > 0)
817 prev = m, m = bkey_next(m);
818
819 /* prev is in the tree, if we merge we're done */
820 status = BTREE_INSERT_STATUS_BACK_MERGE;
821 if (prev &&
822 bch_bkey_try_merge(b, prev, k))
823 goto merged;
824#if 0
825 status = BTREE_INSERT_STATUS_OVERWROTE;
826 if (m != bset_bkey_last(i) &&
827 KEY_PTRS(m) == KEY_PTRS(k) && !KEY_SIZE(m))
828 goto copy;
829#endif
830 status = BTREE_INSERT_STATUS_FRONT_MERGE;
831 if (m != bset_bkey_last(i) &&
832 bch_bkey_try_merge(b, k, m))
833 goto copy;
834
835 bch_bset_insert(b, m, k);
836copy: bkey_copy(m, k);
837merged:
838 return status;
839}
840EXPORT_SYMBOL(bch_btree_insert_key);
841
842/* Lookup */
843
794struct bset_search_iter { 844struct bset_search_iter {
795 struct bkey *l, *r; 845 struct bkey *l, *r;
796}; 846};