diff --git a/srpt/src/ib_srpt.c b/srpt/src/ib_srpt.c index 6f57703f0..7c22691f3 100644 --- a/srpt/src/ib_srpt.c +++ b/srpt/src/ib_srpt.c @@ -1398,6 +1398,19 @@ out: TRACE_EXIT(); } +void srpt_on_abort_cmd(struct scst_cmd *cmd) +{ + struct srpt_send_ioctx *ioctx = scst_cmd_get_tgt_priv(cmd); + struct srpt_rdma_ch *ch = ioctx->ch; + + if (ch->state >= CH_DISCONNECTED) { + PRINT_ERROR("Cmd %p: IB completion for idx %u has not" + " been received in time (SRPT command state %d)", + cmd, ioctx->ioctx.index, ioctx->state); + srpt_abort_cmd(ioctx, SCST_CONTEXT_THREAD); + } +} + /** * srpt_handle_send_err_comp() - Process an IB_WC_SEND error completion. */ @@ -3761,6 +3774,7 @@ static struct scst_tgt_template srpt_template = { .close_session = srpt_close_session, .xmit_response = srpt_xmit_response, .rdy_to_xfer = srpt_rdy_to_xfer, + .on_abort_cmd = srpt_on_abort_cmd, .on_hw_pending_cmd_timeout = srpt_pending_cmd_timeout, .on_free_cmd = srpt_on_free_cmd, .task_mgmt_fn_done = srpt_tsk_mgmt_done,