On 07.10.20 14:14, Christoph Hellwig wrote: > On Wed, Oct 07, 2020 at 02:09:18PM +0200, Christian Borntraeger wrote: >> Unfortunately not. On insmodding virtio_blk I do get: > > Yeah, the symbol_put needs to be conditional as well. New version below: Yes, this works. > > diff --git a/block/partitions/ibm.c b/block/partitions/ibm.c > index d6e18df9c53c6d..4b044e620d3534 100644 > --- a/block/partitions/ibm.c > +++ b/block/partitions/ibm.c > @@ -305,8 +305,6 @@ int ibm_partition(struct parsed_partitions *state) > if (!disk->fops->getgeo) > goto out_exit; > fn = symbol_get(dasd_biodasdinfo); > - if (!fn) > - goto out_exit; > blocksize = bdev_logical_block_size(bdev); > if (blocksize <= 0) > goto out_symbol; > @@ -326,7 +324,7 @@ int ibm_partition(struct parsed_partitions *state) > geo->start = get_start_sect(bdev); > if (disk->fops->getgeo(bdev, geo)) > goto out_freeall; > - if (fn(disk, info)) { > + if (!fn || fn(disk, info)) { > kfree(info); > info = NULL; > } > @@ -370,7 +368,8 @@ int ibm_partition(struct parsed_partitions *state) > out_nogeo: > kfree(info); > out_symbol: > - symbol_put(dasd_biodasdinfo); > + if (fn) > + symbol_put(dasd_biodasdinfo); > out_exit: > return res; > } >