Commit cc74f719 authored by Michael S. Tsirkin's avatar Michael S. Tsirkin Committed by Rusty Russell

virtio_blk: drop config_enable

Now that virtio core ensures config changes don't
arrive during probing, drop config_enable flag
in virtio blk.
On removal, flush is now sufficient to guarantee that
no change work is queued.

This help simplify the driver, and will allow
setting DRIVER_OK earlier without losing config
change notifications.
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Reviewed-by: default avatarCornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
parent 22b7050a
...@@ -44,9 +44,6 @@ struct virtio_blk ...@@ -44,9 +44,6 @@ struct virtio_blk
/* Lock for config space updates */ /* Lock for config space updates */
struct mutex config_lock; struct mutex config_lock;
/* enable config space updates */
bool config_enable;
/* What host tells us, plus 2 for header & tailer. */ /* What host tells us, plus 2 for header & tailer. */
unsigned int sg_elems; unsigned int sg_elems;
...@@ -348,8 +345,6 @@ static void virtblk_config_changed_work(struct work_struct *work) ...@@ -348,8 +345,6 @@ static void virtblk_config_changed_work(struct work_struct *work)
u64 capacity, size; u64 capacity, size;
mutex_lock(&vblk->config_lock); mutex_lock(&vblk->config_lock);
if (!vblk->config_enable)
goto done;
/* Host must always specify the capacity. */ /* Host must always specify the capacity. */
virtio_cread(vdev, struct virtio_blk_config, capacity, &capacity); virtio_cread(vdev, struct virtio_blk_config, capacity, &capacity);
...@@ -374,7 +369,7 @@ static void virtblk_config_changed_work(struct work_struct *work) ...@@ -374,7 +369,7 @@ static void virtblk_config_changed_work(struct work_struct *work)
set_capacity(vblk->disk, capacity); set_capacity(vblk->disk, capacity);
revalidate_disk(vblk->disk); revalidate_disk(vblk->disk);
kobject_uevent_env(&disk_to_dev(vblk->disk)->kobj, KOBJ_CHANGE, envp); kobject_uevent_env(&disk_to_dev(vblk->disk)->kobj, KOBJ_CHANGE, envp);
done:
mutex_unlock(&vblk->config_lock); mutex_unlock(&vblk->config_lock);
} }
...@@ -609,7 +604,6 @@ static int virtblk_probe(struct virtio_device *vdev) ...@@ -609,7 +604,6 @@ static int virtblk_probe(struct virtio_device *vdev)
mutex_init(&vblk->config_lock); mutex_init(&vblk->config_lock);
INIT_WORK(&vblk->config_work, virtblk_config_changed_work); INIT_WORK(&vblk->config_work, virtblk_config_changed_work);
vblk->config_enable = true;
err = init_vq(vblk); err = init_vq(vblk);
if (err) if (err)
...@@ -771,10 +765,8 @@ static void virtblk_remove(struct virtio_device *vdev) ...@@ -771,10 +765,8 @@ static void virtblk_remove(struct virtio_device *vdev)
int index = vblk->index; int index = vblk->index;
int refc; int refc;
/* Prevent config work handler from accessing the device. */ /* Make sure no work handler is accessing the device. */
mutex_lock(&vblk->config_lock); flush_work(&vblk->config_work);
vblk->config_enable = false;
mutex_unlock(&vblk->config_lock);
del_gendisk(vblk->disk); del_gendisk(vblk->disk);
blk_cleanup_queue(vblk->disk->queue); blk_cleanup_queue(vblk->disk->queue);
...@@ -784,8 +776,6 @@ static void virtblk_remove(struct virtio_device *vdev) ...@@ -784,8 +776,6 @@ static void virtblk_remove(struct virtio_device *vdev)
/* Stop all the virtqueues. */ /* Stop all the virtqueues. */
vdev->config->reset(vdev); vdev->config->reset(vdev);
flush_work(&vblk->config_work);
refc = atomic_read(&disk_to_dev(vblk->disk)->kobj.kref.refcount); refc = atomic_read(&disk_to_dev(vblk->disk)->kobj.kref.refcount);
put_disk(vblk->disk); put_disk(vblk->disk);
vdev->config->del_vqs(vdev); vdev->config->del_vqs(vdev);
...@@ -805,11 +795,7 @@ static int virtblk_freeze(struct virtio_device *vdev) ...@@ -805,11 +795,7 @@ static int virtblk_freeze(struct virtio_device *vdev)
/* Ensure we don't receive any more interrupts */ /* Ensure we don't receive any more interrupts */
vdev->config->reset(vdev); vdev->config->reset(vdev);
/* Prevent config work handler from accessing the device. */ /* Make sure no work handler is accessing the device. */
mutex_lock(&vblk->config_lock);
vblk->config_enable = false;
mutex_unlock(&vblk->config_lock);
flush_work(&vblk->config_work); flush_work(&vblk->config_work);
blk_mq_stop_hw_queues(vblk->disk->queue); blk_mq_stop_hw_queues(vblk->disk->queue);
...@@ -823,7 +809,6 @@ static int virtblk_restore(struct virtio_device *vdev) ...@@ -823,7 +809,6 @@ static int virtblk_restore(struct virtio_device *vdev)
struct virtio_blk *vblk = vdev->priv; struct virtio_blk *vblk = vdev->priv;
int ret; int ret;
vblk->config_enable = true;
ret = init_vq(vdev->priv); ret = init_vq(vdev->priv);
if (!ret) if (!ret)
blk_mq_start_stopped_hw_queues(vblk->disk->queue, true); blk_mq_start_stopped_hw_queues(vblk->disk->queue, true);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment