scsi: virtio_scsi: Drop DID_TARGET_FAILURE use
authorMike Christie <michael.christie@oracle.com>
Fri, 12 Aug 2022 01:00:21 +0000 (20:00 -0500)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 7 Sep 2022 02:05:58 +0000 (22:05 -0400)
DID_TARGET_FAILURE is internal to the SCSI layer. Drivers must not use it
because:

 1. It's not propagated upwards, so SG IO/passthrough users will not see an
    error and think a command was successful.

 2. There is no handling for it in scsi_decide_disposition() so it results
    in entering SCSI error handling.

virtio_scsi gets this when something like qemu returns
VIRTIO_SCSI_S_TARGET_FAILURE.  It looks like qemu returns that error code
if a host OS returns it, but this shouldn't happen for Linux since we never
propagate that error to userspace.

This has us use DID_BAD_TARGET in case some other virt layer is returning
it. In that case we will still get a hard error like before and it conveys
something unexpected happened.

Link: https://lore.kernel.org/r/20220812010027.8251-5-michael.christie@oracle.com
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Mike Christie <michael.christie@oracle.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/virtio_scsi.c

index 578c4b6d0f7d97b1caddb46d8e0baef6f0b21822..112d8c3962b0a3ed7b38b69d70807ba2a372d1ee 100644 (file)
@@ -141,7 +141,7 @@ static void virtscsi_complete_cmd(struct virtio_scsi *vscsi, void *buf)
                set_host_byte(sc, DID_TRANSPORT_DISRUPTED);
                break;
        case VIRTIO_SCSI_S_TARGET_FAILURE:
-               set_host_byte(sc, DID_TARGET_FAILURE);
+               set_host_byte(sc, DID_BAD_TARGET);
                break;
        case VIRTIO_SCSI_S_NEXUS_FAILURE:
                set_host_byte(sc, DID_NEXUS_FAILURE);