[PATCH 2/3] target: replace ->get_cdb with a target_get_task_cdb helper

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 and stgt.

Signed-off-by: Christoph Hellwig <hch@xxxxxx>

Index: lio-core/drivers/target/target_core_transport.c
===================================================================
--- lio-core.orig/drivers/target/target_core_transport.c	2011-10-12 13:53:44.528773581 +0200
+++ lio-core/drivers/target/target_core_transport.c	2011-10-12 13:53:47.872774905 +0200
@@ -3960,17 +3960,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
@@ -4024,7 +4013,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;
 
@@ -4032,12 +4020,6 @@ transport_allocate_control_task(struct s
 	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: lio-core/include/target/target_core_transport.h
===================================================================
--- lio-core.orig/include/target/target_core_transport.h	2011-10-12 13:09:11.198057799 +0200
+++ lio-core/include/target/target_core_transport.h	2011-10-12 13:53:47.872774905 +0200
@@ -190,6 +190,7 @@ extern int transport_generic_do_tmr(stru
 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
@@ -309,10 +310,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():
 	 */
 	u32 (*get_device_rev)(struct se_device *);
Index: lio-core/drivers/target/target_core_pscsi.c
===================================================================
--- lio-core.orig/drivers/target/target_core_pscsi.c	2011-10-12 12:09:50.949272196 +0200
+++ lio-core/drivers/target/target_core_pscsi.c	2011-10-12 13:53:47.872774905 +0200
@@ -1068,6 +1068,8 @@ static int pscsi_do_task(struct se_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_tem
 	.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: lio-core/drivers/target/target_core_stgt.c
===================================================================
--- lio-core.orig/drivers/target/target_core_stgt.c	2011-10-12 12:10:08.440814171 +0200
+++ lio-core/drivers/target/target_core_stgt.c	2011-10-12 13:53:47.876772923 +0200
@@ -336,6 +336,7 @@ static int stgt_do_task(struct se_task *
 		return PYX_TRANSPORT_LU_COMM_FAILURE;
 	}
 
+	target_get_task_cdb(task, st->stgt_cdb);
 	memcpy(sc->cmnd, st->stgt_cdb, MAX_COMMAND_SIZE);
 	sc->sdb.length = task->task_size;
 	sc->sdb.table.sgl = task->task_sg;
@@ -462,17 +463,6 @@ static ssize_t stgt_show_configfs_dev_pa
 	return bl;
 }
 
-/*	stgt_get_cdb():
- *
- *
- */
-static unsigned char *stgt_get_cdb(struct se_task *task)
-{
-	struct stgt_plugin_task *pt = STGT_TASK(task);
-
-	return pt->stgt_cdb;
-}
-
 /*	stgt_get_sense_buffer():
  *
  *
@@ -590,7 +580,6 @@ static struct se_subsystem_api stgt_temp
 	.check_configfs_dev_params = stgt_check_configfs_dev_params,
 	.set_configfs_dev_params = stgt_set_configfs_dev_params,
 	.show_configfs_dev_params = stgt_show_configfs_dev_params,
-	.get_cdb		= stgt_get_cdb,
 	.get_sense_buffer	= stgt_get_sense_buffer,
 	.get_device_rev		= stgt_get_device_rev,
 	.get_device_type	= stgt_get_device_type,
Index: lio-core/drivers/target/target_core_cdb.c
===================================================================
--- lio-core.orig/drivers/target/target_core_cdb.c	2011-10-12 13:07:05.696771131 +0200
+++ lio-core/drivers/target/target_core_cdb.c	2011-10-12 13:53:47.876772923 +0200
@@ -1265,3 +1265,19 @@ transport_emulate_control_cdb(struct se_
 
 	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);

--
To unsubscribe from this list: send the line "unsubscribe target-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux SCSI]     [Kernel Newbies]     [Linux SCSI Target Infrastructure]     [Share Photos]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Device Mapper]

  Powered by Linux