Commit 5ff843721467 ("scsi: virtio_scsi: unplug LUNs when events missed"),
almost fixed the case of mass unpluging of LUNs, but it missed a
corner case in which all the LUNs are unplugged at the same time.

In this case INQUIRY ends with DID_BAD_TARGET.
Detect this and unplug the LUN.

Signed-off-by: Maxim Levitsky <mlevi...@redhat.com>
---
 drivers/scsi/virtio_scsi.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/drivers/scsi/virtio_scsi.c b/drivers/scsi/virtio_scsi.c
index 0e0910c5b9424..c7f0c22b6f11d 100644
--- a/drivers/scsi/virtio_scsi.c
+++ b/drivers/scsi/virtio_scsi.c
@@ -351,6 +351,16 @@ static void virtscsi_rescan_hotunplug(struct virtio_scsi 
*vscsi)
                        /* PQ indicates the LUN is not attached */
                        scsi_remove_device(sdev);
                }
+
+               else if (host_byte(result) == DID_BAD_TARGET) {
+                       /*
+                        * if all LUNs of a virtio-scsi device are unplugged,
+                        * it will respond with BAD TARGET on any INQUIRY
+                        * command.
+                        * Remove the device in this case as well
+                        */
+                       scsi_remove_device(sdev);
+               }
        }
 
        kfree(inq_result);
-- 
2.26.2

Reply via email to