public inbox for linux-scsi@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/3] target: remove unused get_dma_length subsystem method
@ 2010-11-29 21:57 Christoph Hellwig
  2010-11-29 21:58 ` [PATCH 2/3] target: always assign t_task_lba in transport_generic_cmd_sequencer Christoph Hellwig
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Christoph Hellwig @ 2010-11-29 21:57 UTC (permalink / raw)
  To: nab; +Cc: linux-scsi

Signed-off-by: Christoph Hellwig <hch@lst.de>

Index: lio-core/drivers/target/target_core_file.c
===================================================================
--- lio-core.orig/drivers/target/target_core_file.c	2010-11-29 19:33:01.688023888 +0100
+++ lio-core/drivers/target/target_core_file.c	2010-11-29 19:33:14.165258208 +0100
@@ -635,15 +635,6 @@ static u32 fd_get_device_type(struct se_
 	return TYPE_DISK;
 }
 
-/*	fd_get_dma_length(): (Part of se_subsystem_api_t template)
- *
- *
- */
-static u32 fd_get_dma_length(u32 task_size, struct se_device *dev)
-{
-	return PAGE_SIZE;
-}
-
 static sector_t fd_get_blocks(struct se_device *dev)
 {
 	struct fd_dev *fd_dev = dev->dev_ptr;
@@ -676,7 +667,6 @@ static struct se_subsystem_api fileio_te
 	.get_cdb		= fd_get_cdb,
 	.get_device_rev		= fd_get_device_rev,
 	.get_device_type	= fd_get_device_type,
-	.get_dma_length		= fd_get_dma_length,
 	.get_blocks		= fd_get_blocks,
 };
 
Index: lio-core/drivers/target/target_core_iblock.c
===================================================================
--- lio-core.orig/drivers/target/target_core_iblock.c	2010-11-29 19:33:01.695009151 +0100
+++ lio-core/drivers/target/target_core_iblock.c	2010-11-29 19:33:14.165258208 +0100
@@ -705,11 +705,6 @@ static u32 iblock_get_device_type(struct
 	return TYPE_DISK;
 }
 
-static u32 iblock_get_dma_length(u32 task_size, struct se_device *dev)
-{
-	return PAGE_SIZE;
-}
-
 static sector_t iblock_get_blocks(struct se_device *dev)
 {
 	struct iblock_dev *ibd = dev->dev_ptr;
@@ -792,7 +787,6 @@ static struct se_subsystem_api iblock_te
 	.get_cdb		= iblock_get_cdb,
 	.get_device_rev		= iblock_get_device_rev,
 	.get_device_type	= iblock_get_device_type,
-	.get_dma_length		= iblock_get_dma_length,
 	.get_blocks		= iblock_get_blocks,
 };
 
Index: lio-core/drivers/target/target_core_rd.c
===================================================================
--- lio-core.orig/drivers/target/target_core_rd.c	2010-11-29 19:33:01.715003703 +0100
+++ lio-core/drivers/target/target_core_rd.c	2010-11-29 19:33:14.173020046 +0100
@@ -1017,15 +1017,6 @@ static u32 rd_get_device_type(struct se_
 	return TYPE_DISK;
 }
 
-/*	rd_get_dma_length(): (Part of se_subsystem_api_t template)
- *
- *
- */
-static u32 rd_get_dma_length(u32 task_size, struct se_device *dev)
-{
-	return PAGE_SIZE;
-}
-
 static sector_t rd_get_blocks(struct se_device *dev)
 {
 	struct rd_dev *rd_dev = dev->dev_ptr;
@@ -1052,7 +1043,6 @@ static struct se_subsystem_api rd_dr_tem
 	.get_cdb		= rd_get_cdb,
 	.get_device_rev		= rd_get_device_rev,
 	.get_device_type	= rd_get_device_type,
-	.get_dma_length		= rd_get_dma_length,
 	.get_blocks		= rd_get_blocks,
 	.do_se_mem_map		= rd_DIRECT_do_se_mem_map,
 };
@@ -1074,7 +1064,6 @@ static struct se_subsystem_api rd_mcp_te
 	.get_cdb		= rd_get_cdb,
 	.get_device_rev		= rd_get_device_rev,
 	.get_device_type	= rd_get_device_type,
-	.get_dma_length		= rd_get_dma_length,
 	.get_blocks		= rd_get_blocks,
 };
 
Index: lio-core/drivers/target/target_core_stgt.c
===================================================================
--- lio-core.orig/drivers/target/target_core_stgt.c	2010-11-29 19:33:01.724003145 +0100
+++ lio-core/drivers/target/target_core_stgt.c	2010-11-29 19:33:14.177031221 +0100
@@ -514,15 +514,6 @@ static u32 stgt_get_device_type(struct s
 	return sd->type;
 }
 
-/*	stgt_get_dma_length():
- *
- *
- */
-static u32 stgt_get_dma_length(u32 task_size, struct se_device *dev)
-{
-	return PAGE_SIZE;
-}
-
 /*	stgt_handle_SAM_STATUS_failures():
  *
  *
@@ -609,7 +600,6 @@ static struct se_subsystem_api stgt_temp
 	.get_sense_buffer	= stgt_get_sense_buffer,
 	.get_device_rev		= stgt_get_device_rev,
 	.get_device_type	= stgt_get_device_type,
-	.get_dma_length		= stgt_get_dma_length,
 };
 
 static int __init stgt_module_init(void)
Index: lio-core/include/target/target_core_transport.h
===================================================================
--- lio-core.orig/include/target/target_core_transport.h	2010-11-29 19:33:01.676004681 +0100
+++ lio-core/include/target/target_core_transport.h	2010-11-29 19:33:14.182005379 +0100
@@ -342,10 +342,6 @@ struct se_subsystem_api {
 	 */
 	u32 (*get_device_type)(struct se_device *);
 	/*
-	 * get_dma_length():
-	 */
-	u32 (*get_dma_length)(u32, struct se_device *);
-	/*
 	 * Get the sector_t from a subsystem backstore..
 	 */
 	sector_t (*get_blocks)(struct se_device *);
Index: lio-core/drivers/target/target_core_pscsi.c
===================================================================
--- lio-core.orig/drivers/target/target_core_pscsi.c	2010-11-29 19:33:15.180003285 +0100
+++ lio-core/drivers/target/target_core_pscsi.c	2010-11-29 19:33:36.257004472 +0100
@@ -1361,15 +1361,6 @@ static u32 pscsi_get_device_type(struct
 	return sd->type;
 }
 
-/*	pscsi_get_dma_length():
- *
- *
- */
-static u32 pscsi_get_dma_length(u32 task_size, struct se_device *dev)
-{
-	return PAGE_SIZE;
-}
-
 static sector_t pscsi_get_blocks(struct se_device *dev)
 {
 	struct pscsi_dev_virt *pdv = dev->dev_ptr;
@@ -1459,7 +1450,6 @@ static struct se_subsystem_api pscsi_tem
 	.get_sense_buffer	= pscsi_get_sense_buffer,
 	.get_device_rev		= pscsi_get_device_rev,
 	.get_device_type	= pscsi_get_device_type,
-	.get_dma_length		= pscsi_get_dma_length,
 	.get_blocks		= pscsi_get_blocks,
 };
 

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 2/3] target: always assign t_task_lba in transport_generic_cmd_sequencer
  2010-11-29 21:57 [PATCH 1/3] target: remove unused get_dma_length subsystem method Christoph Hellwig
@ 2010-11-29 21:58 ` Christoph Hellwig
  2010-11-29 22:18   ` Nicholas A. Bellinger
  2010-11-29 21:58 ` [PATCH 3/3] target: always assign se_cmd flags " Christoph Hellwig
  2010-11-29 22:17 ` [PATCH 1/3] target: remove unused get_dma_length subsystem method Nicholas A. Bellinger
  2 siblings, 1 reply; 6+ messages in thread
From: Christoph Hellwig @ 2010-11-29 21:58 UTC (permalink / raw)
  To: nab; +Cc: linux-scsi

We already sometimes directly calculate the lba in
transport_generic_cmd_sequencer, but sometimes use the transport_get_long_lba /
transport_get_lba callback in the se_cmd.  Unify the code to always assign
it directly and remove the callbacks.

Signed-off-by: Christoph Hellwig <hch@lst.de>

Index: lio-core/drivers/target/target_core_transport.c
===================================================================
--- lio-core.orig/drivers/target/target_core_transport.c	2010-11-29 19:42:05.046003633 +0100
+++ lio-core/drivers/target/target_core_transport.c	2010-11-29 19:47:31.670254576 +0100
@@ -1952,15 +1952,6 @@ int transport_generic_allocate_tasks(
 		DEBUG_CDB_H("Set cdb[0]: 0x%02x to "
 				"SCF_SCSI_DATA_SG_IO_CDB\n", cdb[0]);
 		cmd->se_cmd_flags |= SCF_SCSI_DATA_SG_IO_CDB;
-
-		/*
-		 * Get the initial Logical Block Address from the Original
-		 * Command Descriptor Block that arrived on the iSCSI wire.
-		 */
-		T_TASK(cmd)->t_task_lba = (cmd->transport_get_long_lba) ?
-			cmd->transport_get_long_lba(cdb) :
-			cmd->transport_get_lba(cdb);
-
 		break;
 	case TGCS_CONTROL_SG_IO_CDB:
 		DEBUG_CDB_H("Set cdb[0]: 0x%02x to"
@@ -3184,7 +3175,7 @@ static int transport_generic_cmd_sequenc
 			return TGCS_UNSUPPORTED_CDB;
 		size = transport_get_size(sectors, cdb, cmd);
 		cmd->transport_split_cdb = &split_cdb_XX_6;
-		cmd->transport_get_lba = &transport_lba_21;
+		T_TASK(cmd)->t_task_lba = transport_lba_21(cdb);
 		ret = TGCS_DATA_SG_IO_CDB;
 		break;
 	case READ_10:
@@ -3193,7 +3184,7 @@ static int transport_generic_cmd_sequenc
 			return TGCS_UNSUPPORTED_CDB;
 		size = transport_get_size(sectors, cdb, cmd);
 		cmd->transport_split_cdb = &split_cdb_XX_10;
-		cmd->transport_get_lba = &transport_lba_32;
+		T_TASK(cmd)->t_task_lba = transport_lba_32(cdb);
 		ret = TGCS_DATA_SG_IO_CDB;
 		break;
 	case READ_12:
@@ -3202,7 +3193,7 @@ static int transport_generic_cmd_sequenc
 			return TGCS_UNSUPPORTED_CDB;
 		size = transport_get_size(sectors, cdb, cmd);
 		cmd->transport_split_cdb = &split_cdb_XX_12;
-		cmd->transport_get_lba = &transport_lba_32;
+		T_TASK(cmd)->t_task_lba = transport_lba_32(cdb);
 		ret = TGCS_DATA_SG_IO_CDB;
 		break;
 	case READ_16:
@@ -3211,7 +3202,7 @@ static int transport_generic_cmd_sequenc
 			return TGCS_UNSUPPORTED_CDB;
 		size = transport_get_size(sectors, cdb, cmd);
 		cmd->transport_split_cdb = &split_cdb_XX_16;
-		cmd->transport_get_long_lba = &transport_lba_64;
+		T_TASK(cmd)->t_task_lba = transport_lba_64(cdb);
 		ret = TGCS_DATA_SG_IO_CDB;
 		break;
 	case WRITE_6:
@@ -3220,7 +3211,7 @@ static int transport_generic_cmd_sequenc
 			return TGCS_UNSUPPORTED_CDB;
 		size = transport_get_size(sectors, cdb, cmd);
 		cmd->transport_split_cdb = &split_cdb_XX_6;
-		cmd->transport_get_lba = &transport_lba_21;
+		T_TASK(cmd)->t_task_lba = transport_lba_21(cdb);
 		ret = TGCS_DATA_SG_IO_CDB;
 		break;
 	case WRITE_10:
@@ -3229,7 +3220,7 @@ static int transport_generic_cmd_sequenc
 			return TGCS_UNSUPPORTED_CDB;
 		size = transport_get_size(sectors, cdb, cmd);
 		cmd->transport_split_cdb = &split_cdb_XX_10;
-		cmd->transport_get_lba = &transport_lba_32;
+		T_TASK(cmd)->t_task_lba = transport_lba_32(cdb);
 		T_TASK(cmd)->t_tasks_fua = (cdb[1] & 0x8);
 		ret = TGCS_DATA_SG_IO_CDB;
 		break;
@@ -3239,7 +3230,7 @@ static int transport_generic_cmd_sequenc
 			return TGCS_UNSUPPORTED_CDB;
 		size = transport_get_size(sectors, cdb, cmd);
 		cmd->transport_split_cdb = &split_cdb_XX_12;
-		cmd->transport_get_lba = &transport_lba_32;
+		T_TASK(cmd)->t_task_lba = transport_lba_32(cdb);
 		T_TASK(cmd)->t_tasks_fua = (cdb[1] & 0x8);
 		ret = TGCS_DATA_SG_IO_CDB;
 		break;
@@ -3249,7 +3240,7 @@ static int transport_generic_cmd_sequenc
 			return TGCS_UNSUPPORTED_CDB;
 		size = transport_get_size(sectors, cdb, cmd);
 		cmd->transport_split_cdb = &split_cdb_XX_16;
-		cmd->transport_get_long_lba = &transport_lba_64;
+		T_TASK(cmd)->t_task_lba = transport_lba_64(cdb);
 		T_TASK(cmd)->t_tasks_fua = (cdb[1] & 0x8);
 		ret = TGCS_DATA_SG_IO_CDB;
 		break;
@@ -3262,7 +3253,7 @@ static int transport_generic_cmd_sequenc
 			return TGCS_UNSUPPORTED_CDB;
 		size = transport_get_size(sectors, cdb, cmd);
 		cmd->transport_split_cdb = &split_cdb_XX_10;
-		cmd->transport_get_lba = &transport_lba_32;
+		T_TASK(cmd)->t_task_lba = transport_lba_32(cdb);
 		passthrough = (TRANSPORT(dev)->transport_type ==
 				TRANSPORT_PLUGIN_PHBA_PDEV);
 		/*
@@ -3297,7 +3288,7 @@ static int transport_generic_cmd_sequenc
 			 * XDWRITE_READ_32 logic.
 			 */
 			cmd->transport_split_cdb = &split_cdb_XX_32;
-			cmd->transport_get_long_lba = &transport_lba_64_ext;
+			T_TASK(cmd)->t_task_lba = transport_lba_64_ext(cdb);
 			/*
 			 * Skip the remaining assignments for TCM/PSCSI passthrough
 			 */
Index: lio-core/include/target/target_core_base.h
===================================================================
--- lio-core.orig/include/target/target_core_base.h	2010-11-29 19:45:26.207004193 +0100
+++ lio-core/include/target/target_core_base.h	2010-11-29 19:45:30.786254087 +0100
@@ -531,8 +531,6 @@ struct se_cmd {
 	struct se_transport_task t_task_backstore;
 	struct target_core_fabric_ops *se_tfo;
 	int (*transport_emulate_cdb)(struct se_cmd *);
-	u32 (*transport_get_lba)(unsigned char *);
-	unsigned long long (*transport_get_long_lba)(unsigned char *);
 	void (*transport_split_cdb)(unsigned long long, u32 *, unsigned char *);
 	void (*transport_wait_for_tasks)(struct se_cmd *, int, int);
 	void (*transport_complete_callback)(struct se_cmd *);

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 3/3] target: always assign se_cmd flags in transport_generic_cmd_sequencer
  2010-11-29 21:57 [PATCH 1/3] target: remove unused get_dma_length subsystem method Christoph Hellwig
  2010-11-29 21:58 ` [PATCH 2/3] target: always assign t_task_lba in transport_generic_cmd_sequencer Christoph Hellwig
