mirror of
https://github.com/qemu/qemu.git
synced 2024-12-03 16:53:53 +08:00
virtio-scsi: don't process IO on fenced dataplane
If virtio_scsi_dataplane_start fails, there is a small window when it drops the aio lock (in aio_wait_bh_oneshot) and the dataplane's AIO handler can still run during that window. This is done after the dataplane was marked as fenced, thus we use this flag to avoid it doing any IO. Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com> Message-Id: <20201217150040.906961-2-mlevitsk@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
166854f7cd
commit
6f1a5c37db
@ -52,12 +52,14 @@ void virtio_scsi_dataplane_setup(VirtIOSCSI *s, Error **errp)
|
||||
static bool virtio_scsi_data_plane_handle_cmd(VirtIODevice *vdev,
|
||||
VirtQueue *vq)
|
||||
{
|
||||
bool progress;
|
||||
bool progress = false;
|
||||
VirtIOSCSI *s = VIRTIO_SCSI(vdev);
|
||||
|
||||
virtio_scsi_acquire(s);
|
||||
assert(s->ctx && s->dataplane_started);
|
||||
progress = virtio_scsi_handle_cmd_vq(s, vq);
|
||||
if (!s->dataplane_fenced) {
|
||||
assert(s->ctx && s->dataplane_started);
|
||||
progress = virtio_scsi_handle_cmd_vq(s, vq);
|
||||
}
|
||||
virtio_scsi_release(s);
|
||||
return progress;
|
||||
}
|
||||
@ -65,12 +67,14 @@ static bool virtio_scsi_data_plane_handle_cmd(VirtIODevice *vdev,
|
||||
static bool virtio_scsi_data_plane_handle_ctrl(VirtIODevice *vdev,
|
||||
VirtQueue *vq)
|
||||
{
|
||||
bool progress;
|
||||
bool progress = false;
|
||||
VirtIOSCSI *s = VIRTIO_SCSI(vdev);
|
||||
|
||||
virtio_scsi_acquire(s);
|
||||
assert(s->ctx && s->dataplane_started);
|
||||
progress = virtio_scsi_handle_ctrl_vq(s, vq);
|
||||
if (!s->dataplane_fenced) {
|
||||
assert(s->ctx && s->dataplane_started);
|
||||
progress = virtio_scsi_handle_ctrl_vq(s, vq);
|
||||
}
|
||||
virtio_scsi_release(s);
|
||||
return progress;
|
||||
}
|
||||
@ -78,12 +82,14 @@ static bool virtio_scsi_data_plane_handle_ctrl(VirtIODevice *vdev,
|
||||
static bool virtio_scsi_data_plane_handle_event(VirtIODevice *vdev,
|
||||
VirtQueue *vq)
|
||||
{
|
||||
bool progress;
|
||||
bool progress = false;
|
||||
VirtIOSCSI *s = VIRTIO_SCSI(vdev);
|
||||
|
||||
virtio_scsi_acquire(s);
|
||||
assert(s->ctx && s->dataplane_started);
|
||||
progress = virtio_scsi_handle_event_vq(s, vq);
|
||||
if (!s->dataplane_fenced) {
|
||||
assert(s->ctx && s->dataplane_started);
|
||||
progress = virtio_scsi_handle_event_vq(s, vq);
|
||||
}
|
||||
virtio_scsi_release(s);
|
||||
return progress;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user