summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2020-07-02 13:27:05 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2020-07-02 13:29:31 -0400
commitf385d13bf8510277eedcc24de4a6a3c3bf8f334b (patch)
treef550e339551b85e337fc89f7661665e1dbb1ecea
parenta6b467671db6a47a363b2c93ae202618475e94ec (diff)
fixup! bcachefs: Fix bch2_extent_can_insert() not being called
Journal replay just treats extents like regular keys - it doesn't split existing extents, so bch2_extent_can_insert() shouldn't be called from that path. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r--fs/bcachefs/btree_update_leaf.c26
1 files changed, 12 insertions, 14 deletions
diff --git a/fs/bcachefs/btree_update_leaf.c b/fs/bcachefs/btree_update_leaf.c
index 6e9688d0bb77..57c0311b184f 100644
--- a/fs/bcachefs/btree_update_leaf.c
+++ b/fs/bcachefs/btree_update_leaf.c
@@ -265,11 +265,10 @@ static enum btree_insert_ret
btree_key_can_insert(struct btree_trans *trans,
struct btree_iter *iter,
struct bkey_i *insert,
- unsigned *u64s)
+ unsigned u64s)
{
struct bch_fs *c = trans->c;
struct btree *b = iter_l(iter)->b;
- static enum btree_insert_ret ret;
if (unlikely(btree_node_fake(b)))
return BTREE_INSERT_BTREE_NODE_FULL;
@@ -281,13 +280,7 @@ btree_key_can_insert(struct btree_trans *trans,
if (unlikely(btree_node_old_extent_overwrite(b)))
return BTREE_INSERT_BTREE_NODE_FULL;
- ret = !btree_iter_is_extents(iter)
- ? BTREE_INSERT_OK
- : bch2_extent_can_insert(trans, iter, insert);
- if (ret)
- return ret;
-
- if (*u64s > bch_btree_keys_u64s_remaining(c, b))
+ if (unlikely(u64s > bch_btree_keys_u64s_remaining(c, b)))
return BTREE_INSERT_BTREE_NODE_FULL;
return BTREE_INSERT_OK;
@@ -297,7 +290,7 @@ static enum btree_insert_ret
btree_key_can_insert_cached(struct btree_trans *trans,
struct btree_iter *iter,
struct bkey_i *insert,
- unsigned *u64s)
+ unsigned u64s)
{
struct bkey_cached *ck = (void *) iter->l[0].b;
unsigned new_u64s;
@@ -305,10 +298,10 @@ btree_key_can_insert_cached(struct btree_trans *trans,
BUG_ON(iter->level);
- if (*u64s <= ck->u64s)
+ if (u64s <= ck->u64s)
return BTREE_INSERT_OK;
- new_u64s = roundup_pow_of_two(*u64s);
+ new_u64s = roundup_pow_of_two(u64s);
new_k = krealloc(ck->k, new_u64s * sizeof(u64), GFP_NOFS);
if (!new_k)
return -ENOMEM;
@@ -414,8 +407,8 @@ bch2_trans_commit_write_locked(struct btree_trans *trans,
u64s += i->k->k.u64s;
ret = btree_iter_type(i->iter) != BTREE_ITER_CACHED
- ? btree_key_can_insert(trans, i->iter, i->k, &u64s)
- : btree_key_can_insert_cached(trans, i->iter, i->k, &u64s);
+ ? btree_key_can_insert(trans, i->iter, i->k, u64s)
+ : btree_key_can_insert_cached(trans, i->iter, i->k, u64s);
if (ret) {
*stopped_at = i;
return ret;
@@ -733,6 +726,11 @@ static int extent_update_to_keys(struct btree_trans *trans,
struct bkey_i *insert)
{
struct btree_iter *iter;
+ int ret;
+
+ ret = bch2_extent_can_insert(trans, orig_iter, insert);
+ if (ret)
+ return ret;
if (bkey_deleted(&insert->k))
return 0;