Re: [PATCH v4 2/5] target: Split transport_send_check_condition_and_sense()

2015-07-09 Thread Martin K. Petersen
 Sagi == Sagi Grimberg sa...@mellanox.com writes:

Sagi From: Bart Van Assche bart.vanass...@sandisk.com Move the code
Sagi for translating a sense_reason_t code into a SCSI status ASC and
Sagi ASCQ codes from transport_send_check_condition_and_sense() into
Sagi the new function translate_sense_reason(). Convert the switch
Sagi statement that performs the translation into table-driven code.

Reviewed-by: Martin K. Petersen martin.peter...@oracle.com

-- 
Martin K. Petersen  Oracle Linux Engineering
--
To unsubscribe from this list: send the line unsubscribe linux-scsi in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v4 2/5] target: Split transport_send_check_condition_and_sense()

2015-07-08 Thread Sagi Grimberg
From: Bart Van Assche bart.vanass...@sandisk.com

Move the code for translating a sense_reason_t code into a SCSI status
ASC and ASCQ codes from transport_send_check_condition_and_sense() into
the new function translate_sense_reason(). Convert the switch statement
that performs the translation into table-driven code.

Signed-off-by: Bart Van Assche bart.vanass...@sandisk.com
Signed-off-by: Sagi Grimberg sa...@mellanox.com
Reviewed-by: Hannes Reinecke h...@suse.de
Reviewed-by: Christoph Hellwig h...@lst.de
---
 drivers/target/target_core_transport.c | 383 +
 1 file changed, 148 insertions(+), 235 deletions(-)

diff --git a/drivers/target/target_core_transport.c 
b/drivers/target/target_core_transport.c
index e895156..31373f3 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -2633,13 +2633,155 @@ void transport_err_sector_info(unsigned char *buffer, 
sector_t bad_sector)
put_unaligned_be64(bad_sector, buffer[12]);
 }
 
+struct sense_info {
+   u8 key;
+   u8 asc;
+   u8 ascq;
+   bool add_sector_info;
+};
+
+static const struct sense_info sense_info_table[] = {
+   [TCM_NO_SENSE] = {
+   .key = NOT_READY
+   },
+   [TCM_NON_EXISTENT_LUN] = {
+   .key = ILLEGAL_REQUEST,
+   .asc = 0x25 /* LOGICAL UNIT NOT SUPPORTED */
+   },
+   [TCM_UNSUPPORTED_SCSI_OPCODE] = {
+   .key = ILLEGAL_REQUEST,
+   .asc = 0x20, /* INVALID COMMAND OPERATION CODE */
+   },
+   [TCM_SECTOR_COUNT_TOO_MANY] = {
+   .key = ILLEGAL_REQUEST,
+   .asc = 0x20, /* INVALID COMMAND OPERATION CODE */
+   },
+   [TCM_UNKNOWN_MODE_PAGE] = {
+   .key = ILLEGAL_REQUEST,
+   .asc = 0x24, /* INVALID FIELD IN CDB */
+   },
+   [TCM_CHECK_CONDITION_ABORT_CMD] = {
+   .key = ABORTED_COMMAND,
+   .asc = 0x29, /* BUS DEVICE RESET FUNCTION OCCURRED */
+   .ascq = 0x03,
+   },
+   [TCM_INCORRECT_AMOUNT_OF_DATA] = {
+   .key = ABORTED_COMMAND,
+   .asc = 0x0c, /* WRITE ERROR */
+   .ascq = 0x0d, /* NOT ENOUGH UNSOLICITED DATA */
+   },
+   [TCM_INVALID_CDB_FIELD] = {
+   .key = ILLEGAL_REQUEST,
+   .asc = 0x24, /* INVALID FIELD IN CDB */
+   },
+   [TCM_INVALID_PARAMETER_LIST] = {
+   .key = ILLEGAL_REQUEST,
+   .asc = 0x26, /* INVALID FIELD IN PARAMETER LIST */
+   },
+   [TCM_PARAMETER_LIST_LENGTH_ERROR] = {
+   .key = ILLEGAL_REQUEST,
+   .asc = 0x1a, /* PARAMETER LIST LENGTH ERROR */
+   },
+   [TCM_UNEXPECTED_UNSOLICITED_DATA] = {
+   .key = ILLEGAL_REQUEST,
+   .asc = 0x0c, /* WRITE ERROR */
+   .ascq = 0x0c, /* UNEXPECTED_UNSOLICITED_DATA */
+   },
+   [TCM_SERVICE_CRC_ERROR] = {
+   .key = ABORTED_COMMAND,
+   .asc = 0x47, /* PROTOCOL SERVICE CRC ERROR */
+   .ascq = 0x05, /* N/A */
+   },
+   [TCM_SNACK_REJECTED] = {
+   .key = ABORTED_COMMAND,
+   .asc = 0x11, /* READ ERROR */
+   .ascq = 0x13, /* FAILED RETRANSMISSION REQUEST */
+   },
+   [TCM_WRITE_PROTECTED] = {
+   .key = DATA_PROTECT,
+   .asc = 0x27, /* WRITE PROTECTED */
+   },
+   [TCM_ADDRESS_OUT_OF_RANGE] = {
+   .key = ILLEGAL_REQUEST,
+   .asc = 0x21, /* LOGICAL BLOCK ADDRESS OUT OF RANGE */
+   },
+   [TCM_CHECK_CONDITION_UNIT_ATTENTION] = {
+   .key = UNIT_ATTENTION,
+   },
+   [TCM_CHECK_CONDITION_NOT_READY] = {
+   .key = NOT_READY,
+   },
+   [TCM_MISCOMPARE_VERIFY] = {
+   .key = MISCOMPARE,
+   .asc = 0x1d, /* MISCOMPARE DURING VERIFY OPERATION */
+   .ascq = 0x00,
+   },
+   [TCM_LOGICAL_BLOCK_GUARD_CHECK_FAILED] = {
+   .key = ILLEGAL_REQUEST,
+   .asc = 0x10,
+   .ascq = 0x01, /* LOGICAL BLOCK GUARD CHECK FAILED */
+   .add_sector_info = true,
+   },
+   [TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED] = {
+   .key = ILLEGAL_REQUEST,
+   .asc = 0x10,
+   .ascq = 0x02, /* LOGICAL BLOCK APPLICATION TAG CHECK FAILED */
+   .add_sector_info = true,
+   },
+   [TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED] = {
+   .key = ILLEGAL_REQUEST,
+   .asc = 0x10,
+   .ascq = 0x03, /* LOGICAL BLOCK REFERENCE TAG CHECK FAILED */
+   .add_sector_info = true,
+   },
+   [TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE] = {
+   /*
+* Returning ILLEGAL REQUEST would cause immediate IO errors on
+* Solaris initiators.  Returning NOT READY instead means the
+* operations will be retried