On 8/9/21 2:40 PM, Christoph Hellwig wrote: > Except for the IDA none of the allocations in bcache_device_init is > unwound on error, fix that. > > Signed-off-by: Christoph Hellwig <hch@xxxxxx> Acked-by: Coly Li <colyli@xxxxxxx> Thanks. Coly Li > --- > drivers/md/bcache/super.c | 16 +++++++++++----- > 1 file changed, 11 insertions(+), 5 deletions(-) > > diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c > index 185246a0d855..d0f08e946453 100644 > --- a/drivers/md/bcache/super.c > +++ b/drivers/md/bcache/super.c > @@ -931,20 +931,20 @@ static int bcache_device_init(struct bcache_device *d, unsigned int block_size, > n = BITS_TO_LONGS(d->nr_stripes) * sizeof(unsigned long); > d->full_dirty_stripes = kvzalloc(n, GFP_KERNEL); > if (!d->full_dirty_stripes) > - return -ENOMEM; > + goto out_free_stripe_sectors_dirty; > > idx = ida_simple_get(&bcache_device_idx, 0, > BCACHE_DEVICE_IDX_MAX, GFP_KERNEL); > if (idx < 0) > - return idx; > + goto out_free_full_dirty_stripes; > > if (bioset_init(&d->bio_split, 4, offsetof(struct bbio, bio), > BIOSET_NEED_BVECS|BIOSET_NEED_RESCUER)) > - goto err; > + goto out_ida_remove; > > d->disk = blk_alloc_disk(NUMA_NO_NODE); > if (!d->disk) > - goto err; > + goto out_bioset_exit; > > set_capacity(d->disk, sectors); > snprintf(d->disk->disk_name, DISK_NAME_LEN, "bcache%i", idx); > @@ -987,8 +987,14 @@ static int bcache_device_init(struct bcache_device *d, unsigned int block_size, > > return 0; > > -err: > +out_bioset_exit: > + bioset_exit(&d->bio_split); > +out_ida_remove: > ida_simple_remove(&bcache_device_idx, idx); > +out_free_full_dirty_stripes: > + kvfree(d->full_dirty_stripes); > +out_free_stripe_sectors_dirty: > + kvfree(d->stripe_sectors_dirty); > return -ENOMEM; > > }