[Stgt-devel] [Patch 1/3] Rework of mnemonic ASC/ASCQ values

FUJITA Tomonori fujita.tomonori
Wed Jun 27 13:23:17 CEST 2007


From: Mark Harvey <markh794 at gmail.com>
Subject: [Stgt-devel] [Patch 1/3] Rework of mnemonic ASC/ASCQ values
Date: Sat, 23 Jun 2007 18:11:52 +1000

> >From d163aa03f036609ac5343c2d8983aba38ecec679 Mon Sep 17 00:00:00 2001
> From: Mark Harvey <markh794 at gmail.com>
> Date: Fri, 22 Jun 2007 18:20:54 +1000
> Subject: Use nmemonic codes for SENSE codes instead of numeric value.
> 
> Using nmemonic representation for ASC/ASCQ as a 16bit value.
>  - Values defined in sense_codes.h
>  - Updated sense_data_build() to accept a single 16bit
>    combined asc/ascq value.
> 
> Signed-off-by: Mark Harvey <markh794 at gmail.com>
> ---
>  usr/bs_sync.c       |    3 +-
>  usr/ibmvio/ibmvio.c |   15 ++++---
>  usr/mmc.c           |    7 ++-
>  usr/osd.c           |    5 +-
>  usr/sbc.c           |   33 +++++++++-------
>  usr/scsi.c          |   13 +++---
>  usr/sense_codes.h   |  103 +++++++++++++++++++++++++++++++++++++++++++++++++++
>  usr/spc.c           |   19 +++++----
>  usr/spt.c           |    5 +-
>  usr/tgtd.h          |    3 +-
>  10 files changed, 161 insertions(+), 45 deletions(-)
>  create mode 100644 usr/sense_codes.h
> 
> diff --git a/usr/bs_sync.c b/usr/bs_sync.c
> index 6789b5b..4986c59 100644
> --- a/usr/bs_sync.c
> +++ b/usr/bs_sync.c
> @@ -37,6 +37,7 @@
>  #include "util.h"
>  #include "tgtd.h"
>  #include "scsi.h"
> +#include "sense_codes.h"
>  
>  #define NR_WORKER_THREADS	4
>  
> @@ -161,7 +162,7 @@ static void *bs_sync_worker_fn(void *arg)
>  			eprintf("io error %p %x %d %d %" PRIu64 ", %m\n",
>  				cmd, cmd->scb[0], ret, cmd->len, cmd->offset);
>  			cmd->result = SAM_STAT_CHECK_CONDITION;
> -			sense_data_build(cmd, MEDIUM_ERROR, 0x11, 0x0);
> +			sense_data_build(cmd, MEDIUM_ERROR, ASC_READ_ERROR);
>  		}
>  
>  		pthread_mutex_lock(&info->finished_lock);
> diff --git a/usr/ibmvio/ibmvio.c b/usr/ibmvio/ibmvio.c
> index 5a2f8fe..8cfc8d6 100644
> --- a/usr/ibmvio/ibmvio.c
> +++ b/usr/ibmvio/ibmvio.c
> @@ -44,6 +44,7 @@
>  #include "target.h"
>  #include "driver.h"
>  #include "spc.h"
> +#include "sense_codes.h"
>  
>  #define GETTARGET(x) ((int)((((uint64_t)(x)) >> 56) & 0x003f))
>  #define GETBUS(x) ((int)((((uint64_t)(x)) >> 53) & 0x0007))
> @@ -140,7 +141,8 @@ static int ibmvio_inquiry(int host_no, struct scsi_cmd *cmd)
>  {
>  	int ret = SAM_STAT_CHECK_CONDITION;
>  	uint8_t *data, *scb = cmd->scb;
> -	unsigned char key = ILLEGAL_REQUEST, asc = 0x24;
> +	unsigned char key = ILLEGAL_REQUEST;
> +	uint16_t asc = ASC_INVALID_FIELD_IN_CDB;
>  
>  	if (((scb[1] & 0x3) == 0x3) || (!(scb[1] & 0x3) && scb[2]))
>  		goto sense;
> @@ -148,7 +150,7 @@ static int ibmvio_inquiry(int host_no, struct scsi_cmd *cmd)
>  	data = valloc(pagesize);
>  	if (!data) {
>  		key = HARDWARE_ERROR;
> -		asc = 0;
> +		asc = ASC_INTERNAL_TGT_FAILURE;

Just ASC_INTERNAL_FAILURE would look better?


> diff --git a/usr/scsi.c b/usr/scsi.c
> index 36722e1..5ddc94c 100644
> --- a/usr/scsi.c
> +++ b/usr/scsi.c
> @@ -38,27 +38,28 @@
>  #include "scsi.h"
>  #include "spc.h"
>  
> -void sense_data_build(struct scsi_cmd *cmd, uint8_t key, uint8_t asc, uint8_t asq)
> +void sense_data_build(struct scsi_cmd *cmd, uint8_t key, uint16_t asc)
>  {
> +	uint16_t *sense_code;
> +
>  	if (cmd->dev->attrs.sense_format) {
>  		/* descriptor format */
> +		sense_code = (uint16_t *)&cmd->sense_buffer[2];
>  
>  		cmd->sense_buffer[0] = 0x72;  /* current, not deferred */
>  		cmd->sense_buffer[1] = key;
> -		cmd->sense_buffer[2] = asc;
> -		cmd->sense_buffer[3] = asq;
>  		cmd->sense_len = 8;
>  	} else {
>  		/* fixed format */
> +		sense_code = (uint16_t *)&cmd->sense_buffer[12];
>  
>  		int len = 0xa;
> -		cmd->sense_buffer[0] = 0x70;
> +		cmd->sense_buffer[0] = 0x70;  /* current, not deferred */
>  		cmd->sense_buffer[2] = key;
>  		cmd->sense_buffer[7] = len;
> -		cmd->sense_buffer[12] = asc;
> -		cmd->sense_buffer[13] = asq;
>  		cmd->sense_len = len + 8;
>  	}
> +	*sense_code = __cpu_to_be16(asc);
>  }

This doesn't work on big-endian boxes?

I prefer more simple code like:

void sense_data_build(struct scsi_cmd *cmd, uint8_t key, uint16_t code)
{
	uint8_t asc, asq;

	asc = code >> 8;
	asq = code & 0xff;

	if (cmd->dev->attrs.sense_format) {
		cmd->sense_buffer[0] = 0x72;  /* current, not deferred */
		cmd->sense_buffer[1] = key;
		cmd->sense_buffer[2] = asc;
		cmd->sense_buffer[3] = asq;
		cmd->sense_len = 8;


>  #define        TGT_INVALID_DEV_ID      ~0ULL
> diff --git a/usr/sense_codes.h b/usr/sense_codes.h
> new file mode 100644
> index 0000000..ea8eebc
> --- /dev/null
> +++ b/usr/sense_codes.h
> @@ -0,0 +1,103 @@
> +/*
> + * The SCSI sense key Additional Sense Code / Additional Sense Code Qualifier
> + *
> + * Copyright (C) 2007 Mark Harvey markh794 at gmail dot com

How about:

+ * Copyright (C) 2007      Mark Harvey <markh794 at gmail.com>

Looks better.

I don't think camouflaging your address is useful since spammers can
find your address in the git history.



More information about the stgt mailing list