virtio_scsi: move kick event out from virtscsi_init
We currently kick event within virtscsi_init, before host is fully initialized. This can in theory confuse guest if device consumes the buffers immediately. To fix, move virtscsi_kick_event_all out to scan/restore. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
0246555550
commit
cd67904895
|
@ -853,7 +853,11 @@ static void virtscsi_init_vq(struct virtio_scsi_vq *virtscsi_vq,
|
|||
|
||||
static void virtscsi_scan(struct virtio_device *vdev)
|
||||
{
|
||||
struct Scsi_Host *shost = (struct Scsi_Host *)vdev->priv;
|
||||
struct Scsi_Host *shost = virtio_scsi_host(vdev);
|
||||
struct virtio_scsi *vscsi = shost_priv(shost);
|
||||
|
||||
if (virtio_has_feature(vdev, VIRTIO_SCSI_F_HOTPLUG))
|
||||
virtscsi_kick_event_all(vscsi);
|
||||
|
||||
scsi_scan_host(shost);
|
||||
}
|
||||
|
@ -916,9 +920,6 @@ static int virtscsi_init(struct virtio_device *vdev,
|
|||
virtscsi_config_set(vdev, cdb_size, VIRTIO_SCSI_CDB_SIZE);
|
||||
virtscsi_config_set(vdev, sense_size, VIRTIO_SCSI_SENSE_SIZE);
|
||||
|
||||
if (virtio_has_feature(vdev, VIRTIO_SCSI_F_HOTPLUG))
|
||||
virtscsi_kick_event_all(vscsi);
|
||||
|
||||
err = 0;
|
||||
|
||||
out:
|
||||
|
@ -1048,8 +1049,13 @@ static int virtscsi_restore(struct virtio_device *vdev)
|
|||
return err;
|
||||
|
||||
err = register_hotcpu_notifier(&vscsi->nb);
|
||||
if (err)
|
||||
if (err) {
|
||||
vdev->config->del_vqs(vdev);
|
||||
return err;
|
||||
}
|
||||
|
||||
if (virtio_has_feature(vdev, VIRTIO_SCSI_F_HOTPLUG))
|
||||
virtscsi_kick_event_all(vscsi);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue