[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 01/13] virtio-scsi: avoid race between unplug and transport event
From: |
Stefan Hajnoczi |
Subject: |
[PATCH 01/13] virtio-scsi: avoid race between unplug and transport event |
Date: |
Mon, 3 Apr 2023 14:29:52 -0400 |
Only report a transport reset event to the guest after the SCSIDevice
has been unrealized by qdev_simple_device_unplug_cb().
qdev_simple_device_unplug_cb() sets the SCSIDevice's qdev.realized field
to false so that scsi_device_find/get() no longer see it.
scsi_target_emulate_report_luns() also needs to be updated to filter out
SCSIDevices that are unrealized.
These changes ensure that the guest driver does not see the SCSIDevice
that's being unplugged if it responds very quickly to the transport
reset event.
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
hw/scsi/scsi-bus.c | 3 ++-
hw/scsi/virtio-scsi.c | 18 +++++++++---------
2 files changed, 11 insertions(+), 10 deletions(-)
diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c
index c97176110c..f9bd064833 100644
--- a/hw/scsi/scsi-bus.c
+++ b/hw/scsi/scsi-bus.c
@@ -487,7 +487,8 @@ static bool scsi_target_emulate_report_luns(SCSITargetReq
*r)
DeviceState *qdev = kid->child;
SCSIDevice *dev = SCSI_DEVICE(qdev);
- if (dev->channel == channel && dev->id == id && dev->lun != 0) {
+ if (dev->channel == channel && dev->id == id && dev->lun != 0 &&
+ qatomic_load_acquire(&dev->qdev.realized)) {
store_lun(tmp, dev->lun);
g_byte_array_append(buf, tmp, 8);
len += 8;
diff --git a/hw/scsi/virtio-scsi.c b/hw/scsi/virtio-scsi.c
index 612c525d9d..000961446c 100644
--- a/hw/scsi/virtio-scsi.c
+++ b/hw/scsi/virtio-scsi.c
@@ -1063,15 +1063,6 @@ static void virtio_scsi_hotunplug(HotplugHandler
*hotplug_dev, DeviceState *dev,
SCSIDevice *sd = SCSI_DEVICE(dev);
AioContext *ctx = s->ctx ?: qemu_get_aio_context();
- if (virtio_vdev_has_feature(vdev, VIRTIO_SCSI_F_HOTPLUG)) {
- virtio_scsi_acquire(s);
- virtio_scsi_push_event(s, sd,
- VIRTIO_SCSI_T_TRANSPORT_RESET,
- VIRTIO_SCSI_EVT_RESET_REMOVED);
- scsi_bus_set_ua(&s->bus, SENSE_CODE(REPORTED_LUNS_CHANGED));
- virtio_scsi_release(s);
- }
-
aio_disable_external(ctx);
qdev_simple_device_unplug_cb(hotplug_dev, dev, errp);
aio_enable_external(ctx);
@@ -1082,6 +1073,15 @@ static void virtio_scsi_hotunplug(HotplugHandler
*hotplug_dev, DeviceState *dev,
blk_set_aio_context(sd->conf.blk, qemu_get_aio_context(), NULL);
virtio_scsi_release(s);
}
+
+ if (virtio_vdev_has_feature(vdev, VIRTIO_SCSI_F_HOTPLUG)) {
+ virtio_scsi_acquire(s);
+ virtio_scsi_push_event(s, sd,
+ VIRTIO_SCSI_T_TRANSPORT_RESET,
+ VIRTIO_SCSI_EVT_RESET_REMOVED);
+ scsi_bus_set_ua(&s->bus, SENSE_CODE(REPORTED_LUNS_CHANGED));
+ virtio_scsi_release(s);
+ }
}
static struct SCSIBusInfo virtio_scsi_scsi_info = {
--
2.39.2
- [PATCH 00/13] block: remove aio_disable_external() API, Stefan Hajnoczi, 2023/04/03
- [PATCH 02/13] virtio-scsi: stop using aio_disable_external() during unplug, Stefan Hajnoczi, 2023/04/03
- [PATCH 05/13] block/export: wait for vhost-user-blk requests when draining, Stefan Hajnoczi, 2023/04/03
- [PATCH 06/13] block/export: stop using is_external in vhost-user-blk server, Stefan Hajnoczi, 2023/04/03
- [PATCH 03/13] block/export: only acquire AioContext once for vhost_user_server_stop(), Stefan Hajnoczi, 2023/04/03
- [PATCH 08/13] hw/xen: do not use aio_set_fd_handler(is_external=true) in xen_xenstore, Stefan Hajnoczi, 2023/04/03
- [PATCH 04/13] util/vhost-user-server: rename refcount to in_flight counter, Stefan Hajnoczi, 2023/04/03
- [PATCH 01/13] virtio-scsi: avoid race between unplug and transport event,
Stefan Hajnoczi <=
- Re: [PATCH 01/13] virtio-scsi: avoid race between unplug and transport event, Michael S. Tsirkin, 2023/04/04
- [PATCH 09/13] hw/xen: do not set is_external=true on evtchn fds, Stefan Hajnoczi, 2023/04/03
- [PATCH 07/13] virtio: do not set is_external=true on host notifiers, Stefan Hajnoczi, 2023/04/03
- [PATCH 12/13] block/fuse: do not set is_external=true on FUSE fd, Stefan Hajnoczi, 2023/04/03
- [PATCH 10/13] block/export: rewrite vduse-blk drain code, Stefan Hajnoczi, 2023/04/03
- [PATCH 13/13] aio: remove aio_disable_external() API, Stefan Hajnoczi, 2023/04/03