[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 01/13] virtio-scsi: avoid race between unplug and transport event
On Mon, Apr 03, 2023 at 02:29:52PM -0400, Stefan Hajnoczi wrote: > 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@xxxxxxxxxx> Reviewed-by: Michael S. Tsirkin <mst@xxxxxxxxxx> Feel free to merge. > --- > 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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |