diff options
author | Christoph Hellwig <hch@infradead.org> | 2012-07-08 15:58:45 -0400 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2012-07-16 20:35:19 -0400 |
commit | b8b22533fed12dbb9e5a63d414cb1c768d1c28dd (patch) | |
tree | 121ce98fd9b96ce9f6c6ee135885d27922e97cc2 /drivers/target | |
parent | 43381ce8bb14d2536102fe700b43e97da1410169 (diff) |
tcm_fc: Offload WRITE I/O backend submission to tpg workqueue
Defer the write processing to the internal to be able to use
target_execute_cmd. I'm not even entirely sure the calling code requires
this due to the convoluted structure in libfc, but let's be safe for now.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Cc: Mark Rustad <mark.d.rustad@intel.com>
Cc: Kiran Patil <Kiran.patil@intel.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target')
-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 071a505f98fc..ad36ede1a1ea 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) | |||
183 | return ft_queue_status(se_cmd); | 183 | return ft_queue_status(se_cmd); |
184 | } | 184 | } |
185 | 185 | ||
186 | static void ft_execute_work(struct work_struct *work) | ||
187 | { | ||
188 | struct ft_cmd *cmd = container_of(work, struct ft_cmd, work); | ||
189 | |||
190 | target_execute_cmd(&cmd->se_cmd); | ||
191 | } | ||
192 | |||
186 | /* | 193 | /* |
187 | * Receive write data frame. | 194 | * Receive write data frame. |
188 | */ | 195 | */ |
@@ -307,8 +314,10 @@ void ft_recv_write_data(struct ft_cmd *cmd, struct fc_frame *fp) | |||
307 | cmd->write_data_len += tlen; | 314 | cmd->write_data_len += tlen; |
308 | } | 315 | } |
309 | last_frame: | 316 | last_frame: |
310 | if (cmd->write_data_len == se_cmd->data_length) | 317 | if (cmd->write_data_len == se_cmd->data_length) { |
311 | transport_generic_handle_data(se_cmd); | 318 | INIT_WORK(&cmd->work, ft_execute_work); |
319 | queue_work(cmd->sess->tport->tpg->workqueue, &cmd->work); | ||
320 | } | ||
312 | drop: | 321 | drop: |
313 | fc_frame_free(fp); | 322 | fc_frame_free(fp); |
314 | } | 323 | } |