On Wed 16-03-22 09:45:17, Christoph Hellwig wrote: > Ensure that the lo_device which is stored in the gendisk private > data is valid until the gendisk is freed. Currently the loop driver > uses a lot of effort to make sure a device is not freed when it is > still in use, but to to fix a potential deadlock this will be relaxed > a bit soon. > > Signed-off-by: Christoph Hellwig <hch@xxxxxx> Looks good. Feel free to add: Reviewed-by: Jan Kara <jack@xxxxxxx> Honza > --- > drivers/block/loop.c | 16 ++++++++++++---- > 1 file changed, 12 insertions(+), 4 deletions(-) > > diff --git a/drivers/block/loop.c b/drivers/block/loop.c > index 0813f63d5bbd2..cbaa18bcad1fe 100644 > --- a/drivers/block/loop.c > +++ b/drivers/block/loop.c > @@ -1765,6 +1765,14 @@ static void lo_release(struct gendisk *disk, fmode_t mode) > mutex_unlock(&lo->lo_mutex); > } > > +static void lo_free_disk(struct gendisk *disk) > +{ > + struct loop_device *lo = disk->private_data; > + > + mutex_destroy(&lo->lo_mutex); > + kfree(lo); > +} > + > static const struct block_device_operations lo_fops = { > .owner = THIS_MODULE, > .open = lo_open, > @@ -1773,6 +1781,7 @@ static const struct block_device_operations lo_fops = { > #ifdef CONFIG_COMPAT > .compat_ioctl = lo_compat_ioctl, > #endif > + .free_disk = lo_free_disk, > }; > > /* > @@ -2064,14 +2073,13 @@ static void loop_remove(struct loop_device *lo) > { > /* Make this loop device unreachable from pathname. */ > del_gendisk(lo->lo_disk); > - blk_cleanup_disk(lo->lo_disk); > + blk_cleanup_queue(lo->lo_disk->queue); > blk_mq_free_tag_set(&lo->tag_set); > mutex_lock(&loop_ctl_mutex); > idr_remove(&loop_index_idr, lo->lo_number); > mutex_unlock(&loop_ctl_mutex); > - /* There is no route which can find this loop device. */ > - mutex_destroy(&lo->lo_mutex); > - kfree(lo); > + > + put_disk(lo->lo_disk); > } > > static void loop_probe(dev_t dev) > -- > 2.30.2 > -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR