diff options
author | Nicholas Bellinger <nab@linux-iscsi.org> | 2014-01-07 18:39:33 -0500 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2014-01-18 04:53:11 -0500 |
commit | fcc4f17b9ce931c93ce08f8cf27d6bd010f0b1ef (patch) | |
tree | 7c6f4592517c40b1bbce5f48af07dca864891a4d | |
parent | ce65e5b97b19446ff91e9ee0bbcd9f8b8e87ae5a (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.c | 30 | ||||
-rw-r--r-- | include/target/target_core_base.h | 3 |
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 | ||