From: Nicholas Bellinger Date: Sat, 22 Oct 2011 11:06:23 +0000 (-0700) Subject: target: Fix BIDI t_task_cdb handling in transport_generic_new_cmd X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=9ac549873d35626cd6d7718691aaf4c55f2667a7;p=linux-beck.git target: Fix BIDI t_task_cdb handling in transport_generic_new_cmd This patch fixes a bug for BIDI handling in transport_generic_new_cmd() where cmd->t_task_cdbs_left and Co. where not taking into account the extra task count generated during the first call to transport_allocate_data_tasks(). Cc: Christoph Hellwig Cc: Boaz Harrosh Signed-off-by: Nicholas Bellinger --- diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c index 8c8e62e2687f..ab4e3083d968 100644 --- a/drivers/target/target_core_transport.c +++ b/drivers/target/target_core_transport.c @@ -3934,7 +3934,7 @@ transport_allocate_control_task(struct se_cmd *cmd) int transport_generic_new_cmd(struct se_cmd *cmd) { struct se_device *dev = cmd->se_dev; - int task_cdbs; + int task_cdbs, task_cdbs_bidi = 0; int set_counts = 1; int ret = 0; @@ -3957,9 +3957,10 @@ int transport_generic_new_cmd(struct se_cmd *cmd) dev->transport->transport_type != TRANSPORT_PLUGIN_PHBA_PDEV) { BUG_ON(!(cmd->se_cmd_flags & SCF_SCSI_DATA_SG_IO_CDB)); - ret = transport_allocate_data_tasks(cmd, DMA_FROM_DEVICE, - cmd->t_bidi_data_sg, cmd->t_bidi_data_nents); - if (ret <= 0) + task_cdbs_bidi = transport_allocate_data_tasks(cmd, + DMA_FROM_DEVICE, cmd->t_bidi_data_sg, + cmd->t_bidi_data_nents); + if (task_cdbs_bidi <= 0) goto out_fail; atomic_inc(&cmd->t_fe_count); @@ -3983,11 +3984,10 @@ int transport_generic_new_cmd(struct se_cmd *cmd) atomic_inc(&cmd->t_se_count); } - cmd->t_task_list_num = task_cdbs; - - atomic_set(&cmd->t_task_cdbs_left, task_cdbs); - atomic_set(&cmd->t_task_cdbs_ex_left, task_cdbs); - atomic_set(&cmd->t_task_cdbs_timeout_left, task_cdbs); + cmd->t_task_list_num = (task_cdbs + task_cdbs_bidi); + atomic_set(&cmd->t_task_cdbs_left, cmd->t_task_list_num); + atomic_set(&cmd->t_task_cdbs_ex_left, cmd->t_task_list_num); + atomic_set(&cmd->t_task_cdbs_timeout_left, cmd->t_task_list_num); /* * For WRITEs, let the fabric know its buffer is ready..