diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/target/target_core_transport.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index 4de3186dc44e..3425098ef728 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c | |||
@@ -1181,15 +1181,20 @@ int target_cmd_size_check(struct se_cmd *cmd, unsigned int size) | |||
1181 | /* Returns CHECK_CONDITION + INVALID_CDB_FIELD */ | 1181 | /* Returns CHECK_CONDITION + INVALID_CDB_FIELD */ |
1182 | goto out_invalid_cdb_field; | 1182 | goto out_invalid_cdb_field; |
1183 | } | 1183 | } |
1184 | 1184 | /* | |
1185 | * For the overflow case keep the existing fabric provided | ||
1186 | * ->data_length. Otherwise for the underflow case, reset | ||
1187 | * ->data_length to the smaller SCSI expected data transfer | ||
1188 | * length. | ||
1189 | */ | ||
1185 | if (size > cmd->data_length) { | 1190 | if (size > cmd->data_length) { |
1186 | cmd->se_cmd_flags |= SCF_OVERFLOW_BIT; | 1191 | cmd->se_cmd_flags |= SCF_OVERFLOW_BIT; |
1187 | cmd->residual_count = (size - cmd->data_length); | 1192 | cmd->residual_count = (size - cmd->data_length); |
1188 | } else { | 1193 | } else { |
1189 | cmd->se_cmd_flags |= SCF_UNDERFLOW_BIT; | 1194 | cmd->se_cmd_flags |= SCF_UNDERFLOW_BIT; |
1190 | cmd->residual_count = (cmd->data_length - size); | 1195 | cmd->residual_count = (cmd->data_length - size); |
1196 | cmd->data_length = size; | ||
1191 | } | 1197 | } |
1192 | cmd->data_length = size; | ||
1193 | } | 1198 | } |
1194 | 1199 | ||
1195 | return 0; | 1200 | return 0; |