Message ID | 20200913160259.32145-2-mlevitsk@redhat.com |
---|---|
State | New |
Headers | show |
Series | Fix scsi devices plug/unplug races w.r.t virtio-scsi iothread | expand |
On 13/09/20 18:02, Maxim Levitsky wrote: > This change will allow us to convert the bus children list to RCU, > while not changing the logic of this function > > Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com> > Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> > --- > hw/scsi/scsi-bus.c | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c > index df65cc2223..f8adfbc2a5 100644 > --- a/hw/scsi/scsi-bus.c > +++ b/hw/scsi/scsi-bus.c > @@ -1572,7 +1572,7 @@ SCSIDevice *scsi_device_find(SCSIBus *bus, int channel, int id, int lun) > BusChild *kid; > SCSIDevice *target_dev = NULL; > > - QTAILQ_FOREACH_REVERSE(kid, &bus->qbus.children, sibling) { > + QTAILQ_FOREACH(kid, &bus->qbus.children, sibling) { > DeviceState *qdev = kid->child; > SCSIDevice *dev = SCSI_DEVICE(qdev); > > @@ -1580,7 +1580,15 @@ SCSIDevice *scsi_device_find(SCSIBus *bus, int channel, int id, int lun) > if (dev->lun == lun) { > return dev; > } > - target_dev = dev; > + > + /* > + * If we don't find exact match (channel/bus/lun), > + * we will return the first device which matches channel/bus > + */ > + > + if (!target_dev) { > + target_dev = dev; > + } > } > } > return target_dev; > I think this breaks the detection of duplicate LUNs. I'll play with it and let you know. Paolo
diff --git a/hw/scsi/scsi-bus.c b/hw/scsi/scsi-bus.c index df65cc2223..f8adfbc2a5 100644 --- a/hw/scsi/scsi-bus.c +++ b/hw/scsi/scsi-bus.c @@ -1572,7 +1572,7 @@ SCSIDevice *scsi_device_find(SCSIBus *bus, int channel, int id, int lun) BusChild *kid; SCSIDevice *target_dev = NULL; - QTAILQ_FOREACH_REVERSE(kid, &bus->qbus.children, sibling) { + QTAILQ_FOREACH(kid, &bus->qbus.children, sibling) { DeviceState *qdev = kid->child; SCSIDevice *dev = SCSI_DEVICE(qdev); @@ -1580,7 +1580,15 @@ SCSIDevice *scsi_device_find(SCSIBus *bus, int channel, int id, int lun) if (dev->lun == lun) { return dev; } - target_dev = dev; + + /* + * If we don't find exact match (channel/bus/lun), + * we will return the first device which matches channel/bus + */ + + if (!target_dev) { + target_dev = dev; + } } } return target_dev;