target: replace ->get_cdb with a target_get_task_cdb helper
authorChristoph Hellwig <hch@infradead.org>
Wed, 12 Oct 2011 15:09:12 +0000 (11:09 -0400)
committerNicholas Bellinger <nab@linux-iscsi.org>
Mon, 24 Oct 2011 03:21:13 +0000 (03:21 +0000)
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>
drivers/target/target_core_cdb.c
drivers/target/target_core_pscsi.c
drivers/target/target_core_transport.c
include/target/target_core_transport.h

index 0d02391d1fb172673c1545c383b93af2d08a73e5..fb0b6308038ba803e98d4b0411bcf3ed45ca591e 100644 (file)
@@ -1265,3 +1265,19 @@ transport_emulate_control_cdb(struct se_task *task)
 
        return PYX_TRANSPORT_SENT_TO_TRANSPORT;
 }
+
+/*
+ * Write a CDB into @cdb that is based on the one the intiator sent us,
+ * but updated to only cover the sectors that the current task handles.
+ */
+void target_get_task_cdb(struct se_task *task, unsigned char *cdb)
+{
+       struct se_cmd *cmd = task->task_se_cmd;
+
+       memcpy(cdb, cmd->t_task_cdb, scsi_command_size(cmd->t_task_cdb));
+       if (cmd->se_cmd_flags & SCF_SCSI_DATA_SG_IO_CDB) {
+               cmd->transport_split_cdb(task->task_lba, task->task_sectors,
+                                        cdb);
+       }
+}
+EXPORT_SYMBOL(target_get_task_cdb);
index b347862bf8014c811c4b2e4bf31b8431387eef83..936b9fec4cca3b788c6ac80ee5279adc0c988d54 100644 (file)
@@ -1068,6 +1068,8 @@ static int pscsi_do_task(struct se_task *task)
        struct bio *hbio;
        int ret;
 
+       target_get_task_cdb(task, pt->pscsi_cdb);
+
        if (task->task_se_cmd->se_cmd_flags & SCF_SCSI_NON_DATA_CDB) {
                req = blk_get_request(pdv->pdv_sd->request_queue,
                                (task->task_data_direction == DMA_TO_DEVICE),
@@ -1150,18 +1152,6 @@ fail:
        return PYX_TRANSPORT_OUT_OF_MEMORY_RESOURCES;
 }
 
-
-/*     pscsi_get_cdb():
- *
- *
- */
-static unsigned char *pscsi_get_cdb(struct se_task *task)
-{
-       struct pscsi_plugin_task *pt = PSCSI_TASK(task);
-
-       return pt->pscsi_cdb;
-}
-
 /*     pscsi_get_sense_buffer():
  *
  *
@@ -1276,7 +1266,6 @@ static struct se_subsystem_api pscsi_template = {
        .check_configfs_dev_params = pscsi_check_configfs_dev_params,
        .set_configfs_dev_params = pscsi_set_configfs_dev_params,
        .show_configfs_dev_params = pscsi_show_configfs_dev_params,
-       .get_cdb                = pscsi_get_cdb,
        .get_sense_buffer       = pscsi_get_sense_buffer,
        .get_device_rev         = pscsi_get_device_rev,
        .get_device_type        = pscsi_get_device_type,
index 895969650a27767bcef1e91c4c9a34866e527922..3025a6f5ab56bd4586478057d3acc2ddf3d1cdea 100644 (file)
@@ -3958,17 +3958,6 @@ static int transport_allocate_data_tasks(
                task->task_sectors = min(sectors, dev_max_sectors);
                task->task_size = task->task_sectors * sector_size;
 
-               if (dev->transport->get_cdb) {
-                       unsigned char *cdb = dev->transport->get_cdb(task);
-
-                       memcpy(cdb, cmd->t_task_cdb,
-                              scsi_command_size(cmd->t_task_cdb));
-
-                       /* Update new cdb with updated lba/sectors */
-                       cmd->transport_split_cdb(task->task_lba,
-                                                task->task_sectors, cdb);
-               }
-
                /*
                 * This now assumes that passed sg_ents are in PAGE_SIZE chunks
                 * in order to calculate the number per task SGL entries
@@ -4022,7 +4011,6 @@ static int transport_allocate_data_tasks(
 static int
 transport_allocate_control_task(struct se_cmd *cmd)
 {
-       struct se_device *dev = cmd->se_dev;
        struct se_task *task;
        unsigned long flags;
 
@@ -4030,12 +4018,6 @@ transport_allocate_control_task(struct se_cmd *cmd)
        if (!task)
                return -ENOMEM;
 
-       if (dev->transport->get_cdb) {
-               unsigned char *cdb = dev->transport->get_cdb(task);
-
-               memcpy(cdb, cmd->t_task_cdb, scsi_command_size(cmd->t_task_cdb));
-       }
-
        task->task_sg = kmalloc(sizeof(struct scatterlist) * cmd->t_data_nents,
                                GFP_KERNEL);
        if (!task->task_sg) {
index c5eb259c2e2f85dfbe2d4656c4182c8a4c7eb116..171c2359bc797190e0e1d55651bcf530617485ef 100644 (file)
@@ -190,6 +190,7 @@ extern int transport_generic_do_tmr(struct se_cmd *);
 extern int core_alua_check_nonop_delay(struct se_cmd *);
 /* From target_core_cdb.c */
 extern int transport_emulate_control_cdb(struct se_task *);
+extern void target_get_task_cdb(struct se_task *task, unsigned char *cdb);
 
 /*
  * Each se_transport_task_t can have N number of possible struct se_task's
@@ -308,10 +309,6 @@ struct se_subsystem_api {
         */
        ssize_t (*show_configfs_dev_params)(struct se_hba *, struct se_subsystem_dev *,
                                                char *);
-       /*
-        * get_cdb():
-        */
-       unsigned char *(*get_cdb)(struct se_task *);
        /*
         * get_device_rev():
         */