Commit d6e0175c authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Nicholas Bellinger

target: add a parse_cdb method to the backend drivers

Instead of trying to handle all SCSI command sets in one function
(transport_generic_cmd_sequencer) call out to the backend driver to perform
this functionality.  For pSCSI a copy of the existing code is used, but for
all virtual backends we can use a new parse_sbc_cdb helper is used to
provide a simple SBC emulation.

For now this setups means a fair amount of duplication between pSCSI and the
SBC library, but patches later in this series will sort out that problem.

(nab: Fix up build failure in target_core_pscsi.c)
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent 88455ec4
...@@ -10,6 +10,7 @@ target_core_mod-y := target_core_configfs.o \ ...@@ -10,6 +10,7 @@ target_core_mod-y := target_core_configfs.o \
target_core_tpg.o \ target_core_tpg.o \
target_core_transport.o \ target_core_transport.o \
target_core_cdb.o \ target_core_cdb.o \
target_core_sbc.o \
target_core_spc.o \ target_core_spc.o \
target_core_ua.o \ target_core_ua.o \
target_core_rd.o \ target_core_rd.o \
......
...@@ -561,6 +561,7 @@ static struct se_subsystem_api fileio_template = { ...@@ -561,6 +561,7 @@ static struct se_subsystem_api fileio_template = {
.allocate_virtdevice = fd_allocate_virtdevice, .allocate_virtdevice = fd_allocate_virtdevice,
.create_virtdevice = fd_create_virtdevice, .create_virtdevice = fd_create_virtdevice,
.free_device = fd_free_device, .free_device = fd_free_device,
.parse_cdb = sbc_parse_cdb,
.execute_cmd = fd_execute_cmd, .execute_cmd = fd_execute_cmd,
.do_sync_cache = fd_emulate_sync_cache, .do_sync_cache = fd_emulate_sync_cache,
.check_configfs_dev_params = fd_check_configfs_dev_params, .check_configfs_dev_params = fd_check_configfs_dev_params,
......
...@@ -653,6 +653,7 @@ static struct se_subsystem_api iblock_template = { ...@@ -653,6 +653,7 @@ static struct se_subsystem_api iblock_template = {
.allocate_virtdevice = iblock_allocate_virtdevice, .allocate_virtdevice = iblock_allocate_virtdevice,
.create_virtdevice = iblock_create_virtdevice, .create_virtdevice = iblock_create_virtdevice,
.free_device = iblock_free_device, .free_device = iblock_free_device,
.parse_cdb = sbc_parse_cdb,
.execute_cmd = iblock_execute_cmd, .execute_cmd = iblock_execute_cmd,
.do_discard = iblock_do_discard, .do_discard = iblock_do_discard,
.do_sync_cache = iblock_emulate_sync_cache, .do_sync_cache = iblock_emulate_sync_cache,
......
...@@ -96,9 +96,6 @@ int core_tpg_post_addlun(struct se_portal_group *, struct se_lun *, ...@@ -96,9 +96,6 @@ int core_tpg_post_addlun(struct se_portal_group *, struct se_lun *,
struct se_lun *core_tpg_pre_dellun(struct se_portal_group *, u32 unpacked_lun); struct se_lun *core_tpg_pre_dellun(struct se_portal_group *, u32 unpacked_lun);
int core_tpg_post_dellun(struct se_portal_group *, struct se_lun *); int core_tpg_post_dellun(struct se_portal_group *, struct se_lun *);
/* target_core_spc.c */
int spc_parse_cdb(struct se_cmd *cmd, unsigned int *size, bool passthrough);
/* target_core_transport.c */ /* target_core_transport.c */
extern struct kmem_cache *se_tmr_req_cache; extern struct kmem_cache *se_tmr_req_cache;
......
This diff is collapsed.
...@@ -468,6 +468,7 @@ static struct se_subsystem_api rd_mcp_template = { ...@@ -468,6 +468,7 @@ static struct se_subsystem_api rd_mcp_template = {
.allocate_virtdevice = rd_allocate_virtdevice, .allocate_virtdevice = rd_allocate_virtdevice,
.create_virtdevice = rd_create_virtdevice, .create_virtdevice = rd_create_virtdevice,
.free_device = rd_free_device, .free_device = rd_free_device,
.parse_cdb = sbc_parse_cdb,
.execute_cmd = rd_execute_cmd, .execute_cmd = rd_execute_cmd,
.check_configfs_dev_params = rd_check_configfs_dev_params, .check_configfs_dev_params = rd_check_configfs_dev_params,
.set_configfs_dev_params = rd_set_configfs_dev_params, .set_configfs_dev_params = rd_set_configfs_dev_params,
......
This diff is collapsed.
...@@ -152,6 +152,7 @@ int spc_parse_cdb(struct se_cmd *cmd, unsigned int *size, bool passthrough) ...@@ -152,6 +152,7 @@ int spc_parse_cdb(struct se_cmd *cmd, unsigned int *size, bool passthrough)
cmd->sam_task_attr = MSG_HEAD_TAG; cmd->sam_task_attr = MSG_HEAD_TAG;
break; break;
case TEST_UNIT_READY: case TEST_UNIT_READY:
*size = 0;
if (!passthrough) if (!passthrough)
cmd->execute_cmd = target_emulate_noop; cmd->execute_cmd = target_emulate_noop;
break; break;
......
This diff is collapsed.
...@@ -24,6 +24,8 @@ struct se_subsystem_api { ...@@ -24,6 +24,8 @@ struct se_subsystem_api {
struct se_subsystem_dev *, void *); struct se_subsystem_dev *, void *);
void (*free_device)(void *); void (*free_device)(void *);
int (*transport_complete)(struct se_cmd *cmd, struct scatterlist *); int (*transport_complete)(struct se_cmd *cmd, struct scatterlist *);
int (*parse_cdb)(struct se_cmd *cmd, unsigned int *size);
int (*execute_cmd)(struct se_cmd *, struct scatterlist *, u32, int (*execute_cmd)(struct se_cmd *, struct scatterlist *, u32,
enum dma_data_direction); enum dma_data_direction);
int (*do_discard)(struct se_device *, sector_t, u32); int (*do_discard)(struct se_device *, sector_t, u32);
...@@ -49,6 +51,9 @@ struct se_device *transport_add_device_to_core_hba(struct se_hba *, ...@@ -49,6 +51,9 @@ struct se_device *transport_add_device_to_core_hba(struct se_hba *,
void target_complete_cmd(struct se_cmd *, u8); void target_complete_cmd(struct se_cmd *, u8);
int sbc_parse_cdb(struct se_cmd *cmd, unsigned int *size);
int spc_parse_cdb(struct se_cmd *cmd, unsigned int *size, bool passthrough);
void transport_set_vpd_proto_id(struct t10_vpd *, unsigned char *); void transport_set_vpd_proto_id(struct t10_vpd *, unsigned char *);
int transport_set_vpd_assoc(struct t10_vpd *, unsigned char *); int transport_set_vpd_assoc(struct t10_vpd *, unsigned char *);
int transport_set_vpd_ident_type(struct t10_vpd *, unsigned char *); int transport_set_vpd_ident_type(struct t10_vpd *, unsigned char *);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment