On Fri, Jun 20, 2025 at 12:53:00AM +0800, Alan Huang wrote:
> 
> On Jun 20, 2025, at 00:37, Kent Overstreet <kent.overstr...@linux.dev> 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 <kent.overstr...@linux.dev>
> > ---
> > 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)  ?

btree_trans_subbuf fields are u16s, we're just concerned about integer
overflows here

> 
> > +
> > if (buf->u64s)
> > memcpy(n,
> >       btree_trans_subbuf_base(trans, buf),
> >       old_size * sizeof(u64));
> 
> copy buf->u64s is enough.

yup, already spotted that

> 
> > 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
> > 
> 

Reply via email to