diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2018-06-28 18:52:03 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2018-06-30 21:53:38 -0400 |
commit | f7170d19e35b1a4a8cdd5b8d5a8d0dc8ca67e290 (patch) | |
tree | ec4b6b8246afb6b038b543e880b6535b0909fef9 | |
parent | 8f3cdbfdfad66ca6824e85458184ac0ab9349957 (diff) |
bcachefs: fix btree reserve calculations
-rw-r--r-- | fs/bcachefs/btree_update_interior.h | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/fs/bcachefs/btree_update_interior.h b/fs/bcachefs/btree_update_interior.h index 3a17de5ca43e..e6f050718586 100644 --- a/fs/bcachefs/btree_update_interior.h +++ b/fs/bcachefs/btree_update_interior.h @@ -199,14 +199,17 @@ void bch2_btree_root_alloc(struct bch_fs *, enum btree_id); static inline unsigned btree_update_reserve_required(struct bch_fs *c, struct btree *b) { - unsigned depth = btree_node_root(c, b)->level - b->level + 1; + unsigned depth = btree_node_root(c, b)->level + 1; /* * Number of nodes we might have to allocate in a worst case btree * split operation - we split all the way up to the root, then allocate - * a new root. + * a new root, unless we're already at max depth: */ - return depth * 2 + 1; + if (depth < BTREE_MAX_DEPTH) + return (depth - b->level) * 2 + 1; + else + return (depth - b->level) * 2 - 1; } static inline void btree_node_reset_sib_u64s(struct btree *b) |