On Thu, Apr 23, 2020 at 07:13:38AM -0700, Christoph Hellwig wrote: > On Thu, Apr 23, 2020 at 01:37:17PM +0100, Stefan Hajnoczi wrote: > > A virtio_blk block device can still be referenced after hot unplug by > > userspace processes that hold the file descriptor. In this case > > virtblk_getgeo() can be invoked after virtblk_remove() was called. For > > example, a program that has /dev/vdb open can call ioctl(HDIO_GETGEO) > > after hot unplug. > > > > Fix this by clearing vblk->disk->private_data and checking that the > > virtio_blk driver instance is still around in virtblk_getgeo(). > > > > Note that the virtblk_getgeo() function itself is guaranteed to remain > > in memory after hot unplug because the virtio_blk module refcount is > > still held while a block device reference exists. > > > > Originally-by: Lance Digby <ldi...@redhat.com> > > Signed-off-by: Stefan Hajnoczi <stefa...@redhat.com> > > --- > > drivers/block/virtio_blk.c | 5 +++++ > > 1 file changed, 5 insertions(+) > > > > diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c > > index 93468b7c6701..b50cdf37a6f7 100644 > > --- a/drivers/block/virtio_blk.c > > +++ b/drivers/block/virtio_blk.c > > @@ -300,6 +300,10 @@ static int virtblk_getgeo(struct block_device *bd, > > struct hd_geometry *geo) > > { > > struct virtio_blk *vblk = bd->bd_disk->private_data; > > > > + /* Driver instance has been removed */ > > + if (!vblk) > > + return -ENOTTY; > > If this ever hits you have a nasty race condition and this is not > going to fix it, as it could be removed just after this check as well.
Perhaps a better fix is to keep a refcount in struct virtio_blk and implement block_device_operations->release() to decrement the refcount. That way the struct virtio_blk stays around until all block device references are dropped. This is similar to nbd_put() in drivers/block/nbd.c. Stefan
signature.asc
Description: PGP signature
_______________________________________________ Virtualization mailing list Virtualization@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/virtualization