aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicholas Bellinger <nab@linux-iscsi.org>2014-01-07 18:39:33 -0500
committerNicholas Bellinger <nab@linux-iscsi.org>2014-01-18 04:53:11 -0500
commitfcc4f17b9ce931c93ce08f8cf27d6bd010f0b1ef (patch)
tree7c6f4592517c40b1bbce5f48af07dca864891a4d
parentce65e5b97b19446ff91e9ee0bbcd9f8b8e87ae5a (diff)
target: Add DIF CHECK_CONDITION ASC/ASCQ exception cases
This patch adds support for DIF related CHECK_CONDITION ASC/ASCQ exception cases into transport_send_check_condition_and_sense(). This includes: LOGICAL BLOCK GUARD CHECK FAILED LOGICAL BLOCK APPLICATION TAG CHECK FAILED LOGICAL BLOCK REFERENCE TAG CHECK FAILED that used by DIF TYPE1 and TYPE3 failure cases. Cc: Martin K. Petersen <martin.petersen@oracle.com> Cc: Christoph Hellwig <hch@lst.de> Cc: Hannes Reinecke <hare@suse.de> Cc: Sagi Grimberg <sagig@mellanox.com> Cc: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
-rw-r--r--drivers/target/target_core_transport.c30
-rw-r--r--include/target/target_core_base.h3
2 files changed, 33 insertions, 0 deletions
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
index 18c828dc3b9e..fa4fc0429452 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -2674,6 +2674,36 @@ transport_send_check_condition_and_sense(struct se_cmd *cmd,
2674 buffer[SPC_ASC_KEY_OFFSET] = 0x1d; 2674 buffer[SPC_ASC_KEY_OFFSET] = 0x1d;
2675 buffer[SPC_ASCQ_KEY_OFFSET] = 0x00; 2675 buffer[SPC_ASCQ_KEY_OFFSET] = 0x00;
2676 break; 2676 break;
2677 case TCM_LOGICAL_BLOCK_GUARD_CHECK_FAILED:
2678 /* CURRENT ERROR */
2679 buffer[0] = 0x70;
2680 buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10;
2681 /* ILLEGAL REQUEST */
2682 buffer[SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST;
2683 /* LOGICAL BLOCK GUARD CHECK FAILED */
2684 buffer[SPC_ASC_KEY_OFFSET] = 0x10;
2685 buffer[SPC_ASCQ_KEY_OFFSET] = 0x01;
2686 break;
2687 case TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED:
2688 /* CURRENT ERROR */
2689 buffer[0] = 0x70;
2690 buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10;
2691 /* ILLEGAL REQUEST */
2692 buffer[SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST;
2693 /* LOGICAL BLOCK APPLICATION TAG CHECK FAILED */
2694 buffer[SPC_ASC_KEY_OFFSET] = 0x10;
2695 buffer[SPC_ASCQ_KEY_OFFSET] = 0x02;
2696 break;
2697 case TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED:
2698 /* CURRENT ERROR */
2699 buffer[0] = 0x70;
2700 buffer[SPC_ADD_SENSE_LEN_OFFSET] = 10;
2701 /* ILLEGAL REQUEST */
2702 buffer[SPC_SENSE_KEY_OFFSET] = ILLEGAL_REQUEST;
2703 /* LOGICAL BLOCK REFERENCE TAG CHECK FAILED */
2704 buffer[SPC_ASC_KEY_OFFSET] = 0x10;
2705 buffer[SPC_ASCQ_KEY_OFFSET] = 0x03;
2706 break;
2677 case TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE: 2707 case TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE:
2678 default: 2708 default:
2679 /* CURRENT ERROR */ 2709 /* CURRENT ERROR */
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h
index d98048b97fe3..0336d70d0d9f 100644
--- a/include/target/target_core_base.h
+++ b/include/target/target_core_base.h
@@ -205,6 +205,9 @@ enum tcm_sense_reason_table {
205 TCM_OUT_OF_RESOURCES = R(0x12), 205 TCM_OUT_OF_RESOURCES = R(0x12),
206 TCM_PARAMETER_LIST_LENGTH_ERROR = R(0x13), 206 TCM_PARAMETER_LIST_LENGTH_ERROR = R(0x13),
207 TCM_MISCOMPARE_VERIFY = R(0x14), 207 TCM_MISCOMPARE_VERIFY = R(0x14),
208 TCM_LOGICAL_BLOCK_GUARD_CHECK_FAILED = R(0x15),
209 TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED = R(0x16),
210 TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED = R(0x17),
208#undef R 211#undef R
209}; 212};
210 213