diff options
| -rw-r--r-- | drivers/block/virtio_blk.c | 7 | 
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c index 0bdde8fba39..07a18e23848 100644 --- a/drivers/block/virtio_blk.c +++ b/drivers/block/virtio_blk.c @@ -889,6 +889,7 @@ static void __devexit virtblk_remove(struct virtio_device *vdev)  {  	struct virtio_blk *vblk = vdev->priv;  	int index = vblk->index; +	int refc;  	/* Prevent config work handler from accessing the device. */  	mutex_lock(&vblk->config_lock); @@ -903,11 +904,15 @@ static void __devexit virtblk_remove(struct virtio_device *vdev)  	flush_work(&vblk->config_work); +	refc = atomic_read(&disk_to_dev(vblk->disk)->kobj.kref.refcount);  	put_disk(vblk->disk);  	mempool_destroy(vblk->pool);  	vdev->config->del_vqs(vdev);  	kfree(vblk); -	ida_simple_remove(&vd_index_ida, index); + +	/* Only free device id if we don't have any users */ +	if (refc == 1) +		ida_simple_remove(&vd_index_ida, index);  }  #ifdef CONFIG_PM  |