diff options
author | Kent Overstreet <kmo@daterainc.com> | 2013-11-11 20:02:31 -0500 |
---|---|---|
committer | Kent Overstreet <kmo@daterainc.com> | 2014-01-08 16:05:14 -0500 |
commit | 829a60b9055c319f3656a01eb8cb78b1b86232ef (patch) | |
tree | d6e709a97b9fc3274ef8de84cb52c2e3e0078807 /drivers/md/bcache/bset.c | |
parent | 89ebb4a28ba9efb5c9b18ba552e784021957b14a (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.c | 50 |
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 | } |
677 | EXPORT_SYMBOL(bch_bset_build_written_tree); | 677 | EXPORT_SYMBOL(bch_bset_build_written_tree); |
678 | 678 | ||
679 | /* Insert */ | ||
680 | |||
679 | void bch_bset_fix_invalidated_key(struct btree_keys *b, struct bkey *k) | 681 | void 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 | } |
792 | EXPORT_SYMBOL(bch_bset_insert); | 794 | EXPORT_SYMBOL(bch_bset_insert); |
793 | 795 | ||
796 | unsigned 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); | ||
836 | copy: bkey_copy(m, k); | ||
837 | merged: | ||
838 | return status; | ||
839 | } | ||
840 | EXPORT_SYMBOL(bch_btree_insert_key); | ||
841 | |||
842 | /* Lookup */ | ||
843 | |||
794 | struct bset_search_iter { | 844 | struct bset_search_iter { |
795 | struct bkey *l, *r; | 845 | struct bkey *l, *r; |
796 | }; | 846 | }; |