diff options
Diffstat (limited to 'drivers/target/tcm_fc/tfc_io.c')
| -rw-r--r-- | drivers/target/tcm_fc/tfc_io.c | 13 | 
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/target/tcm_fc/tfc_io.c b/drivers/target/tcm_fc/tfc_io.c index 071a505f98f..ad36ede1a1e 100644 --- a/drivers/target/tcm_fc/tfc_io.c +++ b/drivers/target/tcm_fc/tfc_io.c @@ -183,6 +183,13 @@ int ft_queue_data_in(struct se_cmd *se_cmd)  	return ft_queue_status(se_cmd);  } +static void ft_execute_work(struct work_struct *work) +{ +	struct ft_cmd *cmd = container_of(work, struct ft_cmd, work); + +	target_execute_cmd(&cmd->se_cmd); +} +  /*   * Receive write data frame.   */ @@ -307,8 +314,10 @@ void ft_recv_write_data(struct ft_cmd *cmd, struct fc_frame *fp)  		cmd->write_data_len += tlen;  	}  last_frame: -	if (cmd->write_data_len == se_cmd->data_length) -		transport_generic_handle_data(se_cmd); +	if (cmd->write_data_len == se_cmd->data_length) { +		INIT_WORK(&cmd->work, ft_execute_work); +		queue_work(cmd->sess->tport->tpg->workqueue, &cmd->work); +	}  drop:  	fc_frame_free(fp);  }  |