diff options
Diffstat (limited to 'libbcachefs/btree_update.c')
-rw-r--r-- | libbcachefs/btree_update.c | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/libbcachefs/btree_update.c b/libbcachefs/btree_update.c index e97e78c1..192c1e5e 100644 --- a/libbcachefs/btree_update.c +++ b/libbcachefs/btree_update.c @@ -546,23 +546,29 @@ int bch2_btree_insert_clone_trans(struct btree_trans *trans, void *__bch2_trans_subbuf_alloc(struct btree_trans *trans, struct btree_trans_subbuf *buf, - unsigned u64s) + unsigned u64s, ulong ip) { unsigned new_top = buf->u64s + u64s; - unsigned old_size = buf->size; + unsigned new_size = buf->size; - if (new_top > buf->size) - buf->size = roundup_pow_of_two(new_top); + BUG_ON(roundup_pow_of_two(new_top) > U16_MAX); - void *n = bch2_trans_kmalloc_nomemzero(trans, buf->size * sizeof(u64)); + if (new_top > new_size) + new_size = roundup_pow_of_two(new_top); + + void *n = bch2_trans_kmalloc_nomemzero_ip(trans, new_size * sizeof(u64), ip); if (IS_ERR(n)) return n; + unsigned offset = (u64 *) n - (u64 *) trans->mem; + BUG_ON(offset > U16_MAX); + if (buf->u64s) memcpy(n, btree_trans_subbuf_base(trans, buf), - old_size * sizeof(u64)); + buf->size * sizeof(u64)); buf->base = (u64 *) n - (u64 *) trans->mem; + buf->size = new_size; void *p = btree_trans_subbuf_top(trans, buf); buf->u64s = new_top; @@ -807,11 +813,11 @@ int bch2_btree_bit_mod_buffered(struct btree_trans *trans, enum btree_id btree, return bch2_trans_update_buffered(trans, btree, &k); } -static int __bch2_trans_log_str(struct btree_trans *trans, const char *str, unsigned len) +static int __bch2_trans_log_str(struct btree_trans *trans, const char *str, unsigned len, ulong ip) { unsigned u64s = DIV_ROUND_UP(len, sizeof(u64)); - struct jset_entry *e = bch2_trans_jset_entry_alloc(trans, jset_u64s(u64s)); + struct jset_entry *e = bch2_trans_jset_entry_alloc_ip(trans, jset_u64s(u64s), ip); int ret = PTR_ERR_OR_ZERO(e); if (ret) return ret; @@ -824,7 +830,7 @@ static int __bch2_trans_log_str(struct btree_trans *trans, const char *str, unsi int bch2_trans_log_str(struct btree_trans *trans, const char *str) { - return __bch2_trans_log_str(trans, str, strlen(str)); + return __bch2_trans_log_str(trans, str, strlen(str), _RET_IP_); } int bch2_trans_log_msg(struct btree_trans *trans, struct printbuf *buf) @@ -833,13 +839,14 @@ int bch2_trans_log_msg(struct btree_trans *trans, struct printbuf *buf) if (ret) return ret; - return __bch2_trans_log_str(trans, buf->buf, buf->pos); + return __bch2_trans_log_str(trans, buf->buf, buf->pos, _RET_IP_); } int bch2_trans_log_bkey(struct btree_trans *trans, enum btree_id btree, unsigned level, struct bkey_i *k) { - struct jset_entry *e = bch2_trans_jset_entry_alloc(trans, jset_u64s(k->k.u64s)); + struct jset_entry *e = bch2_trans_jset_entry_alloc_ip(trans, + jset_u64s(k->k.u64s), _RET_IP_); int ret = PTR_ERR_OR_ZERO(e); if (ret) return ret; |