diff options
author | Christoph Hellwig <hch@infradead.org> | 2011-10-12 11:09:12 -0400 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2011-10-23 23:21:13 -0400 |
commit | 485fd0d1e3b8010b538bd0b209f3592acc825677 (patch) | |
tree | a13b8785b9b24fcec032b9f28fd06597edae7256 /drivers/target | |
parent | 6193f06e6fe27c9475e407cb3cf2b0d4cd2725b0 (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.c | 16 | ||||
-rw-r--r-- | drivers/target/target_core_pscsi.c | 15 | ||||
-rw-r--r-- | drivers/target/target_core_transport.c | 18 |
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 | */ | ||
1273 | void 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 | } | ||
1283 | EXPORT_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 | */ | ||
1158 | static 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( | |||
4022 | static int | 4011 | static int |
4023 | transport_allocate_control_task(struct se_cmd *cmd) | 4012 | transport_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) { |