srpt: use target_execute_cmd for WRITEs in srpt_handle_rdma_comp

srpt_handle_rdma_comp is called from kthread context and thus can execute
target_execute_cmd directly.  srpt_abort_cmd sets the CMD_T_LUN_STOP
flag directly, and thus the abuse of transport_generic_handle_data can be
replaced with an opencoded variant of that code path.  I'm still not happy
about a fabric driver poking into target core internals like this, but
let's defer the bigger architecture changes for now.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
This commit is contained in:
Christoph Hellwig 2012-07-08 15:58:43 -04:00 committed by Nicholas Bellinger
parent 67441b68fa
commit e672a47fd9
1 changed files with 10 additions and 5 deletions

View File

@ -1377,10 +1377,14 @@ static int srpt_abort_cmd(struct srpt_send_ioctx *ioctx)
break; break;
case SRPT_STATE_NEED_DATA: case SRPT_STATE_NEED_DATA:
/* DMA_TO_DEVICE (write) - RDMA read error. */ /* DMA_TO_DEVICE (write) - RDMA read error. */
/* XXX(hch): this is a horrible layering violation.. */
spin_lock_irqsave(&ioctx->cmd.t_state_lock, flags); spin_lock_irqsave(&ioctx->cmd.t_state_lock, flags);
ioctx->cmd.transport_state |= CMD_T_LUN_STOP; ioctx->cmd.transport_state |= CMD_T_LUN_STOP;
ioctx->cmd.transport_state &= ~CMD_T_ACTIVE;
spin_unlock_irqrestore(&ioctx->cmd.t_state_lock, flags); spin_unlock_irqrestore(&ioctx->cmd.t_state_lock, flags);
transport_generic_handle_data(&ioctx->cmd);
complete(&ioctx->cmd.transport_lun_stop_comp);
break; break;
case SRPT_STATE_CMD_RSP_SENT: case SRPT_STATE_CMD_RSP_SENT:
/* /*
@ -1463,9 +1467,10 @@ static void srpt_handle_send_comp(struct srpt_rdma_ch *ch,
/** /**
* srpt_handle_rdma_comp() - Process an IB RDMA completion notification. * srpt_handle_rdma_comp() - Process an IB RDMA completion notification.
* *
* Note: transport_generic_handle_data() is asynchronous so unmapping the * XXX: what is now target_execute_cmd used to be asynchronous, and unmapping
* data that has been transferred via IB RDMA must be postponed until the * the data that has been transferred via IB RDMA had to be postponed until the
* check_stop_free() callback. * check_stop_free() callback. None of this is nessecary anymore and needs to
* be cleaned up.
*/ */
static void srpt_handle_rdma_comp(struct srpt_rdma_ch *ch, static void srpt_handle_rdma_comp(struct srpt_rdma_ch *ch,
struct srpt_send_ioctx *ioctx, struct srpt_send_ioctx *ioctx,
@ -1477,7 +1482,7 @@ static void srpt_handle_rdma_comp(struct srpt_rdma_ch *ch,
if (opcode == SRPT_RDMA_READ_LAST) { if (opcode == SRPT_RDMA_READ_LAST) {
if (srpt_test_and_set_cmd_state(ioctx, SRPT_STATE_NEED_DATA, if (srpt_test_and_set_cmd_state(ioctx, SRPT_STATE_NEED_DATA,
SRPT_STATE_DATA_IN)) SRPT_STATE_DATA_IN))
transport_generic_handle_data(&ioctx->cmd); target_execute_cmd(&ioctx->cmd);
else else
printk(KERN_ERR "%s[%d]: wrong state = %d\n", __func__, printk(KERN_ERR "%s[%d]: wrong state = %d\n", __func__,
__LINE__, srpt_get_cmd_state(ioctx)); __LINE__, srpt_get_cmd_state(ioctx));