aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@infradead.org>2011-10-12 11:09:12 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2011-10-23 23:21:13 -0400
commit485fd0d1e3b8010b538bd0b209f3592acc825677 (patch)
treea13b8785b9b24fcec032b9f28fd06597edae7256 /drivers/target
parent6193f06e6fe27c9475e407cb3cf2b0d4cd2725b0 (diff)
target: replace ->get_cdb with a target_get_task_cdb helper
Instead of calling out to the backends from the core to get a per-task CDB and then modify it for the LBA/len pair used for this CDB provide a helper that writes the adjusted CDB into a provided buffer and call this method from ->do_task in pscsi. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target')
-rw-r--r--drivers/target/target_core_cdb.c16
-rw-r--r--drivers/target/target_core_pscsi.c15
-rw-r--r--drivers/target/target_core_transport.c18
3 files changed, 18 insertions, 31 deletions
diff --git a/drivers/target/target_core_cdb.c b/drivers/target/target_core_cdb.c
index 0d02391d1fb1..fb0b6308038b 100644
--- a/drivers/target/target_core_cdb.c
+++ b/drivers/target/target_core_cdb.c
@@ -1265,3 +1265,19 @@ transport_emulate_control_cdb(struct se_task *task)
1265 1265
1266 return PYX_TRANSPORT_SENT_TO_TRANSPORT; 1266 return PYX_TRANSPORT_SENT_TO_TRANSPORT;
1267} 1267}
1268
1269/*
1270 * Write a CDB into @cdb that is based on the one the intiator sent us,
1271 * but updated to only cover the sectors that the current task handles.
1272 */
1273void target_get_task_cdb(struct se_task *task, unsigned char *cdb)
1274{
1275 struct se_cmd *cmd = task->task_se_cmd;
1276
1277 memcpy(cdb, cmd->t_task_cdb, scsi_command_size(cmd->t_task_cdb));
1278 if (cmd->se_cmd_flags & SCF_SCSI_DATA_SG_IO_CDB) {
1279 cmd->transport_split_cdb(task->task_lba, task->task_sectors,
1280 cdb);
1281 }
1282}
1283EXPORT_SYMBOL(target_get_task_cdb);
diff --git a/drivers/target/target_core_pscsi.c b/drivers/target/target_core_pscsi.c
index b347862bf801..936b9fec4cca 100644
--- a/drivers/target/target_core_pscsi.c
+++ b/drivers/target/target_core_pscsi.c
@@ -1068,6 +1068,8 @@ static int pscsi_do_task(struct se_task *task)
1068 struct bio *hbio; 1068 struct bio *hbio;
1069 int ret; 1069 int ret;
1070 1070
1071 target_get_task_cdb(task, pt->pscsi_cdb);
1072
1071 if (task->task_se_cmd->se_cmd_flags & SCF_SCSI_NON_DATA_CDB) { 1073 if (task->task_se_cmd->se_cmd_flags & SCF_SCSI_NON_DATA_CDB) {
1072 req = blk_get_request(pdv->pdv_sd->request_queue, 1074 req = blk_get_request(pdv->pdv_sd->request_queue,
1073 (task->task_data_direction == DMA_TO_DEVICE), 1075 (task->task_data_direction == DMA_TO_DEVICE),
@@ -1150,18 +1152,6 @@ fail:
1150 return PYX_TRANSPORT_OUT_OF_MEMORY_RESOURCES; 1152 return PYX_TRANSPORT_OUT_OF_MEMORY_RESOURCES;
1151} 1153}
1152 1154
1153
1154/* pscsi_get_cdb():
1155 *
1156 *
1157 */
1158static unsigned char *pscsi_get_cdb(struct se_task *task)
1159{
1160 struct pscsi_plugin_task *pt = PSCSI_TASK(task);
1161
1162 return pt->pscsi_cdb;
1163}
1164
1165/* pscsi_get_sense_buffer(): 1155/* pscsi_get_sense_buffer():
1166 * 1156 *
1167 * 1157 *
@@ -1276,7 +1266,6 @@ static struct se_subsystem_api pscsi_template = {
1276 .check_configfs_dev_params = pscsi_check_configfs_dev_params, 1266 .check_configfs_dev_params = pscsi_check_configfs_dev_params,
1277 .set_configfs_dev_params = pscsi_set_configfs_dev_params, 1267 .set_configfs_dev_params = pscsi_set_configfs_dev_params,
1278 .show_configfs_dev_params = pscsi_show_configfs_dev_params, 1268 .show_configfs_dev_params = pscsi_show_configfs_dev_params,
1279 .get_cdb = pscsi_get_cdb,
1280 .get_sense_buffer = pscsi_get_sense_buffer, 1269 .get_sense_buffer = pscsi_get_sense_buffer,
1281 .get_device_rev = pscsi_get_device_rev, 1270 .get_device_rev = pscsi_get_device_rev,
1282 .get_device_type = pscsi_get_device_type, 1271 .get_device_type = pscsi_get_device_type,
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
index 895969650a27..3025a6f5ab56 100644
--- a/drivers/target/target_core_transport.c
+++ b/drivers/target/target_core_transport.c
@@ -3958,17 +3958,6 @@ static int transport_allocate_data_tasks(
3958 task->task_sectors = min(sectors, dev_max_sectors); 3958 task->task_sectors = min(sectors, dev_max_sectors);
3959 task->task_size = task->task_sectors * sector_size; 3959 task->task_size = task->task_sectors * sector_size;
3960 3960
3961 if (dev->transport->get_cdb) {
3962 unsigned char *cdb = dev->transport->get_cdb(task);
3963
3964 memcpy(cdb, cmd->t_task_cdb,
3965 scsi_command_size(cmd->t_task_cdb));
3966
3967 /* Update new cdb with updated lba/sectors */
3968 cmd->transport_split_cdb(task->task_lba,
3969 task->task_sectors, cdb);
3970 }
3971
3972 /* 3961 /*
3973 * This now assumes that passed sg_ents are in PAGE_SIZE chunks 3962 * This now assumes that passed sg_ents are in PAGE_SIZE chunks
3974 * in order to calculate the number per task SGL entries 3963 * in order to calculate the number per task SGL entries
@@ -4022,7 +4011,6 @@ static int transport_allocate_data_tasks(
4022static int 4011static int
4023transport_allocate_control_task(struct se_cmd *cmd) 4012transport_allocate_control_task(struct se_cmd *cmd)
4024{ 4013{
4025 struct se_device *dev = cmd->se_dev;
4026 struct se_task *task; 4014 struct se_task *task;
4027 unsigned long flags; 4015 unsigned long flags;
4028 4016
@@ -4030,12 +4018,6 @@ transport_allocate_control_task(struct se_cmd *cmd)
4030 if (!task) 4018 if (!task)
4031 return -ENOMEM; 4019 return -ENOMEM;
4032 4020
4033 if (dev->transport->get_cdb) {
4034 unsigned char *cdb = dev->transport->get_cdb(task);
4035
4036 memcpy(cdb, cmd->t_task_cdb, scsi_command_size(cmd->t_task_cdb));
4037 }
4038
4039 task->task_sg = kmalloc(sizeof(struct scatterlist) * cmd->t_data_nents, 4021 task->task_sg = kmalloc(sizeof(struct scatterlist) * cmd->t_data_nents,
4040 GFP_KERNEL); 4022 GFP_KERNEL);
4041 if (!task->task_sg) { 4023 if (!task->task_sg) {