[stgt] [PATCH] MMC: add a dedicated backend for MMC so that supported-opcode map works

Ronnie Sahlberg ronniesahlberg at gmail.com
Thu Aug 21 01:45:38 CEST 2014


MMC has been broken for a while since some of the vital opcodes
(GET_CONFIGURATION) and friends are not in the supported opcode
whitelist in bs_rdwr.c.
The real problem is that we have a bs_rdwr.c backend for SBC and we
piggyback on this SBC backend also for the MMC emulation.

Add defines for the missing MMC opcodes and create a new backend
dedicated for MMC that has the proper whitelist for MMC opcodes.
This new backend is actually part of bs_rdwr.c and shares all the
code with the SBC based backend.
However the new MMC backend will have a different name "mmc" to indicate
it is for the MMC emulation and it comes with a supported opcode
whitelist that is appropriate for MMC devices.

Signed-off-by: Ronnie Sahlberg <ronniesahlberg at gmail.com>
---
 usr/bs_rdwr.c |   54 ++++++++++++++++++++++++++++++++++++++++++++++++++----
 usr/mmc.c     |    6 +++---
 usr/scsi.h    |    9 +++++++++
 3 files changed, 62 insertions(+), 7 deletions(-)

diff --git a/usr/bs_rdwr.c b/usr/bs_rdwr.c
index a6301a7..2769a0d 100644
--- a/usr/bs_rdwr.c
+++ b/usr/bs_rdwr.c
@@ -423,9 +423,20 @@ static struct backingstore_template rdwr_bst = {
 	.bs_oflags_supported    = O_SYNC | O_DIRECT,
 };
 
+static struct backingstore_template mmc_bst = {
+	.bs_name		= "mmc",
+	.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 opcodes[] = {
+	unsigned char sbc_opcodes[] = {
 		ALLOW_MEDIUM_REMOVAL,
 		COMPARE_AND_WRITE,
 		FORMAT_UNIT,
@@ -469,8 +480,43 @@ __attribute__((constructor)) static void bs_rdwr_constructor(void)
 		WRITE_VERIFY_12,
 		WRITE_VERIFY_16
 	};
-
-	bs_create_opcode_map(&rdwr_bst, opcodes, ARRAY_SIZE(opcodes));
-
+	bs_create_opcode_map(&rdwr_bst, sbc_opcodes, ARRAY_SIZE(sbc_opcodes));
 	register_backingstore_template(&rdwr_bst);
+
+	unsigned char mmc_opcodes[] = {
+		ALLOW_MEDIUM_REMOVAL,
+		CLOSE_TRACK,
+		GET_CONFIGURATION,
+		GET_PERFORMACE,
+		INQUIRY,
+		MODE_SELECT,
+		MODE_SELECT_10,
+		MODE_SENSE,
+		MODE_SENSE_10,
+		PERSISTENT_RESERVE_IN,
+		PERSISTENT_RESERVE_OUT,
+		READ_10,
+		READ_12,
+		READ_BUFFER_CAP,
+		READ_CAPACITY,
+		READ_DISK_INFO,
+		READ_DVD_STRUCTURE,
+		READ_TOC,
+		READ_TRACK_INFO,
+		RELEASE,
+		REPORT_LUNS,
+		REQUEST_SENSE,
+		RESERVE,
+		SET_CD_SPEED,
+		SET_STREAMING,
+		START_STOP,
+		SYNCHRONIZE_CACHE,
+		TEST_UNIT_READY,
+		VERIFY_10,
+		WRITE_10,
+		WRITE_12,
+		WRITE_VERIFY,
+	};
+	bs_create_opcode_map(&mmc_bst, mmc_opcodes, ARRAY_SIZE(mmc_opcodes));
+	register_backingstore_template(&mmc_bst);
 }
diff --git a/usr/mmc.c b/usr/mmc.c
index 768fe91..edfea61 100644
--- a/usr/mmc.c
+++ b/usr/mmc.c
@@ -2207,10 +2207,10 @@ static tgtadm_err mmc_lu_init(struct scsi_lu *lu)
 	if (spc_lu_init(lu))
 		return TGTADM_NOMEM;
 
-	/* MMC devices always use rdwr backingstore */
-	bst = get_backingstore_template("rdwr");
+	/* MMC devices always use mmc backingstore */
+	bst = get_backingstore_template("mmc");
 	if (!bst) {
-		eprintf("failed to find bstype, rdwr\n");
+		eprintf("failed to find bstype, mmc\n");
 		return TGTADM_INVALID_REQUEST;
 	}
 	lu->bst = bst;
diff --git a/usr/scsi.h b/usr/scsi.h
index 1edcfd7..3569fd0 100644
--- a/usr/scsi.h
+++ b/usr/scsi.h
@@ -62,12 +62,17 @@
 #define WRITE_SAME            0x41
 #define UNMAP		      0x42
 #define READ_TOC              0x43
+#define GET_CONFIGURATION     0x46
 #define LOG_SELECT            0x4c
 #define LOG_SENSE             0x4d
+#define READ_DISK_INFO        0x51
+#define READ_TRACK_INFO       0x52
 #define MODE_SELECT_10        0x55
 #define RESERVE_10            0x56
 #define RELEASE_10            0x57
 #define MODE_SENSE_10         0x5a
+#define CLOSE_TRACK           0x5b
+#define READ_BUFFER_CAP       0x5c
 #define PERSISTENT_RESERVE_IN 0x5e
 #define PERSISTENT_RESERVE_OUT 0x5f
 #define VARLEN_CDB            0x7f
@@ -89,6 +94,8 @@
 #define EXCHANGE_MEDIUM       0xa6
 #define READ_12               0xa8
 #define WRITE_12              0xaa
+#define GET_PERFORMACE        0xac
+#define READ_DVD_STRUCTURE    0xad
 #define WRITE_VERIFY_12       0xae
 #define VERIFY_12	      0xaf
 #define SEARCH_HIGH_12        0xb0
@@ -96,6 +103,8 @@
 #define SEARCH_LOW_12         0xb2
 #define READ_ELEMENT_STATUS   0xb8
 #define SEND_VOLUME_TAG       0xb6
+#define SET_STREAMING         0xb6
+#define SET_CD_SPEED          0xbb
 #define WRITE_LONG_2          0xea
 
 /* Service actions for opcode 0xa3 */
-- 
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