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

Commit b0d79946 authored by Sebastian Andrzej Siewior's avatar Sebastian Andrzej Siewior Committed by Nicholas Bellinger
Browse files

target: add unknown size flag to target_submit_cmd()



The UASP protocol does not inform the target device upfront how much
data it should expect so we have to learn in from the CDB.  So in order
to handle this case, add a TARGET_SCF_UNKNOWN_SIZE to target_submit_cmd()
and perform an explictly assignment for se_cmd->data_length from the
extracted CDB size in transport_generic_cmd_sequencer().

Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent 58d92618
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -1701,6 +1701,8 @@ void target_submit_cmd(struct se_cmd *se_cmd, struct se_session *se_sess,
	 */
	transport_init_se_cmd(se_cmd, se_tpg->se_tpg_tfo, se_sess,
				data_length, data_dir, task_attr, sense);
	if (flags & TARGET_SCF_UNKNOWN_SIZE)
		se_cmd->unknown_data_length = 1;
	/*
	 * Obtain struct se_cmd->cmd_kref reference and add new cmd to
	 * se_sess->sess_cmd_list.  A second kref_get here is necessary
@@ -3142,6 +3144,9 @@ static int transport_generic_cmd_sequencer(
		goto out_unsupported_cdb;
	}

	if (cmd->unknown_data_length)
		cmd->data_length = size;

	if (size != cmd->data_length) {
		pr_warn("TARGET_CORE[%s]: Expected Transfer Length:"
			" %u does not match SCSI CDB Length: %u for SAM Opcode:"
+2 −0
Original line number Diff line number Diff line
@@ -233,6 +233,7 @@ enum tcm_sense_reason_table {
enum target_sc_flags_table {
	TARGET_SCF_BIDI_OP		= 0x01,
	TARGET_SCF_ACK_KREF		= 0x02,
	TARGET_SCF_UNKNOWN_SIZE		= 0x04,
};

/* fabric independent task management function values */
@@ -537,6 +538,7 @@ struct se_cmd {
	/* Used to signal cmd->se_tfo->check_release_cmd() usage per cmd */
	unsigned		check_release:1;
	unsigned		cmd_wait_set:1;
	unsigned		unknown_data_length:1;
	/* See se_cmd_flags_table */
	u32			se_cmd_flags;
	u32			se_ordered_id;