[stgt] [PATCH] RFC prevent tgtd from segfault when attempting to configure passthrough device

Mark Harvey markh794 at gmail.com
Thu Jul 8 03:44:05 CEST 2010


This was one way to resolve the segfault if .cmd_passthrough() is NULL


>From cd9c358476090d1a1758aba03157c30e60c53e57 Mon Sep 17 00:00:00 2001
From: Mark Harvey <markh794 at gmail.com>
Date: Thu, 8 Jul 2010 06:48:02 +1000
Subject: Prevent segfault if passthrough params not correct.

If user neglects to supply '--device_type=pt' when creating a
passthrough device, tgtd would segfault due to .cmd_passthrough() being NULL

Signed-off-by: Mark Harvey <markh794 at gmail.com>
---
 usr/bs_sg.c |    8 ++++++++
 usr/mmc.c   |    1 +
 usr/osd.c   |    1 +
 usr/sbc.c   |    1 +
 usr/scc.c   |    6 ++++++
 usr/smc.c   |    1 +
 usr/ssc.c   |    2 +-
 usr/tgtd.h  |    1 +
 8 files changed, 20 insertions(+), 1 deletions(-)

diff --git a/usr/bs_sg.c b/usr/bs_sg.c
index bee6df5..9e519c0 100644
--- a/usr/bs_sg.c
+++ b/usr/bs_sg.c
@@ -89,6 +89,14 @@ static int graceful_write(int fd, void *p_write,
int to_write)
 	return 0;
 }

+/* Used by other target types to prevent segfault if .cmd_passthrough() null */
+int bs_sg_error(int host_no, struct scsi_cmd *cmd)
+{
+	eprintf("++++ Backing store incorrectly configured ++++\n");
+	eprintf("++++ Need to add \'--device-type=pt\'     ++++\n");
+	return -1;
+}
+
 static int bs_sg_rw(int host_no, struct scsi_cmd *cmd)
 {
 	int ret;
diff --git a/usr/mmc.c b/usr/mmc.c
index 0e34167..a8f6c03 100644
--- a/usr/mmc.c
+++ b/usr/mmc.c
@@ -2305,6 +2305,7 @@ static struct device_type_template mmc_template = {
 	.lu_online	= mmc_lu_online,
 	.lu_offline	= mmc_lu_offline,
 	.lu_exit	= spc_lu_exit,
+	.cmd_passthrough = bs_sg_error,
 	.ops		= {
 		{spc_test_unit,},
 		{spc_illegal_op,},
diff --git a/usr/osd.c b/usr/osd.c
index d81c6cf..22c7fc7 100644
--- a/usr/osd.c
+++ b/usr/osd.c
@@ -60,6 +60,7 @@ static struct device_type_template osd_template = {
 	.lu_online	= spc_lu_online,
 	.lu_offline	= spc_lu_offline,
 	.lu_exit	= spc_lu_exit,
+	.cmd_passthrough = bs_sg_error,
 	.ops		= {
 		/* 0x00 */
 		{spc_test_unit,},
diff --git a/usr/sbc.c b/usr/sbc.c
index a048d53..2798600 100644
--- a/usr/sbc.c
+++ b/usr/sbc.c
@@ -269,6 +269,7 @@ static struct device_type_template sbc_template = {
 	.lu_online	= spc_lu_online,
 	.lu_offline	= spc_lu_offline,
 	.lu_exit	= spc_lu_exit,
+	.cmd_passthrough = bs_sg_error,
 	.ops		= {
 		{spc_test_unit,},
 		{spc_illegal_op,},
diff --git a/usr/scc.c b/usr/scc.c
index 27bc07b..fe404df 100644
--- a/usr/scc.c
+++ b/usr/scc.c
@@ -52,6 +52,11 @@ static int scc_lu_init(struct scsi_lu *lu)
 	return 0;
 }

+static int scc_cmd_passthrough(int host_id, struct scsi_cmd *cmd)
+{
+	return -1;
+}
+
 static struct device_type_template scc_template = {
 	.type		= TYPE_RAID,
 	.lu_init	= scc_lu_init,
@@ -59,6 +64,7 @@ static struct device_type_template scc_template = {
 	.lu_online	= spc_lu_online,
 	.lu_offline	= spc_lu_offline,
 	.lu_exit	= spc_lu_exit,
+	.cmd_passthrough = scc_cmd_passthrough,
 	.ops		= {
 		{spc_test_unit,},
 		{spc_illegal_op,},
diff --git a/usr/smc.c b/usr/smc.c
index c0f25d6..1e76edf 100644
--- a/usr/smc.c
+++ b/usr/smc.c
@@ -787,6 +787,7 @@ struct device_type_template smc_template = {
 	.lu_online	= spc_lu_online,
 	.lu_offline	= spc_lu_offline,
 	.lu_config	= smc_lu_config,
+	.cmd_passthrough = bs_sg_error,
 	.ops	= {
 		{spc_test_unit,},
 		{spc_illegal_op,},
diff --git a/usr/ssc.c b/usr/ssc.c
index 84fa317..4adde2b 100644
--- a/usr/ssc.c
+++ b/usr/ssc.c
@@ -168,7 +168,7 @@ static struct device_type_template ssc_template = {
 	.lu_online	= spc_lu_online,
 	.lu_offline	= spc_lu_offline,
 	.lu_exit	= spc_lu_exit,
-
+	.cmd_passthrough = bs_sg_error,
 	.ops		= {
 		{spc_test_unit,},
 		{ssc_rw,},
diff --git a/usr/tgtd.h b/usr/tgtd.h
index 9c44994..5386438 100644
--- a/usr/tgtd.h
+++ b/usr/tgtd.h
@@ -349,4 +349,5 @@ int do_tgt_event_modify(int efd, struct list_head
*list, int fd, int events);

 int run_ext_program(const char *cmd,
 		    void (*callback)(void *data, int result), void *data);
+int bs_sg_error(int host_id, struct scsi_cmd *cmd);
 #endif
-- 
1.6.3.3
--
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