scsi: core: Drop obsolete Linux-specific SCSI status codes
authorHannes Reinecke <hare@suse.de>
Tue, 27 Apr 2021 08:30:46 +0000 (10:30 +0200)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 1 Jun 2021 03:59:18 +0000 (23:59 -0400)
Originally the SCSI subsystem has been using 'special' SCSI status codes,
which were the SAM-specified ones but shifted by 1.  As most drivers have
now been modified to use the SAM-specified ones, having two nearly
identical sets of definitions only causes confusion.

The Linux-specifed SCSI status codes have been marked obsolete for several
years so drop them and use the SAM-specified status codes throughout.

Link: https://lore.kernel.org/r/20210427083046.31620-41-hare@suse.de
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Douglas Gilbert <dgilbert@interlog.com>
Signed-off-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
18 files changed:
drivers/ata/libata-scsi.c
drivers/infiniband/ulp/srp/ib_srp.c
drivers/scsi/3w-9xxx.c
drivers/scsi/3w-xxxx.c
drivers/scsi/53c700.c
drivers/scsi/NCR5380.c
drivers/scsi/arcmsr/arcmsr_hba.c
drivers/scsi/esas2r/esas2r_main.c
drivers/scsi/megaraid.c
drivers/scsi/megaraid/megaraid_mbox.c
drivers/scsi/scsi_error.c
drivers/scsi/scsi_lib.c
drivers/scsi/sr.c
drivers/scsi/sr_ioctl.c
drivers/xen/xen-scsiback.c
include/scsi/scsi.h
include/scsi/scsi_proto.h
include/scsi/sg.h

index 31b47ad073ad247785fe87568c1416bb7b6fc909..b9588c52815d240228a4a65b9bc52cd3fe041447 100644 (file)
@@ -642,7 +642,7 @@ static struct ata_queued_cmd *ata_scsi_qc_new(struct ata_device *dev,
                if (cmd->request->rq_flags & RQF_QUIET)
                        qc->flags |= ATA_QCFLAG_QUIET;
        } else {
-               cmd->result = (DID_OK << 16) | (QUEUE_FULL << 1);
+               cmd->result = (DID_OK << 16) | SAM_STAT_TASK_SET_FULL;
                cmd->scsi_done(cmd);
        }
 
index 31f8aa2c40ed8f6320816750d6f279997d0b6394..62d9b70f7c63285e54d5f7d18fe7efc16f60e7c1 100644 (file)
@@ -2232,7 +2232,7 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd)
                 * to reduce queue depth temporarily.
                 */
                scmnd->result = len == -ENOMEM ?
-                       DID_OK << 16 | QUEUE_FULL << 1 : DID_ERROR << 16;
+                       DID_OK << 16 | SAM_STAT_TASK_SET_FULL : DID_ERROR << 16;
                goto err_iu;
        }
 
index 2b4b629a6e9690aa21706c8e296acafb8b0a2b88..e41cc354cc8af878b6258eb32e379ee88ebd08fd 100644 (file)
@@ -1338,7 +1338,7 @@ static irqreturn_t twa_interrupt(int irq, void *dev_instance)
                                /* If error, command failed */
                                if (error == 1) {
                                        /* Ask for a host reset */
-                                       cmd->result = (DID_OK << 16) | (CHECK_CONDITION << 1);
+                                       cmd->result = (DID_OK << 16) | SAM_STAT_CHECK_CONDITION;
                                }
 
                                /* Report residual bytes for single sgl */
index 7a0b4a44395d89aaa890b490c708f6975b5e81d1..4ee485ab271484501ba50400775b7dd7fc70f05f 100644 (file)
@@ -429,7 +429,7 @@ static int tw_decode_sense(TW_Device_Extension *tw_dev, int request_id, int fill
                                        /* Additional sense code qualifier */
                                        tw_dev->srb[request_id]->sense_buffer[13] = tw_sense_table[i][3];
 
-                                       tw_dev->srb[request_id]->result = (DID_OK << 16) | (CHECK_CONDITION << 1);
+                                       tw_dev->srb[request_id]->result = (DID_OK << 16) | SAM_STAT_CHECK_CONDITION;
                                        return TW_ISR_DONT_RESULT; /* Special case for isr to not over-write result */
                                }
                        }
