target: Report bad sector in sense data for DIF errors

SPC-4 states that data-integrity errors shall also report
the failed sector in CHECK_CONDITION response sense data
information field.

Signed-off-by: Sagi Grimberg <sagig@mellanox.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>

authored by Sagi Grimberg and committed by Nicholas Bellinger 76736db3 676687c6

+22 -1
+2
drivers/target/target_core_sbc.c
··· 1131 if (rc) { 1132 kunmap_atomic(paddr); 1133 kunmap_atomic(daddr); 1134 return rc; 1135 } 1136 ··· 1192 if (rc) { 1193 kunmap_atomic(paddr); 1194 kunmap_atomic(daddr); 1195 return rc; 1196 } 1197
··· 1131 if (rc) { 1132 kunmap_atomic(paddr); 1133 kunmap_atomic(daddr); 1134 + cmd->bad_sector = sector; 1135 return rc; 1136 } 1137 ··· 1191 if (rc) { 1192 kunmap_atomic(paddr); 1193 kunmap_atomic(daddr); 1194 + cmd->bad_sector = sector; 1195 return rc; 1196 } 1197
+16
drivers/target/target_core_transport.c
··· 2493 return 0; 2494 } 2495 2496 int 2497 transport_send_check_condition_and_sense(struct se_cmd *cmd, 2498 sense_reason_t reason, int from_transport) ··· 2708 /* LOGICAL BLOCK GUARD CHECK FAILED */ 2709 buffer[SPC_ASC_KEY_OFFSET] = 0x10; 2710 buffer[SPC_ASCQ_KEY_OFFSET] = 0x01; 2711 break; 2712 case TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED: 2713 /* CURRENT ERROR */ ··· 2719 /* LOGICAL BLOCK APPLICATION TAG CHECK FAILED */ 2720 buffer[SPC_ASC_KEY_OFFSET] = 0x10; 2721 buffer[SPC_ASCQ_KEY_OFFSET] = 0x02; 2722 break; 2723 case TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED: 2724 /* CURRENT ERROR */ ··· 2730 /* LOGICAL BLOCK REFERENCE TAG CHECK FAILED */ 2731 buffer[SPC_ASC_KEY_OFFSET] = 0x10; 2732 buffer[SPC_ASCQ_KEY_OFFSET] = 0x03; 2733 break; 2734 case TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE: 2735 default:
··· 2493 return 0; 2494 } 2495 2496 + static 2497 + void transport_err_sector_info(unsigned char *buffer, sector_t bad_sector) 2498 + { 2499 + /* Place failed LBA in sense data information descriptor 0. */ 2500 + buffer[SPC_ADD_SENSE_LEN_OFFSET] = 0xc; 2501 + buffer[SPC_DESC_TYPE_OFFSET] = 0; /* Information */ 2502 + buffer[SPC_ADDITIONAL_DESC_LEN_OFFSET] = 0xa; 2503 + buffer[SPC_VALIDITY_OFFSET] = 0x80; 2504 + 2505 + /* Descriptor Information: failing sector */ 2506 + put_unaligned_be64(bad_sector, &buffer[12]); 2507 + } 2508 + 2509 int 2510 transport_send_check_condition_and_sense(struct se_cmd *cmd, 2511 sense_reason_t reason, int from_transport) ··· 2695 /* LOGICAL BLOCK GUARD CHECK FAILED */ 2696 buffer[SPC_ASC_KEY_OFFSET] = 0x10; 2697 buffer[SPC_ASCQ_KEY_OFFSET] = 0x01; 2698 + transport_err_sector_info(buffer, cmd->bad_sector); 2699 break; 2700 case TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED: 2701 /* CURRENT ERROR */ ··· 2705 /* LOGICAL BLOCK APPLICATION TAG CHECK FAILED */ 2706 buffer[SPC_ASC_KEY_OFFSET] = 0x10; 2707 buffer[SPC_ASCQ_KEY_OFFSET] = 0x02; 2708 + transport_err_sector_info(buffer, cmd->bad_sector); 2709 break; 2710 case TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED: 2711 /* CURRENT ERROR */ ··· 2715 /* LOGICAL BLOCK REFERENCE TAG CHECK FAILED */ 2716 buffer[SPC_ASC_KEY_OFFSET] = 0x10; 2717 buffer[SPC_ASCQ_KEY_OFFSET] = 0x03; 2718 + transport_err_sector_info(buffer, cmd->bad_sector); 2719 break; 2720 case TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE: 2721 default:
+4 -1
include/target/target_core_base.h
··· 37 /* Used by transport_send_check_condition_and_sense() */ 38 #define SPC_SENSE_KEY_OFFSET 2 39 #define SPC_ADD_SENSE_LEN_OFFSET 7 40 #define SPC_ASC_KEY_OFFSET 12 41 #define SPC_ASCQ_KEY_OFFSET 13 42 #define TRANSPORT_IQN_LEN 224 ··· 563 unsigned int t_prot_nents; 564 enum target_prot_ho prot_handover; 565 sense_reason_t pi_err; 566 - u32 block_num; 567 }; 568 569 struct se_ua {
··· 37 /* Used by transport_send_check_condition_and_sense() */ 38 #define SPC_SENSE_KEY_OFFSET 2 39 #define SPC_ADD_SENSE_LEN_OFFSET 7 40 + #define SPC_DESC_TYPE_OFFSET 8 41 + #define SPC_ADDITIONAL_DESC_LEN_OFFSET 9 42 + #define SPC_VALIDITY_OFFSET 10 43 #define SPC_ASC_KEY_OFFSET 12 44 #define SPC_ASCQ_KEY_OFFSET 13 45 #define TRANSPORT_IQN_LEN 224 ··· 560 unsigned int t_prot_nents; 561 enum target_prot_ho prot_handover; 562 sense_reason_t pi_err; 563 + sector_t bad_sector; 564 }; 565 566 struct se_ua {