[PATCH 111/117] Use the scsi_status union more widely

Bart Van Assche
2021-04-20T02:14:37Z

Change the type of the SCSI status argument of the following functions
from int into union scsi_status:
* scsi_status_is_good();
* status_byte();
* msg_byte();
* host_byte();
* driver_byte();
* scsi_hostbyte_string();
* scsi_driverbyte_string().

Make all callers of these functions pass a union scsi_result as argument.

Remove the scsi_status_to_int() macro.

Cc: Christoph Hellwig <hch@lst.de>
Cc: Ming Lei <ming.lei@redhat.com>
Cc: Hannes Reinecke <hare@suse.com>
Cc: John Garry <john.garry@huawei.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
drivers/scsi/constants.c | 8 ++++----
drivers/scsi/scsi_logging.c | 4 ++--
drivers/scsi/sd.c | 4 ++--
include/scsi/scsi.h | 28 +++++++---------------------
include/scsi/scsi_dbg.h | 10 ++++++----
5 files changed, 21 insertions(+), 33 deletions(-)

diff --git a/drivers/scsi/constants.c b/drivers/scsi/constants.c
index 84d73f57292b..0ea510b4ca52 100644
--- a/drivers/scsi/constants.c
+++ b/drivers/scsi/constants.c
@@ -410,10 +410,10 @@ static const char * const driverbyte_table[]={
"DRIVER_OK", "DRIVER_BUSY", "DRIVER_SOFT", "DRIVER_MEDIA", "DRIVER_ERROR",
"DRIVER_INVALID", "DRIVER_TIMEOUT", "DRIVER_HARD", "DRIVER_SENSE"};

-const char *scsi_hostbyte_string(int result)
+const char *scsi_hostbyte_string(union scsi_status result)
{
const char *hb_string = NULL;
- int hb = host_byte(result);
+ enum host_status hb = host_byte(result);

if (hb < ARRAY_SIZE(hostbyte_table))
hb_string = hostbyte_table[hb];
@@ -421,10 +421,10 @@ const char *scsi_hostbyte_string(int result)
}
EXPORT_SYMBOL(scsi_hostbyte_string);

-const char *scsi_driverbyte_string(int result)
+const char *scsi_driverbyte_string(union scsi_status result)
{
const char *db_string = NULL;
- int db = driver_byte(result);
+ enum driver_status db = driver_byte(result);

if (db < ARRAY_SIZE(driverbyte_table))
db_string = driverbyte_table[db];
diff --git a/drivers/scsi/scsi_logging.c b/drivers/scsi/scsi_logging.c
index 5c994ba1fad8..3cba3ff97559 100644
--- a/drivers/scsi/scsi_logging.c
+++ b/drivers/scsi/scsi_logging.c
@@ -384,8 +384,8 @@ 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->status.combined);
- const char *db_string = scsi_driverbyte_string(cmd->status.combined);
+ const char *hb_string = scsi_hostbyte_string(cmd->status);
+ const char *db_string = scsi_driverbyte_string(cmd->status);
unsigned long cmd_age = (jiffies - cmd->jiffies_at_alloc) / HZ;

