On Jun 20, 2025, at 00:37, Kent Overstreet <[email protected]> wrote: > > Don't change buf->size on error - this would usually be a transaction > restart, but it could also be -ENOMEM - when we've exceeded the bump > allocator max). > > Fixes: 247abee6ae6d ("bcachefs: btree_trans_subbuf") > Signed-off-by: Kent Overstreet <[email protected]> > --- > fs/bcachefs/btree_update.c | 13 ++++++++++--- > 1 file changed, 10 insertions(+), 3 deletions(-) > > diff --git a/fs/bcachefs/btree_update.c b/fs/bcachefs/btree_update.c > index f7949dbe8f70..668d4feb2879 100644 > --- a/fs/bcachefs/btree_update.c > +++ b/fs/bcachefs/btree_update.c > @@ -550,19 +550,26 @@ void *__bch2_trans_subbuf_alloc(struct btree_trans > *trans, > { > 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_ip(trans, buf->size * sizeof(u64), > ip); > + 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);
offset * sizeof(u64) ? > + > if (buf->u64s) > memcpy(n, > btree_trans_subbuf_base(trans, buf), > old_size * sizeof(u64)); copy buf->u64s is enough. > buf->base = (u64 *) n - (u64 *) trans->mem; > + buf->size = new_size; > > void *p = btree_trans_subbuf_top(trans, buf); > buf->u64s = new_top; > -- > 2.50.0 >
