]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
bcache: PRECEDING_KEY()
authorKent Overstreet <kmo@daterainc.com>
Tue, 2 Jul 2013 02:29:05 +0000 (19:29 -0700)
committerKent Overstreet <kmo@daterainc.com>
Wed, 11 Sep 2013 02:05:25 +0000 (19:05 -0700)
btree_insert_key() was open coding this, this is just refactoring.

Signed-off-by: Kent Overstreet <kmo@daterainc.com>
drivers/md/bcache/bset.h
drivers/md/bcache/btree.c

index 959c4aa7b8ec6e372942db40b91c451d6d6d23dc..73684fdcd4c47e6a99708e4284146416ba75baf5 100644 (file)
@@ -353,12 +353,30 @@ void bch_bset_fix_lookup_table(struct btree *, struct bkey *);
 struct bkey *__bch_bset_search(struct btree *, struct bset_tree *,
                           const struct bkey *);
 
+/*
+ * Returns the first key that is strictly greater than search
+ */
 static inline struct bkey *bch_bset_search(struct btree *b, struct bset_tree *t,
                                           const struct bkey *search)
 {
        return search ? __bch_bset_search(b, t, search) : t->data->start;
 }
 
+#define PRECEDING_KEY(_k)                                      \
+({                                                             \
+       struct bkey *_ret = NULL;                               \
+                                                               \
+       if (KEY_INODE(_k) || KEY_OFFSET(_k)) {                  \
+               _ret = &KEY(KEY_INODE(_k), KEY_OFFSET(_k), 0);  \
+                                                               \
+               if (!_ret->low)                                 \
+                       _ret->high--;                           \
+               _ret->low--;                                    \
+       }                                                       \
+                                                               \
+       _ret;                                                   \
+})
+
 bool bch_bkey_try_merge(struct btree *, struct bkey *, struct bkey *);
 void bch_btree_sort_lazy(struct btree *);
 void bch_btree_sort_into(struct btree *, struct btree *);
index 6ecac2169836cc1b886a72a3a2db7289123a9067..462371e8a4e194c0bc19de738c1e4abbde633e5e 100644 (file)
@@ -1832,19 +1832,14 @@ static bool btree_insert_key(struct btree *b, struct btree_op *op,
 
        if (!b->level) {
                struct btree_iter iter;
-               struct bkey search = KEY(KEY_INODE(k), KEY_START(k), 0);
 
                /*
                 * bset_search() returns the first key that is strictly greater
                 * than the search key - but for back merging, we want to find
-                * the first key that is greater than or equal to KEY_START(k) -
-                * unless KEY_START(k) is 0.
+                * the previous key.
                 */
-               if (KEY_OFFSET(&search))
-                       SET_KEY_OFFSET(&search, KEY_OFFSET(&search) - 1);
-
                prev = NULL;
-               m = bch_btree_iter_init(b, &iter, &search);
+               m = bch_btree_iter_init(b, &iter, PRECEDING_KEY(&START_KEY(k)));
 
                if (fix_overlapping_extents(b, k, &iter, replace_key)) {
                        op->insert_collision = true;