[stgt] [PATCH] SMC: add a smc backend template with an opcode whitelist
Ronnie Sahlberg
ronniesahlberg at gmail.com
Tue Sep 9 04:53:09 CEST 2014
SMC is not working properly since we do not yet initialize a proper
SMC backend to tell it which opcodes are valid and which are not.
With this change SMC works again and we can create a jukebox that
mtx can communicate with correctly.
Signed-off-by: Ronnie Sahlberg <ronniesahlberg at gmail.com>
---
usr/bs_rdwr.c | 33 +++++++++++++++++++++++++++++++++
usr/scsi.h | 1 +
usr/smc.c | 9 +++++++++
3 files changed, 43 insertions(+), 0 deletions(-)
diff --git a/usr/bs_rdwr.c b/usr/bs_rdwr.c
index 2769a0d..56d086d 100644
--- a/usr/bs_rdwr.c
+++ b/usr/bs_rdwr.c
@@ -434,6 +434,17 @@ static struct backingstore_template mmc_bst = {
.bs_oflags_supported = O_SYNC | O_DIRECT,
};
+static struct backingstore_template smc_bst = {
+ .bs_name = "smc",
+ .bs_datasize = sizeof(struct bs_thread_info),
+ .bs_open = bs_rdwr_open,
+ .bs_close = bs_rdwr_close,
+ .bs_init = bs_rdwr_init,
+ .bs_exit = bs_rdwr_exit,
+ .bs_cmd_submit = bs_thread_cmd_submit,
+ .bs_oflags_supported = O_SYNC | O_DIRECT,
+};
+
__attribute__((constructor)) static void bs_rdwr_constructor(void)
{
unsigned char sbc_opcodes[] = {
@@ -519,4 +530,26 @@ __attribute__((constructor)) static void bs_rdwr_constructor(void)
};
bs_create_opcode_map(&mmc_bst, mmc_opcodes, ARRAY_SIZE(mmc_opcodes));
register_backingstore_template(&mmc_bst);
+
+ unsigned char smc_opcodes[] = {
+ INITIALIZE_ELEMENT_STATUS,
+ INITIALIZE_ELEMENT_STATUS_WITH_RANGE,
+ INQUIRY,
+ MAINT_PROTOCOL_IN,
+ MODE_SELECT,
+ MODE_SELECT_10,
+ MODE_SENSE,
+ MODE_SENSE_10,
+ MOVE_MEDIUM,
+ PERSISTENT_RESERVE_IN,
+ PERSISTENT_RESERVE_OUT,
+ REQUEST_SENSE,
+ TEST_UNIT_READY,
+ READ_ELEMENT_STATUS,
+ RELEASE,
+ REPORT_LUNS,
+ RESERVE,
+ };
+ bs_create_opcode_map(&smc_bst, smc_opcodes, ARRAY_SIZE(smc_opcodes));
+ register_backingstore_template(&smc_bst);
}
diff --git a/usr/scsi.h b/usr/scsi.h
index 3569fd0..6d0a2a5 100644
--- a/usr/scsi.h
+++ b/usr/scsi.h
@@ -50,6 +50,7 @@
#define SYNCHRONIZE_CACHE 0x35
#define LOCK_UNLOCK_CACHE 0x36
#define READ_DEFECT_DATA 0x37
+#define INITIALIZE_ELEMENT_STATUS_WITH_RANGE 0x37
#define MEDIUM_SCAN 0x38
#define COMPARE 0x39
#define COPY_VERIFY 0x3a
diff --git a/usr/smc.c b/usr/smc.c
index 910b532..9a40bdb 100644
--- a/usr/smc.c
+++ b/usr/smc.c
@@ -493,6 +493,7 @@ sense:
static tgtadm_err smc_lu_init(struct scsi_lu *lu)
{
+ struct backingstore_template *bst;
struct smc_info *smc;
tgtadm_err adm_err;
@@ -505,6 +506,14 @@ static tgtadm_err smc_lu_init(struct scsi_lu *lu)
if (spc_lu_init(lu))
return TGTADM_NOMEM;
+ /* SMC devices always use smc backingstore */
+ bst = get_backingstore_template("smc");
+ if (!bst) {
+ eprintf("failed to find bstype, smc\n");
+ return TGTADM_INVALID_REQUEST;
+ }
+ lu->bst = bst;
+
strncpy(lu->attrs.product_id, "VIRTUAL-CHANGER",
sizeof(lu->attrs.product_id));
lu->attrs.version_desc[0] = 0x0480; /* SMC-3 no version claimed */
--
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