* [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
* 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
* [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 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
* 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
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