|
@@ -1181,15 +1181,20 @@ int target_cmd_size_check(struct se_cmd *cmd, unsigned int size)
|
|
|
/* Returns CHECK_CONDITION + INVALID_CDB_FIELD */
|
|
|
goto out_invalid_cdb_field;
|
|
|
}
|
|
|
-
|
|
|
+ /*
|
|
|
+ * For the overflow case keep the existing fabric provided
|
|
|
+ * ->data_length. Otherwise for the underflow case, reset
|
|
|
+ * ->data_length to the smaller SCSI expected data transfer
|
|
|
+ * length.
|
|
|
+ */
|
|
|
if (size > cmd->data_length) {
|
|
|
cmd->se_cmd_flags |= SCF_OVERFLOW_BIT;
|
|
|
cmd->residual_count = (size - cmd->data_length);
|
|
|
} else {
|
|
|
cmd->se_cmd_flags |= SCF_UNDERFLOW_BIT;
|
|
|
cmd->residual_count = (cmd->data_length - size);
|
|
|
+ cmd->data_length = size;
|
|
|
}
|
|
|
- cmd->data_length = size;
|
|
|
}
|
|
|
|
|
|
return 0;
|