Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 485fd0d1 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Nicholas Bellinger
Browse files

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: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent 6193f06e
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -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);
+2 −13
Original line number Diff line number Diff line
@@ -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,
+0 −18
Original line number Diff line number Diff line
@@ -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) {
+1 −4
Original line number Diff line number Diff line
@@ -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():
	 */