logbuf = scsi_log_reserve_buffer(&logbuf_len);
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index 8df2f25e4129..756fe99794a7 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -3812,8 +3812,8 @@ void sd_print_sense_hdr(struct scsi_disk *sdkp, struct scsi_sense_hdr *sshdr)
void sd_print_result(const struct scsi_disk *sdkp, const char *msg,
union scsi_status result)
{
- const char *hb_string = scsi_hostbyte_string(result.combined);
- const char *db_string = scsi_driverbyte_string(result.combined);
+ const char *hb_string = scsi_hostbyte_string(result);
+ const char *db_string = scsi_driverbyte_string(result);

if (hb_string || db_string)
sd_printk(KERN_INFO, sdkp,
diff --git a/include/scsi/scsi.h b/include/scsi/scsi.h
index 18bb1fb2458f..03f047333e52 100644
--- a/include/scsi/scsi.h
+++ b/include/scsi/scsi.h
@@ -33,20 +33,20 @@ enum scsi_timeouts {

/** scsi_status_is_good - check the status return.
*
- * @status: the status passed up from the driver (including host and
+ * @scsi_status: the status passed up from the driver (including host and
* driver components)
*
* This returns true for known good conditions that may be treated as
* command completed normally
*/
-static inline bool __scsi_status_is_good(int status)
+static inline bool scsi_status_is_good(union scsi_status scsi_status)
{
/*
* FIXME: bit0 is listed as reserved in SCSI-2, but is
* significant in SCSI-3. For now, we follow the SCSI-2
* behaviour and ignore reserved bits.
*/
- status &= 0xfe;
+ const u8 status = scsi_status.combined & 0xfe;
return ((status == SAM_STAT_GOOD) ||
(status == SAM_STAT_CONDITION_MET) ||
/* Next two "intermediate" statuses are obsolete in SAM-4 */
@@ -56,20 +56,6 @@ static inline bool __scsi_status_is_good(int status)
(status == SAM_STAT_COMMAND_TERMINATED));
}

-/*
- * If the 'status' argument has type int, unsigned int or union scsi_status,
- * return the combined SCSI status. If the 'status' argument has another type,
- * trigger a compiler error by passing a struct to a context where an integer
- * is expected.
- */
-#define scsi_status_to_int(status) \
- __builtin_choose_expr(sizeof(status) == 4, \
- *(int32_t *)&(status), \
- (union scsi_status){})
-
-#define scsi_status_is_good(status) \
- __scsi_status_is_good(scsi_status_to_int(status))
-

/*
* standard mode-select header prepended to all mode-select commands
@@ -148,10 +134,10 @@ enum scsi_disposition {
* driver_byte = set by mid-level.
*/
#define status_byte(result) ((enum sam_status_divided_by_two) \
- ((scsi_status_to_int((result)) >> 1) & 0x7f))
-#define msg_byte(result) ((scsi_status_to_int((result)) >> 8) & 0xff)
-#define host_byte(result) ((scsi_status_to_int((result)) >> 16) & 0xff)
-#define driver_byte(result) ((scsi_status_to_int((result)) >> 24) & 0xff)
+ ((result).b.status >> 1))
+#define msg_byte(result) ((result).b.msg)
+#define host_byte(result) ((result).b.host)
+#define driver_byte(result) ((result).b.driver)

#define sense_class(sense) (((sense) >> 4) & 0x7)
#define sense_error(sense) ((sense) & 0xf)
diff --git a/include/scsi/scsi_dbg.h b/include/scsi/scsi_dbg.h
index 7b196d234626..d3a868b6dd89 100644
--- a/include/scsi/scsi_dbg.h
+++ b/include/scsi/scsi_dbg.h
@@ -2,6 +2,8 @@
#ifndef _SCSI_SCSI_DBG_H
#define _SCSI_SCSI_DBG_H

+#include <scsi/scsi_status.h>
+
struct scsi_cmnd;
struct scsi_device;
struct scsi_sense_hdr;
@@ -23,8 +25,8 @@ extern const char *scsi_sense_key_string(unsigned char);
extern const char *scsi_extd_sense_format(unsigned char, unsigned char,
const char **);
extern const char *scsi_mlreturn_string(int);
-extern const char *scsi_hostbyte_string(int);
-extern const char *scsi_driverbyte_string(int);
+extern const char *scsi_hostbyte_string(union scsi_status result);
+extern const char *scsi_driverbyte_string(union scsi_status result);
#else
static inline bool
scsi_opcode_sa_name(int cmd, int sa,
@@ -71,13 +73,13 @@ scsi_mlreturn_string(int result)
}

static inline const char *
-scsi_hostbyte_string(int result)
+scsi_hostbyte_string(union scsi_status result)
{
return NULL;
}

static inline const char *
-scsi_driverbyte_string(int result)
+scsi_driverbyte_string(union scsi_status result)
{
return NULL;
}