@ 2010-11-29 21:58 ` Christoph Hellwig
  2010-11-29 22:26   ` Nicholas A. Bellinger
  2010-11-29 22:17 ` [PATCH 1/3] target: remove unused get_dma_length subsystem method Nicholas A. Bellinger
  2 siblings, 1 reply; 6+ messages in thread
From: Christoph Hellwig @ 2010-11-29 21:58 UTC (permalink / raw)
  To: nab; +Cc: linux-scsi

Assign the flags and in case of errors the sense code in
transport_generic_cmd_sequencer, and pass through the return value from it in
transport_generic_allocate_tasks.  This gets rid of a special set of return
codes and a switch statement in the fast path.

Signed-off-by: Christoph Hellwig <hch@lst.de>

Index: lio-core/drivers/target/target_core_alua.c
===================================================================
--- lio-core.orig/drivers/target/target_core_alua.c	2010-11-29 20:11:25.778254298 +0100
+++ lio-core/drivers/target/target_core_alua.c	2010-11-29 20:16:02.436254646 +0100
@@ -455,9 +455,9 @@ static int core_alua_state_check_nop(
  * Also, this function can return three different return codes to
  * signal transport_generic_cmd_sequencer()
  *
- * return 1: Is used to signal LUN not accecsable, and TGCS_CHECK_CONDITION_NOT_READY
+ * return 1: Is used to signal LUN not accecsable, and check condition/not ready
  * return 0: Used to signal success
- * reutrn -1: Used to signal failure, and TGCS_INVALID_CDB_FIELD
+ * reutrn -1: Used to signal failure, and invalid cdb field
  */
 static int core_alua_state_check(
 	struct se_cmd *cmd,
Index: lio-core/drivers/target/target_core_transport.c
===================================================================
--- lio-core.orig/drivers/target/target_core_transport.c	2010-11-29 20:11:30.802004332 +0100
+++ lio-core/drivers/target/target_core_transport.c	2010-11-29 20:17:20.321254787 +0100
@@ -1886,7 +1886,7 @@ int transport_generic_allocate_tasks(
 	struct se_cmd *cmd,
 	unsigned char *cdb)
 {
-	int non_data_cdb;
+	int ret;
 
 	transport_generic_prepare_cdb(cdb);
 
@@ -1900,9 +1900,9 @@ int transport_generic_allocate_tasks(
 	 * See if this is a CDB which follows SAM, also grab a function
 	 * pointer to see if we need to do extra work.
 	 */
-	non_data_cdb = transport_generic_cmd_sequencer(cmd, cdb);
-	if (non_data_cdb < 0)
-		return -1;
+	ret = transport_generic_cmd_sequencer(cmd, cdb);
+	if (ret < 0)
+		return ret;
 	/*
 	 * Ensure that the received CDB is less than the max (252 + 8) bytes
 	 * for VARIABLE_LENGTH_CMD
@@ -1946,75 +1946,6 @@ int transport_generic_allocate_tasks(
 	if (cmd->se_lun->lun_sep)
 		cmd->se_lun->lun_sep->sep_stats.cmd_pdus++;
 	spin_unlock(&cmd->se_lun->lun_sep_lock);
-
-	switch (non_data_cdb) {
-	case TGCS_DATA_SG_IO_CDB:
-		DEBUG_CDB_H("Set cdb[0]: 0x%02x to "
-				"SCF_SCSI_DATA_SG_IO_CDB\n", cdb[0]);
-		cmd->se_cmd_flags |= SCF_SCSI_DATA_SG_IO_CDB;
-		break;
-	case TGCS_CONTROL_SG_IO_CDB:
-		DEBUG_CDB_H("Set cdb[0]: 0x%02x to"
-				" SCF_SCSI_CONTROL_SG_IO_CDB\n", cdb[0]);
-		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
-		break;
-	case TGCS_CONTROL_NONSG_IO_CDB:
-		DEBUG_CDB_H("Set cdb[0]: 0x%02x to "
-				"SCF_SCSI_CONTROL_NONSG_IO_CDB\n", cdb[0]);
-		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
-		break;
-	case TGCS_NON_DATA_CDB:
-		DEBUG_CDB_H("Set cdb[0]: 0x%02x to "
-				"SCF_SCSI_NON_DATA_CDB\n", cdb[0]);
-		cmd->se_cmd_flags |= SCF_SCSI_NON_DATA_CDB;
-		break;
-	case TGCS_UNSUPPORTED_CDB:
-		DEBUG_CDB_H("Set cdb[0]: 0x%02x to"
-				" SCF_SCSI_UNSUPPORTED_CDB\n", cdb[0]);
-		cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
-		cmd->scsi_sense_reason = TCM_UNSUPPORTED_SCSI_OPCODE;
-		return -2;
-	case TGCS_RESERVATION_CONFLICT:
-		DEBUG_CDB_H("Set cdb[0]: 0x%02x to"
-				" SCF_SCSI_RESERVATION_CONFLICT\n", cdb[0]);
-		cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
-		cmd->se_cmd_flags |= SCF_SCSI_RESERVATION_CONFLICT;
-		cmd->scsi_status = SAM_STAT_RESERVATION_CONFLICT;
-		/*
-		 * For UA Interlock Code 11b, a RESERVATION CONFLICT will
-		 * establish a UNIT ATTENTION with PREVIOUS RESERVATION
-		 * CONFLICT STATUS.
-		 *
-		 * See spc4r17, section 7.4.6 Control Mode Page, Table 349
-		 */
-		if (SE_SESS(cmd) &&
-		    DEV_ATTRIB(cmd->se_dev)->emulate_ua_intlck_ctrl == 2)
-			core_scsi3_ua_allocate(SE_SESS(cmd)->se_node_acl,
-				cmd->orig_fe_lun, 0x2C,
-				ASCQ_2CH_PREVIOUS_RESERVATION_CONFLICT_STATUS);
-		return -2;
-	case TGCS_INVALID_CDB_FIELD:
-		cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
-		cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD;
-		return -2;
-	case TGCS_ILLEGAL_REQUEST:
-		cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
-		cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
-		return -2;
-	case TGCS_CHECK_CONDITION_UNIT_ATTENTION:
-		cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
-		cmd->scsi_sense_reason = TCM_CHECK_CONDITION_UNIT_ATTENTION;
-		return -2;
-	case TGCS_CHECK_CONDITION_NOT_READY:
-		cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
-		cmd->scsi_sense_reason = TCM_CHECK_CONDITION_NOT_READY;
-		return -2;
-	default:
-		cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
-		cmd->scsi_sense_reason = TCM_UNSUPPORTED_SCSI_OPCODE;
-		return -2;
-	}
-
 	return 0;
 }
 EXPORT_SYMBOL(transport_generic_allocate_tasks);
@@ -3101,6 +3032,28 @@ static int transport_allocate_resources(
 		return 0;
 }
 
+static int
+transport_handle_reservation_conflict(struct se_cmd *cmd)
+{
+	cmd->transport_wait_for_tasks = &transport_nop_wait_for_tasks;
+	cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
+	cmd->se_cmd_flags |= SCF_SCSI_RESERVATION_CONFLICT;
+	cmd->scsi_status = SAM_STAT_RESERVATION_CONFLICT;
+	/*
+	 * For UA Interlock Code 11b, a RESERVATION CONFLICT will
+	 * establish a UNIT ATTENTION with PREVIOUS RESERVATION
+	 * CONFLICT STATUS.
+	 *
+	 * See spc4r17, section 7.4.6 Control Mode Page, Table 349
+	 */
+	if (SE_SESS(cmd) &&
+	    DEV_ATTRIB(cmd->se_dev)->emulate_ua_intlck_ctrl == 2)
+		core_scsi3_ua_allocate(SE_SESS(cmd)->se_node_acl,
+			cmd->orig_fe_lun, 0x2C,
+			ASCQ_2CH_PREVIOUS_RESERVATION_CONFLICT_STATUS);
+	return -2;
+}
+
 /*	transport_generic_cmd_sequencer():
  *
  *	Generic Command Sequencer that should work for most DAS transport
@@ -3117,7 +3070,7 @@ static int transport_generic_cmd_sequenc
 {
 	struct se_device *dev = SE_DEV(cmd);
 	struct se_subsystem_dev *su_dev = dev->se_sub_dev;
-	int ret, sector_ret = 0, passthrough;
+	int ret = 0, sector_ret = 0, passthrough;
 	u32 sectors = 0, size = 0, pr_reg_type = 0;
 	u16 service_action;
 	u8 alua_ascq = 0;
@@ -3127,7 +3080,9 @@ static int transport_generic_cmd_sequenc
 	if (core_scsi3_ua_check(cmd, cdb) < 0) {
 		cmd->transport_wait_for_tasks =
 				&transport_nop_wait_for_tasks;
-		return TGCS_CHECK_CONDITION_UNIT_ATTENTION;
+		cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
+		cmd->scsi_sense_reason = TCM_CHECK_CONDITION_UNIT_ATTENTION;
+		return -2;
 	}
 	/*
 	 * Check status of Asymmetric Logical Unit Assignment port
@@ -3147,20 +3102,19 @@ static int transport_generic_cmd_sequenc
 				CMD_TFO(cmd)->get_fabric_name(), alua_ascq);
 #endif
 			transport_set_sense_codes(cmd, 0x04, alua_ascq);
-			return TGCS_CHECK_CONDITION_NOT_READY;
+			cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
+			cmd->scsi_sense_reason = TCM_CHECK_CONDITION_NOT_READY;
+			return -2;
 		}
-		return TGCS_INVALID_CDB_FIELD;
+		goto out_invalid_cdb_field;
 	}
 	/*
 	 * Check status for SPC-3 Persistent Reservations
 	 */
 	if (T10_PR_OPS(su_dev)->t10_reservation_check(cmd, &pr_reg_type) != 0) {
 		if (T10_PR_OPS(su_dev)->t10_seq_non_holder(
-					cmd, cdb, pr_reg_type) != 0) {
-			cmd->transport_wait_for_tasks =
-					&transport_nop_wait_for_tasks;
-			return TGCS_RESERVATION_CONFLICT;
-		}
+					cmd, cdb, pr_reg_type) != 0)
+			return transport_handle_reservation_conflict(cmd);
 		/*
 		 * This means the CDB is allowed for the SCSI Initiator port
 		 * when said port is *NOT* holding the legacy SPC-2 or
@@ -3172,88 +3126,89 @@ static int transport_generic_cmd_sequenc
 	case READ_6:
 		sectors = transport_get_sectors_6(cdb, cmd, &sector_ret);
 		if (sector_ret)
-			return TGCS_UNSUPPORTED_CDB;
+			goto out_unsupported_cdb;
 		size = transport_get_size(sectors, cdb, cmd);
 		cmd->transport_split_cdb = &split_cdb_XX_6;
 		T_TASK(cmd)->t_task_lba = transport_lba_21(cdb);
-		ret = TGCS_DATA_SG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_DATA_SG_IO_CDB;
 		break;
 	case READ_10:
 		sectors = transport_get_sectors_10(cdb, cmd, &sector_ret);
 		if (sector_ret)
-			return TGCS_UNSUPPORTED_CDB;
+			goto out_unsupported_cdb;
 		size = transport_get_size(sectors, cdb, cmd);
 		cmd->transport_split_cdb = &split_cdb_XX_10;
 		T_TASK(cmd)->t_task_lba = transport_lba_32(cdb);
-		ret = TGCS_DATA_SG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_DATA_SG_IO_CDB;
 		break;
 	case READ_12:
 		sectors = transport_get_sectors_12(cdb, cmd, &sector_ret);
 		if (sector_ret)
-			return TGCS_UNSUPPORTED_CDB;
+			goto out_unsupported_cdb;
 		size = transport_get_size(sectors, cdb, cmd);
 		cmd->transport_split_cdb = &split_cdb_XX_12;
 		T_TASK(cmd)->t_task_lba = transport_lba_32(cdb);
-		ret = TGCS_DATA_SG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_DATA_SG_IO_CDB;
 		break;
 	case READ_16:
 		sectors = transport_get_sectors_16(cdb, cmd, &sector_ret);
 		if (sector_ret)
-			return TGCS_UNSUPPORTED_CDB;
+			goto out_unsupported_cdb;
 		size = transport_get_size(sectors, cdb, cmd);
 		cmd->transport_split_cdb = &split_cdb_XX_16;
 		T_TASK(cmd)->t_task_lba = transport_lba_64(cdb);
-		ret = TGCS_DATA_SG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_DATA_SG_IO_CDB;
 		break;
 	case WRITE_6:
 		sectors = transport_get_sectors_6(cdb, cmd, &sector_ret);
 		if (sector_ret)
-			return TGCS_UNSUPPORTED_CDB;
+			goto out_unsupported_cdb;
 		size = transport_get_size(sectors, cdb, cmd);
 		cmd->transport_split_cdb = &split_cdb_XX_6;
 		T_TASK(cmd)->t_task_lba = transport_lba_21(cdb);
-		ret = TGCS_DATA_SG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_DATA_SG_IO_CDB;
 		break;
 	case WRITE_10:
 		sectors = transport_get_sectors_10(cdb, cmd, &sector_ret);
 		if (sector_ret)
-			return TGCS_UNSUPPORTED_CDB;
+			goto out_unsupported_cdb;
 		size = transport_get_size(sectors, cdb, cmd);
 		cmd->transport_split_cdb = &split_cdb_XX_10;
 		T_TASK(cmd)->t_task_lba = transport_lba_32(cdb);
 		T_TASK(cmd)->t_tasks_fua = (cdb[1] & 0x8);
-		ret = TGCS_DATA_SG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_DATA_SG_IO_CDB;
 		break;
 	case WRITE_12:
 		sectors = transport_get_sectors_12(cdb, cmd, &sector_ret);
 		if (sector_ret)
-			return TGCS_UNSUPPORTED_CDB;
+			goto out_unsupported_cdb;
 		size = transport_get_size(sectors, cdb, cmd);
 		cmd->transport_split_cdb = &split_cdb_XX_12;
 		T_TASK(cmd)->t_task_lba = transport_lba_32(cdb);
 		T_TASK(cmd)->t_tasks_fua = (cdb[1] & 0x8);
-		ret = TGCS_DATA_SG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_DATA_SG_IO_CDB;
 		break;
 	case WRITE_16:
 		sectors = transport_get_sectors_16(cdb, cmd, &sector_ret);
 		if (sector_ret)
-			return TGCS_UNSUPPORTED_CDB;
+			goto out_unsupported_cdb;
 		size = transport_get_size(sectors, cdb, cmd);
 		cmd->transport_split_cdb = &split_cdb_XX_16;
 		T_TASK(cmd)->t_task_lba = transport_lba_64(cdb);
 		T_TASK(cmd)->t_tasks_fua = (cdb[1] & 0x8);
-		ret = TGCS_DATA_SG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_DATA_SG_IO_CDB;
 		break;
 	case XDWRITEREAD_10:
 		if ((cmd->data_direction != DMA_TO_DEVICE) ||
 		    !(T_TASK(cmd)->t_tasks_bidi))
-			return TGCS_INVALID_CDB_FIELD;
+			goto out_invalid_cdb_field;
 		sectors = transport_get_sectors_10(cdb, cmd, &sector_ret);
 		if (sector_ret)
-			return TGCS_UNSUPPORTED_CDB;
+			goto out_unsupported_cdb;
 		size = transport_get_size(sectors, cdb, cmd);
 		cmd->transport_split_cdb = &split_cdb_XX_10;
 		T_TASK(cmd)->t_task_lba = transport_lba_32(cdb);
+		cmd->se_cmd_flags |= SCF_SCSI_DATA_SG_IO_CDB;
 		passthrough = (TRANSPORT(dev)->transport_type ==
 				TRANSPORT_PLUGIN_PHBA_PDEV);
 		/*
@@ -3266,7 +3221,6 @@ static int transport_generic_cmd_sequenc
 		 */
 		cmd->transport_complete_callback = &transport_xor_callback;
 		T_TASK(cmd)->t_tasks_fua = (cdb[1] & 0x8);
-		ret = TGCS_DATA_SG_IO_CDB;
 		break;
 	case VARIABLE_LENGTH_CMD:
 		service_action = get_unaligned_be16(&cdb[8]);
@@ -3281,7 +3235,7 @@ static int transport_generic_cmd_sequenc
 		case XDWRITEREAD_32:
 			sectors = transport_get_sectors_32(cdb, cmd, &sector_ret);
 			if (sector_ret)
-				return TGCS_UNSUPPORTED_CDB;
+				goto out_unsupported_cdb;
 			size = transport_get_size(sectors, cdb, cmd);
 			/*
 			 * Use WRITE_32 and READ_32 opcodes for the emulated
@@ -3289,39 +3243,40 @@ static int transport_generic_cmd_sequenc
 			 */
 			cmd->transport_split_cdb = &split_cdb_XX_32;
 			T_TASK(cmd)->t_task_lba = transport_lba_64_ext(cdb);
+			cmd->se_cmd_flags |= SCF_SCSI_DATA_SG_IO_CDB;
+
 			/*
 			 * Skip the remaining assignments for TCM/PSCSI passthrough
 			 */
-			if (passthrough) {
-				ret = TGCS_DATA_SG_IO_CDB;
+			if (passthrough)
 				break;
-			}
+
 			/*
 			 * Setup BIDI XOR callback to be run during
 			 * transport_generic_complete_ok()
 			 */
 			cmd->transport_complete_callback = &transport_xor_callback;
 			T_TASK(cmd)->t_tasks_fua = (cdb[10] & 0x8);
-			ret = TGCS_DATA_SG_IO_CDB;	
 			break;
 		case WRITE_SAME_32:
 			sectors = transport_get_sectors_32(cdb, cmd, &sector_ret);
 			if (sector_ret)
-				return TGCS_UNSUPPORTED_CDB;
+				goto out_unsupported_cdb;
 			size = transport_get_size(sectors, cdb, cmd);
 			T_TASK(cmd)->t_task_lba = get_unaligned_be64(&cdb[12]);
+			cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
+
 			/*
 			 * Skip the remaining assignments for TCM/PSCSI passthrough
 			 */
-			if (passthrough) {
-				ret = TGCS_CONTROL_SG_IO_CDB;
+			if (passthrough)
 				break;
-			}
+
 			if ((cdb[10] & 0x04) || (cdb[10] & 0x02)) {
 				printk(KERN_ERR "WRITE_SAME PBDATA and LBDATA"
 					" bits not supported for Block Discard"
 					" Emulation\n");
-				return TGCS_INVALID_CDB_FIELD;
+				goto out_invalid_cdb_field;
 			}
 			/*
 			 * Currently for the emulated case we only accept
@@ -3330,14 +3285,13 @@ static int transport_generic_cmd_sequenc
 			if (!(cdb[10] & 0x08)) {
 				printk(KERN_ERR "WRITE_SAME w/o UNMAP bit not"
 					" supported for Block Discard Emulation\n");
-				return TGCS_INVALID_CDB_FIELD;
+				goto out_invalid_cdb_field;
 			}
-			ret = TGCS_CONTROL_SG_IO_CDB;
 			break;
 		default:
 			printk(KERN_ERR "VARIABLE_LENGTH_CMD service action"
 				" 0x%04x not supported\n", service_action);
-			return TGCS_UNSUPPORTED_CDB;
+			goto out_unsupported_cdb;
 		}
 		break;
 	case 0xa3:
@@ -3359,19 +3313,19 @@ static int transport_generic_cmd_sequenc
 			/* GPCMD_SEND_KEY from multi media commands */
 			size = (cdb[8] << 8) + cdb[9];
 		}
-		ret = TGCS_CONTROL_NONSG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
 		break;
 	case MODE_SELECT:
 		size = cdb[4];
-		ret = TGCS_CONTROL_SG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
 		break;
 	case MODE_SELECT_10:
 		size = (cdb[7] << 8) + cdb[8];
-		ret = TGCS_CONTROL_SG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
 		break;
 	case MODE_SENSE:
 		size = cdb[4];
-		ret = TGCS_CONTROL_NONSG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
 		break;
 	case MODE_SENSE_10:
 	case GPCMD_READ_BUFFER_CAPACITY:
@@ -3379,18 +3333,18 @@ static int transport_generic_cmd_sequenc
 	case LOG_SELECT:
 	case LOG_SENSE:
 		size = (cdb[7] << 8) + cdb[8];
-		ret = TGCS_CONTROL_NONSG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
 		break;
 	case READ_BLOCK_LIMITS:
 		size = READ_BLOCK_LEN;
-		ret = TGCS_CONTROL_NONSG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
 		break;
 	case GPCMD_GET_CONFIGURATION:
 	case GPCMD_READ_FORMAT_CAPACITIES:
 	case GPCMD_READ_DISC_INFO:
 	case GPCMD_READ_TRACK_RZONE_INFO:
 		size = (cdb[7] << 8) + cdb[8];
-		ret = TGCS_CONTROL_SG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
 		break;
 	case PERSISTENT_RESERVE_IN:
 	case PERSISTENT_RESERVE_OUT:
@@ -3399,16 +3353,16 @@ static int transport_generic_cmd_sequenc
 			 SPC3_PERSISTENT_RESERVATIONS) ?
 			&core_scsi3_emulate_pr : NULL;
 		size = (cdb[7] << 8) + cdb[8];
-		ret = TGCS_CONTROL_NONSG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
 		break;
 	case GPCMD_MECHANISM_STATUS:
 	case GPCMD_READ_DVD_STRUCTURE:
 		size = (cdb[8] << 8) + cdb[9];
-		ret = TGCS_CONTROL_SG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
 		break;
 	case READ_POSITION:
 		size = READ_POSITION_LEN;
-		ret = TGCS_CONTROL_NONSG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
 		break;
 	case 0xa4:
 		if (TRANSPORT(dev)->get_device_type(dev) != TYPE_ROM) {
@@ -3430,7 +3384,7 @@ static int transport_generic_cmd_sequenc
 			/* GPCMD_REPORT_KEY from multi media commands */
 			size = (cdb[8] << 8) + cdb[9];
 		}
-		ret = TGCS_CONTROL_NONSG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
 		break;
 	case INQUIRY:
 		size = (cdb[3] << 8) + cdb[4];
@@ -3440,21 +3394,21 @@ static int transport_generic_cmd_sequenc
 		 */
 		if (SE_DEV(cmd)->dev_task_attr_type == SAM_TASK_ATTR_EMULATED)
 			cmd->sam_task_attr = TASK_ATTR_HOQ;
-		ret = TGCS_CONTROL_NONSG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
 		break;
 	case READ_BUFFER:
 		size = (cdb[6] << 16) + (cdb[7] << 8) + cdb[8];
-		ret = TGCS_CONTROL_NONSG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
 		break;
 	case READ_CAPACITY:
 		size = READ_CAP_LEN;
-		ret = TGCS_CONTROL_NONSG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
 		break;
 	case READ_MEDIA_SERIAL_NUMBER:
 	case SECURITY_PROTOCOL_IN:
 	case SECURITY_PROTOCOL_OUT:
 		size = (cdb[6] << 24) | (cdb[7] << 16) | (cdb[8] << 8) | cdb[9];
-		ret = TGCS_CONTROL_NONSG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
 		break;
 	case SERVICE_ACTION_IN:
 	case ACCESS_CONTROL_IN:
@@ -3465,36 +3419,36 @@ static int transport_generic_cmd_sequenc
 	case WRITE_ATTRIBUTE:
 		size = (cdb[10] << 24) | (cdb[11] << 16) |
 		       (cdb[12] << 8) | cdb[13];
-		ret = TGCS_CONTROL_NONSG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
 		break;
 	case RECEIVE_DIAGNOSTIC:
 	case SEND_DIAGNOSTIC:
 		size = (cdb[3] << 8) | cdb[4];
-		ret = TGCS_CONTROL_NONSG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
 		break;
 /* #warning FIXME: Figure out correct GPCMD_READ_CD blocksize. */
 #if 0
 	case GPCMD_READ_CD:
 		sectors = (cdb[6] << 16) + (cdb[7] << 8) + cdb[8];
 		size = (2336 * sectors);
-		ret = TGCS_CONTROL_NONSG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
 		break;
 #endif
 	case READ_TOC:
 		size = cdb[8];
-		ret = TGCS_CONTROL_NONSG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
 		break;
 	case REQUEST_SENSE:
 		size = cdb[4];
-		ret = TGCS_CONTROL_NONSG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
 		break;
 	case READ_ELEMENT_STATUS:
 		size = 65536 * cdb[7] + 256 * cdb[8] + cdb[9];
-		ret = TGCS_CONTROL_NONSG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
 		break;
 	case WRITE_BUFFER:
 		size = (cdb[6] << 16) + (cdb[7] << 8) + cdb[8];
-		ret = TGCS_CONTROL_NONSG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
 		break;
 	case RESERVE:
 	case RESERVE_10:
@@ -3518,7 +3472,7 @@ static int transport_generic_cmd_sequenc
 				(T10_RES(su_dev)->res_type !=
 				 SPC_PASSTHROUGH) ?
 				&core_scsi2_emulate_crh : NULL;
-		ret = TGCS_NON_DATA_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_NON_DATA_CDB;
 		break;
 	case RELEASE:
 	case RELEASE_10:
@@ -3535,7 +3489,7 @@ static int transport_generic_cmd_sequenc
 				(T10_RES(su_dev)->res_type !=
 				 SPC_PASSTHROUGH) ?
 				&core_scsi2_emulate_crh : NULL;
-		ret = TGCS_NON_DATA_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_NON_DATA_CDB;
 		break;
 	case SYNCHRONIZE_CACHE:
 	case 0x91: /* SYNCHRONIZE_CACHE_16: */
@@ -3550,10 +3504,11 @@ static int transport_generic_cmd_sequenc
 			T_TASK(cmd)->t_task_lba = transport_lba_64(cdb);
 		}
                 if (sector_ret)
-                        return TGCS_UNSUPPORTED_CDB;
+			goto out_unsupported_cdb;
 
                 size = transport_get_size(sectors, cdb, cmd);
-		ret = TGCS_NON_DATA_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_NON_DATA_CDB;
+
 		/*
 		 * For TCM/pSCSI passthrough, skip cmd->transport_emulate_cdb()
 		 */
@@ -3569,7 +3524,7 @@ static int transport_generic_cmd_sequenc
 		 * device.
 		 */
 		if (transport_get_sectors(cmd) < 0)
-			return TGCS_INVALID_CDB_FIELD;
+			goto out_invalid_cdb_field;
 		break;
 	case UNMAP:
 		size = get_unaligned_be16(&cdb[7]);
@@ -3585,12 +3540,12 @@ static int transport_generic_cmd_sequenc
 		if (!(passthrough))
 			cmd->se_cmd_flags |= SCF_EMULATE_SYNC_UNMAP;
 
-		ret = TGCS_CONTROL_NONSG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
 		break;
 	case WRITE_SAME_16:
 		sectors = transport_get_sectors_16(cdb, cmd, &sector_ret);
 		if (sector_ret)
-			return TGCS_UNSUPPORTED_CDB;
+			goto out_unsupported_cdb;
 		size = transport_get_size(sectors, cdb, cmd);
 		T_TASK(cmd)->t_task_lba = get_unaligned_be16(&cdb[2]);
 		passthrough = (TRANSPORT(dev)->transport_type ==
@@ -3607,7 +3562,7 @@ static int transport_generic_cmd_sequenc
 				printk(KERN_ERR "WRITE_SAME PBDATA and LBDATA"
 					" bits not supported for Block Discard"
 					" Emulation\n");
-				return TGCS_INVALID_CDB_FIELD;
+				goto out_invalid_cdb_field;
 			}
 			/*
 			 * Currently for the emulated case we only accept
@@ -3616,10 +3571,10 @@ static int transport_generic_cmd_sequenc
 			if (!(cdb[1] & 0x08)) {
 				printk(KERN_ERR "WRITE_SAME w/o UNMAP bit not "
 					" supported for Block Discard Emulation\n");
-				return TGCS_INVALID_CDB_FIELD;
+				goto out_invalid_cdb_field;
 			}
 		}
-		ret = TGCS_CONTROL_SG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
 		break;
 	case ALLOW_MEDIUM_REMOVAL:
 	case GPCMD_CLOSE_TRACK:
@@ -3635,7 +3590,7 @@ static int transport_generic_cmd_sequenc
 	case VERIFY:
 	case WRITE_FILEMARKS:
 	case MOVE_MEDIUM:
-		ret = TGCS_NON_DATA_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_NON_DATA_CDB;
 		break;
 	case REPORT_LUNS:
 		cmd->transport_emulate_cdb =
@@ -3647,14 +3602,14 @@ static int transport_generic_cmd_sequenc
 		 */
 		if (SE_DEV(cmd)->dev_task_attr_type == SAM_TASK_ATTR_EMULATED)
 			cmd->sam_task_attr = TASK_ATTR_HOQ;
-		ret = TGCS_CONTROL_NONSG_IO_CDB;
+		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
 		break;
 	default:
 		printk(KERN_WARNING "TARGET_CORE[%s]: Unsupported SCSI Opcode"
 			" 0x%02x, sending CHECK_CONDITION.\n",
 			CMD_TFO(cmd)->get_fabric_name(), cdb[0]);
 		cmd->transport_wait_for_tasks = &transport_nop_wait_for_tasks;
-		return TGCS_UNSUPPORTED_CDB;
+		goto out_unsupported_cdb;
 	}
 
 	if (size != cmd->data_length) {
@@ -3668,7 +3623,7 @@ static int transport_generic_cmd_sequenc
 		if (cmd->data_direction == DMA_TO_DEVICE) {
 			printk(KERN_ERR "Rejecting underflow/overflow"
 					" WRITE data\n");
-			return TGCS_INVALID_CDB_FIELD;
+			goto out_invalid_cdb_field;
 		}
 		/*
 		 * Reject READ_* or WRITE_* with overflow/underflow for
@@ -3679,7 +3634,7 @@ static int transport_generic_cmd_sequenc
 				" CDB on non 512-byte sector setup subsystem"
 				" plugin: %s\n", TRANSPORT(dev)->name);
 			/* Returns CHECK_CONDITION + INVALID_CDB_FIELD */
-			return TGCS_INVALID_CDB_FIELD;
+			goto out_invalid_cdb_field;
 		}
 
 		if (size > cmd->data_length) {
@@ -3694,6 +3649,15 @@ static int transport_generic_cmd_sequenc
 
 	transport_set_supported_SAM_opcode(cmd);
 	return ret;
+
+out_unsupported_cdb:
+	cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
+	cmd->scsi_sense_reason = TCM_UNSUPPORTED_SCSI_OPCODE;
+	return -2;
+out_invalid_cdb_field:
+	cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
+	cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD;
+	return -2;
 }
 
 static inline void transport_release_tasks(struct se_cmd *);
Index: lio-core/include/target/target_core_transport.h
===================================================================
--- lio-core.orig/include/target/target_core_transport.h	2010-11-29 20:11:30.365253948 +0100
+++ lio-core/include/target/target_core_transport.h	2010-11-29 20:11:31.452004192 +0100
@@ -63,20 +63,6 @@
 #define DF_SPC2_RESERVATIONS			0x00000002
 #define DF_SPC2_RESERVATIONS_WITH_ISID		0x00000004
 
-/*
- * Used as return values from transport_generic_cmd_sequencer()
- */
-#define TGCS_DATA_SG_IO_CDB			0
-#define TGCS_CONTROL_SG_IO_CDB			1
-#define TGCS_CONTROL_NONSG_IO_CDB		2
-#define TGCS_NON_DATA_CDB			3
-#define TGCS_UNSUPPORTED_CDB			4
-#define TGCS_RESERVATION_CONFLICT		5
-#define TGCS_INVALID_CDB_FIELD			6
-#define TGCS_ILLEGAL_REQUEST			7
-#define TGCS_CHECK_CONDITION_UNIT_ATTENTION	8
-#define TGCS_CHECK_CONDITION_NOT_READY		9
-
 /* struct se_dev_attrib sanity values */
 /* 10 Minutes */
 #define DA_TASK_TIMEOUT_MAX			600

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/3] target: remove unused get_dma_length subsystem method
  2010-11-29 21:57 [PATCH 1/3] target: remove unused get_dma_length subsystem method Christoph Hellwig
  2010-11-29 21:58 ` [PATCH 2/3] target: always assign t_task_lba in transport_generic_cmd_sequencer Christoph Hellwig
  2010-11-29 21:58 ` [PATCH 3/3] target: always assign se_cmd flags " Christoph Hellwig
@ 2010-11-29 22:17 ` Nicholas A. Bellinger
  2 siblings, 0 replies; 6+ messages in thread
