summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2018-06-28 18:52:03 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2018-06-30 21:53:38 -0400
commitf7170d19e35b1a4a8cdd5b8d5a8d0dc8ca67e290 (patch)
treeec4b6b8246afb6b038b543e880b6535b0909fef9
parent8f3cdbfdfad66ca6824e85458184ac0ab9349957 (diff)
bcachefs: fix btree reserve calculations
-rw-r--r--fs/bcachefs/btree_update_interior.h9
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)