summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/md/bcache/bkey.c8
-rw-r--r--drivers/md/bcache/bkey.h6
-rw-r--r--drivers/md/bcache/bset.c4
-rw-r--r--drivers/md/bcache/bset.h19
-rw-r--r--drivers/md/bcache/btree_gc.c2
-rw-r--r--drivers/md/bcache/btree_update.c2
6 files changed, 31 insertions, 10 deletions
diff --git a/drivers/md/bcache/bkey.c b/drivers/md/bcache/bkey.c
index 966620014c8f..64d2c845ce22 100644
--- a/drivers/md/bcache/bkey.c
+++ b/drivers/md/bcache/bkey.c
@@ -284,7 +284,7 @@ struct bkey __bkey_unpack_key(const struct bkey_format *format,
}
#ifndef HAVE_BCACHE_COMPILED_UNPACK
-static struct bpos __bkey_unpack_pos(const struct bkey_format *format,
+struct bpos __bkey_unpack_pos(const struct bkey_format *format,
const struct bkey_packed *in)
{
struct unpack_state state = unpack_state_init(format, in);
@@ -1140,11 +1140,7 @@ int __bkey_cmp_left_packed_format_checked(const struct btree *b,
const struct bkey_packed *l,
const struct bpos *r)
{
-#ifdef HAVE_BCACHE_COMPILED_UNPACK
- return bkey_cmp(bkey_unpack_key_format_checked(b, l).p, *r);
-#else
- return bkey_cmp(__bkey_unpack_pos(&b->format, l), *r);
-#endif
+ return bkey_cmp(bkey_unpack_pos_format_checked(b, l), *r);
}
__pure __flatten
diff --git a/drivers/md/bcache/bkey.h b/drivers/md/bcache/bkey.h
index dbea52986a53..3e29cdde93b4 100644
--- a/drivers/md/bcache/bkey.h
+++ b/drivers/md/bcache/bkey.h
@@ -328,6 +328,12 @@ bool bch_bkey_transform(const struct bkey_format *,
struct bkey __bkey_unpack_key(const struct bkey_format *,
const struct bkey_packed *);
+
+#ifndef HAVE_BCACHE_COMPILED_UNPACK
+struct bpos __bkey_unpack_pos(const struct bkey_format *,
+ const struct bkey_packed *);
+#endif
+
bool bkey_pack_key(struct bkey_packed *, const struct bkey *,
const struct bkey_format *);
diff --git a/drivers/md/bcache/bset.c b/drivers/md/bcache/bset.c
index e95213efe019..cf512da3bcb7 100644
--- a/drivers/md/bcache/bset.c
+++ b/drivers/md/bcache/bset.c
@@ -979,7 +979,7 @@ retry:
while (bkey_next(k) != btree_bkey_last(b, t))
k = bkey_next(k);
- t->max_key = bkey_unpack_key(b, k).p;
+ t->max_key = bkey_unpack_pos(b, k);
/* Then we build the tree */
for (j = inorder_next(0, t->size);
@@ -1146,7 +1146,7 @@ void bch_bset_fix_invalidated_key(struct btree *b, struct bset_tree *t,
min_key.u64s = max_key.u64s = 0;
if (bkey_next(k) == btree_bkey_last(b, t)) {
- t->max_key = bkey_unpack_key(b, k).p;
+ t->max_key = bkey_unpack_pos(b, k);
for (j = 1; j < t->size; j = j * 2 + 1)
make_bfloat(b, t, j, &min_key, &max_key);
diff --git a/drivers/md/bcache/bset.h b/drivers/md/bcache/bset.h
index b437f5ebdca6..f03e6b868257 100644
--- a/drivers/md/bcache/bset.h
+++ b/drivers/md/bcache/bset.h
@@ -210,6 +210,25 @@ static inline struct bkey bkey_unpack_key(const struct btree *b,
: *packed_to_bkey_c(src);
}
+static inline struct bpos
+bkey_unpack_pos_format_checked(const struct btree *b,
+ const struct bkey_packed *src)
+{
+#ifdef HAVE_BCACHE_COMPILED_UNPACK
+ return bkey_unpack_key_format_checked(b, src).p;
+#else
+ return __bkey_unpack_pos(&b->format, src);
+#endif
+}
+
+static inline struct bpos bkey_unpack_pos(const struct btree *b,
+ const struct bkey_packed *src)
+{
+ return likely(bkey_packed(src))
+ ? bkey_unpack_pos_format_checked(b, src)
+ : packed_to_bkey_c(src)->p;
+}
+
/* Disassembled bkeys */
static inline struct bkey_s_c bkey_disassemble(struct btree *b,
diff --git a/drivers/md/bcache/btree_gc.c b/drivers/md/bcache/btree_gc.c
index f0704e21d69b..e34445da10f5 100644
--- a/drivers/md/bcache/btree_gc.c
+++ b/drivers/md/bcache/btree_gc.c
@@ -567,7 +567,7 @@ static void bch_coalesce_nodes(struct btree *old_nodes[GC_MERGE_NODES],
} else if (u64s) {
/* move part of n2 into n1 */
n1->key.k.p = n1->data->max_key =
- bkey_unpack_key(n1, last).p;
+ bkey_unpack_pos(n1, last);
n2->data->min_key =
btree_type_successor(iter->btree_id,
diff --git a/drivers/md/bcache/btree_update.c b/drivers/md/bcache/btree_update.c
index be27bd365f27..54b34fe9e19a 100644
--- a/drivers/md/bcache/btree_update.c
+++ b/drivers/md/bcache/btree_update.c
@@ -1294,7 +1294,7 @@ static struct btree *__btree_split_node(struct btree_iter *iter, struct btree *n
BUG_ON(!prev);
- n1->key.k.p = bkey_unpack_key(n1, prev).p;
+ n1->key.k.p = bkey_unpack_pos(n1, prev);
n1->data->max_key = n1->key.k.p;
n2->data->min_key =
btree_type_successor(n1->btree_id, n1->key.k.p);