From: Nicholas A. Bellinger @ 2010-11-29 22:17 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: linux-scsi

On Mon, 2010-11-29 at 16:57 -0500, Christoph Hellwig wrote:
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> 

Looks good, committed as 12403c4 with the following:

"This patch removes the legacy se_subsystem_api->get_dma_length() that was
 originally used by a modern v4 equivilient of transport_generic_get_mem()
 with PAGE_SIZE to allow this to be dependent upon the backend."

Thanks Christoph!

--nab



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/3] target: always assign t_task_lba in transport_generic_cmd_sequencer
  2010-11-29 21:58 ` [PATCH 2/3] target: always assign t_task_lba in transport_generic_cmd_sequencer Christoph Hellwig
@ 2010-11-29 22:18   ` Nicholas A. Bellinger
  0 siblings, 0 replies; 6+ messages in thread
From: Nicholas A. Bellinger @ 2010-11-29 22:18 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: linux-scsi

On Mon, 2010-11-29 at 16:58 -0500, Christoph Hellwig wrote:
> We already sometimes directly calculate the lba in
> transport_generic_cmd_sequencer, but sometimes use the transport_get_long_lba /
> transport_get_lba callback in the se_cmd.  Unify the code to always assign
> it directly and remove the callbacks.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> 

A nice simplification, commited as 2c0284d.

Thanks!

> Index: lio-core/drivers/target/target_core_transport.c
> ===================================================================
> --- lio-core.orig/drivers/target/target_core_transport.c	2010-11-29 19:42:05.046003633 +0100
> +++ lio-core/drivers/target/target_core_transport.c	2010-11-29 19:47:31.670254576 +0100
> @@ -1952,15 +1952,6 @@ int transport_generic_allocate_tasks(
>  		DEBUG_CDB_H("Set cdb[0]: 0x%02x to "
>  				"SCF_SCSI_DATA_SG_IO_CDB\n", cdb[0]);
>  		cmd->se_cmd_flags |= SCF_SCSI_DATA_SG_IO_CDB;
> -
> -		/*
> -		 * Get the initial Logical Block Address from the Original
> -		 * Command Descriptor Block that arrived on the iSCSI wire.
> -		 */
> -		T_TASK(cmd)->t_task_lba = (cmd->transport_get_long_lba) ?
> -			cmd->transport_get_long_lba(cdb) :
> -			cmd->transport_get_lba(cdb);
> -
>  		break;
>  	case TGCS_CONTROL_SG_IO_CDB:
>  		DEBUG_CDB_H("Set cdb[0]: 0x%02x to"
> @@ -3184,7 +3175,7 @@ static int transport_generic_cmd_sequenc
>  			return TGCS_UNSUPPORTED_CDB;
>  		size = transport_get_size(sectors, cdb, cmd);
>  		cmd->transport_split_cdb = &split_cdb_XX_6;
> -		cmd->transport_get_lba = &transport_lba_21;
> +		T_TASK(cmd)->t_task_lba = transport_lba_21(cdb);
>  		ret = TGCS_DATA_SG_IO_CDB;
>  		break;
>  	case READ_10:
> @@ -3193,7 +3184,7 @@ static int transport_generic_cmd_sequenc
>  			return TGCS_UNSUPPORTED_CDB;
>  		size = transport_get_size(sectors, cdb, cmd);
>  		cmd->transport_split_cdb = &split_cdb_XX_10;
> -		cmd->transport_get_lba = &transport_lba_32;
> +		T_TASK(cmd)->t_task_lba = transport_lba_32(cdb);
>  		ret = TGCS_DATA_SG_IO_CDB;
>  		break;
>  	case READ_12:
> @@ -3202,7 +3193,7 @@ static int transport_generic_cmd_sequenc
>  			return TGCS_UNSUPPORTED_CDB;
>  		size = transport_get_size(sectors, cdb, cmd);
>  		cmd->transport_split_cdb = &split_cdb_XX_12;
> -		cmd->transport_get_lba = &transport_lba_32;
> +		T_TASK(cmd)->t_task_lba = transport_lba_32(cdb);
>  		ret = TGCS_DATA_SG_IO_CDB;
>  		break;
>  	case READ_16:
> @@ -3211,7 +3202,7 @@ static int transport_generic_cmd_sequenc
>  			return TGCS_UNSUPPORTED_CDB;
>  		size = transport_get_size(sectors, cdb, cmd);
>  		cmd->transport_split_cdb = &split_cdb_XX_16;
> -		cmd->transport_get_long_lba = &transport_lba_64;
> +		T_TASK(cmd)->t_task_lba = transport_lba_64(cdb);
>  		ret = TGCS_DATA_SG_IO_CDB;
>  		break;
>  	case WRITE_6:
> @@ -3220,7 +3211,7 @@ static int transport_generic_cmd_sequenc
>  			return TGCS_UNSUPPORTED_CDB;
>  		size = transport_get_size(sectors, cdb, cmd);
>  		cmd->transport_split_cdb = &split_cdb_XX_6;
> -		cmd->transport_get_lba = &transport_lba_21;
> +		T_TASK(cmd)->t_task_lba = transport_lba_21(cdb);
>  		ret = TGCS_DATA_SG_IO_CDB;
>  		break;
>  	case WRITE_10:
> @@ -3229,7 +3220,7 @@ static int transport_generic_cmd_sequenc
>  			return TGCS_UNSUPPORTED_CDB;
>  		size = transport_get_size(sectors, cdb, cmd);
>  		cmd->transport_split_cdb = &split_cdb_XX_10;
> -		cmd->transport_get_lba = &transport_lba_32;
> +		T_TASK(cmd)->t_task_lba = transport_lba_32(cdb);
>  		T_TASK(cmd)->t_tasks_fua = (cdb[1] & 0x8);
>  		ret = TGCS_DATA_SG_IO_CDB;
>  		break;
> @@ -3239,7 +3230,7 @@ static int transport_generic_cmd_sequenc
>  			return TGCS_UNSUPPORTED_CDB;
>  		size = transport_get_size(sectors, cdb, cmd);
>  		cmd->transport_split_cdb = &split_cdb_XX_12;
> -		cmd->transport_get_lba = &transport_lba_32;
> +		T_TASK(cmd)->t_task_lba = transport_lba_32(cdb);
>  		T_TASK(cmd)->t_tasks_fua = (cdb[1] & 0x8);
>  		ret = TGCS_DATA_SG_IO_CDB;
>  		break;
> @@ -3249,7 +3240,7 @@ static int transport_generic_cmd_sequenc
>  			return TGCS_UNSUPPORTED_CDB;
>  		size = transport_get_size(sectors, cdb, cmd);
>  		cmd->transport_split_cdb = &split_cdb_XX_16;
> -		cmd->transport_get_long_lba = &transport_lba_64;
> +		T_TASK(cmd)->t_task_lba = transport_lba_64(cdb);
>  		T_TASK(cmd)->t_tasks_fua = (cdb[1] & 0x8);
>  		ret = TGCS_DATA_SG_IO_CDB;
>  		break;
> @@ -3262,7 +3253,7 @@ static int transport_generic_cmd_sequenc
>  			return TGCS_UNSUPPORTED_CDB;
>  		size = transport_get_size(sectors, cdb, cmd);
>  		cmd->transport_split_cdb = &split_cdb_XX_10;
> -		cmd->transport_get_lba = &transport_lba_32;
> +		T_TASK(cmd)->t_task_lba = transport_lba_32(cdb);
>  		passthrough = (TRANSPORT(dev)->transport_type ==
>  				TRANSPORT_PLUGIN_PHBA_PDEV);
>  		/*
> @@ -3297,7 +3288,7 @@ static int transport_generic_cmd_sequenc
>  			 * XDWRITE_READ_32 logic.
>  			 */
>  			cmd->transport_split_cdb = &split_cdb_XX_32;
> -			cmd->transport_get_long_lba = &transport_lba_64_ext;
> +			T_TASK(cmd)->t_task_lba = transport_lba_64_ext(cdb);
>  			/*
>  			 * Skip the remaining assignments for TCM/PSCSI passthrough
>  			 */
> Index: lio-core/include/target/target_core_base.h
> ===================================================================
> --- lio-core.orig/include/target/target_core_base.h	2010-11-29 19:45:26.207004193 +0100
> +++ lio-core/include/target/target_core_base.h	2010-11-29 19:45:30.786254087 +0100
> @@ -531,8 +531,6 @@ struct se_cmd {
>  	struct se_transport_task t_task_backstore;
>  	struct target_core_fabric_ops *se_tfo;
>  	int (*transport_emulate_cdb)(struct se_cmd *);
> -	u32 (*transport_get_lba)(unsigned char *);
> -	unsigned long long (*transport_get_long_lba)(unsigned char *);
>  	void (*transport_split_cdb)(unsigned long long, u32 *, unsigned char *);
>  	void (*transport_wait_for_tasks)(struct se_cmd *, int, int);
>  	void (*transport_complete_callback)(struct se_cmd *);


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 3/3] target: always assign se_cmd flags in transport_generic_cmd_sequencer
  2010-11-29 21:58 ` [PATCH 3/3] target: always assign se_cmd flags " Christoph Hellwig
@ 2010-11-29 22:26   ` Nicholas A. Bellinger
  0 siblings, 0 replies; 6+ messages in thread
From: Nicholas A. Bellinger @ 2010-11-29 22:26 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: linux-scsi

On Mon, 2010-11-29 at 16:58 -0500, Christoph Hellwig wrote:
> Assign the flags and in case of errors the sense code in
> transport_generic_cmd_sequencer, and pass through the return value from it in
> transport_generic_allocate_tasks.  This gets rid of a special set of return
> codes and a switch statement in the fast path.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> 

A very nice cleanup as well, everything looks correct and committed as
a1a31bf.  The total for the series is:

 drivers/target/target_core_alua.c      |    4 +-
 drivers/target/target_core_file.c      |   10 -
 drivers/target/target_core_iblock.c    |    6 -
 drivers/target/target_core_pscsi.c     |   10 -
 drivers/target/target_core_rd.c        |   11 --
 drivers/target/target_core_stgt.c      |   10 -
 drivers/target/target_core_transport.c |  295 ++++++++++++++------------------
 include/target/target_core_base.h      |    2 -
 include/target/target_core_transport.h |   18 --
 9 files changed, 127 insertions(+), 239 deletions(-)


Pushing into lio-4.0 now, and will be testing shortly and pushing into
master as well.

Thanks!

--nab


> Index: lio-core/drivers/target/target_core_alua.c
> ===================================================================
> --- lio-core.orig/drivers/target/target_core_alua.c	2010-11-29 20:11:25.778254298 +0100
> +++ lio-core/drivers/target/target_core_alua.c	2010-11-29 20:16:02.436254646 +0100
> @@ -455,9 +455,9 @@ static int core_alua_state_check_nop(
>   * Also, this function can return three different return codes to
>   * signal transport_generic_cmd_sequencer()
>   *
> - * return 1: Is used to signal LUN not accecsable, and TGCS_CHECK_CONDITION_NOT_READY
> + * return 1: Is used to signal LUN not accecsable, and check condition/not ready
>   * return 0: Used to signal success
> - * reutrn -1: Used to signal failure, and TGCS_INVALID_CDB_FIELD
> + * reutrn -1: Used to signal failure, and invalid cdb field
>   */
>  static int core_alua_state_check(
>  	struct se_cmd *cmd,
> Index: lio-core/drivers/target/target_core_transport.c
> ===================================================================
> --- lio-core.orig/drivers/target/target_core_transport.c	2010-11-29 20:11:30.802004332 +0100
> +++ lio-core/drivers/target/target_core_transport.c	2010-11-29 20:17:20.321254787 +0100
> @@ -1886,7 +1886,7 @@ int transport_generic_allocate_tasks(
>  	struct se_cmd *cmd,
>  	unsigned char *cdb)
>  {
> -	int non_data_cdb;
> +	int ret;
>  
>  	transport_generic_prepare_cdb(cdb);
>  
> @@ -1900,9 +1900,9 @@ int transport_generic_allocate_tasks(
>  	 * See if this is a CDB which follows SAM, also grab a function
>  	 * pointer to see if we need to do extra work.
>  	 */
> -	non_data_cdb = transport_generic_cmd_sequencer(cmd, cdb);
> -	if (non_data_cdb < 0)
> -		return -1;
> +	ret = transport_generic_cmd_sequencer(cmd, cdb);
> +	if (ret < 0)
> +		return ret;
>  	/*
>  	 * Ensure that the received CDB is less than the max (252 + 8) bytes
>  	 * for VARIABLE_LENGTH_CMD
> @@ -1946,75 +1946,6 @@ int transport_generic_allocate_tasks(
>  	if (cmd->se_lun->lun_sep)
>  		cmd->se_lun->lun_sep->sep_stats.cmd_pdus++;
>  	spin_unlock(&cmd->se_lun->lun_sep_lock);
> -
> -	switch (non_data_cdb) {
> -	case TGCS_DATA_SG_IO_CDB:
> -		DEBUG_CDB_H("Set cdb[0]: 0x%02x to "
> -				"SCF_SCSI_DATA_SG_IO_CDB\n", cdb[0]);
> -		cmd->se_cmd_flags |= SCF_SCSI_DATA_SG_IO_CDB;
> -		break;
> -	case TGCS_CONTROL_SG_IO_CDB:
> -		DEBUG_CDB_H("Set cdb[0]: 0x%02x to"
> -				" SCF_SCSI_CONTROL_SG_IO_CDB\n", cdb[0]);
> -		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
> -		break;
> -	case TGCS_CONTROL_NONSG_IO_CDB:
> -		DEBUG_CDB_H("Set cdb[0]: 0x%02x to "
> -				"SCF_SCSI_CONTROL_NONSG_IO_CDB\n", cdb[0]);
> -		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
> -		break;
> -	case TGCS_NON_DATA_CDB:
> -		DEBUG_CDB_H("Set cdb[0]: 0x%02x to "
> -				"SCF_SCSI_NON_DATA_CDB\n", cdb[0]);
> -		cmd->se_cmd_flags |= SCF_SCSI_NON_DATA_CDB;
> -		break;
> -	case TGCS_UNSUPPORTED_CDB:
> -		DEBUG_CDB_H("Set cdb[0]: 0x%02x to"
> -				" SCF_SCSI_UNSUPPORTED_CDB\n", cdb[0]);
> -		cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
> -		cmd->scsi_sense_reason = TCM_UNSUPPORTED_SCSI_OPCODE;
> -		return -2;
> -	case TGCS_RESERVATION_CONFLICT:
> -		DEBUG_CDB_H("Set cdb[0]: 0x%02x to"
> -				" SCF_SCSI_RESERVATION_CONFLICT\n", cdb[0]);
> -		cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
> -		cmd->se_cmd_flags |= SCF_SCSI_RESERVATION_CONFLICT;
> -		cmd->scsi_status = SAM_STAT_RESERVATION_CONFLICT;
> -		/*
> -		 * For UA Interlock Code 11b, a RESERVATION CONFLICT will
> -		 * establish a UNIT ATTENTION with PREVIOUS RESERVATION
> -		 * CONFLICT STATUS.
> -		 *
> -		 * See spc4r17, section 7.4.6 Control Mode Page, Table 349
> -		 */
> -		if (SE_SESS(cmd) &&
> -		    DEV_ATTRIB(cmd->se_dev)->emulate_ua_intlck_ctrl == 2)
> -			core_scsi3_ua_allocate(SE_SESS(cmd)->se_node_acl,
> -				cmd->orig_fe_lun, 0x2C,
> -				ASCQ_2CH_PREVIOUS_RESERVATION_CONFLICT_STATUS);
> -		return -2;
> -	case TGCS_INVALID_CDB_FIELD:
> -		cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
> -		cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD;
> -		return -2;
> -	case TGCS_ILLEGAL_REQUEST:
> -		cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
> -		cmd->scsi_sense_reason = TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
> -		return -2;
> -	case TGCS_CHECK_CONDITION_UNIT_ATTENTION:
> -		cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
> -		cmd->scsi_sense_reason = TCM_CHECK_CONDITION_UNIT_ATTENTION;
> -		return -2;
> -	case TGCS_CHECK_CONDITION_NOT_READY:
> -		cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
> -		cmd->scsi_sense_reason = TCM_CHECK_CONDITION_NOT_READY;
> -		return -2;
> -	default:
> -		cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
> -		cmd->scsi_sense_reason = TCM_UNSUPPORTED_SCSI_OPCODE;
> -		return -2;
> -	}
> -
>  	return 0;
>  }
>  EXPORT_SYMBOL(transport_generic_allocate_tasks);
> @@ -3101,6 +3032,28 @@ static int transport_allocate_resources(
>  		return 0;
>  }
>  
> +static int
> +transport_handle_reservation_conflict(struct se_cmd *cmd)
> +{
> +	cmd->transport_wait_for_tasks = &transport_nop_wait_for_tasks;
> +	cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
> +	cmd->se_cmd_flags |= SCF_SCSI_RESERVATION_CONFLICT;
> +	cmd->scsi_status = SAM_STAT_RESERVATION_CONFLICT;
> +	/*
> +	 * For UA Interlock Code 11b, a RESERVATION CONFLICT will
> +	 * establish a UNIT ATTENTION with PREVIOUS RESERVATION
> +	 * CONFLICT STATUS.
> +	 *
> +	 * See spc4r17, section 7.4.6 Control Mode Page, Table 349
> +	 */
> +	if (SE_SESS(cmd) &&
> +	    DEV_ATTRIB(cmd->se_dev)->emulate_ua_intlck_ctrl == 2)
> +		core_scsi3_ua_allocate(SE_SESS(cmd)->se_node_acl,
> +			cmd->orig_fe_lun, 0x2C,
> +			ASCQ_2CH_PREVIOUS_RESERVATION_CONFLICT_STATUS);
> +	return -2;
> +}
> +
>  /*	transport_generic_cmd_sequencer():
>   *
>   *	Generic Command Sequencer that should work for most DAS transport
> @@ -3117,7 +3070,7 @@ static int transport_generic_cmd_sequenc
>  {
>  	struct se_device *dev = SE_DEV(cmd);
>  	struct se_subsystem_dev *su_dev = dev->se_sub_dev;
> -	int ret, sector_ret = 0, passthrough;
> +	int ret = 0, sector_ret = 0, passthrough;
>  	u32 sectors = 0, size = 0, pr_reg_type = 0;
>  	u16 service_action;
>  	u8 alua_ascq = 0;
> @@ -3127,7 +3080,9 @@ static int transport_generic_cmd_sequenc
>  	if (core_scsi3_ua_check(cmd, cdb) < 0) {
>  		cmd->transport_wait_for_tasks =
>  				&transport_nop_wait_for_tasks;
> -		return TGCS_CHECK_CONDITION_UNIT_ATTENTION;
> +		cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
> +		cmd->scsi_sense_reason = TCM_CHECK_CONDITION_UNIT_ATTENTION;
> +		return -2;
>  	}
>  	/*
>  	 * Check status of Asymmetric Logical Unit Assignment port
> @@ -3147,20 +3102,19 @@ static int transport_generic_cmd_sequenc
>  				CMD_TFO(cmd)->get_fabric_name(), alua_ascq);
>  #endif
>  			transport_set_sense_codes(cmd, 0x04, alua_ascq);
> -			return TGCS_CHECK_CONDITION_NOT_READY;
> +			cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
> +			cmd->scsi_sense_reason = TCM_CHECK_CONDITION_NOT_READY;
> +			return -2;
>  		}
> -		return TGCS_INVALID_CDB_FIELD;
> +		goto out_invalid_cdb_field;
>  	}
>  	/*
>  	 * Check status for SPC-3 Persistent Reservations
>  	 */
>  	if (T10_PR_OPS(su_dev)->t10_reservation_check(cmd, &pr_reg_type) != 0) {
>  		if (T10_PR_OPS(su_dev)->t10_seq_non_holder(
> -					cmd, cdb, pr_reg_type) != 0) {
> -			cmd->transport_wait_for_tasks =
> -					&transport_nop_wait_for_tasks;
> -			return TGCS_RESERVATION_CONFLICT;
> -		}
> +					cmd, cdb, pr_reg_type) != 0)
> +			return transport_handle_reservation_conflict(cmd);
>  		/*
>  		 * This means the CDB is allowed for the SCSI Initiator port
>  		 * when said port is *NOT* holding the legacy SPC-2 or
> @@ -3172,88 +3126,89 @@ static int transport_generic_cmd_sequenc
>  	case READ_6:
>  		sectors = transport_get_sectors_6(cdb, cmd, &sector_ret);
>  		if (sector_ret)
> -			return TGCS_UNSUPPORTED_CDB;
> +			goto out_unsupported_cdb;
>  		size = transport_get_size(sectors, cdb, cmd);
>  		cmd->transport_split_cdb = &split_cdb_XX_6;
>  		T_TASK(cmd)->t_task_lba = transport_lba_21(cdb);
> -		ret = TGCS_DATA_SG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_DATA_SG_IO_CDB;
>  		break;
>  	case READ_10:
>  		sectors = transport_get_sectors_10(cdb, cmd, &sector_ret);
>  		if (sector_ret)
> -			return TGCS_UNSUPPORTED_CDB;
> +			goto out_unsupported_cdb;
>  		size = transport_get_size(sectors, cdb, cmd);
>  		cmd->transport_split_cdb = &split_cdb_XX_10;
>  		T_TASK(cmd)->t_task_lba = transport_lba_32(cdb);
> -		ret = TGCS_DATA_SG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_DATA_SG_IO_CDB;
>  		break;
>  	case READ_12:
>  		sectors = transport_get_sectors_12(cdb, cmd, &sector_ret);
>  		if (sector_ret)
> -			return TGCS_UNSUPPORTED_CDB;
> +			goto out_unsupported_cdb;
>  		size = transport_get_size(sectors, cdb, cmd);
>  		cmd->transport_split_cdb = &split_cdb_XX_12;
>  		T_TASK(cmd)->t_task_lba = transport_lba_32(cdb);
> -		ret = TGCS_DATA_SG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_DATA_SG_IO_CDB;
>  		break;
>  	case READ_16:
>  		sectors = transport_get_sectors_16(cdb, cmd, &sector_ret);
>  		if (sector_ret)
> -			return TGCS_UNSUPPORTED_CDB;
> +			goto out_unsupported_cdb;
>  		size = transport_get_size(sectors, cdb, cmd);
>  		cmd->transport_split_cdb = &split_cdb_XX_16;
>  		T_TASK(cmd)->t_task_lba = transport_lba_64(cdb);
> -		ret = TGCS_DATA_SG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_DATA_SG_IO_CDB;
>  		break;
>  	case WRITE_6:
>  		sectors = transport_get_sectors_6(cdb, cmd, &sector_ret);
>  		if (sector_ret)
> -			return TGCS_UNSUPPORTED_CDB;
> +			goto out_unsupported_cdb;
>  		size = transport_get_size(sectors, cdb, cmd);
>  		cmd->transport_split_cdb = &split_cdb_XX_6;
>  		T_TASK(cmd)->t_task_lba = transport_lba_21(cdb);
> -		ret = TGCS_DATA_SG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_DATA_SG_IO_CDB;
>  		break;
>  	case WRITE_10:
>  		sectors = transport_get_sectors_10(cdb, cmd, &sector_ret);
>  		if (sector_ret)
> -			return TGCS_UNSUPPORTED_CDB;
> +			goto out_unsupported_cdb;
>  		size = transport_get_size(sectors, cdb, cmd);
>  		cmd->transport_split_cdb = &split_cdb_XX_10;
>  		T_TASK(cmd)->t_task_lba = transport_lba_32(cdb);
>  		T_TASK(cmd)->t_tasks_fua = (cdb[1] & 0x8);
> -		ret = TGCS_DATA_SG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_DATA_SG_IO_CDB;
>  		break;
>  	case WRITE_12:
>  		sectors = transport_get_sectors_12(cdb, cmd, &sector_ret);
>  		if (sector_ret)
> -			return TGCS_UNSUPPORTED_CDB;
> +			goto out_unsupported_cdb;
>  		size = transport_get_size(sectors, cdb, cmd);
>  		cmd->transport_split_cdb = &split_cdb_XX_12;
>  		T_TASK(cmd)->t_task_lba = transport_lba_32(cdb);
>  		T_TASK(cmd)->t_tasks_fua = (cdb[1] & 0x8);
> -		ret = TGCS_DATA_SG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_DATA_SG_IO_CDB;
>  		break;
>  	case WRITE_16:
>  		sectors = transport_get_sectors_16(cdb, cmd, &sector_ret);
>  		if (sector_ret)
> -			return TGCS_UNSUPPORTED_CDB;
> +			goto out_unsupported_cdb;
>  		size = transport_get_size(sectors, cdb, cmd);
>  		cmd->transport_split_cdb = &split_cdb_XX_16;
>  		T_TASK(cmd)->t_task_lba = transport_lba_64(cdb);
>  		T_TASK(cmd)->t_tasks_fua = (cdb[1] & 0x8);
> -		ret = TGCS_DATA_SG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_DATA_SG_IO_CDB;
>  		break;
>  	case XDWRITEREAD_10:
>  		if ((cmd->data_direction != DMA_TO_DEVICE) ||
>  		    !(T_TASK(cmd)->t_tasks_bidi))
> -			return TGCS_INVALID_CDB_FIELD;
> +			goto out_invalid_cdb_field;
>  		sectors = transport_get_sectors_10(cdb, cmd, &sector_ret);
>  		if (sector_ret)
> -			return TGCS_UNSUPPORTED_CDB;
> +			goto out_unsupported_cdb;
>  		size = transport_get_size(sectors, cdb, cmd);
>  		cmd->transport_split_cdb = &split_cdb_XX_10;
>  		T_TASK(cmd)->t_task_lba = transport_lba_32(cdb);
> +		cmd->se_cmd_flags |= SCF_SCSI_DATA_SG_IO_CDB;
>  		passthrough = (TRANSPORT(dev)->transport_type ==
>  				TRANSPORT_PLUGIN_PHBA_PDEV);
>  		/*
> @@ -3266,7 +3221,6 @@ static int transport_generic_cmd_sequenc
>  		 */
>  		cmd->transport_complete_callback = &transport_xor_callback;
>  		T_TASK(cmd)->t_tasks_fua = (cdb[1] & 0x8);
> -		ret = TGCS_DATA_SG_IO_CDB;
>  		break;
>  	case VARIABLE_LENGTH_CMD:
>  		service_action = get_unaligned_be16(&cdb[8]);
> @@ -3281,7 +3235,7 @@ static int transport_generic_cmd_sequenc
>  		case XDWRITEREAD_32:
>  			sectors = transport_get_sectors_32(cdb, cmd, &sector_ret);
>  			if (sector_ret)
> -				return TGCS_UNSUPPORTED_CDB;
> +				goto out_unsupported_cdb;
>  			size = transport_get_size(sectors, cdb, cmd);
>  			/*
>  			 * Use WRITE_32 and READ_32 opcodes for the emulated
> @@ -3289,39 +3243,40 @@ static int transport_generic_cmd_sequenc
>  			 */
>  			cmd->transport_split_cdb = &split_cdb_XX_32;
>  			T_TASK(cmd)->t_task_lba = transport_lba_64_ext(cdb);
> +			cmd->se_cmd_flags |= SCF_SCSI_DATA_SG_IO_CDB;
> +
>  			/*
>  			 * Skip the remaining assignments for TCM/PSCSI passthrough
>  			 */
> -			if (passthrough) {
> -				ret = TGCS_DATA_SG_IO_CDB;
> +			if (passthrough)
>  				break;
> -			}
> +
>  			/*
>  			 * Setup BIDI XOR callback to be run during
>  			 * transport_generic_complete_ok()
>  			 */
>  			cmd->transport_complete_callback = &transport_xor_callback;
>  			T_TASK(cmd)->t_tasks_fua = (cdb[10] & 0x8);
> -			ret = TGCS_DATA_SG_IO_CDB;	
>  			break;
>  		case WRITE_SAME_32:
>  			sectors = transport_get_sectors_32(cdb, cmd, &sector_ret);
>  			if (sector_ret)
> -				return TGCS_UNSUPPORTED_CDB;
> +				goto out_unsupported_cdb;
>  			size = transport_get_size(sectors, cdb, cmd);
>  			T_TASK(cmd)->t_task_lba = get_unaligned_be64(&cdb[12]);
> +			cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
> +
>  			/*
>  			 * Skip the remaining assignments for TCM/PSCSI passthrough
>  			 */
> -			if (passthrough) {
> -				ret = TGCS_CONTROL_SG_IO_CDB;
> +			if (passthrough)
>  				break;
> -			}
> +
>  			if ((cdb[10] & 0x04) || (cdb[10] & 0x02)) {
>  				printk(KERN_ERR "WRITE_SAME PBDATA and LBDATA"
>  					" bits not supported for Block Discard"
>  					" Emulation\n");
> -				return TGCS_INVALID_CDB_FIELD;
> +				goto out_invalid_cdb_field;
>  			}
>  			/*
>  			 * Currently for the emulated case we only accept
> @@ -3330,14 +3285,13 @@ static int transport_generic_cmd_sequenc
>  			if (!(cdb[10] & 0x08)) {
>  				printk(KERN_ERR "WRITE_SAME w/o UNMAP bit not"
>  					" supported for Block Discard Emulation\n");
> -				return TGCS_INVALID_CDB_FIELD;
> +				goto out_invalid_cdb_field;
>  			}
> -			ret = TGCS_CONTROL_SG_IO_CDB;
>  			break;
>  		default:
>  			printk(KERN_ERR "VARIABLE_LENGTH_CMD service action"
>  				" 0x%04x not supported\n", service_action);
> -			return TGCS_UNSUPPORTED_CDB;
> +			goto out_unsupported_cdb;
>  		}
>  		break;
>  	case 0xa3:
> @@ -3359,19 +3313,19 @@ static int transport_generic_cmd_sequenc
>  			/* GPCMD_SEND_KEY from multi media commands */
>  			size = (cdb[8] << 8) + cdb[9];
>  		}
> -		ret = TGCS_CONTROL_NONSG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
>  		break;
>  	case MODE_SELECT:
>  		size = cdb[4];
> -		ret = TGCS_CONTROL_SG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
>  		break;
>  	case MODE_SELECT_10:
>  		size = (cdb[7] << 8) + cdb[8];
> -		ret = TGCS_CONTROL_SG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
>  		break;
>  	case MODE_SENSE:
>  		size = cdb[4];
> -		ret = TGCS_CONTROL_NONSG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
>  		break;
>  	case MODE_SENSE_10:
>  	case GPCMD_READ_BUFFER_CAPACITY:
> @@ -3379,18 +3333,18 @@ static int transport_generic_cmd_sequenc
>  	case LOG_SELECT:
>  	case LOG_SENSE:
>  		size = (cdb[7] << 8) + cdb[8];
> -		ret = TGCS_CONTROL_NONSG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
>  		break;
>  	case READ_BLOCK_LIMITS:
>  		size = READ_BLOCK_LEN;
> -		ret = TGCS_CONTROL_NONSG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
>  		break;
>  	case GPCMD_GET_CONFIGURATION:
>  	case GPCMD_READ_FORMAT_CAPACITIES:
>  	case GPCMD_READ_DISC_INFO:
>  	case GPCMD_READ_TRACK_RZONE_INFO:
>  		size = (cdb[7] << 8) + cdb[8];
> -		ret = TGCS_CONTROL_SG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
>  		break;
>  	case PERSISTENT_RESERVE_IN:
>  	case PERSISTENT_RESERVE_OUT:
> @@ -3399,16 +3353,16 @@ static int transport_generic_cmd_sequenc
>  			 SPC3_PERSISTENT_RESERVATIONS) ?
>  			&core_scsi3_emulate_pr : NULL;
>  		size = (cdb[7] << 8) + cdb[8];
> -		ret = TGCS_CONTROL_NONSG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
>  		break;
>  	case GPCMD_MECHANISM_STATUS:
>  	case GPCMD_READ_DVD_STRUCTURE:
>  		size = (cdb[8] << 8) + cdb[9];
> -		ret = TGCS_CONTROL_SG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
>  		break;
>  	case READ_POSITION:
>  		size = READ_POSITION_LEN;
> -		ret = TGCS_CONTROL_NONSG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
>  		break;
>  	case 0xa4:
>  		if (TRANSPORT(dev)->get_device_type(dev) != TYPE_ROM) {
> @@ -3430,7 +3384,7 @@ static int transport_generic_cmd_sequenc
>  			/* GPCMD_REPORT_KEY from multi media commands */
>  			size = (cdb[8] << 8) + cdb[9];
>  		}
> -		ret = TGCS_CONTROL_NONSG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
>  		break;
>  	case INQUIRY:
>  		size = (cdb[3] << 8) + cdb[4];
> @@ -3440,21 +3394,21 @@ static int transport_generic_cmd_sequenc
>  		 */
>  		if (SE_DEV(cmd)->dev_task_attr_type == SAM_TASK_ATTR_EMULATED)
>  			cmd->sam_task_attr = TASK_ATTR_HOQ;
> -		ret = TGCS_CONTROL_NONSG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
>  		break;
>  	case READ_BUFFER:
>  		size = (cdb[6] << 16) + (cdb[7] << 8) + cdb[8];
> -		ret = TGCS_CONTROL_NONSG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
>  		break;
>  	case READ_CAPACITY:
>  		size = READ_CAP_LEN;
> -		ret = TGCS_CONTROL_NONSG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
>  		break;
>  	case READ_MEDIA_SERIAL_NUMBER:
>  	case SECURITY_PROTOCOL_IN:
>  	case SECURITY_PROTOCOL_OUT:
>  		size = (cdb[6] << 24) | (cdb[7] << 16) | (cdb[8] << 8) | cdb[9];
> -		ret = TGCS_CONTROL_NONSG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
>  		break;
>  	case SERVICE_ACTION_IN:
>  	case ACCESS_CONTROL_IN:
> @@ -3465,36 +3419,36 @@ static int transport_generic_cmd_sequenc
>  	case WRITE_ATTRIBUTE:
>  		size = (cdb[10] << 24) | (cdb[11] << 16) |
>  		       (cdb[12] << 8) | cdb[13];
> -		ret = TGCS_CONTROL_NONSG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
>  		break;
>  	case RECEIVE_DIAGNOSTIC:
>  	case SEND_DIAGNOSTIC:
>  		size = (cdb[3] << 8) | cdb[4];
> -		ret = TGCS_CONTROL_NONSG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
>  		break;
>  /* #warning FIXME: Figure out correct GPCMD_READ_CD blocksize. */
>  #if 0
>  	case GPCMD_READ_CD:
>  		sectors = (cdb[6] << 16) + (cdb[7] << 8) + cdb[8];
>  		size = (2336 * sectors);
> -		ret = TGCS_CONTROL_NONSG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
>  		break;
>  #endif
>  	case READ_TOC:
>  		size = cdb[8];
> -		ret = TGCS_CONTROL_NONSG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
>  		break;
>  	case REQUEST_SENSE:
>  		size = cdb[4];
> -		ret = TGCS_CONTROL_NONSG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
>  		break;
>  	case READ_ELEMENT_STATUS:
>  		size = 65536 * cdb[7] + 256 * cdb[8] + cdb[9];
> -		ret = TGCS_CONTROL_NONSG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
>  		break;
>  	case WRITE_BUFFER:
>  		size = (cdb[6] << 16) + (cdb[7] << 8) + cdb[8];
> -		ret = TGCS_CONTROL_NONSG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
>  		break;
>  	case RESERVE:
>  	case RESERVE_10:
> @@ -3518,7 +3472,7 @@ static int transport_generic_cmd_sequenc
>  				(T10_RES(su_dev)->res_type !=
>  				 SPC_PASSTHROUGH) ?
>  				&core_scsi2_emulate_crh : NULL;
> -		ret = TGCS_NON_DATA_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_NON_DATA_CDB;
>  		break;
>  	case RELEASE:
>  	case RELEASE_10:
> @@ -3535,7 +3489,7 @@ static int transport_generic_cmd_sequenc
>  				(T10_RES(su_dev)->res_type !=
>  				 SPC_PASSTHROUGH) ?
>  				&core_scsi2_emulate_crh : NULL;
> -		ret = TGCS_NON_DATA_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_NON_DATA_CDB;
>  		break;
>  	case SYNCHRONIZE_CACHE:
>  	case 0x91: /* SYNCHRONIZE_CACHE_16: */
> @@ -3550,10 +3504,11 @@ static int transport_generic_cmd_sequenc
>  			T_TASK(cmd)->t_task_lba = transport_lba_64(cdb);
>  		}
>                  if (sector_ret)
> -                        return TGCS_UNSUPPORTED_CDB;
> +			goto out_unsupported_cdb;
>  
>                  size = transport_get_size(sectors, cdb, cmd);
> -		ret = TGCS_NON_DATA_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_NON_DATA_CDB;
> +
>  		/*
>  		 * For TCM/pSCSI passthrough, skip cmd->transport_emulate_cdb()
>  		 */
> @@ -3569,7 +3524,7 @@ static int transport_generic_cmd_sequenc
>  		 * device.
>  		 */
>  		if (transport_get_sectors(cmd) < 0)
> -			return TGCS_INVALID_CDB_FIELD;
> +			goto out_invalid_cdb_field;
>  		break;
>  	case UNMAP:
>  		size = get_unaligned_be16(&cdb[7]);
> @@ -3585,12 +3540,12 @@ static int transport_generic_cmd_sequenc
>  		if (!(passthrough))
>  			cmd->se_cmd_flags |= SCF_EMULATE_SYNC_UNMAP;
>  
> -		ret = TGCS_CONTROL_NONSG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
>  		break;
>  	case WRITE_SAME_16:
>  		sectors = transport_get_sectors_16(cdb, cmd, &sector_ret);
>  		if (sector_ret)
> -			return TGCS_UNSUPPORTED_CDB;
> +			goto out_unsupported_cdb;
>  		size = transport_get_size(sectors, cdb, cmd);
>  		T_TASK(cmd)->t_task_lba = get_unaligned_be16(&cdb[2]);
>  		passthrough = (TRANSPORT(dev)->transport_type ==
> @@ -3607,7 +3562,7 @@ static int transport_generic_cmd_sequenc
>  				printk(KERN_ERR "WRITE_SAME PBDATA and LBDATA"
>  					" bits not supported for Block Discard"
>  					" Emulation\n");
> -				return TGCS_INVALID_CDB_FIELD;
> +				goto out_invalid_cdb_field;
>  			}
>  			/*
>  			 * Currently for the emulated case we only accept
> @@ -3616,10 +3571,10 @@ static int transport_generic_cmd_sequenc
>  			if (!(cdb[1] & 0x08)) {
>  				printk(KERN_ERR "WRITE_SAME w/o UNMAP bit not "
>  					" supported for Block Discard Emulation\n");
> -				return TGCS_INVALID_CDB_FIELD;
> +				goto out_invalid_cdb_field;
>  			}
>  		}
> -		ret = TGCS_CONTROL_SG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
>  		break;
>  	case ALLOW_MEDIUM_REMOVAL:
>  	case GPCMD_CLOSE_TRACK:
> @@ -3635,7 +3590,7 @@ static int transport_generic_cmd_sequenc
>  	case VERIFY:
>  	case WRITE_FILEMARKS:
>  	case MOVE_MEDIUM:
> -		ret = TGCS_NON_DATA_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_NON_DATA_CDB;
>  		break;
>  	case REPORT_LUNS:
>  		cmd->transport_emulate_cdb =
> @@ -3647,14 +3602,14 @@ static int transport_generic_cmd_sequenc
>  		 */
>  		if (SE_DEV(cmd)->dev_task_attr_type == SAM_TASK_ATTR_EMULATED)
>  			cmd->sam_task_attr = TASK_ATTR_HOQ;
> -		ret = TGCS_CONTROL_NONSG_IO_CDB;
> +		cmd->se_cmd_flags |= SCF_SCSI_CONTROL_NONSG_IO_CDB;
>  		break;
>  	default:
>  		printk(KERN_WARNING "TARGET_CORE[%s]: Unsupported SCSI Opcode"
>  			" 0x%02x, sending CHECK_CONDITION.\n",
>  			CMD_TFO(cmd)->get_fabric_name(), cdb[0]);
>  		cmd->transport_wait_for_tasks = &transport_nop_wait_for_tasks;
> -		return TGCS_UNSUPPORTED_CDB;
> +		goto out_unsupported_cdb;
>  	}
>  
>  	if (size != cmd->data_length) {
> @@ -3668,7 +3623,7 @@ static int transport_generic_cmd_sequenc
>  		if (cmd->data_direction == DMA_TO_DEVICE) {
>  			printk(KERN_ERR "Rejecting underflow/overflow"
>  					" WRITE data\n");
> -			return TGCS_INVALID_CDB_FIELD;
> +			goto out_invalid_cdb_field;
>  		}
>  		/*
>  		 * Reject READ_* or WRITE_* with overflow/underflow for
> @@ -3679,7 +3634,7 @@ static int transport_generic_cmd_sequenc
>  				" CDB on non 512-byte sector setup subsystem"
>  				" plugin: %s\n", TRANSPORT(dev)->name);
>  			/* Returns CHECK_CONDITION + INVALID_CDB_FIELD */
> -			return TGCS_INVALID_CDB_FIELD;
> +			goto out_invalid_cdb_field;
>  		}
>  
>  		if (size > cmd->data_length) {
> @@ -3694,6 +3649,15 @@ static int transport_generic_cmd_sequenc
>  
>  	transport_set_supported_SAM_opcode(cmd);
>  	return ret;
> +
> +out_unsupported_cdb:
> +	cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
> +	cmd->scsi_sense_reason = TCM_UNSUPPORTED_SCSI_OPCODE;
> +	return -2;
> +out_invalid_cdb_field:
> +	cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
> +	cmd->scsi_sense_reason = TCM_INVALID_CDB_FIELD;
> +	return -2;
>  }
>  
>  static inline void transport_release_tasks(struct se_cmd *);
> Index: lio-core/include/target/target_core_transport.h
> ===================================================================
> --- lio-core.orig/include/target/target_core_transport.h	2010-11-29 20:11:30.365253948 +0100
> +++ lio-core/include/target/target_core_transport.h	2010-11-29 20:11:31.452004192 +0100
> @@ -63,20 +63,6 @@
>  #define DF_SPC2_RESERVATIONS			0x00000002
>  #define DF_SPC2_RESERVATIONS_WITH_ISID		0x00000004
>  
> -/*
> - * Used as return values from transport_generic_cmd_sequencer()
> - */
> -#define TGCS_DATA_SG_IO_CDB			0
> -#define TGCS_CONTROL_SG_IO_CDB			1
> -#define TGCS_CONTROL_NONSG_IO_CDB		2
> -#define TGCS_NON_DATA_CDB			3
> -#define TGCS_UNSUPPORTED_CDB			4
> -#define TGCS_RESERVATION_CONFLICT		5
> -#define TGCS_INVALID_CDB_FIELD			6
> -#define TGCS_ILLEGAL_REQUEST			7
> -#define TGCS_CHECK_CONDITION_UNIT_ATTENTION	8
> -#define TGCS_CHECK_CONDITION_NOT_READY		9
> -
>  /* struct se_dev_attrib sanity values */
>  /* 10 Minutes */
>  #define DA_TASK_TIMEOUT_MAX			600


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2010-11-29 22:32 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-11-29 21:57 [PATCH 1/3] target: remove unused get_dma_length subsystem method Christoph Hellwig
2010-11-29 21:58 ` [PATCH 2/3] target: always assign t_task_lba in transport_generic_cmd_sequencer Christoph Hellwig
2010-11-29 22:18   ` Nicholas A. Bellinger
2010-11-29 21:58 ` [PATCH 3/3] target: always assign se_cmd flags " Christoph Hellwig
2010-11-29 22:26   ` Nicholas A. Bellinger
2010-11-29 22:17 ` [PATCH 1/3] target: remove unused get_dma_length subsystem method Nicholas A. Bellinger

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox