scsi: virtio-scsi: Correctly handle the case where all LUNs are unplugged
authorMaxim Levitsky <mlevitsk@redhat.com>
Wed, 29 Jul 2020 19:48:06 +0000 (22:48 +0300)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 31 Jul 2020 01:08:52 +0000 (21:08 -0400)
Commit 5ff843721467 ("scsi: virtio_scsi: unplug LUNs when events missed")
missed a corner case in which all the LUNs are unplugged at the same time.

In this case INQUIRY returns DID_BAD_TARGET. Detect this and unplug the
LUN.

Link: https://lore.kernel.org/r/20200729194806.4933-2-mlevitsk@redhat.com
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/virtio_scsi.c

index 42fac69..8cc003a 100644 (file)
@@ -350,6 +350,14 @@ static void virtscsi_rescan_hotunplug(struct virtio_scsi *vscsi)
                if (result == 0 && inq_result[0] >> 5) {
                        /* 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);
                }
        }