[stgt] [PATCH] Add an array that describes which opcodes are supported by the RDWR and SHEEPDOG backends.
ronnie sahlberg
ronniesahlberg at gmail.com
Wed Oct 16 18:05:17 CEST 2013
ping?
On Sat, Oct 12, 2013 at 7:38 AM, Ronnie Sahlberg
<ronniesahlberg at gmail.com> wrote:
> While RDWR supports all SBC opcodes that TGTD implement SHEEPDOG
> only supports a subset and lacks the following opcodes:
> WRITE_VERIFY10/12/16 VERIFY10/12/16 PREFETCH10/16
> WRITE_SAME10/16 UNMAP and ORWRITE
>
> This allows backends to specify which opcodes it is prepared to process
> and which commands should fail with invalid op code
> and allows SHEEPDOG backed LUNs to respond with INVALID_OP_CODE
> correctly.
>
> This is most useful for block devices where we have several different backens
> and where some backends only support a subset of the commands
>
> Signed-off-by: Ronnie Sahlberg <ronniesahlberg at gmail.com>
> ---
> usr/bs.c | 8 ++++++++
> usr/bs_rdwr.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
> usr/bs_sheepdog.c | 38 ++++++++++++++++++++++++++++++++++++++
> usr/scsi.c | 6 ++++++
> usr/tgtd.h | 1 +
> 5 files changed, 104 insertions(+), 0 deletions(-)
>
> diff --git a/usr/bs.c b/usr/bs.c
> index 636f53b..5299498 100644
> --- a/usr/bs.c
> +++ b/usr/bs.c
> @@ -463,3 +463,11 @@ int bs_thread_cmd_submit(struct scsi_cmd *cmd)
>
> return 0;
> }
> +
> +void bs_create_opcode_map(unsigned char *map, unsigned char *opcodes, int num)
> +{
> + int i;
> +
> + for (i = 0; i < num; i++)
> + map[opcodes[i]] = 1;
> +}
> diff --git a/usr/bs_rdwr.c b/usr/bs_rdwr.c
> index 47d2d99..6a88205 100644
> --- a/usr/bs_rdwr.c
> +++ b/usr/bs_rdwr.c
> @@ -412,6 +412,8 @@ static void bs_rdwr_exit(struct scsi_lu *lu)
> bs_thread_close(info);
> }
>
> +static char bs_ops_supported[256];
> +
> static struct backingstore_template rdwr_bst = {
> .bs_name = "rdwr",
> .bs_datasize = sizeof(struct bs_thread_info),
> @@ -421,9 +423,58 @@ static struct backingstore_template rdwr_bst = {
> .bs_exit = bs_rdwr_exit,
> .bs_cmd_submit = bs_thread_cmd_submit,
> .bs_oflags_supported = O_SYNC | O_DIRECT,
> + .bs_ops_supported = bs_ops_supported,
> };
>
> __attribute__((constructor)) static void bs_rdwr_constructor(void)
> {
> + static char opcodes[] = {
> + ALLOW_MEDIUM_REMOVAL,
> + COMPARE_AND_WRITE,
> + FORMAT_UNIT,
> + INQUIRY,
> + MAINT_PROTOCOL_IN,
> + MODE_SELECT,
> + MODE_SELECT_10,
> + MODE_SENSE,
> + MODE_SENSE_10,
> + ORWRITE_16,
> + PERSISTENT_RESERVE_IN,
> + PERSISTENT_RESERVE_OUT,
> + PRE_FETCH_10,
> + PRE_FETCH_16,
> + READ_10,
> + READ_12,
> + READ_16,
> + READ_6,
> + READ_CAPACITY,
> + RELEASE,
> + REPORT_LUNS,
> + REQUEST_SENSE,
> + RESERVE,
> + SEND_DIAGNOSTIC,
> + SERVICE_ACTION_IN,
> + START_STOP,
> + SYNCHRONIZE_CACHE,
> + SYNCHRONIZE_CACHE_16,
> + TEST_UNIT_READY,
> + UNMAP,
> + VERIFY_10,
> + VERIFY_12,
> + VERIFY_16,
> + WRITE_10,
> + WRITE_12,
> + WRITE_16,
> + WRITE_6,
> + WRITE_SAME,
> + WRITE_SAME_16,
> + WRITE_VERIFY,
> + WRITE_VERIFY_12,
> + WRITE_VERIFY_16
> + };
> +
> + bs_create_opcode_map(bs_ops_supported, &opcodes[0],
> + sizeof(opcodes) / sizeof(opcodes[0]));
> +
> register_backingstore_template(&rdwr_bst);
> }
> diff --git a/usr/bs_sheepdog.c b/usr/bs_sheepdog.c
> index 4b5a951..3099b58 100644
> --- a/usr/bs_sheepdog.c
> +++ b/usr/bs_sheepdog.c
> @@ -1017,6 +1017,8 @@ static void bs_sheepdog_exit(struct scsi_lu *lu)
> }
> }
>
> +static char bs_ops_supported[256];
> +
> static struct backingstore_template sheepdog_bst = {
> .bs_name = "sheepdog",
> .bs_datasize =
> @@ -1026,9 +1028,45 @@ static struct backingstore_template sheepdog_bst = {
> .bs_init = bs_sheepdog_init,
> .bs_exit = bs_sheepdog_exit,
> .bs_cmd_submit = bs_thread_cmd_submit,
> + .bs_ops_supported = bs_ops_supported,
> };
>
> __attribute__((constructor)) static void __constructor(void)
> {
> + static char opcodes[] = {
> + ALLOW_MEDIUM_REMOVAL,
> + FORMAT_UNIT,
> + INQUIRY,
> + MAINT_PROTOCOL_IN,
> + MODE_SELECT,
> + MODE_SELECT_10,
> + MODE_SENSE,
> + MODE_SENSE_10,
> + PERSISTENT_RESERVE_IN,
> + PERSISTENT_RESERVE_OUT,
> + READ_10,
> + READ_12,
> + READ_16,
> + READ_6,
> + READ_CAPACITY,
> + RELEASE,
> + REPORT_LUNS,
> + REQUEST_SENSE,
> + RESERVE,
> + SEND_DIAGNOSTIC,
> + SERVICE_ACTION_IN,
> + START_STOP,
> + SYNCHRONIZE_CACHE,
> + SYNCHRONIZE_CACHE_16,
> + TEST_UNIT_READY,
> + WRITE_10,
> + WRITE_12,
> + WRITE_16,
> + WRITE_6
> + };
> +
> + bs_create_opcode_map(bs_ops_supported, &opcodes[0],
> + sizeof(opcodes) / sizeof(opcodes[0]));
> +
> register_backingstore_template(&sheepdog_bst);
> }
> diff --git a/usr/scsi.c b/usr/scsi.c
> index 2636a5c..bce5ae0 100644
> --- a/usr/scsi.c
> +++ b/usr/scsi.c
> @@ -492,6 +492,12 @@ int scsi_cmd_perform(int host_no, struct scsi_cmd *cmd)
> if (spc_access_check(cmd))
> return SAM_STAT_RESERVATION_CONFLICT;
>
> + if (cmd->dev->bst->bs_ops_supported
> + && !cmd->dev->bst->bs_ops_supported[op]) {
> + sense_data_build(cmd, ILLEGAL_REQUEST, ASC_INVALID_OP_CODE);
> + return SAM_STAT_CHECK_CONDITION;
> + }
> +
> return cmd->dev->dev_type_template.ops[op].cmd_perform(host_no, cmd);
> }
>
> diff --git a/usr/tgtd.h b/usr/tgtd.h
> index 484e6e9..70f6306 100644
> --- a/usr/tgtd.h
> +++ b/usr/tgtd.h
> @@ -165,6 +165,7 @@ struct backingstore_template {
> void (*bs_exit)(struct scsi_lu *dev);
> int (*bs_cmd_submit)(struct scsi_cmd *cmd);
> int bs_oflags_supported;
> + const char *bs_ops_supported;
>
> struct list_head backingstore_siblings;
> };
> --
> 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
More information about the stgt
mailing list