[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v2 2/4] xen/scsiback: use new command result macros



Instead of using the kernel's values for the result of PV scsi
operations use the values of the interface definition.

Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
---
V2:
- fix scsiback_result() to pass through lowest 16 bits of result
- use XEN_VSCSIIF_RSLT_HOST() instead of open coding it (Boris Ostrovsky)
---
 drivers/xen/xen-scsiback.c | 82 ++++++++++++++++++++++++++++++++++++--
 1 file changed, 79 insertions(+), 3 deletions(-)

diff --git a/drivers/xen/xen-scsiback.c b/drivers/xen/xen-scsiback.c
index 0c5e565aa8cf..7a0c93acc2c5 100644
--- a/drivers/xen/xen-scsiback.c
+++ b/drivers/xen/xen-scsiback.c
@@ -280,6 +280,82 @@ static void scsiback_free_translation_entry(struct kref 
*kref)
        kfree(entry);
 }
 
+static int32_t scsiback_result(int32_t result)
+{
+       int32_t host_status;
+
+       switch (XEN_VSCSIIF_RSLT_HOST(result)) {
+       case DID_OK:
+               host_status = XEN_VSCSIIF_RSLT_HOST_OK;
+               break;
+       case DID_NO_CONNECT:
+               host_status = XEN_VSCSIIF_RSLT_HOST_NO_CONNECT;
+               break;
+       case DID_BUS_BUSY:
+               host_status = XEN_VSCSIIF_RSLT_HOST_BUS_BUSY;
+               break;
+       case DID_TIME_OUT:
+               host_status = XEN_VSCSIIF_RSLT_HOST_TIME_OUT;
+               break;
+       case DID_BAD_TARGET:
+               host_status = XEN_VSCSIIF_RSLT_HOST_BAD_TARGET;
+               break;
+       case DID_ABORT:
+               host_status = XEN_VSCSIIF_RSLT_HOST_ABORT;
+               break;
+       case DID_PARITY:
+               host_status = XEN_VSCSIIF_RSLT_HOST_PARITY;
+               break;
+       case DID_ERROR:
+               host_status = XEN_VSCSIIF_RSLT_HOST_ERROR;
+               break;
+       case DID_RESET:
+               host_status = XEN_VSCSIIF_RSLT_HOST_RESET;
+               break;
+       case DID_BAD_INTR:
+               host_status = XEN_VSCSIIF_RSLT_HOST_BAD_INTR;
+               break;
+       case DID_PASSTHROUGH:
+               host_status = XEN_VSCSIIF_RSLT_HOST_PASSTHROUGH;
+               break;
+       case DID_SOFT_ERROR:
+               host_status = XEN_VSCSIIF_RSLT_HOST_SOFT_ERROR;
+               break;
+       case DID_IMM_RETRY:
+               host_status = XEN_VSCSIIF_RSLT_HOST_IMM_RETRY;
+               break;
+       case DID_REQUEUE:
+               host_status = XEN_VSCSIIF_RSLT_HOST_REQUEUE;
+               break;
+       case DID_TRANSPORT_DISRUPTED:
+               host_status = XEN_VSCSIIF_RSLT_HOST_TRANSPORT_DISRUPTED;
+               break;
+       case DID_TRANSPORT_FAILFAST:
+               host_status = XEN_VSCSIIF_RSLT_HOST_TRANSPORT_FAILFAST;
+               break;
+       case DID_TARGET_FAILURE:
+               host_status = XEN_VSCSIIF_RSLT_HOST_TARGET_FAILURE;
+               break;
+       case DID_NEXUS_FAILURE:
+               host_status = XEN_VSCSIIF_RSLT_HOST_NEXUS_FAILURE;
+               break;
+       case DID_ALLOC_FAILURE:
+               host_status = XEN_VSCSIIF_RSLT_HOST_ALLOC_FAILURE;
+               break;
+       case DID_MEDIUM_ERROR:
+               host_status = XEN_VSCSIIF_RSLT_HOST_MEDIUM_ERROR;
+               break;
+       case DID_TRANSPORT_MARGINAL:
+               host_status = XEN_VSCSIIF_RSLT_HOST_TRANSPORT_MARGINAL;
+               break;
+       default:
+               host_status = XEN_VSCSIIF_RSLT_HOST_ERROR;
+               break;
+       }
+
+       return (host_status << 16) | (result & 0x00ffff);
+}
+
 static void scsiback_send_response(struct vscsibk_info *info,
                        char *sense_buffer, int32_t result, uint32_t resid,
                        uint16_t rqid)
@@ -295,7 +371,7 @@ static void scsiback_send_response(struct vscsibk_info 
*info,
        ring_res = RING_GET_RESPONSE(&info->ring, info->ring.rsp_prod_pvt);
        info->ring.rsp_prod_pvt++;
 
-       ring_res->rslt   = result;
+       ring_res->rslt   = scsiback_result(result);
        ring_res->rqid   = rqid;
 
        if (sense_buffer != NULL &&
@@ -555,7 +631,7 @@ static void scsiback_device_action(struct vscsibk_pend 
*pending_req,
        struct scsiback_nexus *nexus = tpg->tpg_nexus;
        struct se_cmd *se_cmd = &pending_req->se_cmd;
        u64 unpacked_lun = pending_req->v2p->lun;
-       int rc, err = FAILED;
+       int rc, err = XEN_VSCSIIF_RSLT_RESET_FAILED;
 
        init_completion(&pending_req->tmr_done);
 
@@ -569,7 +645,7 @@ static void scsiback_device_action(struct vscsibk_pend 
*pending_req,
        wait_for_completion(&pending_req->tmr_done);
 
        err = (se_cmd->se_tmr_req->response == TMR_FUNCTION_COMPLETE) ?
-               SUCCESS : FAILED;
+               XEN_VSCSIIF_RSLT_RESET_SUCCESS : XEN_VSCSIIF_RSLT_RESET_FAILED;
 
        scsiback_do_resp_with_sense(NULL, err, 0, pending_req);
        transport_generic_free_cmd(&pending_req->se_cmd, 0);
-- 
2.34.1




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.