On Thu, 2014-01-23 at 19:29 +0200, Sagi Grimberg wrote: > 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@xxxxxxxxxxxx> > --- Applied to target-pending/for-next. Thanks Sagi! --nab > drivers/target/target_core_sbc.c | 2 ++ > drivers/target/target_core_transport.c | 16 ++++++++++++++++ > include/target/target_core_base.h | 5 ++++- > 3 files changed, 22 insertions(+), 1 deletions(-) > > diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c > index f5a736e..e93ada4 100644 > --- a/drivers/target/target_core_sbc.c > +++ b/drivers/target/target_core_sbc.c > @@ -1107,6 +1107,7 @@ sbc_dif_verify_write(struct se_cmd *cmd, sector_t start, unsigned int sectors, > if (rc) { > kunmap_atomic(paddr); > kunmap_atomic(daddr); > + cmd->bad_sector = sector; > return rc; > } > > @@ -1166,6 +1167,7 @@ sbc_dif_verify_read(struct se_cmd *cmd, sector_t start, unsigned int sectors, > if (rc) { > kunmap_atomic(paddr); > kunmap_atomic(daddr); > + cmd->bad_sector = sector; > return rc; > } > > diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c > index aebe0bb..51a9736 100644 > --- a/drivers/target/target_core_transport.c > +++ b/drivers/target/target_core_transport.c > @@ -2493,6 +2493,19 @@ static int transport_get_sense_codes( > return 0; > } > > +static > +void transport_err_sector_info(unsigned char *buffer, sector_t bad_sector) > +{ > + /* Place failed LBA in sense data information descriptor 0. */ > + buffer[SPC_ADD_SENSE_LEN_OFFSET] = 0xc; > + buffer[SPC_DESC_TYPE_OFFSET] = 0; /* Information */ > + buffer[SPC_ADDITIONAL_DESC_LEN_OFFSET] = 0xa; > + buffer[SPC_VALIDITY_OFFSET] = 0x80; > + > + /* Descriptor Information: failing sector */ > + put_unaligned_be64(bad_sector, &buffer[12]); > +} > + > int > transport_send_check_condition_and_sense(struct se_cmd *cmd, > sense_reason_t reason, int from_transport) > @@ -2695,6 +2708,7 @@ transport_send_check_condition_and_sense(struct se_cmd *cmd, > /* LOGICAL BLOCK GUARD CHECK FAILED */ > buffer[SPC_ASC_KEY_OFFSET] = 0x10; > buffer[SPC_ASCQ_KEY_OFFSET] = 0x01; > + transport_err_sector_info(buffer, cmd->bad_sector); > break; > case TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED: > /* CURRENT ERROR */ > @@ -2705,6 +2719,7 @@ transport_send_check_condition_and_sense(struct se_cmd *cmd, > /* LOGICAL BLOCK APPLICATION TAG CHECK FAILED */ > buffer[SPC_ASC_KEY_OFFSET] = 0x10; > buffer[SPC_ASCQ_KEY_OFFSET] = 0x02; > + transport_err_sector_info(buffer, cmd->bad_sector); > break; > case TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED: > /* CURRENT ERROR */ > @@ -2715,6 +2730,7 @@ transport_send_check_condition_and_sense(struct se_cmd *cmd, > /* LOGICAL BLOCK REFERENCE TAG CHECK FAILED */ > buffer[SPC_ASC_KEY_OFFSET] = 0x10; > buffer[SPC_ASCQ_KEY_OFFSET] = 0x03; > + transport_err_sector_info(buffer, cmd->bad_sector); > break; > case TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE: > default: > diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h > index 5165cf7..9431ca2 100644 > --- a/include/target/target_core_base.h > +++ b/include/target/target_core_base.h > @@ -37,6 +37,9 @@ > /* Used by transport_send_check_condition_and_sense() */ > #define SPC_SENSE_KEY_OFFSET 2 > #define SPC_ADD_SENSE_LEN_OFFSET 7 > +#define SPC_DESC_TYPE_OFFSET 8 > +#define SPC_ADDITIONAL_DESC_LEN_OFFSET 9 > +#define SPC_VALIDITY_OFFSET 10 > #define SPC_ASC_KEY_OFFSET 12 > #define SPC_ASCQ_KEY_OFFSET 13 > #define TRANSPORT_IQN_LEN 224 > @@ -573,7 +576,7 @@ struct se_cmd { > unsigned int t_prot_nents; > enum target_prot_ho prot_handover; > sense_reason_t pi_err; > - u32 block_num; > + sector_t bad_sector; > }; > > struct se_ua { -- To unsubscribe from this list: send the line "unsubscribe target-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html