Skip to content

Commit 76736db

Browse files
Sagi GrimbergNicholas Bellinger
authored andcommitted
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>
1 parent 676687c commit 76736db

File tree

3 files changed

+22
-1
lines changed

3 files changed

+22
-1
lines changed

drivers/target/target_core_sbc.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1131,6 +1131,7 @@ sbc_dif_verify_write(struct se_cmd *cmd, sector_t start, unsigned int sectors,
11311131
if (rc) {
11321132
kunmap_atomic(paddr);
11331133
kunmap_atomic(daddr);
1134+
cmd->bad_sector = sector;
11341135
return rc;
11351136
}
11361137

@@ -1191,6 +1192,7 @@ sbc_dif_verify_read(struct se_cmd *cmd, sector_t start, unsigned int sectors,
11911192
if (rc) {
11921193
kunmap_atomic(paddr);
11931194
kunmap_atomic(daddr);
1195+
cmd->bad_sector = sector;
11941196
return rc;
11951197
}
11961198

drivers/target/target_core_transport.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2493,6 +2493,19 @@ static int transport_get_sense_codes(
24932493
return 0;
24942494
}
24952495

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+
24962509
int
24972510
transport_send_check_condition_and_sense(struct se_cmd *cmd,
24982511
sense_reason_t reason, int from_transport)
@@ -2695,6 +2708,7 @@ transport_send_check_condition_and_sense(struct se_cmd *cmd,
26952708
/* LOGICAL BLOCK GUARD CHECK FAILED */
26962709
buffer[SPC_ASC_KEY_OFFSET] = 0x10;
26972710
buffer[SPC_ASCQ_KEY_OFFSET] = 0x01;
2711+
transport_err_sector_info(buffer, cmd->bad_sector);
26982712
break;
26992713
case TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED:
27002714
/* CURRENT ERROR */
@@ -2705,6 +2719,7 @@ transport_send_check_condition_and_sense(struct se_cmd *cmd,
27052719
/* LOGICAL BLOCK APPLICATION TAG CHECK FAILED */
27062720
buffer[SPC_ASC_KEY_OFFSET] = 0x10;
27072721
buffer[SPC_ASCQ_KEY_OFFSET] = 0x02;
2722+
transport_err_sector_info(buffer, cmd->bad_sector);
27082723
break;
27092724
case TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED:
27102725
/* CURRENT ERROR */
@@ -2715,6 +2730,7 @@ transport_send_check_condition_and_sense(struct se_cmd *cmd,
27152730
/* LOGICAL BLOCK REFERENCE TAG CHECK FAILED */
27162731
buffer[SPC_ASC_KEY_OFFSET] = 0x10;
27172732
buffer[SPC_ASCQ_KEY_OFFSET] = 0x03;
2733+
transport_err_sector_info(buffer, cmd->bad_sector);
27182734
break;
27192735
case TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE:
27202736
default:

include/target/target_core_base.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@
3737
/* Used by transport_send_check_condition_and_sense() */
3838
#define SPC_SENSE_KEY_OFFSET 2
3939
#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
4043
#define SPC_ASC_KEY_OFFSET 12
4144
#define SPC_ASCQ_KEY_OFFSET 13
4245
#define TRANSPORT_IQN_LEN 224
@@ -560,7 +563,7 @@ struct se_cmd {
560563
unsigned int t_prot_nents;
561564
enum target_prot_ho prot_handover;
562565
sense_reason_t pi_err;
563-
u32 block_num;
566+
sector_t bad_sector;
564567
};
565568

566569
struct se_ua {

0 commit comments

Comments
 (0)