@@ -57,14 +57,16 @@ static int bsg_transport_complete_rq(struct request *rq, struct sg_io_v4 *hdr)
{
struct bsg_job *job = blk_mq_rq_to_pdu(rq);
int ret = 0;
+ struct scsi_result sres = { 0 };
/*
* The assignments below don't make much sense, but are kept for
* bug by bug backwards compatibility:
*/
- hdr->device_status = job->result & 0xff;
- hdr->transport_status = host_byte(job->result);
- hdr->driver_status = driver_byte(job->result);
+ to_scsi_result(sres, job->result);
+ hdr->device_status = status_byte(sres);
+ hdr->transport_status = host_byte(sres);
+ hdr->driver_status = driver_byte(sres);
hdr->info = 0;
if (hdr->device_status || hdr->transport_status || hdr->driver_status)
hdr->info |= SG_INFO_CHECK;
@@ -162,14 +162,16 @@ static int bsg_scsi_fill_hdr(struct request *rq, struct sg_io_v4 *hdr,
static int bsg_scsi_complete_rq(struct request *rq, struct sg_io_v4 *hdr)
{
struct scsi_request *sreq = scsi_req(rq);
+ struct scsi_result scsi_res = { 0 };
int ret = 0;
/*
* fill in all the output members
*/
- hdr->device_status = sreq->result & 0xff;
- hdr->transport_status = host_byte(sreq->result);
- hdr->driver_status = driver_byte(sreq->result);
+ to_scsi_result(scsi_res, sreq->result);
+ hdr->device_status = status_byte(scsi_res);
+ hdr->transport_status = host_byte(scsi_res);
+ hdr->driver_status = driver_byte(scsi_res);
hdr->info = 0;
if (hdr->device_status || hdr->transport_status || hdr->driver_status)
hdr->info |= SG_INFO_CHECK;
@@ -257,16 +257,18 @@ static int blk_complete_sghdr_rq(struct request *rq, struct sg_io_hdr *hdr,
struct bio *bio)
{
struct scsi_request *req = scsi_req(rq);
+ struct scsi_result sres = { 0 };
int r, ret = 0;
/*
* fill in all the output members
*/
- hdr->status = req->result & 0xff;
- hdr->masked_status = status_byte(req->result);
- hdr->msg_status = msg_byte(req->result);
- hdr->host_status = host_byte(req->result);
- hdr->driver_status = driver_byte(req->result);
+ to_scsi_result(sres, req->result);
+ hdr->status = status_byte(sres);
+ hdr->masked_status = status_byte(sres) >> 1;
+ hdr->msg_status = msg_byte(sres);
+ hdr->host_status = host_byte(sres);
+ hdr->driver_status = driver_byte(sres);
hdr->info = 0;
if (hdr->masked_status || hdr->host_status || hdr->driver_status)
hdr->info |= SG_INFO_CHECK;
@@ -602,6 +602,7 @@ int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg)
int argsize = 0;
enum dma_data_direction data_dir;
struct scsi_sense_hdr sshdr;
+ struct scsi_result sres;
int cmd_result;
if (arg == NULL)
@@ -651,14 +652,15 @@ int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg)
from scsi_ioctl_send_command() for default case... */
cmd_result = scsi_execute(scsidev, scsi_cmd, data_dir, argbuf, argsize,
sensebuf, &sshdr, (10*HZ), 5, 0, 0, NULL);
+ to_scsi_result(sres, cmd_result); /* FIXME */
- if (driver_byte(cmd_result) == DRIVER_SENSE) {/* sense data available */
+ if (driver_byte(sres) == DRIVER_SENSE) {/* sense data available */
u8 *desc = sensebuf + 8;
cmd_result &= ~(0xFF<<24); /* DRIVER_SENSE is not an error */
/* If we set cc then ATA pass-through will cause a
* check condition even if no error. Filter that. */
- if (cmd_result & SAM_STAT_CHECK_CONDITION) {
+ if (status_byte(sres) == SAM_STAT_CHECK_CONDITION) {
if (sshdr.sense_key == RECOVERED_ERROR &&
sshdr.asc == 0 && sshdr.ascq == 0x1d)
cmd_result &= ~SAM_STAT_CHECK_CONDITION;
@@ -707,6 +709,7 @@ int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg)
u8 scsi_cmd[MAX_COMMAND_SIZE];
u8 args[7], *sensebuf = NULL;
struct scsi_sense_hdr sshdr;
+ struct scsi_result sres;
int cmd_result;
if (arg == NULL)
@@ -736,13 +739,14 @@ int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg)
cmd_result = scsi_execute(scsidev, scsi_cmd, DMA_NONE, NULL, 0,
sensebuf, &sshdr, (10*HZ), 5, 0, 0, NULL);
- if (driver_byte(cmd_result) == DRIVER_SENSE) {/* sense data available */
+ to_scsi_result(sres, cmd_result); /* FIXME */
+ if (driver_byte(sres) == DRIVER_SENSE) {/* sense data available */
u8 *desc = sensebuf + 8;
cmd_result &= ~(0xFF<<24); /* DRIVER_SENSE is not an error */
/* If we set cc then ATA pass-through will cause a
* check condition even if no error. Filter that. */
- if (cmd_result & SAM_STAT_CHECK_CONDITION) {
+ if (status_byte(sres) == SAM_STAT_CHECK_CONDITION) {
if (sshdr.sense_key == RECOVERED_ERROR &&
sshdr.asc == 0 && sshdr.ascq == 0x1d)
cmd_result &= ~SAM_STAT_CHECK_CONDITION;
@@ -1391,7 +1391,7 @@ static void complete_command_orb(struct sbp2_orb *base_orb,
sizeof(orb->request), DMA_TO_DEVICE);
sbp2_unmap_scatterlist(device->card->device, orb);
- orb->cmd->result = result;
+ to_scsi_result(orb->cmd->result, result);
orb->cmd->scsi_done(orb->cmd);
}
@@ -1323,7 +1323,7 @@ static void srp_finish_req(struct srp_rdma_ch *ch, struct srp_request *req,
if (scmnd) {
srp_free_req(ch, req, scmnd, 0);
- scmnd->result = result;
+ to_scsi_result(scmnd->result, result);
scmnd->scsi_done(scmnd);
}
}
@@ -2291,7 +2291,7 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd)
unsigned long flags;
u32 tag;
u16 idx;
- int len, ret;
+ int len, ret, scsi_res;
const bool in_scsi_eh = !in_interrupt() && current == shost->ehandler;
/*
@@ -2303,10 +2303,11 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd)
if (in_scsi_eh)
mutex_lock(&rport->mutex);
- scmnd->result = srp_chkready(target->rport);
- if (unlikely(scmnd->result))
+ scsi_res = srp_chkready(target->rport);
+ if (unlikely(scsi_res))
goto err;
+ to_scsi_result(scmnd->result, scsi_res);
WARN_ON_ONCE(scmnd->request->tag < 0);
tag = blk_mq_unique_tag(scmnd->request);
ch = &target->ch[blk_mq_unique_tag_to_hwq(tag)];
@@ -2387,7 +2388,7 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd)
req->scmnd = NULL;
err:
- if (scmnd->result) {
+ if (from_scsi_result(scmnd->result)) {
scmnd->scsi_done(scmnd);
ret = 0;
} else {
@@ -657,7 +657,7 @@ mptfc_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *SCpnt)
err = fc_remote_port_chkready(rport);
if (unlikely(err)) {
- SCpnt->result = err;
+ to_scsi_result(SCpnt->result, err);
SCpnt->scsi_done(SCpnt);
return 0;
}
@@ -543,7 +543,7 @@ mptscsih_info_scsiio(MPT_ADAPTER *ioc, struct scsi_cmnd *sc, SCSIIOReply_t * pSc
scsi_get_resid(sc));
printk(MYIOC_s_DEBUG_FMT "\ttag = %d, transfer_count = %d, "
"sc->result = %08X\n", ioc->name, le16_to_cpu(pScsiReply->TaskTag),
- le32_to_cpu(pScsiReply->TransferCount), sc->result);
+ le32_to_cpu(pScsiReply->TransferCount), from_scsi_result(sc->result));
printk(MYIOC_s_DEBUG_FMT "\tiocstatus = %s (0x%04x), "
"scsi_status = %s (0x%02x), scsi_state = (0x%02x)\n",
@@ -824,7 +824,8 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
set_scsi_result(sc, 0, DID_OK, 0, scsi_status);
dreplyprintk(ioc, printk(MYIOC_s_DEBUG_FMT
"RESIDUAL_MISMATCH: result=%x on channel=%d id=%d\n",
- ioc->name, sc->result, sc->device->channel, sc->device->id));
+ ioc->name, from_scsi_result(sc->result),
+ sc->device->channel, sc->device->id));
break;
case MPI_IOCSTATUS_SCSI_DATA_UNDERRUN: /* 0x0045 */
@@ -992,7 +993,7 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
* Not real sure here either so do nothing... */
}
- if (sc->result == MPI_SCSI_STATUS_TASK_SET_FULL)
+ if (status_byte(sc->result) == SAM_STAT_TASK_SET_FULL)
mptscsih_report_queue_full(sc, pScsiReply, pScsiReq);
/* Add handling of:
@@ -1025,7 +1026,8 @@ mptscsih_io_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr)
} /* switch(status) */
#ifdef CONFIG_FUSION_LOGGING
- if (sc->result && (ioc->debug_level & MPT_DEBUG_REPLY))
+ if (from_scsi_result(sc->result) != 0
+ && (ioc->debug_level & MPT_DEBUG_REPLY))
mptscsih_info_scsiio(ioc, sc, pScsiReply);
#endif
@@ -2828,8 +2828,8 @@ static void blogic_process_ccbs(struct blogic_adapter *adapter)
set_host_byte(command, DID_ABORT);
break;
case BLOGIC_CMD_COMPLETE_ERROR:
- command->result = blogic_resultcode(adapter,
- ccb->adapter_status, ccb->tgt_status);
+ to_scsi_result(command->result, blogic_resultcode(adapter,
+ ccb->adapter_status, ccb->tgt_status));
if (ccb->adapter_status != BLOGIC_SELECT_TIMEOUT) {
adapter->tgt_stats[ccb->tgt_id]
.cmds_complete++;
@@ -513,7 +513,7 @@ static void complete_cmd(struct Scsi_Host *instance,
if (hostdata->sensing == cmd) {
/* Autosense processing ends here */
- if ((cmd->result & 0xff) != SAM_STAT_GOOD) {
+ if (status_byte(cmd->result) != SAM_STAT_GOOD) {
scsi_eh_restore_cmnd(cmd, &hostdata->ses);
set_host_byte(cmd, DID_ERROR);
} else
@@ -1295,7 +1295,7 @@ static void done(struct Scsi_Host *shpnt, int error)
DONE_SC = CURRENT_SC;
CURRENT_SC = NULL;
- DONE_SC->result = error;
+ to_scsi_result(DONE_SC->result, error);
} else
printk(KERN_ERR "aha152x: done() called outside of command\n");
}
@@ -92,16 +92,16 @@ bfa_cb_ioim_done(void *drv, struct bfad_ioim_s *dio,
scsi_dma_unmap(cmnd);
cmnd->host_scribble = NULL;
- bfa_trc(bfad, cmnd->result);
+ bfa_trc(bfad, from_scsi_result(cmnd->result));
itnim_data = cmnd->device->hostdata;
if (itnim_data) {
itnim = itnim_data->itnim;
- if (!cmnd->result && itnim &&
+ if (from_scsi_result(cmnd->result) == 0 && itnim &&
(bfa_lun_queue_depth > cmnd->device->queue_depth)) {
/* Queue depth adjustment for good status completion */
bfad_ramp_up_qdepth(itnim, cmnd->device);
- } else if (cmnd->result == SAM_STAT_TASK_SET_FULL && itnim) {
+ } else if (status_byte(cmnd->result) == SAM_STAT_TASK_SET_FULL && itnim) {
/* qfull handling */
bfad_handle_qfull(itnim, cmnd->device);
}
@@ -150,7 +150,7 @@ bfa_cb_ioim_abort(void *drv, struct bfad_ioim_s *dio)
if (cmnd->device->host != NULL)
scsi_dma_unmap(cmnd);
- bfa_trc(bfad, cmnd->result);
+ bfa_trc(bfad, from_scsi_result(cmnd->result));
cmnd->host_scribble = NULL;
}
@@ -1228,7 +1228,7 @@ bfad_im_queuecommand_lck(struct scsi_cmnd *cmnd, void (*done) (struct scsi_cmnd
rc = fc_remote_port_chkready(rport);
if (rc) {
- cmnd->result = rc;
+ to_scsi_result(cmnd->result, rc);
done(cmnd);
return 0;
}
@@ -1824,7 +1824,7 @@ int bnx2fc_queuecommand(struct Scsi_Host *host,
rval = fc_remote_port_chkready(rport);
if (rval) {
- sc_cmd->result = rval;
+ to_scsi_result(sc_cmd->result, rval);
sc_cmd->scsi_done(sc_cmd);
return 0;
}
@@ -199,7 +199,7 @@ ch_do_scsi(scsi_changer *ch, unsigned char *cmd, int cmd_len,
buflength, &sshdr, timeout * HZ,
MAX_RETRIES, NULL);
- if (driver_byte(result) & DRIVER_SENSE) {
+ if ((result >> 24) == DRIVER_SENSE) {
if (debug)
scsi_print_sense_hdr(ch->device, ch->name, &sshdr);
errno = ch_find_errno(&sshdr);
@@ -413,7 +413,7 @@ static const char * const driverbyte_table[]={
const char *scsi_hostbyte_string(int result)
{
const char *hb_string = NULL;
- int hb = host_byte(result);
+ int hb = result >> 16;
if (hb < ARRAY_SIZE(hostbyte_table))
hb_string = hostbyte_table[hb];
@@ -424,7 +424,7 @@ EXPORT_SYMBOL(scsi_hostbyte_string);
const char *scsi_driverbyte_string(int result)
{
const char *db_string = NULL;
- int db = driver_byte(result);
+ int db = result >> 24;
if (db < ARRAY_SIZE(driverbyte_table))
db_string = driverbyte_table[db];
@@ -1793,7 +1793,7 @@ csio_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmnd)
nr = fc_remote_port_chkready(rport);
if (nr) {
- cmnd->result = nr;
+ to_scsi_result(cmnd->result, nr);
CSIO_INC_STATS(scsim, n_rn_nr_error);
goto err_done;
}
@@ -164,7 +164,6 @@
#define RES_TARGET 0x000000FF /* Target State */
#define RES_TARGET_LNX STATUS_MASK /* Only official ... */
#define RES_ENDMSG 0x0000FF00 /* End Message */
-#define RES_DID 0x00FF0000 /* DID_ codes */
#define RES_DRV 0xFF000000 /* DRIVER_ codes */
#define MK_RES(drv,did,msg,tgt) ((int)(drv)<<24 | (int)(did)<<16 | (int)(msg)<<8 | (int)(tgt))
@@ -3400,10 +3399,10 @@ static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
/*
* target status..........................
*/
- if (status_byte(status) == CHECK_CONDITION) {
+ if ((status & 0xff) == SAM_STAT_CHECK_CONDITION) {
request_sense(acb, dcb, srb);
return;
- } else if (status_byte(status) == QUEUE_FULL) {
+ } else if ((status & 0xff) == SAM_STAT_TASK_SET_FULL) {
tempcnt = (u8)list_size(&dcb->srb_going_list);
dprintkl(KERN_INFO, "QUEUE_FULL for dev <%02i-%i> with %i cmnds\n",
dcb->target_id, dcb->target_lun, tempcnt);
@@ -3464,7 +3463,7 @@ static void srb_done(struct AdapterCtlBlk *acb, struct DeviceCtlBlk *dcb,
base = scsi_kmap_atomic_sg(sg, scsi_sg_count(cmd), &offset, &len);
ptr = (struct ScsiInqData *)(base + offset);
- if (!ckc_only && (cmd->result & RES_DID) == 0
+ if (!ckc_only && host_byte(cmd->result) == DID_OK
&& cmd->cmnd[2] == 0 && scsi_bufflen(cmd) >= 8
&& dir != PCI_DMA_NONE && ptr && (ptr->Vers & 0x07) >= 2)
dcb->inquiry7 = ptr->Flags;
@@ -3537,7 +3536,7 @@ static void doing_srb_done(struct AdapterCtlBlk *acb, u8 did_flag,
srb_going_remove(dcb, srb);
free_tag(dcb, srb);
srb_free_insert(acb, srb);
- p->result = result;
+ to_scsi_result(p->result, result);
pci_unmap_srb_sense(acb, srb);
pci_unmap_srb(acb, srb);
if (force) {
@@ -3566,7 +3565,7 @@ static void doing_srb_done(struct AdapterCtlBlk *acb, u8 did_flag,
(u8)p->device->lun);
srb_waiting_remove(dcb, srb);
srb_free_insert(acb, srb);
- p->result = result;
+ to_scsi_result(p->result, result);
pci_unmap_srb_sense(acb, srb);
pci_unmap_srb(acb, srb);
if (force) {
@@ -544,6 +544,10 @@ static int alua_rtpg(struct scsi_device *sdev, struct alua_port_group *pg)
retval = submit_rtpg(sdev, buff, bufflen, &sense_hdr, pg->flags);
if (retval) {
+ struct scsi_result scsi_res;
+
+ to_scsi_result(scsi_res, retval);
+
/*
* Some (broken) implementations have a habit of returning
* an error during things like firmware update etc.
@@ -565,7 +569,7 @@ static int alua_rtpg(struct scsi_device *sdev, struct alua_port_group *pg)
"%s: rtpg failed, result %d\n",
ALUA_DH_NAME, retval);
kfree(buff);
- if (driver_byte(retval) == DRIVER_ERROR)
+ if ((retval >> 24) == DRIVER_ERROR)
return SCSI_DH_DEV_TEMP_BUSY;
return SCSI_DH_IO;
}
@@ -745,6 +749,7 @@ static unsigned alua_stpg(struct scsi_device *sdev, struct alua_port_group *pg)
{
int retval;
struct scsi_sense_hdr sense_hdr;
+ struct scsi_result scsi_result;
if (!(pg->tpgs & TPGS_MODE_EXPLICIT)) {
/* Only implicit ALUA supported, retry */
@@ -773,13 +778,14 @@ static unsigned alua_stpg(struct scsi_device *sdev, struct alua_port_group *pg)
return SCSI_DH_NOSYS;
}
retval = submit_stpg(sdev, pg->group_id, &sense_hdr);
+ to_scsi_result(scsi_result, retval);
if (retval) {
if (!scsi_sense_valid(&sense_hdr)) {
sdev_printk(KERN_INFO, sdev,
"%s: stpg failed, result %d",
ALUA_DH_NAME, retval);
- if (driver_byte(retval) == DRIVER_ERROR)
+ if (driver_byte(scsi_result) == DRIVER_ERROR)
return SCSI_DH_DEV_TEMP_BUSY;
} else {
sdev_printk(KERN_INFO, sdev, "%s: stpg failed\n",
@@ -2501,7 +2501,7 @@ static s32 adpt_i2o_to_scsi(void __iomem *reply, struct scsi_cmnd* cmd)
if(cmd->scsi_done != NULL){
cmd->scsi_done(cmd);
}
- return cmd->result;
+ return from_scsi_result(cmd->result);
}
@@ -894,7 +894,7 @@ static void esp_cmd_is_done(struct esp *esp, struct esp_cmd_entry *ent,
esp->active_cmd = NULL;
esp_unmap_dma(esp, cmd);
esp_free_lun_tag(ent, dev->hostdata);
- cmd->result = result;
+ to_scsi_result(cmd->result, result);
if (ent->eh_done) {
complete(ent->eh_done);
@@ -461,7 +461,7 @@ static int fnic_queuecommand_lck(struct scsi_cmnd *sc, void (*done)(struct scsi_
FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host,
"rport is not ready\n");
atomic64_inc(&fnic_stats->misc_stats.rport_not_ready);
- sc->result = ret;
+ to_scsi_result(sc->result, ret);
done(sc);
return 0;
}
@@ -2667,7 +2667,7 @@ static void complete_scsi_command(struct CommandList *cp)
"Returning result: 0x%x\n",
cp, ei->ScsiStatus,
sense_key, asc, ascq,
- cmd->result);
+ from_scsi_result(cmd->result));
} else { /* scsi status is zero??? How??? */
dev_warn(&h->pdev->dev, "cp %p SCSI status was 0. "
"Returning no connection.\n", cp),
@@ -1879,7 +1879,7 @@ int fc_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *sc_cmd)
rval = fc_remote_port_chkready(rport);
if (rval) {
- sc_cmd->result = rval;
+ to_scsi_result(sc_cmd->result, rval);
sc_cmd->scsi_done(sc_cmd);
return 0;
}
@@ -927,7 +927,7 @@ static void iscsi_scsi_cmd_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
}
out:
ISCSI_DBG_SESSION(session, "cmd rsp done [sc %p res %d itt 0x%x]\n",
- sc, sc->result, task->itt);
+ sc, from_scsi_result(sc->result), task->itt);
conn->scsirsp_pdus_cnt++;
iscsi_complete_task(task, ISCSI_TASK_COMPLETED);
}
@@ -966,7 +966,7 @@ iscsi_data_in_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
ISCSI_DBG_SESSION(conn->session, "data in with status done "
"[sc %p res %d itt 0x%x]\n",
- sc, sc->result, task->itt);
+ sc, from_scsi_result(sc->result), task->itt);
conn->scsirsp_pdus_cnt++;
iscsi_complete_task(task, ISCSI_TASK_COMPLETED);
}
@@ -1690,7 +1690,7 @@ int iscsi_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *sc)
reason = iscsi_session_chkready(cls_session);
if (reason) {
- sc->result = reason;
+ to_scsi_result(sc->result, reason);
goto fault;
}
@@ -36,6 +36,7 @@
#include <scsi/scsi_host.h>
#include <scsi/scsi_tcq.h>
#include <scsi/scsi_transport_fc.h>
+#include <scsi/scsi_proto.h>
#include "lpfc_version.h"
#include "lpfc_hw4.h"
@@ -211,7 +212,7 @@ lpfc_update_stats(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd)
unsigned long latency;
int i;
- if (cmd->result)
+ if (from_scsi_result(cmd->result))
return;
latency = jiffies_to_msecs((long)jiffies - (long)lpfc_cmd->start_time);
@@ -3586,22 +3587,22 @@ lpfc_send_scsi_error_event(struct lpfc_hba *phba, struct lpfc_vport *vport,
uint32_t fcpi_parm = rsp_iocb->iocb.un.fcpi.fcpi_parm;
struct lpfc_fast_path_event *fast_path_evt = NULL;
struct lpfc_nodelist *pnode = lpfc_cmd->rdata->pnode;
+ enum scsi_status_byte sb = status_byte(cmnd->result);
unsigned long flags;
if (!pnode || !NLP_CHK_NODE_ACT(pnode))
return;
/* If there is queuefull or busy condition send a scsi event */
- if ((cmnd->result == SAM_STAT_TASK_SET_FULL) ||
- (cmnd->result == SAM_STAT_BUSY)) {
+ if (sb == SAM_STAT_TASK_SET_FULL || sb == SAM_STAT_BUSY) {
fast_path_evt = lpfc_alloc_fast_evt(phba);
if (!fast_path_evt)
return;
fast_path_evt->un.scsi_evt.event_type =
FC_REG_SCSI_EVENT;
fast_path_evt->un.scsi_evt.subcategory =
- (cmnd->result == SAM_STAT_TASK_SET_FULL) ?
- LPFC_EVENT_QFULL : LPFC_EVENT_DEVBSY;
+ (sb == SAM_STAT_TASK_SET_FULL) ?
+ LPFC_EVENT_QFULL : LPFC_EVENT_DEVBSY;
fast_path_evt->un.scsi_evt.lun = cmnd->device->lun;
memcpy(&fast_path_evt->un.scsi_evt.wwpn,
&pnode->nlp_portname, sizeof(struct lpfc_name));
@@ -4113,15 +4114,15 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn,
} else
set_scsi_result(cmd, 0, DID_OK, 0, 0);
- if (cmd->result || lpfc_cmd->fcp_rsp->rspSnsLen) {
+ if (from_scsi_result(cmd->result) || lpfc_cmd->fcp_rsp->rspSnsLen) {
uint32_t *lp = (uint32_t *)cmd->sense_buffer;
lpfc_printf_vlog(vport, KERN_INFO, LOG_FCP,
"0710 Iodone <%d/%llu> cmd %p, error "
"x%x SNS x%x x%x Data: x%x x%x\n",
cmd->device->id, cmd->device->lun, cmd,
- cmd->result, *lp, *(lp + 3), cmd->retries,
- scsi_get_resid(cmd));
+ from_scsi_result(cmd->result), *lp, *(lp + 3),
+ cmd->retries, scsi_get_resid(cmd));
}
lpfc_update_stats(phba, lpfc_cmd);
@@ -4547,7 +4548,7 @@ lpfc_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *cmnd)
rdata = lpfc_rport_data_from_scsi_device(cmnd->device);
err = fc_remote_port_chkready(rport);
if (err) {
- cmnd->result = err;
+ to_scsi_result(cmnd->result, err);
goto out_fail_command;
}
ndlp = rdata->pnode;
@@ -4580,9 +4580,9 @@ int megasas_reset_fusion(struct Scsi_Host *shost, int reason)
scsi_print_command(cmd_fusion->scmd);
}
- scmd_local->result =
- megasas_check_mpio_paths(instance,
- scmd_local);
+ to_scsi_result(scmd_local->result,
+ megasas_check_mpio_paths(instance,
+ scmd_local));
if (instance->ldio_threshold &&
megasas_cmd_type(scmd_local) == READ_WRITE_LDIO)
atomic_dec(&instance->ldio_outstanding);
@@ -4973,7 +4973,8 @@ _scsih_scsi_ioc_info(struct MPT3SAS_ADAPTER *ioc, struct scsi_cmnd *scmd,
pr_warn(MPT3SAS_FMT
"\ttag(%d), transfer_count(%d), sc->result(0x%08x)\n",
ioc->name, le16_to_cpu(mpi_reply->TaskTag),
- le32_to_cpu(mpi_reply->TransferCount), scmd->result);
+ le32_to_cpu(mpi_reply->TransferCount),
+ from_scsi_result(scmd->result));
pr_warn(MPT3SAS_FMT
"\tscsi_status(%s)(0x%02x), scsi_state(%s)(0x%02x)\n",
ioc->name, desc_scsi_status,
@@ -5429,7 +5430,8 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)
}
- if (scmd->result && (ioc->logging_level & MPT_DEBUG_REPLY))
+ if (from_scsi_result(scmd->result) &&
+ (ioc->logging_level & MPT_DEBUG_REPLY))
_scsih_scsi_ioc_info(ioc , scmd, mpi_reply, smid);
out:
@@ -284,8 +284,7 @@ static int osst_chk_result(struct osst_tape * STp, struct osst_request * SRpnt)
printk(KERN_WARNING
"%s:W: Warning %x (driver bt 0x%x, host bt 0x%x).\n",
- name, result, driver_byte(result),
- host_byte(result));
+ name, result, result >> 24, result >> 16);
if (notyetprinted) {
notyetprinted = 0;
printk(KERN_INFO
@@ -2045,7 +2045,7 @@ static void pmcraid_fail_outstanding_cmds(struct pmcraid_instance *pinstance)
pmcraid_info("failing(%d) CDB[0] = %x result: %x\n",
le32_to_cpu(resp) >> 2,
cmd->ioa_cb->ioarcb.cdb[0],
- scsi_cmd->result);
+ from_scsi_result(scsi_cmd->result));
scsi_cmd->scsi_done(scsi_cmd);
} else if (cmd->cmd_done == pmcraid_internal_done ||
cmd->cmd_done == pmcraid_erp_done) {
@@ -2838,7 +2838,7 @@ static int _pmcraid_io_done(struct pmcraid_cmd *cmd, int reslen, int ioasc)
pmcraid_info("response(%d) CDB[0] = %x ioasc:result: %x:%x\n",
le32_to_cpu(cmd->ioa_cb->ioarcb.response_handle) >> 2,
cmd->ioa_cb->ioarcb.cdb[0],
- ioasc, scsi_cmd->result);
+ ioasc, from_scsi_result(scsi_cmd->result));
if (PMCRAID_IOASC_SENSE_KEY(ioasc) != 0)
rc = pmcraid_error_handler(cmd);
@@ -814,7 +814,7 @@ static void qedf_trace_io(struct qedf_rport *fcport, struct qedf_ioreq *io_req,
io_log->lba[3] = sc_cmd->cmnd[5];
io_log->bufflen = scsi_bufflen(sc_cmd);
io_log->sg_count = scsi_sg_count(sc_cmd);
- io_log->result = sc_cmd->result;
+ io_log->result = from_scsi_result(sc_cmd->result);
io_log->jiffies = jiffies;
io_log->refcount = kref_read(&io_req->refcount);
@@ -934,7 +934,7 @@ qedf_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *sc_cmd)
rval = fc_remote_port_chkready(rport);
if (rval) {
- sc_cmd->result = rval;
+ to_scsi_result(sc_cmd->result, rval);
sc_cmd->scsi_done(sc_cmd);
return 0;
}
@@ -1262,8 +1262,8 @@ void qedf_scsi_done(struct qedf_ctx *qedf, struct qedf_ioreq *io_req,
"sc_cmd=%p result=0x%08x op=0x%02x lba=0x%02x%02x%02x%02x, "
"allowed=%d retries=%d refcount=%d.\n",
qedf->lport->host->host_no, sc_cmd->device->id,
- sc_cmd->device->lun, sc_cmd, sc_cmd->result, sc_cmd->cmnd[0],
- sc_cmd->cmnd[2], sc_cmd->cmnd[3], sc_cmd->cmnd[4],
+ sc_cmd->device->lun, sc_cmd, from_scsi_result(sc_cmd->result),
+ sc_cmd->cmnd[0], sc_cmd->cmnd[2], sc_cmd->cmnd[3], sc_cmd->cmnd[4],
sc_cmd->cmnd[5], sc_cmd->allowed, sc_cmd->retries,
refcount);
@@ -2014,7 +2014,7 @@ void qedi_trace_io(struct qedi_ctx *qedi, struct iscsi_task *task,
io_log->cached_sge = qedi->use_cached_sge;
io_log->slow_sge = qedi->use_slow_sge;
io_log->fast_sge = qedi->use_fast_sge;
- io_log->result = sc_cmd->result;
+ io_log->result = from_scsi_result(sc_cmd->result);
io_log->jiffies = jiffies;
io_log->blk_req_cpu = smp_processor_id();
@@ -1286,7 +1286,7 @@ qla1280_done(struct scsi_qla_host *ha)
target = SCSI_TCN_32(cmd);
lun = SCSI_LUN_32(cmd);
- switch ((CMD_RESULT(cmd) >> 16)) {
+ switch ((host_byte(cmd->result))) {
case DID_RESET:
/* Issue marker command. */
if (!ha->flags.abort_isp_active)
@@ -3711,7 +3711,7 @@ qla1280_status_entry(struct scsi_qla_host *ha, struct response *pkt,
} else {
/* Save ISP completion status */
- CMD_RESULT(cmd) = qla1280_return_status(pkt, cmd);
+ to_scsi_result(cmd->result, qla1280_return_status(pkt, cmd));
if (scsi_status & SAM_STAT_CHECK_CONDITION) {
if (comp_status != CS_ARS_FAILED) {
@@ -2054,7 +2054,7 @@ qla2x00_handle_sense(srb_t *sp, uint8_t *sense_data, uint32_t par_sense_len,
if (track_sense_len != 0) {
rsp->status_srb = sp;
- cp->result = res;
+ to_scsi_result(cp->result, res);
}
if (sense_len) {
@@ -2695,7 +2695,7 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)
case CS_DIF_ERROR:
logit = qla2x00_handle_dif_error(sp, sts24);
- res = cp->result;
+ res = from_scsi_result(cp->result);
break;
case CS_TRANSPORT:
@@ -2785,7 +2785,7 @@ qla2x00_status_cont_entry(struct rsp_que *rsp, sts_cont_entry_t *pkt)
/* Place command on done queue. */
if (sense_len == 0) {
rsp->status_srb = NULL;
- sp->done(sp, cp->result);
+ sp->done(sp, from_scsi_result(cp->result));
}
}
@@ -2158,7 +2158,7 @@ qlafx00_handle_sense(srb_t *sp, uint8_t *sense_data, uint32_t par_sense_len,
sense_len, par_sense_len, track_sense_len);
if (GET_FW_SENSE_LEN(sp) > 0) {
rsp->status_srb = sp;
- cp->result = res;
+ to_scsi_result(cp->result, res);
}
if (sense_len) {
@@ -2616,7 +2616,7 @@ qlafx00_status_cont_entry(struct rsp_que *rsp, sts_cont_entry_t *pkt)
/* Place command on done queue. */
if (sense_len == 0) {
rsp->status_srb = NULL;
- sp->done(sp, cp->result);
+ sp->done(sp, from_scsi_result(cp->result));
}
}
@@ -740,7 +740,7 @@ qla2x00_sp_compl(void *ptr, int res)
srb_t *sp = ptr;
struct scsi_cmnd *cmd = GET_CMD_SP(sp);
- cmd->result = res;
+ to_scsi_result(cmd->result, res);
if (atomic_read(&sp->ref_count) == 0) {
ql_dbg(ql_dbg_io, sp->vha, 0x3015,
@@ -812,7 +812,7 @@ qla2xxx_qpair_sp_compl(void *ptr, int res)
srb_t *sp = ptr;
struct scsi_cmnd *cmd = GET_CMD_SP(sp);
- cmd->result = res;
+ to_scsi_result(cmd->result, res);
if (atomic_read(&sp->ref_count) == 0) {
ql_dbg(ql_dbg_io, sp->fcport->vha, 0x3079,
@@ -883,7 +883,7 @@ qla2xxx_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
rval = fc_remote_port_chkready(rport);
if (rval) {
- cmd->result = rval;
+ to_scsi_result(cmd->result, rval);
ql_dbg(ql_dbg_io + ql_dbg_verbose, vha, 0x3003,
"fc_remote_port_chkready failed for cmd=%p, rval=0x%x.\n",
cmd, rval);
@@ -981,7 +981,7 @@ qla2xxx_mqueuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd,
rval = fc_remote_port_chkready(rport);
if (rval) {
- cmd->result = rval;
+ to_scsi_result(cmd->result, rval);
ql_dbg(ql_dbg_io + ql_dbg_verbose, vha, 0x3076,
"fc_remote_port_chkready failed for cmd=%p, rval=0x%x.\n",
cmd, rval);
@@ -4097,7 +4097,7 @@ static int qla4xxx_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
rval = iscsi_session_chkready(sess);
if (rval) {
- cmd->result = rval;
+ to_scsi_result(cmd->result, rval);
goto qc_fail_command;
}
@@ -4788,7 +4788,7 @@ static void qla4xxx_abort_active_cmds(struct scsi_qla_host *ha, int res)
for (i = 0; i < ha->host->can_queue; i++) {
srb = qla4xxx_del_from_active_array(ha, i);
if (srb != NULL) {
- srb->cmd->result = res;
+ to_scsi_result(srb->cmd->result, res);
kref_put(&srb->srb_ref, qla4xxx_srb_compl);
}
}
@@ -9287,7 +9287,8 @@ static int qla4xxx_eh_device_reset(struct scsi_cmnd *cmd)
"scsi%ld: DEVICE_RESET cmd=%p jiffies = 0x%lx, to=%x,"
"dpc_flags=%lx, status=%x allowed=%d\n", ha->host_no,
cmd, jiffies, cmd->request->timeout / HZ,
- ha->dpc_flags, cmd->result, cmd->allowed));
+ ha->dpc_flags, from_scsi_result(cmd->result),
+ cmd->allowed));
rval = qla4xxx_isp_check_reg(ha);
if (rval != QLA_SUCCESS) {
@@ -9354,7 +9355,8 @@ static int qla4xxx_eh_target_reset(struct scsi_cmnd *cmd)
"scsi%ld: TARGET_DEVICE_RESET cmd=%p jiffies = 0x%lx, "
"to=%x,dpc_flags=%lx, status=%x allowed=%d\n",
ha->host_no, cmd, jiffies, cmd->request->timeout / HZ,
- ha->dpc_flags, cmd->result, cmd->allowed));
+ ha->dpc_flags, from_scsi_result(cmd->result),
+ cmd->allowed));
rval = qla4xxx_isp_check_reg(ha);
if (rval != QLA_SUCCESS) {
@@ -415,7 +415,7 @@ static void ql_ihandl(void *dev_id)
return;
}
icmd = priv->qlcmd;
- icmd->result = ql_pcmd(icmd);
+ to_scsi_result(icmd->result, ql_pcmd(icmd));
priv->qlcmd = NULL;
/*
* If result is CHECK CONDITION done calls qcommand to request
@@ -158,7 +158,8 @@ void scsi_log_completion(struct scsi_cmnd *cmd, int disposition)
if (unlikely(scsi_logging_level)) {
level = SCSI_LOG_LEVEL(SCSI_LOG_MLCOMPLETE_SHIFT,
SCSI_LOG_MLCOMPLETE_BITS);
- if (((level > 0) && (cmd->result || disposition != SUCCESS)) ||
+ if (((level > 0) && (from_scsi_result(cmd->result) ||
+ disposition != SUCCESS)) ||
(level > 1)) {
scsi_print_result(cmd, "Done", disposition);
scsi_print_command(cmd);
@@ -228,7 +229,7 @@ void scsi_finish_command(struct scsi_cmnd *cmd)
SCSI_LOG_MLCOMPLETE(4, sdev_printk(KERN_INFO, sdev,
"Notifying upper driver of completion "
- "(result %x)\n", cmd->result));
+ "(result %x)\n", from_scsi_result(cmd->result)));
good_bytes = scsi_bufflen(cmd);
if (!blk_rq_is_passthrough(cmd->request)) {
@@ -4398,7 +4398,10 @@ static int schedule_resp(struct scsi_cmnd *cmnd, struct sdebug_dev_info *devip,
return SCSI_MLQUEUE_HOST_BUSY;
}
- cmnd->result = pfp != NULL ? pfp(cmnd, devip) : 0;
+ if (pfp != NULL)
+ to_scsi_result(cmnd->result, pfp(cmnd, devip));
+ else
+ clear_scsi_result(cmnd);
if (cmnd->result & SDEG_RES_IMMED_MASK) {
/*
* This is the F_DELAY_OVERR case. No delay.
@@ -4406,12 +4409,12 @@ static int schedule_resp(struct scsi_cmnd *cmnd, struct sdebug_dev_info *devip,
cmnd->result &= ~SDEG_RES_IMMED_MASK;
delta_jiff = ndelay = 0;
}
- if (cmnd->result == 0 && scsi_result != 0)
- cmnd->result = scsi_result;
+ if (from_scsi_result(cmnd->result) == 0 && scsi_result != 0)
+ to_scsi_result(cmnd->result, scsi_result);
- if (unlikely(sdebug_verbose && cmnd->result))
+ if (unlikely(sdebug_verbose && from_scsi_result(cmnd->result)))
sdev_printk(KERN_INFO, sdp, "%s: non-zero result=0x%x\n",
- __func__, cmnd->result);
+ __func__, from_scsi_result(cmnd->result));
if (delta_jiff > 0 || ndelay > 0) {
ktime_t kt;
@@ -4455,10 +4458,14 @@ static int schedule_resp(struct scsi_cmnd *cmnd, struct sdebug_dev_info *devip,
return 0;
respond_in_thread: /* call back to mid-layer using invocation thread */
- cmnd->result = pfp != NULL ? pfp(cmnd, devip) : 0;
+ if (pfp != NULL)
+ to_scsi_result(cmnd->result, pfp(cmnd, devip));
+ else
+ clear_scsi_result(cmnd);
+
cmnd->result &= ~SDEG_RES_IMMED_MASK;
- if (cmnd->result == 0 && scsi_result != 0)
- cmnd->result = scsi_result;
+ if (from_scsi_result(cmnd->result) == 0 && scsi_result != 0)
+ to_scsi_result(cmnd->result, scsi_result);
cmnd->scsi_done(cmnd);
return 0;
}
@@ -43,7 +43,7 @@ void scsi_show_rq(struct seq_file *m, struct request *rq)
if (cdb)
__scsi_format_command(buf, sizeof(buf), cdb, cmd->cmd_len);
seq_printf(m, ", .cmd=%s, .retries=%d, .result = %#x, .flags=", buf,
- cmd->retries, cmd->result);
+ cmd->retries, from_scsi_result(cmd->result));
scsi_flags_show(m, cmd->flags, scsi_cmd_flags,
ARRAY_SIZE(scsi_cmd_flags));
seq_printf(m, ", .timeout=%d.%03d, allocated %d.%03d s ago",
@@ -754,7 +754,7 @@ static void scsi_eh_done(struct scsi_cmnd *scmd)
struct completion *eh_action;
SCSI_LOG_ERROR_RECOVERY(3, scmd_printk(KERN_INFO, scmd,
- "%s result: %x\n", __func__, scmd->result));
+ "%s result: %x\n", __func__, from_scsi_result(scmd->result)));
eh_action = scmd->device->host->eh_action;
if (eh_action)
@@ -948,7 +948,7 @@ void scsi_eh_prep_cmnd(struct scsi_cmnd *scmd, struct scsi_eh_save *ses,
ses->data_direction = scmd->sc_data_direction;
ses->sdb = scmd->sdb;
ses->next_rq = scmd->request->next_rq;
- ses->result = scmd->result;
+ ses->result = from_scsi_result(scmd->result);
ses->underflow = scmd->underflow;
ses->prot_op = scmd->prot_op;
ses->eh_eflags = scmd->eh_eflags;
@@ -1012,7 +1012,7 @@ void scsi_eh_restore_cmnd(struct scsi_cmnd* scmd, struct scsi_eh_save *ses)
scmd->sc_data_direction = ses->data_direction;
scmd->sdb = ses->sdb;
scmd->request->next_rq = ses->next_rq;
- scmd->result = ses->result;
+ to_scsi_result(scmd->result, ses->result);
scmd->underflow = ses->underflow;
scmd->prot_op = ses->prot_op;
scmd->eh_eflags = ses->eh_eflags;
@@ -1213,7 +1213,7 @@ int scsi_eh_get_sense(struct list_head *work_q,
continue;
SCSI_LOG_ERROR_RECOVERY(3, scmd_printk(KERN_INFO, scmd,
- "sense requested, result %x\n", scmd->result));
+ "sense requested, result %x\n", from_scsi_result(scmd->result)));
SCSI_LOG_ERROR_RECOVERY(3, scsi_print_sense(scmd));
rtn = scsi_decide_disposition(scmd);
@@ -1757,7 +1757,7 @@ int scsi_decide_disposition(struct scsi_cmnd *scmd)
* nuke this special code so that it looks like we are saying
* did_ok.
*/
- scmd->result &= 0xff00ffff;
+ set_host_byte(scmd, DID_OK);
return SUCCESS;
case DID_OK:
/*
@@ -2067,7 +2067,7 @@ void scsi_eh_flush_done_q(struct list_head *done_q)
* scsi_eh_get_sense), scmd->result is already
* set, do not set DRIVER_TIMEOUT.
*/
- if (!scmd->result)
+ if (!from_scsi_result(scmd->result))
set_driver_byte(scmd, DRIVER_TIMEOUT);
SCSI_LOG_ERROR_RECOVERY(3,
scmd_printk(KERN_INFO, scmd,
@@ -100,7 +100,7 @@ static int ioctl_internal_command(struct scsi_device *sdev, char *cmd,
SCSI_LOG_IOCTL(2, sdev_printk(KERN_INFO, sdev,
"Ioctl returned 0x%x\n", result));
- if ((driver_byte(result) & DRIVER_SENSE) &&
+ if (((result >> 24) == DRIVER_SENSE) &&
(scsi_sense_valid(&sshdr))) {
switch (sshdr.sense_key) {
case ILLEGAL_REQUEST:
@@ -732,7 +732,10 @@ static bool scsi_end_request(struct request *req, blk_status_t error,
*/
static blk_status_t scsi_result_to_blk_status(struct scsi_cmnd *cmd, int result)
{
- switch (host_byte(result)) {
+ struct scsi_result scsi_result = { 0 };
+
+ to_scsi_result(scsi_result, result);
+ switch (host_byte(scsi_result)) {
case DID_OK:
/*
* Also check the other bytes than the status byte in result
@@ -791,7 +794,7 @@ static blk_status_t scsi_result_to_blk_status(struct scsi_cmnd *cmd, int result)
*/
void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
{
- int result = cmd->result;
+ int result = from_scsi_result(cmd->result);
struct request_queue *q = cmd->device->request_queue;
struct request *req = cmd->request;
blk_status_t error = BLK_STS_OK;
@@ -824,7 +827,7 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
/*
* scsi_result_to_blk_status may have reset the host_byte
*/
- scsi_req(req)->result = cmd->result;
+ scsi_req(req)->result = result;
scsi_req(req)->resid_len = scsi_get_resid(cmd);
if (scsi_bidi_cmnd(cmd)) {
@@ -884,7 +887,7 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
* if it can't fit). Treat SAM_STAT_CONDITION_MET and the related
* intermediate statuses (both obsolete in SAM-4) as good.
*/
- if (status_byte(result) && scsi_status_is_good(result)) {
+ if (status_byte(cmd->result) && scsi_status_is_good(result)) {
result = 0;
error = BLK_STS_OK;
}
@@ -916,7 +919,7 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
error = scsi_result_to_blk_status(cmd, result);
- if (host_byte(result) == DID_RESET) {
+ if (host_byte(cmd->result) == DID_RESET) {
/* Third party bus reset or reset for error recovery
* reasons. Just retry the command and see what
* happens.
@@ -1027,7 +1030,7 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
*/
if (!level && __ratelimit(&_rs)) {
scsi_print_result(cmd, NULL, FAILED);
- if (driver_byte(result) & DRIVER_SENSE)
+ if (driver_byte(cmd->result) & DRIVER_SENSE)
scsi_print_sense(cmd);
scsi_print_command(cmd);
}
@@ -1665,7 +1668,7 @@ static void scsi_softirq_done(struct request *rq)
INIT_LIST_HEAD(&cmd->eh_entry);
atomic_inc(&cmd->device->iodone_cnt);
- if (cmd->result)
+ if (from_scsi_result(cmd->result))
atomic_inc(&cmd->device->ioerr_cnt);
disposition = scsi_decide_disposition(cmd);
@@ -2575,7 +2578,7 @@ scsi_mode_sense(struct scsi_device *sdev, int dbd, int modepage,
* ILLEGAL REQUEST if the code page isn't supported */
if (use_10_for_ms && !scsi_status_is_good(result) &&
- (driver_byte(result) & DRIVER_SENSE)) {
+ ((result >> 24) == DRIVER_SENSE)) {
if (scsi_sense_valid(sshdr)) {
if ((sshdr->sense_key == ILLEGAL_REQUEST) &&
(sshdr->asc == 0x20) && (sshdr->ascq == 0)) {
@@ -2612,7 +2615,7 @@ scsi_mode_sense(struct scsi_device *sdev, int dbd, int modepage,
data->block_descriptor_length = buffer[3];
}
data->header_length = header_length;
- } else if ((status_byte(result) == CHECK_CONDITION) &&
+ } else if (((result & 0xff) == SAM_STAT_CHECK_CONDITION) &&
scsi_sense_valid(sshdr) &&
sshdr->sense_key == UNIT_ATTENTION && retry_count) {
retry_count--;
@@ -431,8 +431,9 @@ void scsi_print_result(const struct scsi_cmnd *cmd, const char *msg,
char *logbuf;
size_t off, logbuf_len;
const char *mlret_string = scsi_mlreturn_string(disposition);
- const char *hb_string = scsi_hostbyte_string(cmd->result);
- const char *db_string = scsi_driverbyte_string(cmd->result);
+ int result = from_scsi_result(cmd->result);
+ const char *hb_string = scsi_hostbyte_string(result);
+ const char *db_string = scsi_driverbyte_string(result);
logbuf = scsi_log_reserve_buffer(&logbuf_len);
if (!logbuf)
@@ -614,7 +614,7 @@ static int scsi_probe_lun(struct scsi_device *sdev, unsigned char *inq_result,
* INQUIRY should not yield UNIT_ATTENTION
* but many buggy devices do so anyway.
*/
- if ((driver_byte(result) & DRIVER_SENSE) &&
+ if (((result >> 24) == DRIVER_SENSE) &&
scsi_sense_valid(&sshdr)) {
if ((sshdr.sense_key == UNIT_ATTENTION) &&
((sshdr.asc == 0x28) ||
@@ -136,7 +136,7 @@ static int spi_execute(struct scsi_device *sdev, const void *cmd,
REQ_FAILFAST_TRANSPORT |
REQ_FAILFAST_DRIVER,
0, NULL);
- if (!(driver_byte(result) & DRIVER_SENSE) ||
+ if (!((result >> 24) == DRIVER_SENSE) ||
sshdr->sense_key != UNIT_ATTENTION)
break;
}
@@ -1574,7 +1574,7 @@ static unsigned int sd_check_events(struct gendisk *disk, unsigned int clearing)
&sshdr);
/* failed to execute TUR, assume media not present */
- if (host_byte(retval)) {
+ if (retval >> 16) {
set_media_not_present(sdkp);
goto out;
}
@@ -1635,7 +1635,7 @@ static int sd_sync_cache(struct scsi_disk *sdkp, struct scsi_sense_hdr *sshdr)
if (res) {
sd_print_result(sdkp, "Synchronize Cache(10) failed", res);
- if (driver_byte(res) & DRIVER_SENSE)
+ if ((res >> 24) == DRIVER_SENSE)
sd_print_sense_hdr(sdkp, sshdr);
/* we need to evaluate the error return */
@@ -1645,7 +1645,7 @@ static int sd_sync_cache(struct scsi_disk *sdkp, struct scsi_sense_hdr *sshdr)
/* this is no error here */
return 0;
- switch (host_byte(res)) {
+ switch (res >> 16) {
/* ignore errors due to racing a disconnection */
case DID_BAD_TARGET:
case DID_NO_CONNECT:
@@ -1737,7 +1737,7 @@ static int sd_pr_command(struct block_device *bdev, u8 sa,
result = scsi_execute_req(sdev, cmd, DMA_TO_DEVICE, &data, sizeof(data),
&sshdr, SD_TIMEOUT, SD_MAX_RETRIES, NULL);
- if ((driver_byte(result) & DRIVER_SENSE) &&
+ if (((result >> 24) == DRIVER_SENSE) &&
(scsi_sense_valid(&sshdr))) {
sdev_printk(KERN_INFO, sdev, "PR command failed: %d\n", result);
scsi_print_sense_hdr(sdev, NULL, &sshdr);
@@ -1929,7 +1929,7 @@ static unsigned int sd_completed_bytes(struct scsi_cmnd *scmd)
**/
static int sd_done(struct scsi_cmnd *SCpnt)
{
- int result = SCpnt->result;
+ int result = from_scsi_result(SCpnt->result);
unsigned int good_bytes = result ? 0 : scsi_bufflen(SCpnt);
unsigned int sector_size = SCpnt->device->sector_size;
unsigned int resid;
@@ -1986,7 +1986,7 @@ static int sd_done(struct scsi_cmnd *SCpnt)
}
sdkp->medium_access_timed_out = 0;
- if (driver_byte(result) != DRIVER_SENSE &&
+ if ((result >> 24) != DRIVER_SENSE &&
(!sense_valid || sense_deferred))
goto out;
@@ -2095,10 +2095,10 @@ sd_spinup_disk(struct scsi_disk *sdkp)
retries++;
} while (retries < 3 &&
(!scsi_status_is_good(the_result) ||
- ((driver_byte(the_result) & DRIVER_SENSE) &&
+ (((the_result >> 24) & DRIVER_SENSE) &&
sense_valid && sshdr.sense_key == UNIT_ATTENTION)));
- if ((driver_byte(the_result) & DRIVER_SENSE) == 0) {
+ if (((the_result >> 24) & DRIVER_SENSE) == 0) {
/* no sense, TUR either succeeded or failed
* with a status error */
if(!spintime && !scsi_status_is_good(the_result)) {
@@ -2222,7 +2222,7 @@ static void read_capacity_error(struct scsi_disk *sdkp, struct scsi_device *sdp,
struct scsi_sense_hdr *sshdr, int sense_valid,
int the_result)
{
- if (driver_byte(the_result) & DRIVER_SENSE)
+ if ((the_result >> 24) & DRIVER_SENSE)
sd_print_sense_hdr(sdkp, sshdr);
else
sd_printk(KERN_NOTICE, sdkp, "Sense not available.\n");
@@ -3488,7 +3488,7 @@ static int sd_start_stop_device(struct scsi_disk *sdkp, int start)
SD_TIMEOUT, SD_MAX_RETRIES, 0, RQF_PM, NULL);
if (res) {
sd_print_result(sdkp, "Start/Stop Unit failed", res);
- if (driver_byte(res) & DRIVER_SENSE)
+ if ((res >> 24) & DRIVER_SENSE)
sd_print_sense_hdr(sdkp, &sshdr);
if (scsi_sense_valid(&sshdr) &&
/* 0x3a is medium not present */
@@ -3708,6 +3708,6 @@ static void sd_print_result(const struct scsi_disk *sdkp, const char *msg,
else
sd_printk(KERN_INFO, sdkp,
"%s: Result: hostbyte=0x%02x driverbyte=0x%02x\n",
- msg, host_byte(result), driver_byte(result));
+ msg, result >> 16, result >> 24);
}
@@ -94,7 +94,7 @@ static int sd_zbc_report_zones(struct scsi_disk *sdkp, unsigned char *buf,
sd_printk(KERN_ERR, sdkp,
"REPORT ZONES lba %llu failed with %d/%d\n",
(unsigned long long)lba,
- host_byte(result), driver_byte(result));
+ result >> 16, result >> 24);
return -EIO;
}
@@ -279,7 +279,7 @@ int sd_zbc_setup_reset_cmnd(struct scsi_cmnd *cmd)
void sd_zbc_complete(struct scsi_cmnd *cmd, unsigned int good_bytes,
struct scsi_sense_hdr *sshdr)
{
- int result = cmd->result;
+ int result = from_scsi_result(cmd->result);
struct request *rq = cmd->request;
switch (req_op(rq)) {
@@ -1327,10 +1327,10 @@ sg_rq_end_io(struct request *rq, blk_status_t status)
struct scsi_sense_hdr sshdr;
srp->header.status = 0xff & result;
- srp->header.masked_status = status_byte(result);
- srp->header.msg_status = msg_byte(result);
- srp->header.host_status = host_byte(result);
- srp->header.driver_status = driver_byte(result);
+ srp->header.masked_status = result >> 1;
+ srp->header.msg_status = result >> 8;
+ srp->header.host_status = result >> 16;
+ srp->header.driver_status = result >> 24;
if ((sdp->sgdebug > 0) &&
((CHECK_CONDITION == srp->header.masked_status) ||
(COMMAND_TERMINATED == srp->header.masked_status)))
@@ -1338,7 +1338,7 @@ sg_rq_end_io(struct request *rq, blk_status_t status)
SCSI_SENSE_BUFFERSIZE);
/* Following if statement is a patch supplied by Eric Youngdale */
- if (driver_byte(result) != 0
+ if ((result >> 24) != 0
&& scsi_normalize_sense(sense, SCSI_SENSE_BUFFERSIZE, &sshdr)
&& !scsi_sense_is_deferred(&sshdr)
&& sshdr.sense_key == UNIT_ATTENTION
@@ -342,7 +342,7 @@ snic_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *sc)
if (ret) {
SNIC_HOST_ERR(shost, "Tgt %p id %d Not Ready.\n", tgt, tgt->id);
atomic64_inc(&snic->s_stats.misc.tgt_not_rdy);
- sc->result = ret;
+ to_scsi_result(sc->result, ret);
sc->scsi_done(sc);
return 0;
@@ -317,7 +317,7 @@ static unsigned int sr_check_events(struct cdrom_device_info *cdi,
*/
static int sr_done(struct scsi_cmnd *SCpnt)
{
- int result = SCpnt->result;
+ int result = from_scsi_result(SCpnt->result);
int this_count = scsi_bufflen(SCpnt);
int good_bytes = (result == 0 ? this_count : 0);
int block_sectors = 0;
@@ -334,7 +334,7 @@ static int sr_done(struct scsi_cmnd *SCpnt)
* care is taken to avoid unnecessary additional work such as
* memcpy's that could be avoided.
*/
- if (driver_byte(result) != 0 && /* An error occurred */
+ if ((result >> 24) != 0 && /* An error occurred */
(SCpnt->sense_buffer[0] & 0x7f) == 0x70) { /* Sense current */
switch (SCpnt->sense_buffer[2]) {
case MEDIUM_ERROR:
@@ -203,7 +203,7 @@ int sr_do_ioctl(Scsi_CD *cd, struct packet_command *cgc)
cgc->timeout, IOCTL_RETRIES, 0, 0, NULL);
/* Minimal error checking. Ignore cases we know about, and report the rest. */
- if (driver_byte(result) != 0) {
+ if ((result >> 24) != 0) {
switch (sshdr.sense_key) {
case UNIT_ATTENTION:
SDev->changed = 1;
@@ -387,7 +387,7 @@ static int st_chk_result(struct scsi_tape *STp, struct st_request * SRpnt)
if (!cmdstatp->have_sense)
st_printk(KERN_WARNING, STp,
"Error %x (driver bt 0x%x, host bt 0x%x).\n",
- result, driver_byte(result), host_byte(result));
+ result, result >> 24, result >> 16);
else if (cmdstatp->have_sense &&
scode != NO_SENSE &&
scode != RECOVERED_ERROR &&
@@ -775,7 +775,7 @@ static void stex_scsi_done(struct st_ccb *ccb)
break;
}
- cmd->result = result;
+ to_scsi_result(cmd->result, result);
cmd->scsi_done(cmd);
}
@@ -1012,7 +1012,7 @@ static void storvsc_command_completion(struct storvsc_cmd_request *cmd_request,
set_status_byte(scmnd, vm_srb->scsi_status);
- if (scmnd->result) {
+ if (from_scsi_result(scmnd->result) != 0) {
if (scsi_normalize_sense(scmnd->sense_buffer,
SCSI_SENSE_BUFFERSIZE, &sense_hdr) &&
!(sense_hdr.sense_key == NOT_READY &&
@@ -237,7 +237,6 @@ static inline struct sym_hcb * sym_get_hcb(struct Scsi_Host *host)
static inline void
sym_set_cam_status(struct scsi_cmnd *cmd, int status)
{
- cmd->result &= ~(0xff << 16);
set_host_byte(cmd, status);
}
@@ -4552,7 +4552,7 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
break;
} /* end of switch */
- if (host_byte(result) != DID_OK)
+ if ((result >> 16) != DID_OK)
ufshcd_print_trs(hba, 1 << lrbp->task_tag, true);
return result;
}
@@ -4596,7 +4596,7 @@ static void __ufshcd_transfer_req_compl(struct ufs_hba *hba,
ufshcd_add_command_trace(hba, index, "complete");
result = ufshcd_transfer_rsp_status(hba, lrbp);
scsi_dma_unmap(cmd);
- cmd->result = result;
+ to_scsi_result(cmd->result, result);
/* Mark completed command as NULL in LRB */
lrbp->cmd = NULL;
clear_bit_unlock(index, &hba->lrb_in_use);
@@ -7050,7 +7050,7 @@ static int ufshcd_set_dev_pwr_mode(struct ufs_hba *hba,
sdev_printk(KERN_WARNING, sdp,
"START_STOP failed for power mode: %d, result %x\n",
pwr_mode, ret);
- if (driver_byte(ret) & DRIVER_SENSE)
+ if ((ret >> 24) == DRIVER_SENSE)
scsi_print_sense_hdr(sdp, NULL, &sshdr);
}
@@ -632,7 +632,8 @@ static void pvscsi_complete_request(struct pvscsi_adapter *adapter,
dev_dbg(&cmd->device->sdev_gendev,
"cmd=%p %x ctx=%p result=0x%x status=0x%x,%x\n",
- cmd, cmd->cmnd[0], ctx, cmd->result, btstat, sdstat);
+ cmd, cmd->cmnd[0], ctx, from_scsi_result(cmd->result),
+ btstat, sdstat);
cmd->scsi_done(cmd);
}
@@ -261,7 +261,7 @@ 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;
+ to_scsi_result(sc->result, ring_rsp->rslt);
scsi_set_resid(sc, ring_rsp->residual_len);
sense_len = min_t(uint8_t, VSCSIIF_SENSE_BUFFERSIZE,
@@ -815,7 +815,7 @@ static void do_scsi_linuxstat(struct uiscmdrsp *cmdrsp,
/* Do not log errors for disk-not-present inquiries */
if (cmdrsp->scsi.cmnd[0] == INQUIRY &&
- (host_byte(cmdrsp->scsi.linuxstat) == DID_NO_CONNECT) &&
+ ((cmdrsp->scsi.linuxstat >> 16) == DID_NO_CONNECT) &&
cmdrsp->scsi.addlstat == ADDL_SEL_TIMEOUT)
return;
/* Okay see what our error_count is here.... */
@@ -919,7 +919,7 @@ static void complete_scsi_command(struct uiscmdrsp *cmdrsp,
struct scsi_cmnd *scsicmd)
{
/* take what we need out of cmdrsp and complete the scsicmd */
- scsicmd->result = cmdrsp->scsi.linuxstat;
+ to_scsi_result(scsicmd->result, cmdrsp->scsi.linuxstat);
if (cmdrsp->scsi.linuxstat)
do_scsi_linuxstat(cmdrsp, scsicmd);
else
@@ -36,6 +36,7 @@
#include <linux/module.h>
#include <asm/unaligned.h>
+#include <scsi/scsi.h>
#include <scsi/scsi_device.h>
#include <scsi/scsi_host.h>
#include <scsi/scsi_tcq.h>
@@ -1048,13 +1049,16 @@ static void pscsi_req_done(struct request *req, blk_status_t status)
{
struct se_cmd *cmd = req->end_io_data;
struct pscsi_plugin_task *pt = cmd->priv;
- int result = scsi_req(req)->result;
- u8 scsi_status = status_byte(result) << 1;
+ struct scsi_result result = { 0 };
+ enum scsi_status_byte scsi_status;
+
+ to_scsi_result(result, scsi_req(req)->result);
+ scsi_status = status_byte(result);
if (scsi_status) {
pr_debug("PSCSI Status Byte exception at cmd: %p CDB:"
" 0x%02x Result: 0x%08x\n", cmd, pt->pscsi_cdb[0],
- result);
+ from_scsi_result(result));
}
pscsi_complete_cmd(cmd, scsi_status, scsi_req(req)->sense);
@@ -1066,7 +1070,7 @@ static void pscsi_req_done(struct request *req, blk_status_t status)
default:
pr_debug("PSCSI Host Byte exception at cmd: %p CDB:"
" 0x%02x Result: 0x%08x\n", cmd, pt->pscsi_cdb[0],
- result);
+ from_scsi_result(result));
target_complete_cmd(cmd, SAM_STAT_CHECK_CONDITION);
break;
}
@@ -135,6 +135,7 @@
#include <linux/blkdev.h>
#include "../../scsi/scsi.h"
#include <scsi/scsi_host.h>
+#include <scsi/scsi_proto.h>
#include "microtek.h"
@@ -406,10 +407,10 @@ static void mts_transfer_cleanup( struct urb *transfer )
static void mts_transfer_done( struct urb *transfer )
{
- enum status_byte scsi_stauts;
+ enum scsi_status_byte scsi_status;
MTS_INT_INIT();
- scsi_status = (enum status_byte)(*context->scsi_status) << 1);
+ scsi_status = (enum scsi_status_byte)(*context->scsi_status) << 1;
set_status_byte(context->srb, scsi_status);
mts_transfer_cleanup(transfer);
@@ -439,8 +440,9 @@ static void mts_data_done( struct urb* transfer )
scsi_set_resid(context->srb, context->data_length -
transfer->actual_length);
} else if ( unlikely(status) ) {
- enum host_byte shb = status == -ENOENT ? DID_ABORT : DID_ERROR;
+ enum scsi_host_byte shb;
+ shb = status == -ENOENT ? DID_ABORT : DID_ERROR;
set_host_byte(context->srb, shb);
}
@@ -499,8 +501,9 @@ static void mts_do_sg (struct urb* transfer)
scsi_sg_count(context->srb));
if (unlikely(status)) {
- enum host_byte shb = status == -ENOENT ? DID_ABORT : DID_ERROR;
+ enum scsi_host_byte shb;
+ shb = status == -ENOENT ? DID_ABORT : DID_ERROR;
set_host_byte(context->srb, shb);
mts_transfer_cleanup(transfer);
}
@@ -147,7 +147,7 @@ static void cypress_atacb_passthrough(struct scsi_cmnd *srb, struct us_data *us)
usb_stor_transparent_scsi_command(srb, us);
/* if the device doesn't support ATACB */
- if (srb->result == SAM_STAT_CHECK_CONDITION &&
+ if (status_byte(srb->result) == SAM_STAT_CHECK_CONDITION &&
memcmp(srb->sense_buffer, usb_stor_sense_invalidCDB,
sizeof(usb_stor_sense_invalidCDB)) == 0) {
usb_stor_dbg(us, "cypress atacb not supported ???\n");
@@ -158,8 +158,8 @@ static void cypress_atacb_passthrough(struct scsi_cmnd *srb, struct us_data *us)
* if ck_cond flags is set, and there wasn't critical error,
* build the special sense
*/
- if ((srb->result != (DID_ERROR << 16) &&
- srb->result != (DID_ABORT << 16)) &&
+ if ((host_byte(srb->result) != DID_ERROR &&
+ host_byte(srb->result) != DID_ABORT) &&
save_cmnd[2] & 0x20) {
struct scsi_eh_save ses;
unsigned char regs[8];
@@ -181,7 +181,7 @@ static void cypress_atacb_passthrough(struct scsi_cmnd *srb, struct us_data *us)
usb_stor_transparent_scsi_command(srb, us);
memcpy(regs, srb->sense_buffer, sizeof(regs));
- tmp_result = srb->result;
+ tmp_result = from_scsi_result(srb->result);
scsi_eh_restore_cmnd(srb, &ses);
/* we fail to get registers, report invalid command */
if (tmp_result != SAM_STAT_GOOD)
@@ -555,7 +555,8 @@ static void last_sector_hacks(struct us_data *us, struct scsi_cmnd *srb)
if (sector + 1 != sdkp->capacity)
goto done;
- if (srb->result == SAM_STAT_GOOD && scsi_get_resid(srb) == 0) {
+ if (status_byte(srb->result) == SAM_STAT_GOOD
+ && scsi_get_resid(srb) == 0) {
/*
* The command succeeded. We know this device doesn't
@@ -316,7 +316,7 @@ static void uas_stat_cmplt(struct urb *urb)
switch (iu->iu_id) {
case IU_ID_STATUS:
uas_sense(urb, cmnd);
- if (cmnd->result != 0) {
+ if (from_scsi_result(cmnd->result) != 0) {
/* cancel data transfers on error */
data_in_urb = usb_get_urb(cmdinfo->data_in_urb);
data_out_urb = usb_get_urb(cmdinfo->data_out_urb);
@@ -389,7 +389,7 @@ static int usb_stor_control_thread(void * __us)
scsi_lock(host);
/* was the command aborted? */
- if (srb->result == DID_ABORT << 16) {
+ if (host_byte(srb->result) == DID_ABORT << 16) {
SkipForAbort:
usb_stor_dbg(us, "scsi command aborted\n");
srb = NULL; /* Don't call srb->scsi_done() */
@@ -420,7 +420,7 @@ static int usb_stor_control_thread(void * __us)
/* now that the locks are released, notify the SCSI core */
if (srb) {
usb_stor_dbg(us, "scsi cmd done, result=0x%x\n",
- srb->result);
+ from_scsi_result(srb->result));
srb->scsi_done(srb);
}
} /* for (;;) */
@@ -259,11 +259,13 @@ static void scsiback_print_status(char *sense_buffer, int errors,
struct vscsibk_pend *pending_req)
{
struct scsiback_tpg *tpg = pending_req->v2p->tpg;
+ struct scsi_result res = { 0 };
+ to_scsi_result(res, errors);
pr_err("[%s:%d] cmnd[0]=%02x -> st=%02x msg=%02x host=%02x drv=%02x\n",
tpg->tport->tport_name, pending_req->v2p->lun,
- pending_req->cmnd[0], status_byte(errors), msg_byte(errors),
- host_byte(errors), driver_byte(errors));
+ pending_req->cmnd[0], status_byte(res), msg_byte(res),
+ host_byte(res), driver_byte(res));
}
static void scsiback_fast_flush_area(struct vscsibk_pend *req)
@@ -203,6 +203,27 @@ enum scsi_driver_byte {
#define SCSI_MLQUEUE_EH_RETRY 0x1057
#define SCSI_MLQUEUE_TARGET_BUSY 0x1058
+struct scsi_result {
+ u8 driver_byte;
+ u8 host_byte;
+ u8 msg_byte;
+ u8 status_byte;
+};
+
+static inline int from_scsi_result(struct scsi_result r)
+{
+ return r.driver_byte << 24 | r.host_byte << 16 | r.msg_byte << 8
+ | r.status_byte;
+}
+
+static inline void to_scsi_result(struct scsi_result r, int res)
+{
+ r.driver_byte = (res & 0xff000000) << 24;
+ r.host_byte = (res & 0x00ff0000) << 16;
+ r.msg_byte = (res & 0x0000ff00) << 8;
+ r.status_byte = res & 0xff;
+}
+
/*
* Use these to separate status msg and our bytes
*
@@ -213,24 +234,24 @@ enum scsi_driver_byte {
* host_byte = set by low-level driver to indicate status.
* driver_byte = set by mid-level.
*/
-static inline enum scsi_status_byte status_byte(int result)
+static inline enum scsi_status_byte status_byte(struct scsi_result result)
{
- return (result >> 1) & 0x7f;
+ return result.status_byte;
}
-static inline enum scsi_msg_byte msg_byte(int result)
+static inline enum scsi_msg_byte msg_byte(struct scsi_result result)
{
- return (result >> 8) & 0xff;
+ return result.msg_byte;
}
-static inline enum scsi_host_byte host_byte(int result)
+static inline enum scsi_host_byte host_byte(struct scsi_result result)
{
- return (result >> 16) & 0xff;
+ return result.host_byte;
}
-static inline enum scsi_driver_byte driver_byte(int result)
+static inline enum scsi_driver_byte driver_byte(struct scsi_result result)
{
- return (result >> 24) & 0xff;
+ return result.driver_byte;
}
#define sense_class(sense) (((sense) >> 4) & 0x7)
@@ -10,6 +10,7 @@
#include <linux/scatterlist.h>
#include <scsi/scsi_device.h>
#include <scsi/scsi_request.h>
+#include <scsi/scsi.h>
struct Scsi_Host;
struct scsi_driver;
@@ -144,7 +145,7 @@ struct scsi_cmnd {
* obtained by scsi_malloc is guaranteed
* to be at an address < 16Mb). */
- int result; /* Status code from lower level driver */
+ struct scsi_result result; /* Status code from LLDD */
int flags; /* Command flags */
unsigned char tag; /* SCSI-II queued command tag */
@@ -340,25 +341,25 @@ static inline struct scsi_data_buffer *scsi_prot(struct scsi_cmnd *cmd)
static inline void set_msg_byte(struct scsi_cmnd *cmd,
enum scsi_msg_byte status)
{
- cmd->result = (cmd->result & 0xffff00ff) | (status << 8);
+ cmd->result.msg_byte = status;
}
static inline void set_host_byte(struct scsi_cmnd *cmd,
enum scsi_host_byte status)
{
- cmd->result = (cmd->result & 0xff00ffff) | (status << 16);
+ cmd->result.host_byte = status;
}
static inline void set_driver_byte(struct scsi_cmnd *cmd,
enum scsi_driver_byte status)
{
- cmd->result = (cmd->result & 0x00ffffff) | (status << 24);
+ cmd->result.driver_byte = status;
}
static inline void set_status_byte(struct scsi_cmnd *cmd,
char status)
{
- cmd->result = (cmd->result & 0xffffff00) | status;
+ cmd->result.status_byte = status;
}
static inline void set_scsi_result(struct scsi_cmnd *cmd,
@@ -366,12 +367,15 @@ static inline void set_scsi_result(struct scsi_cmnd *cmd,
enum scsi_host_byte hb,
enum scsi_msg_byte mb, char status)
{
- cmd->result = db << 24 | hb << 16 | mb << 8 | status;
+ cmd->result.driver_byte = db;
+ cmd->result.host_byte = hb;
+ cmd->result.msg_byte = mb;
+ cmd->result.status_byte = status;
}
static inline void clear_scsi_result(struct scsi_cmnd *cmd)
{
- cmd->result = 0;
+ memset(&cmd->result, 0, FIELD_SIZEOF(struct scsi_cmnd, result));
}
static inline unsigned scsi_transfer_length(struct scsi_cmnd *scmd)
@@ -309,7 +309,7 @@ DECLARE_EVENT_CLASS(scsi_cmd_done_timeout_template,
__entry->channel = cmd->device->channel;
__entry->id = cmd->device->id;
__entry->lun = cmd->device->lun;
- __entry->result = cmd->result;
+ __entry->result = from_scsi_result(cmd->result);
__entry->opcode = cmd->cmnd[0];
__entry->cmd_len = cmd->cmd_len;
__entry->data_sglen = scsi_sg_count(cmd);
Introduce struct scsi_result. Signed-off-by: Johannes Thumshirn <jthumshirn@suse.de> Suggested-by: Bart Van Assche <Bart.VanAssche@wdc.com> --- block/bsg-lib.c | 8 ++++-- block/bsg.c | 8 ++++-- block/scsi_ioctl.c | 12 ++++---- drivers/ata/libata-scsi.c | 12 +++++--- drivers/firewire/sbp2.c | 2 +- drivers/infiniband/ulp/srp/ib_srp.c | 11 ++++---- drivers/message/fusion/mptfc.c | 2 +- drivers/message/fusion/mptscsih.c | 10 ++++--- drivers/scsi/BusLogic.c | 4 +-- drivers/scsi/NCR5380.c | 2 +- drivers/scsi/aha152x.c | 2 +- drivers/scsi/bfa/bfad_im.c | 10 +++---- drivers/scsi/bnx2fc/bnx2fc_io.c | 2 +- drivers/scsi/ch.c | 2 +- drivers/scsi/constants.c | 4 +-- drivers/scsi/csiostor/csio_scsi.c | 2 +- drivers/scsi/dc395x.c | 11 ++++---- drivers/scsi/device_handler/scsi_dh_alua.c | 10 +++++-- drivers/scsi/dpt_i2o.c | 2 +- drivers/scsi/esp_scsi.c | 2 +- drivers/scsi/fnic/fnic_scsi.c | 2 +- drivers/scsi/hpsa.c | 2 +- drivers/scsi/libfc/fc_fcp.c | 2 +- drivers/scsi/libiscsi.c | 6 ++-- drivers/scsi/lpfc/lpfc_scsi.c | 19 +++++++------ drivers/scsi/megaraid/megaraid_sas_fusion.c | 6 ++-- drivers/scsi/mpt3sas/mpt3sas_scsih.c | 6 ++-- drivers/scsi/osst.c | 3 +- drivers/scsi/pmcraid.c | 4 +-- drivers/scsi/qedf/qedf_io.c | 8 +++--- drivers/scsi/qedi/qedi_fw.c | 2 +- drivers/scsi/qla1280.c | 4 +-- drivers/scsi/qla2xxx/qla_isr.c | 6 ++-- drivers/scsi/qla2xxx/qla_mr.c | 4 +-- drivers/scsi/qla2xxx/qla_os.c | 8 +++--- drivers/scsi/qla4xxx/ql4_os.c | 10 ++++--- drivers/scsi/qlogicfas408.c | 2 +- drivers/scsi/scsi.c | 5 ++-- drivers/scsi/scsi_debug.c | 23 +++++++++------ drivers/scsi/scsi_debugfs.c | 2 +- drivers/scsi/scsi_error.c | 12 ++++---- drivers/scsi/scsi_ioctl.c | 2 +- drivers/scsi/scsi_lib.c | 21 ++++++++------ drivers/scsi/scsi_logging.c | 5 ++-- drivers/scsi/scsi_scan.c | 2 +- drivers/scsi/scsi_transport_spi.c | 2 +- drivers/scsi/sd.c | 22 +++++++-------- drivers/scsi/sd_zbc.c | 4 +-- drivers/scsi/sg.c | 10 +++---- drivers/scsi/snic/snic_scsi.c | 2 +- drivers/scsi/sr.c | 4 +-- drivers/scsi/sr_ioctl.c | 2 +- drivers/scsi/st.c | 2 +- drivers/scsi/stex.c | 2 +- drivers/scsi/storvsc_drv.c | 2 +- drivers/scsi/sym53c8xx_2/sym_glue.h | 1 - drivers/scsi/ufs/ufshcd.c | 6 ++-- drivers/scsi/vmw_pvscsi.c | 3 +- drivers/scsi/xen-scsifront.c | 2 +- drivers/staging/unisys/visorhba/visorhba_main.c | 4 +-- drivers/target/target_core_pscsi.c | 12 +++++--- drivers/usb/image/microtek.c | 11 +++++--- drivers/usb/storage/cypress_atacb.c | 8 +++--- drivers/usb/storage/transport.c | 3 +- drivers/usb/storage/uas.c | 2 +- drivers/usb/storage/usb.c | 4 +-- drivers/xen/xen-scsiback.c | 6 ++-- include/scsi/scsi.h | 37 +++++++++++++++++++------ include/scsi/scsi_cmnd.h | 18 +++++++----- include/trace/events/scsi.h | 2 +- 70 files changed, 262 insertions(+), 193 deletions(-)