scsi: core: Introduce enums for the SAM and host status codes
authorBart Van Assche <bvanassche@acm.org>
Mon, 24 May 2021 02:54:56 +0000 (19:54 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 3 Jun 2021 03:09:39 +0000 (23:09 -0400)
Make it possible for the compiler to verify whether SAM and host
status codes are used correctly.

[mkp: resolve conflicts with Hannes' SCSI result series]

Link: https://lore.kernel.org/r/20210524025457.11299-3-bvanassche@acm.org
Cc: Hannes Reinecke <hare@suse.com>
Reviewed-by: John Garry <john.garry@huawei.com>
Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/constants.c
drivers/target/target_core_pscsi.c
include/scsi/scsi.h
include/scsi/scsi_proto.h
include/scsi/scsi_status.h [new file with mode: 0644]

index 41bcfed08260809990a6896be61813a21bd3a280..340785536998d2f1d806100a8709025f48951688 100644 (file)
@@ -408,8 +408,8 @@ static const char * const hostbyte_table[]={
 
 const char *scsi_hostbyte_string(int result)
 {
+       enum scsi_host_status hb = host_byte(result);
        const char *hb_string = NULL;
-       int hb = host_byte(result);
 
        if (hb < ARRAY_SIZE(hostbyte_table))
                hb_string = hostbyte_table[hb];
index e2b97cba667957e15a1c5aea391d9fb115fa13d0..1646ba8eda11f674af86192c06f139b2712907a0 100644 (file)
@@ -1044,7 +1044,7 @@ 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 = result & 0xff;
+       enum sam_status scsi_status = result & 0xff;
 
        if (scsi_status != SAM_STAT_GOOD) {
                pr_debug("PSCSI Status Byte exception at cmd: %p CDB:"
index 358f969f368ffba5ce0289cb8ee15feee4f06ff9..3e46859774c85a48542eed79b231e22b694b98e0 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/kernel.h>
 #include <scsi/scsi_common.h>
 #include <scsi/scsi_proto.h>
+#include <scsi/scsi_status.h>
 
 struct scsi_cmnd;
 
@@ -79,78 +80,14 @@ static inline int scsi_status_is_check_condition(int status)
 }
 
 /*
- *  MESSAGE CODES
+ *  Extended message codes.
  */
-
-#define COMMAND_COMPLETE    0x00
-#define EXTENDED_MESSAGE    0x01
 #define     EXTENDED_MODIFY_DATA_POINTER    0x00
 #define     EXTENDED_SDTR                   0x01
 #define     EXTENDED_EXTENDED_IDENTIFY      0x02    /* SCSI-I only */
 #define     EXTENDED_WDTR                   0x03
 #define     EXTENDED_PPR                    0x04
 #define     EXTENDED_MODIFY_BIDI_DATA_PTR   0x05
-#define SAVE_POINTERS       0x02
-#define RESTORE_POINTERS    0x03
-#define DISCONNECT          0x04
-#define INITIATOR_ERROR     0x05
-#define ABORT_TASK_SET      0x06
-#define MESSAGE_REJECT      0x07
-#define NOP                 0x08
-#define MSG_PARITY_ERROR    0x09
-#define LINKED_CMD_COMPLETE 0x0a
-#define LINKED_FLG_CMD_COMPLETE 0x0b
-#define TARGET_RESET        0x0c
-#define ABORT_TASK          0x0d
-#define CLEAR_TASK_SET      0x0e
-#define INITIATE_RECOVERY   0x0f            /* SCSI-II only */
-#define RELEASE_RECOVERY    0x10            /* SCSI-II only */
-#define TERMINATE_IO_PROC   0x11            /* SCSI-II only */
-#define CLEAR_ACA           0x16
-#define LOGICAL_UNIT_RESET  0x17
-#define SIMPLE_QUEUE_TAG    0x20
-#define HEAD_OF_QUEUE_TAG   0x21
-#define ORDERED_QUEUE_TAG   0x22
-#define IGNORE_WIDE_RESIDUE 0x23
-#define ACA                 0x24
-#define QAS_REQUEST         0x55
-
-/* Old SCSI2 names, don't use in new code */
-#define BUS_DEVICE_RESET    TARGET_RESET
-#define ABORT               ABORT_TASK_SET
-
-/*
- * Host byte codes
- */
-
-#define DID_OK          0x00   /* NO error                                */
-#define DID_NO_CONNECT  0x01   /* Couldn't connect before timeout period  */
-#define DID_BUS_BUSY    0x02   /* BUS stayed busy through time out period */
-#define DID_TIME_OUT    0x03   /* TIMED OUT for other reason              */
-#define DID_BAD_TARGET  0x04   /* BAD target.                             */
-#define DID_ABORT       0x05   /* Told to abort for some other reason     */
-#define DID_PARITY      0x06   /* Parity error                            */
-#define DID_ERROR       0x07   /* Internal error                          */
-#define DID_RESET       0x08   /* Reset by somebody.                      */
-#define DID_BAD_INTR    0x09   /* Got an interrupt we weren't expecting.  */
-#define DID_PASSTHROUGH 0x0a   /* Force command past mid-layer            */
-#define DID_SOFT_ERROR  0x0b   /* The low level driver just wish a retry  */
-#define DID_IMM_RETRY   0x0c   /* Retry without decrementing retry count  */
-#define DID_REQUEUE    0x0d    /* Requeue command (no immediate retry) also
-                                * without decrementing the retry count    */
-#define DID_TRANSPORT_DISRUPTED 0x0e /* Transport error disrupted execution
-                                     * and the driver blocked the port to
-                                     * recover the link. Transport class will
-                                     * retry or fail IO */
-#define DID_TRANSPORT_FAILFAST 0x0f /* Transport class fastfailed the io */
-#define DID_TARGET_FAILURE 0x10 /* Permanent target failure, do not retry on
-                                * other paths */
-#define DID_NEXUS_FAILURE 0x11  /* Permanent nexus failure, retry on other
-                                * paths might yield different results */
-#define DID_ALLOC_FAILURE 0x12  /* Space allocation on the device failed */
-#define DID_MEDIUM_ERROR  0x13  /* Medium error */
-#define DID_TRANSPORT_MARGINAL 0x14 /* Transport marginal errors */
-#define DRIVER_OK       0x00   /* Driver status                           */
 
 /*
  * Internal return values.
index cb218a576bcf3c98039c46083fcdd9b705a57e08..f017843a8124fe75c0ab99d3d3045873c75086f5 100644 (file)
@@ -190,17 +190,19 @@ struct scsi_varlen_cdb_hdr {
  *  SCSI Architecture Model (SAM) Status codes. Taken from SAM-3 draft
  *  T10/1561-D Revision 4 Draft dated 7th November 2002.
  */
-#define SAM_STAT_GOOD            0x00
-#define SAM_STAT_CHECK_CONDITION 0x02
-#define SAM_STAT_CONDITION_MET   0x04
-#define SAM_STAT_BUSY            0x08
-#define SAM_STAT_INTERMEDIATE    0x10
-#define SAM_STAT_INTERMEDIATE_CONDITION_MET 0x14
-#define SAM_STAT_RESERVATION_CONFLICT 0x18
-#define SAM_STAT_COMMAND_TERMINATED 0x22       /* obsolete in SAM-3 */
-#define SAM_STAT_TASK_SET_FULL   0x28
-#define SAM_STAT_ACA_ACTIVE      0x30
-#define SAM_STAT_TASK_ABORTED    0x40
+enum sam_status {
+       SAM_STAT_GOOD                           = 0x00,
+       SAM_STAT_CHECK_CONDITION                = 0x02,
+       SAM_STAT_CONDITION_MET                  = 0x04,
+       SAM_STAT_BUSY                           = 0x08,
+       SAM_STAT_INTERMEDIATE                   = 0x10,
+       SAM_STAT_INTERMEDIATE_CONDITION_MET     = 0x14,
+       SAM_STAT_RESERVATION_CONFLICT           = 0x18,
+       SAM_STAT_COMMAND_TERMINATED             = 0x22, /* obsolete in SAM-3 */
+       SAM_STAT_TASK_SET_FULL                  = 0x28,
+       SAM_STAT_ACA_ACTIVE                     = 0x30,
+       SAM_STAT_TASK_ABORTED                   = 0x40,
+};
 
 #define STATUS_MASK         0xfe
 /*
diff --git a/include/scsi/scsi_status.h b/include/scsi/scsi_status.h
new file mode 100644 (file)
index 0000000..31d30ce
--- /dev/null
@@ -0,0 +1,74 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#ifndef _SCSI_SCSI_STATUS_H
+#define _SCSI_SCSI_STATUS_H
+
+#include <linux/types.h>
+#include <scsi/scsi_proto.h>
+
+/* Message codes. */
+enum scsi_msg_byte {
+       COMMAND_COMPLETE        = 0x00,
+       EXTENDED_MESSAGE        = 0x01,
+       SAVE_POINTERS           = 0x02,
+       RESTORE_POINTERS        = 0x03,
+       DISCONNECT              = 0x04,
+       INITIATOR_ERROR         = 0x05,
+       ABORT_TASK_SET          = 0x06,
+       MESSAGE_REJECT          = 0x07,
+       NOP                     = 0x08,
+       MSG_PARITY_ERROR        = 0x09,
+       LINKED_CMD_COMPLETE     = 0x0a,
+       LINKED_FLG_CMD_COMPLETE = 0x0b,
+       TARGET_RESET            = 0x0c,
+       ABORT_TASK              = 0x0d,
+       CLEAR_TASK_SET          = 0x0e,
+       INITIATE_RECOVERY       = 0x0f,            /* SCSI-II only */
+       RELEASE_RECOVERY        = 0x10,            /* SCSI-II only */
+       TERMINATE_IO_PROC       = 0x11,            /* SCSI-II only */
+       CLEAR_ACA               = 0x16,
+       LOGICAL_UNIT_RESET      = 0x17,
+       SIMPLE_QUEUE_TAG        = 0x20,
+       HEAD_OF_QUEUE_TAG       = 0x21,
+       ORDERED_QUEUE_TAG       = 0x22,
+       IGNORE_WIDE_RESIDUE     = 0x23,
+       ACA                     = 0x24,
+       QAS_REQUEST             = 0x55,
+
+       /* Old SCSI2 names, don't use in new code */
+       BUS_DEVICE_RESET        = TARGET_RESET,
+       ABORT                   = ABORT_TASK_SET,
+};
+
+/* Host byte codes. */
+enum scsi_host_status {
+       DID_OK          = 0x00, /* NO error                                */
+       DID_NO_CONNECT  = 0x01, /* Couldn't connect before timeout period  */
+       DID_BUS_BUSY    = 0x02, /* BUS stayed busy through time out period */
+       DID_TIME_OUT    = 0x03, /* TIMED OUT for other reason              */
+       DID_BAD_TARGET  = 0x04, /* BAD target.                             */
+       DID_ABORT       = 0x05, /* Told to abort for some other reason     */
+       DID_PARITY      = 0x06, /* Parity error                            */
+       DID_ERROR       = 0x07, /* Internal error                          */
+       DID_RESET       = 0x08, /* Reset by somebody.                      */
+       DID_BAD_INTR    = 0x09, /* Got an interrupt we weren't expecting.  */
+       DID_PASSTHROUGH = 0x0a, /* Force command past mid-layer            */
+       DID_SOFT_ERROR  = 0x0b, /* The low level driver just wish a retry  */
+       DID_IMM_RETRY   = 0x0c, /* Retry without decrementing retry count  */
+       DID_REQUEUE     = 0x0d, /* Requeue command (no immediate retry) also
+                                * without decrementing the retry count    */
+       DID_TRANSPORT_DISRUPTED = 0x0e, /* Transport error disrupted execution
+                                        * and the driver blocked the port to
+                                        * recover the link. Transport class will
+                                        * retry or fail IO */
+       DID_TRANSPORT_FAILFAST = 0x0f, /* Transport class fastfailed the io */
+       DID_TARGET_FAILURE = 0x10, /* Permanent target failure, do not retry on
+                                   * other paths */
+       DID_NEXUS_FAILURE = 0x11,  /* Permanent nexus failure, retry on other
+                                   * paths might yield different results */
+       DID_ALLOC_FAILURE = 0x12,  /* Space allocation on the device failed */
+       DID_MEDIUM_ERROR = 0x13,  /* Medium error */
+       DID_TRANSPORT_MARGINAL = 0x14, /* Transport marginal errors */
+};
+
+#endif /* _SCSI_SCSI_STATUS_H */