[stgt] [PATCH 1/3] SBC: Add basic WRITE_SAME(10) support (no UNMAP support yet)

FUJITA Tomonori fujita.tomonori at lab.ntt.co.jp
Sun Apr 22 03:36:34 CEST 2012


On Wed, 18 Apr 2012 19:30:40 +1000
Ronnie Sahlberg <ronniesahlberg at gmail.com> wrote:

> 
> Signed-off-by: Ronnie Sahlberg <ronniesahlberg at gmail.com>
> ---
>  usr/bs_rdwr.c |   24 ++++++++++++++++++++++++
>  usr/sbc.c     |   17 ++++++++++++++++-
>  usr/scsi.c    |    2 ++
>  3 files changed, 42 insertions(+), 1 deletions(-)

What happens if bs_aio.c is used? It would be great if both support
this. At least, bs_aio.c can return a proper error if it gets
WRITE_SAME*?


> diff --git a/usr/bs_rdwr.c b/usr/bs_rdwr.c
> index fbc9a2c..e4456fc 100644
> --- a/usr/bs_rdwr.c
> +++ b/usr/bs_rdwr.c
> @@ -65,6 +65,7 @@ static void bs_rdwr_request(struct scsi_cmd *cmd)
>  	uint8_t key;
>  	uint16_t asc;
>  	char *tmpbuf;
> +	size_t blocksize;
>  
>  	ret = length = 0;
>  	key = asc = 0;
> @@ -109,6 +110,29 @@ static void bs_rdwr_request(struct scsi_cmd *cmd)
>  				      POSIX_FADV_NOREUSE);
>  
>  		break;
> +	case WRITE_SAME:
> +		while (cmd->tl > 0) {
> +			blocksize = 1 << cmd->dev->blk_shift;
> +			tmpbuf = scsi_get_out_buffer(cmd);
> +
> +			switch(cmd->scb[1] & 0x06) {
> +			case 0x02: /* PBDATA==0 LBDATA==1 */
> +				put_unaligned_be32(cmd->offset, tmpbuf);
> +				break;
> +			case 0x04: /* PBDATA==1 LBDATA==0 */
> +				/* physical sector format */
> +				put_unaligned_be64(cmd->offset, tmpbuf);
> +				break;
> +			}
> +
> +			ret = pwrite64(fd, tmpbuf, blocksize, cmd->offset);
> +			if (ret != blocksize)
> +				set_medium_error(&result, &key, &asc);
> +
> +			cmd->offset += blocksize;
> +			cmd->tl     -= blocksize;

Can we avoid changing the above? I can't recall the core code reuse
them after submitting a command to backing store but I think that
backing store code shouldn't touch them.


> +		}
> +		break;
>  	case READ_6:
>  	case READ_10:
>  	case READ_12:
> diff --git a/usr/sbc.c b/usr/sbc.c
> index 55145cf..cf72e65 100644
> --- a/usr/sbc.c
> +++ b/usr/sbc.c
> @@ -228,6 +228,20 @@ static int sbc_rw(int host_no, struct scsi_cmd *cmd)
>  			goto sense;
>  		}
>  		break;
> +	case WRITE_SAME:
> +		/* We only support protection information type 0 */
> +		if (cmd->scb[1] & 0xe0) {
> +			key = ILLEGAL_REQUEST;
> +			asc = ASC_INVALID_FIELD_IN_CDB;
> +			goto sense;
> +		}
> +		/* LBDATA and PBDATA can not both be set */
> +		if ((cmd->scb[1] & 0x06) == 0x06) {
> +			key = ILLEGAL_REQUEST;
> +			asc = ASC_INVALID_FIELD_IN_CDB;
> +			goto sense;
> +		}
> +		break;
>  	}
>  
>  	if (lu->attrs.readonly) {
> @@ -236,6 +250,7 @@ static int sbc_rw(int host_no, struct scsi_cmd *cmd)
>  		case WRITE_10:
>  		case WRITE_12:
>  		case WRITE_16:
> +		case WRITE_SAME:
>  		case PRE_FETCH_10:
>  		case PRE_FETCH_16:
>  			key = DATA_PROTECT;
> @@ -607,7 +622,7 @@ static struct device_type_template sbc_template = {
>  
>  		/* 0x40 */
>  		{spc_illegal_op,},
> -		{spc_illegal_op,},
> +		{sbc_rw,},		/* WRITE_SAME10 */
>  		{sbc_unmap,},
>  		{spc_illegal_op,},
>  		{spc_illegal_op,},
> diff --git a/usr/scsi.c b/usr/scsi.c
> index 7802ba1..c46753e 100644
> --- a/usr/scsi.c
> +++ b/usr/scsi.c
> @@ -119,6 +119,7 @@ uint64_t scsi_rw_offset(uint8_t *scb)
>  	case WRITE_10:
>  	case VERIFY_10:
>  	case WRITE_VERIFY:
> +	case WRITE_SAME:
>  	case SYNCHRONIZE_CACHE:
>  	case READ_12:
>  	case WRITE_12:
> @@ -162,6 +163,7 @@ uint32_t scsi_rw_count(uint8_t *scb)
>  	case WRITE_10:
>  	case VERIFY_10:
>  	case WRITE_VERIFY:
> +	case WRITE_SAME:
>  	case SYNCHRONIZE_CACHE:
>  		cnt = (uint16_t)scb[7] << 8 | (uint16_t)scb[8];
>  		break;
> -- 
> 1.7.3.1
> 
> --
> To unsubscribe from this list: send the line "unsubscribe stgt" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
> 
--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html



More information about the stgt mailing list