[PATCH 11/42] xen-scsifront: compability status handling

Hannes Reinecke
2021-04-21T17:48:43Z

The Xen guest might run against arbitrary backends, so the driver
might receive a status with driver_byte set. Map these errors
to DID_ERROR to be consistent with recent changes.

Signed-off-by: Hannes Reinecke <hare@suse.de>
---
drivers/scsi/xen-scsifront.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/xen-scsifront.c b/drivers/scsi/xen-scsifront.c
index 259fc248d06c..fcf4dd70ebc7 100644
--- a/drivers/scsi/xen-scsifront.c
+++ b/drivers/scsi/xen-scsifront.c
@@ -251,6 +251,7 @@ static void scsifront_cdb_cmd_done(struct vscsifrnt_info *info,
struct scsi_cmnd *sc;
uint32_t id;
uint8_t sense_len;
+ int result;

id = ring_rsp->rqid;
shadow = info->shadow[id];
@@ -261,7 +262,13 @@ static void scsifront_cdb_cmd_done(struct vscsifrnt_info *info,
scsifront_gnttab_done(info, shadow);
scsifront_put_rqid(info, id);

- sc->result = ring_rsp->rslt;
+ result = ring_rsp->rslt;
+ sc->result = 0;
+ if ((result >> 24) & 0xff)
+ set_host_byte(sc, DID_ERROR);
+ else if (host_byte(result))
+ set_host_byte(sc, host_byte(result));
+ set_status_byte(sc, status_byte(result));
scsi_set_resid(sc, ring_rsp->residual_len);

sense_len = min_t(uint8_t, VSCSIIF_SENSE_BUFFERSIZE,
--
2.29.2