bcache: Make bch_keylist_realloc() take u64s, not nptrs
Getting away from KEY_PTRS and moving toward KEY_U64s - and getting rid of magic 2s Also - split out the part that checks against journal entry size so as to avoid a dependancy on struct cache_set in bset.c Signed-off-by: Kent Overstreet <kmo@daterainc.com>
This commit is contained in:
parent
9a02b7eeeb
commit
085d2a3dd4
|
@ -14,21 +14,13 @@
|
||||||
|
|
||||||
/* Keylists */
|
/* Keylists */
|
||||||
|
|
||||||
int bch_keylist_realloc(struct keylist *l, int nptrs, struct cache_set *c)
|
int __bch_keylist_realloc(struct keylist *l, unsigned u64s)
|
||||||
{
|
{
|
||||||
size_t oldsize = bch_keylist_nkeys(l);
|
size_t oldsize = bch_keylist_nkeys(l);
|
||||||
size_t newsize = oldsize + 2 + nptrs;
|
size_t newsize = oldsize + u64s;
|
||||||
uint64_t *old_keys = l->keys_p == l->inline_keys ? NULL : l->keys_p;
|
uint64_t *old_keys = l->keys_p == l->inline_keys ? NULL : l->keys_p;
|
||||||
uint64_t *new_keys;
|
uint64_t *new_keys;
|
||||||
|
|
||||||
/* The journalling code doesn't handle the case where the keys to insert
|
|
||||||
* is bigger than an empty write: If we just return -ENOMEM here,
|
|
||||||
* bio_insert() and bio_invalidate() will insert the keys created so far
|
|
||||||
* and finish the rest when the keylist is empty.
|
|
||||||
*/
|
|
||||||
if (newsize * sizeof(uint64_t) > block_bytes(c) - sizeof(struct jset))
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
newsize = roundup_pow_of_two(newsize);
|
newsize = roundup_pow_of_two(newsize);
|
||||||
|
|
||||||
if (newsize <= KEYLIST_INLINE ||
|
if (newsize <= KEYLIST_INLINE ||
|
||||||
|
|
|
@ -259,7 +259,7 @@ static inline size_t bch_keylist_bytes(struct keylist *l)
|
||||||
|
|
||||||
struct bkey *bch_keylist_pop(struct keylist *);
|
struct bkey *bch_keylist_pop(struct keylist *);
|
||||||
void bch_keylist_pop_front(struct keylist *);
|
void bch_keylist_pop_front(struct keylist *);
|
||||||
int bch_keylist_realloc(struct keylist *, int, struct cache_set *);
|
int __bch_keylist_realloc(struct keylist *, unsigned);
|
||||||
|
|
||||||
void bch_bkey_copy_single_ptr(struct bkey *, const struct bkey *,
|
void bch_bkey_copy_single_ptr(struct bkey *, const struct bkey *,
|
||||||
unsigned);
|
unsigned);
|
||||||
|
|
|
@ -1356,8 +1356,8 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op,
|
||||||
|
|
||||||
n2->keys -= keys;
|
n2->keys -= keys;
|
||||||
|
|
||||||
if (bch_keylist_realloc(keylist,
|
if (__bch_keylist_realloc(keylist,
|
||||||
KEY_PTRS(&new_nodes[i]->key), b->c))
|
bkey_u64s(&new_nodes[i]->key)))
|
||||||
goto out_nocoalesce;
|
goto out_nocoalesce;
|
||||||
|
|
||||||
bch_btree_node_write(new_nodes[i], &cl);
|
bch_btree_node_write(new_nodes[i], &cl);
|
||||||
|
@ -1365,7 +1365,7 @@ static int btree_gc_coalesce(struct btree *b, struct btree_op *op,
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < nodes; i++) {
|
for (i = 0; i < nodes; i++) {
|
||||||
if (bch_keylist_realloc(keylist, KEY_PTRS(&r[i].b->key), b->c))
|
if (__bch_keylist_realloc(keylist, bkey_u64s(&r[i].b->key)))
|
||||||
goto out_nocoalesce;
|
goto out_nocoalesce;
|
||||||
|
|
||||||
make_btree_freeing_key(r[i].b, keylist->top);
|
make_btree_freeing_key(r[i].b, keylist->top);
|
||||||
|
|
|
@ -255,6 +255,24 @@ static void bch_data_insert_keys(struct closure *cl)
|
||||||
closure_return(cl);
|
closure_return(cl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int bch_keylist_realloc(struct keylist *l, unsigned u64s,
|
||||||
|
struct cache_set *c)
|
||||||
|
{
|
||||||
|
size_t oldsize = bch_keylist_nkeys(l);
|
||||||
|
size_t newsize = oldsize + u64s;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The journalling code doesn't handle the case where the keys to insert
|
||||||
|
* is bigger than an empty write: If we just return -ENOMEM here,
|
||||||
|
* bio_insert() and bio_invalidate() will insert the keys created so far
|
||||||
|
* and finish the rest when the keylist is empty.
|
||||||
|
*/
|
||||||
|
if (newsize * sizeof(uint64_t) > block_bytes(c) - sizeof(struct jset))
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
return __bch_keylist_realloc(l, u64s);
|
||||||
|
}
|
||||||
|
|
||||||
static void bch_data_invalidate(struct closure *cl)
|
static void bch_data_invalidate(struct closure *cl)
|
||||||
{
|
{
|
||||||
struct data_insert_op *op = container_of(cl, struct data_insert_op, cl);
|
struct data_insert_op *op = container_of(cl, struct data_insert_op, cl);
|
||||||
|
@ -267,7 +285,7 @@ static void bch_data_invalidate(struct closure *cl)
|
||||||
unsigned sectors = min(bio_sectors(bio),
|
unsigned sectors = min(bio_sectors(bio),
|
||||||
1U << (KEY_SIZE_BITS - 1));
|
1U << (KEY_SIZE_BITS - 1));
|
||||||
|
|
||||||
if (bch_keylist_realloc(&op->insert_keys, 0, op->c))
|
if (bch_keylist_realloc(&op->insert_keys, 2, op->c))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
bio->bi_iter.bi_sector += sectors;
|
bio->bi_iter.bi_sector += sectors;
|
||||||
|
@ -357,7 +375,7 @@ static void bch_data_insert_start(struct closure *cl)
|
||||||
|
|
||||||
/* 1 for the device pointer and 1 for the chksum */
|
/* 1 for the device pointer and 1 for the chksum */
|
||||||
if (bch_keylist_realloc(&op->insert_keys,
|
if (bch_keylist_realloc(&op->insert_keys,
|
||||||
1 + (op->csum ? 1 : 0),
|
3 + (op->csum ? 1 : 0),
|
||||||
op->c))
|
op->c))
|
||||||
continue_at(cl, bch_data_insert_keys, bcache_wq);
|
continue_at(cl, bch_data_insert_keys, bcache_wq);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue