* [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, §or_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, §or_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, §or_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, §or_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, §or_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, §or_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, §or_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, §or_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, §or_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, §or_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, §or_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, §or_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, §or_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, §or_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, §or_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, §or_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, §or_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, §or_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, §or_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, §or_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, §or_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, §or_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, §or_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, §or_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