Loading drivers/md/bcache/bset.h +18 −0 Original line number Diff line number Diff line Loading @@ -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 *); Loading drivers/md/bcache/btree.c +2 −7 Original line number Diff line number Diff line Loading @@ -1844,19 +1844,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; Loading Loading
drivers/md/bcache/bset.h +18 −0 Original line number Diff line number Diff line Loading @@ -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 *); Loading
drivers/md/bcache/btree.c +2 −7 Original line number Diff line number Diff line Loading @@ -1844,19 +1844,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; Loading