Re: [PATCH] Target/core: Report bad sector in sense data for DIF errors

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [Linux SCSI]     [Kernel Newbies]     [Linux SCSI Target Infrastructure]     [Share Photos]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Device Mapper]

  Powered by Linux