@@ -2159,7 +2159,7 @@ static irqreturn_t tw_interrupt(int irq, void *dev_instance)
                                /* If error, command failed */
                                if (error == 1) {
                                        /* Ask for a host reset */
-                                       tw_dev->srb[request_id]->result = (DID_OK << 16) | (CHECK_CONDITION << 1);
+                                       tw_dev->srb[request_id]->result = (DID_OK << 16) | SAM_STAT_CHECK_CONDITION;
                                }
 
                                /* Now complete the io */
index 77ccb96e5ed40d4330452b5a2693d992c7f1fe83..1c6b4e672687ecd74d2f38e82d8e091212c16f5e 100644 (file)
@@ -978,10 +978,10 @@ process_script_interrupt(__u32 dsps, __u32 dsp, struct scsi_cmnd *SCp,
                if (NCR_700_get_tag_neg_state(SCp->device) == NCR_700_DURING_TAG_NEGOTIATION)
                        NCR_700_set_tag_neg_state(SCp->device,
                                                  NCR_700_FINISHED_TAG_NEGOTIATION);
-                       
+
                /* check for contingent allegiance conditions */
-               if (hostdata->status[0] >> 1 == CHECK_CONDITION ||
-                   hostdata->status[0] >> 1 == COMMAND_TERMINATED) {
+               if (hostdata->status[0] == SAM_STAT_CHECK_CONDITION ||
+                   hostdata->status[0] == SAM_STAT_COMMAND_TERMINATED) {
                        struct NCR_700_command_slot *slot =
                                (struct NCR_700_command_slot *)SCp->host_scribble;
                        if(slot->flags == NCR_700_FLAG_AUTOSENSE) {
index a74674941e7de09655444665177e61f990c958dc..8aa964cd54dfe6e4e26a4f923ba09a691c5d2010 100644 (file)
@@ -538,7 +538,7 @@ static void complete_cmd(struct Scsi_Host *instance,
 
        if (hostdata->sensing == cmd) {
                /* Autosense processing ends here */
-               if (status_byte(cmd->result) != GOOD) {
+               if (get_status_byte(cmd) != SAM_STAT_GOOD) {
                        scsi_eh_restore_cmnd(cmd, &hostdata->ses);
                } else {
                        scsi_eh_restore_cmnd(cmd, &hostdata->ses);
index c01a5b2ff67ab1ab36c59b0b72e6f4f0730f5674..e5149c9fd4e600bdf14fce9292e9bfe9b02a7fd0 100644 (file)
@@ -1326,7 +1326,7 @@ static void arcmsr_report_sense_info(struct CommandControlBlock *ccb)
 
        struct scsi_cmnd *pcmd = ccb->pcmd;
        struct SENSE_DATA *sensebuffer = (struct SENSE_DATA *)pcmd->sense_buffer;
-       pcmd->result = (DID_OK << 16) | (CHECK_CONDITION << 1);
+       pcmd->result = (DID_OK << 16) | SAM_STAT_CHECK_CONDITION;
        if (sensebuffer) {
                int sense_data_length =
                        sizeof(struct SENSE_DATA) < SCSI_SENSE_BUFFERSIZE
@@ -3253,7 +3253,7 @@ static int arcmsr_queue_command_lck(struct scsi_cmnd *cmd,
        if (!ccb)
                return SCSI_MLQUEUE_HOST_BUSY;
        if (arcmsr_build_ccb( acb, ccb, cmd ) == FAILED) {
-               cmd->result = (DID_ERROR << 16) | (RESERVATION_CONFLICT << 1);
+               cmd->result = (DID_ERROR << 16) | SAM_STAT_RESERVATION_CONFLICT;
                cmd->scsi_done(cmd);
                return 0;
        }
index 45ec9f16c0850216b1ec6ac0d44b73986c2d9d72..647f82898b6e84c304413e358c23b3d933a60815 100644 (file)
@@ -1525,7 +1525,7 @@ void esas2r_complete_request_cb(struct esas2r_adapter *a,
 
                rq->cmd->result =
                        ((esas2r_req_status_to_error(rq->req_stat) << 16)
-                        | (rq->func_rsp.scsi_rsp.scsi_stat & STATUS_MASK));
+                        | rq->func_rsp.scsi_rsp.scsi_stat);
 
                if (rq->req_stat == RS_UNDERRUN)
                        scsi_set_resid(rq->cmd,
index 1880471c632a2db4f60a6eb20b22d5630924df80..56910e94dbf2a2c75349949b575bf26a54b2e6cf 100644 (file)
@@ -1611,7 +1611,7 @@ mega_cmd_done(adapter_t *adapter, u8 completed[], int nstatus, int status)
                         */
                        if( cmd->cmnd[0] == TEST_UNIT_READY ) {
                                cmd->result |= (DID_ERROR << 16) |
-                                       (RESERVATION_CONFLICT << 1);
+                                       SAM_STAT_RESERVATION_CONFLICT;
                        }
                        else
                        /*
@@ -1623,7 +1623,7 @@ mega_cmd_done(adapter_t *adapter, u8 completed[], int nstatus, int status)
                                         cmd->cmnd[0] == RELEASE) ) {
 
                                cmd->result |= (DID_ERROR << 16) |
-                                       (RESERVATION_CONFLICT << 1);
+                                       SAM_STAT_RESERVATION_CONFLICT;
                        }
                        else
 #endif
index bb8b2fba4b3db0408ce02963c308a534f0281cbe..d3fac99db7862567e7b9bcaee33096fa3e8d1d37 100644 (file)
@@ -2327,7 +2327,7 @@ megaraid_mbox_dpc(unsigned long devp)
                         */
                        if (scp->cmnd[0] == TEST_UNIT_READY) {
                                scp->result = DID_ERROR << 16 |
-                                       RESERVATION_CONFLICT << 1;
+                                       SAM_STAT_RESERVATION_CONFLICT;
                        }
                        else
                        /*
@@ -2338,7 +2338,7 @@ megaraid_mbox_dpc(unsigned long devp)
                                         scp->cmnd[0] == RELEASE)) {
 
                                scp->result = DID_ERROR << 16 |
-                                       RESERVATION_CONFLICT << 1;
+                                       SAM_STAT_RESERVATION_CONFLICT;
                        }
                        else {
                                scp->result = DID_BAD_TARGET << 16 | status;
index 3e6e456816fc9a0aabe5267b1d1894ff05d30027..c6cd5a8e5c856d55936f4b64a5ab088197e45af7 100644 (file)
@@ -745,32 +745,32 @@ static enum scsi_disposition scsi_eh_completed_normally(struct scsi_cmnd *scmd)
         * now, check the status byte to see if this indicates
         * anything special.
         */
-       switch (status_byte(scmd->result)) {
-       case GOOD:
+       switch (get_status_byte(scmd)) {
+       case SAM_STAT_GOOD:
                scsi_handle_queue_ramp_up(scmd->device);
                fallthrough;
-       case COMMAND_TERMINATED:
+       case SAM_STAT_COMMAND_TERMINATED:
                return SUCCESS;
-       case CHECK_CONDITION:
+       case SAM_STAT_CHECK_CONDITION:
                return scsi_check_sense(scmd);
-       case CONDITION_GOOD:
-       case INTERMEDIATE_GOOD:
-       case INTERMEDIATE_C_GOOD:
+       case SAM_STAT_CONDITION_MET:
+       case SAM_STAT_INTERMEDIATE:
+       case SAM_STAT_INTERMEDIATE_CONDITION_MET:
                /*
                 * who knows?  FIXME(eric)
                 */
                return SUCCESS;
-       case RESERVATION_CONFLICT:
+       case SAM_STAT_RESERVATION_CONFLICT:
                if (scmd->cmnd[0] == TEST_UNIT_READY)
                        /* it is a success, we probed the device and
                         * found it */
                        return SUCCESS;
                /* otherwise, we failed to send the command */
                return FAILED;
-       case QUEUE_FULL:
+       case SAM_STAT_TASK_SET_FULL:
                scsi_handle_queue_full(scmd->device);
                fallthrough;
-       case BUSY:
+       case SAM_STAT_BUSY:
                return NEEDS_RETRY;
        default:
                return FAILED;
@@ -1760,7 +1760,7 @@ int scsi_noretry_cmd(struct scsi_cmnd *scmd)
        case DID_PARITY:
                return (scmd->request->cmd_flags & REQ_FAILFAST_DEV);
        case DID_ERROR:
-               if (status_byte(scmd->result) == RESERVATION_CONFLICT)
+               if (get_status_byte(scmd) == SAM_STAT_RESERVATION_CONFLICT)
                        return 0;
                fallthrough;
        case DID_SOFT_ERROR:
@@ -1876,7 +1876,7 @@ enum scsi_disposition scsi_decide_disposition(struct scsi_cmnd *scmd)
                 */
                return SUCCESS;
        case DID_ERROR:
-               if (status_byte(scmd->result) == RESERVATION_CONFLICT)
+               if (get_status_byte(scmd) == SAM_STAT_RESERVATION_CONFLICT)
                        /*
                         * execute reservation conflict processing code
                         * lower down
@@ -1907,15 +1907,15 @@ enum scsi_disposition scsi_decide_disposition(struct scsi_cmnd *scmd)
        /*
         * check the status byte to see if this indicates anything special.
         */
-       switch (status_byte(scmd->result)) {
-       case QUEUE_FULL:
+       switch (get_status_byte(scmd)) {
+       case SAM_STAT_TASK_SET_FULL:
                scsi_handle_queue_full(scmd->device);
                /*
                 * the case of trying to send too many commands to a
                 * tagged queueing device.
                 */
                fallthrough;
-       case BUSY:
+       case SAM_STAT_BUSY:
                /*
                 * device can't talk to us at the moment.  Should only
                 * occur (SAM-3) when the task queue is empty, so will cause
@@ -1923,16 +1923,16 @@ enum scsi_disposition scsi_decide_disposition(struct scsi_cmnd *scmd)
                 * device.
                 */
                return ADD_TO_MLQUEUE;
-       case GOOD:
+       case SAM_STAT_GOOD:
                if (scmd->cmnd[0] == REPORT_LUNS)
                        scmd->device->sdev_target->expecting_lun_change = 0;
                scsi_handle_queue_ramp_up(scmd->device);
                fallthrough;
-       case COMMAND_TERMINATED:
+       case SAM_STAT_COMMAND_TERMINATED:
                return SUCCESS;
-       case TASK_ABORTED:
+       case SAM_STAT_TASK_ABORTED:
                goto maybe_retry;
-       case CHECK_CONDITION:
+       case SAM_STAT_CHECK_CONDITION:
                rtn = scsi_check_sense(scmd);
                if (rtn == NEEDS_RETRY)
                        goto maybe_retry;
@@ -1941,16 +1941,16 @@ enum scsi_disposition scsi_decide_disposition(struct scsi_cmnd *scmd)
                 * to collect the sense and redo the decide
                 * disposition */
                return rtn;
-       case CONDITION_GOOD:
-       case INTERMEDIATE_GOOD:
-       case INTERMEDIATE_C_GOOD:
-       case ACA_ACTIVE:
+       case SAM_STAT_CONDITION_MET:
+       case SAM_STAT_INTERMEDIATE:
+       case SAM_STAT_INTERMEDIATE_CONDITION_MET:
+       case SAM_STAT_ACA_ACTIVE:
                /*
                 * who knows?  FIXME(eric)
                 */
                return SUCCESS;
 
-       case RESERVATION_CONFLICT:
+       case SAM_STAT_RESERVATION_CONFLICT:
                sdev_printk(KERN_INFO, scmd->device,
                            "reservation conflict\n");
                set_host_byte(scmd, DID_NEXUS_FAILURE);
index e3897bb424b44a9ab7cb19a577b25248d54372b4..6b994baf87c23559a3b050a6f32c32c60e2f81d8 100644 (file)
@@ -873,7 +873,7 @@ static int scsi_io_completion_nz_result(struct scsi_cmnd *cmd, int result,
         * 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 ((result & 0xff) && scsi_status_is_good(result)) {
                result = 0;
                *blk_statp = BLK_STS_OK;
        }
index e9cb874f6891b012fd7d3a1eb8f35892e772614c..482a07b662a929f1b7ac866879bc2b8b09a72a8f 100644 (file)
@@ -338,7 +338,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 (status_byte(result) == SAM_STAT_CHECK_CONDITION &&
+       if (scsi_status_is_check_condition(result) &&
            (SCpnt->sense_buffer[0] & 0x7f) == 0x70) { /* Sense current */
                switch (SCpnt->sense_buffer[2]) {
                case MEDIUM_ERROR:
index 93c77dd9a4764de9f90af12b8a4c487f617847ef..79d9aa2df528b35e89f2014d1da29503f6599d45 100644 (file)
@@ -205,7 +205,7 @@ int sr_do_ioctl(Scsi_CD *cd, struct packet_command *cgc)
                err = result;
                goto out;
        }
-       if (status_byte(result) == SAM_STAT_CHECK_CONDITION) {
+       if (scsi_status_is_check_condition(result)) {
                switch (sshdr->sense_key) {
                case UNIT_ATTENTION:
                        SDev->changed = 1;
index bea22f71c782f54558d71e24cc19f2dab1e312e6..61ce0d142eea961757866ce014c262acc42d865d 100644 (file)
@@ -224,7 +224,7 @@ static void scsiback_print_status(char *sense_buffer, int errors,
 
        pr_err("[%s:%d] cmnd[0]=%02x -> st=%02x msg=%02x host=%02x\n",
               tpg->tport->tport_name, pending_req->v2p->lun,
-              pending_req->cmnd[0], status_byte(errors), COMMAND_COMPLETE,
+              pending_req->cmnd[0], errors & 0xff, COMMAND_COMPLETE,
               host_byte(errors));
 }
 
index f4fb7e7728b4a5578d2dfdb55f9ac023021b89f7..358f969f368ffba5ce0289cb8ee15feee4f06ff9 100644 (file)
@@ -184,7 +184,6 @@ enum scsi_disposition {
  *      msg_byte    (unused)
  *      host_byte   = set by low-level driver to indicate status.
  */
-#define status_byte(result) (((result) >> 1) & 0x7f)
 #define host_byte(result)   (((result) >> 16) & 0xff)
 
 #define sense_class(sense)  (((sense) >> 4) & 0x7)
index 5c106c4f249e2b41e43759c94528ff4188190ce1..cb218a576bcf3c98039c46083fcdd9b705a57e08 100644 (file)
@@ -202,27 +202,7 @@ struct scsi_varlen_cdb_hdr {
 #define SAM_STAT_ACA_ACTIVE      0x30
 #define SAM_STAT_TASK_ABORTED    0x40
 
-/*
- *  Status codes. These are deprecated as they are shifted 1 bit right
- *  from those found in the SCSI standards. This causes confusion for
- *  applications that are ported to several OSes. Prefer SAM Status codes
- *  above.
- */
-
-#define GOOD                 0x00
-#define CHECK_CONDITION      0x01
-#define CONDITION_GOOD       0x02
-#define BUSY                 0x04
-#define INTERMEDIATE_GOOD    0x08
-#define INTERMEDIATE_C_GOOD  0x0a
-#define RESERVATION_CONFLICT 0x0c
-#define COMMAND_TERMINATED   0x11
-#define QUEUE_FULL           0x14
-#define ACA_ACTIVE           0x18
-#define TASK_ABORTED         0x20
-
-#define STATUS_MASK          0xfe
-
+#define STATUS_MASK         0xfe
 /*
  *  SENSE KEYS
  */
index e9dd5477ca7a43f35fc52f06d0067beac91299fd..843cefb8efce0e60f7ad1a2e855a51a1ab3c0f2b 100644 (file)
@@ -145,6 +145,26 @@ struct compat_sg_io_hdr {
 /* Obsolete driver_byte() declaration */
 #define driver_byte(result) (((result) >> 24) & 0xff)
 
+/*
+ *  Original linux SCSI Status codes. They are shifted 1 bit right
+ *  from those found in the SCSI standards.
+ */
+
+#define GOOD                 0x00
+#define CHECK_CONDITION      0x01
+#define CONDITION_GOOD       0x02
+#define BUSY                 0x04
+#define INTERMEDIATE_GOOD    0x08
+#define INTERMEDIATE_C_GOOD  0x0a
+#define RESERVATION_CONFLICT 0x0c
+#define COMMAND_TERMINATED   0x11
+#define QUEUE_FULL           0x14
+#define ACA_ACTIVE           0x18
+#define TASK_ABORTED         0x20
+
+/* Obsolete status_byte() declaration */
+#define status_byte(result) (((result) >> 1) & 0x7f)
+
 typedef struct sg_scsi_id { /* used by SG_GET_SCSI_ID ioctl() */
     int host_no;        /* as in "scsi<n>" where 'n' is one of 0, 1, 2 etc */
     int channel;