diff options
-rw-r--r-- | drivers/target/target_core_transport.c | 5 | ||||
-rw-r--r-- | include/target/target_core_base.h | 2 |
2 files changed, 7 insertions, 0 deletions
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index 443704f84fd5..25c67c800f3d 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c | |||
@@ -1701,6 +1701,8 @@ void target_submit_cmd(struct se_cmd *se_cmd, struct se_session *se_sess, | |||
1701 | */ | 1701 | */ |
1702 | transport_init_se_cmd(se_cmd, se_tpg->se_tpg_tfo, se_sess, | 1702 | transport_init_se_cmd(se_cmd, se_tpg->se_tpg_tfo, se_sess, |
1703 | data_length, data_dir, task_attr, sense); | 1703 | data_length, data_dir, task_attr, sense); |
1704 | if (flags & TARGET_SCF_UNKNOWN_SIZE) | ||
1705 | se_cmd->unknown_data_length = 1; | ||
1704 | /* | 1706 | /* |
1705 | * Obtain struct se_cmd->cmd_kref reference and add new cmd to | 1707 | * Obtain struct se_cmd->cmd_kref reference and add new cmd to |
1706 | * se_sess->sess_cmd_list. A second kref_get here is necessary | 1708 | * se_sess->sess_cmd_list. A second kref_get here is necessary |
@@ -3142,6 +3144,9 @@ static int transport_generic_cmd_sequencer( | |||
3142 | goto out_unsupported_cdb; | 3144 | goto out_unsupported_cdb; |
3143 | } | 3145 | } |
3144 | 3146 | ||
3147 | if (cmd->unknown_data_length) | ||
3148 | cmd->data_length = size; | ||
3149 | |||
3145 | if (size != cmd->data_length) { | 3150 | if (size != cmd->data_length) { |
3146 | pr_warn("TARGET_CORE[%s]: Expected Transfer Length:" | 3151 | pr_warn("TARGET_CORE[%s]: Expected Transfer Length:" |
3147 | " %u does not match SCSI CDB Length: %u for SAM Opcode:" | 3152 | " %u does not match SCSI CDB Length: %u for SAM Opcode:" |
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h index edb51f6544f8..6a02c99d54a5 100644 --- a/include/target/target_core_base.h +++ b/include/target/target_core_base.h | |||
@@ -233,6 +233,7 @@ enum tcm_sense_reason_table { | |||
233 | enum target_sc_flags_table { | 233 | enum target_sc_flags_table { |
234 | TARGET_SCF_BIDI_OP = 0x01, | 234 | TARGET_SCF_BIDI_OP = 0x01, |
235 | TARGET_SCF_ACK_KREF = 0x02, | 235 | TARGET_SCF_ACK_KREF = 0x02, |
236 | TARGET_SCF_UNKNOWN_SIZE = 0x04, | ||
236 | }; | 237 | }; |
237 | 238 | ||
238 | /* fabric independent task management function values */ | 239 | /* fabric independent task management function values */ |
@@ -537,6 +538,7 @@ struct se_cmd { | |||
537 | /* Used to signal cmd->se_tfo->check_release_cmd() usage per cmd */ | 538 | /* Used to signal cmd->se_tfo->check_release_cmd() usage per cmd */ |
538 | unsigned check_release:1; | 539 | unsigned check_release:1; |
539 | unsigned cmd_wait_set:1; | 540 | unsigned cmd_wait_set:1; |
541 | unsigned unknown_data_length:1; | ||
540 | /* See se_cmd_flags_table */ | 542 | /* See se_cmd_flags_table */ |
541 | u32 se_cmd_flags; | 543 | u32 se_cmd_flags; |
542 | u32 se_ordered_id; | 544 | u32 se_ordered_id; |