summaryrefslogtreecommitdiff
path: root/libbcachefs/btree_update.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbcachefs/btree_update.c')
-rw-r--r--libbcachefs/btree_update.c29
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;