Message ID | 20220316084519.2850118-7-hch@lst.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [1/8] loop: de-duplicate the idle worker freeing code | expand |
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@lst.de> Looks good. Feel free to add: Reviewed-by: Jan Kara <jack@suse.cz> 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 >
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)
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@lst.de> --- drivers/block/loop.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)