|
@@ -408,6 +408,13 @@ static inline size_t tcmu_cmd_get_data_length(struct tcmu_cmd *tcmu_cmd)
|
|
|
return data_length;
|
|
|
}
|
|
|
|
|
|
+static inline uint32_t tcmu_cmd_get_block_cnt(struct tcmu_cmd *tcmu_cmd)
|
|
|
+{
|
|
|
+ size_t data_length = tcmu_cmd_get_data_length(tcmu_cmd);
|
|
|
+
|
|
|
+ return data_length / DATA_BLOCK_SIZE;
|
|
|
+}
|
|
|
+
|
|
|
static sense_reason_t
|
|
|
tcmu_queue_cmd_ring(struct tcmu_cmd *tcmu_cmd)
|
|
|
{
|
|
@@ -435,8 +442,7 @@ tcmu_queue_cmd_ring(struct tcmu_cmd *tcmu_cmd)
|
|
|
* expensive to tell how many regions are freed in the bitmap
|
|
|
*/
|
|
|
base_command_size = max(offsetof(struct tcmu_cmd_entry,
|
|
|
- req.iov[se_cmd->t_bidi_data_nents +
|
|
|
- se_cmd->t_data_nents]),
|
|
|
+ req.iov[tcmu_cmd_get_block_cnt(tcmu_cmd)]),
|
|
|
sizeof(struct tcmu_cmd_entry));
|
|
|
command_size = base_command_size
|
|
|
+ round_up(scsi_command_size(se_cmd->t_task_cdb), TCMU_OP_ALIGN_SIZE);
|