From 74b2ae36e2d37f5140983cb57d985f87ff4f18a1 Mon Sep 17 00:00:00 2001 From: Vladislav Bolkhovitin Date: Wed, 8 Aug 2018 22:25:43 +0000 Subject: [PATCH] qla2x00t: fix possible crash with DLM PR sync enabled Reported-By: Aaron Knister Analyzed-by: Bart Van Assche git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@7468 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- qla2x00t/qla2x00-target/qla2x00t.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/qla2x00t/qla2x00-target/qla2x00t.c b/qla2x00t/qla2x00-target/qla2x00t.c index 0a0df43f5..32437a989 100644 --- a/qla2x00t/qla2x00-target/qla2x00t.c +++ b/qla2x00t/qla2x00-target/qla2x00t.c @@ -3450,10 +3450,7 @@ out_unlock: spin_unlock_irqrestore(&ha->hardware_lock, flags); if (do_tgt_cmd_done) { - if (!ha_locked && !in_interrupt()) - scst_tgt_cmd_done(&cmd->scst_cmd, SCST_CONTEXT_DIRECT); - else - scst_tgt_cmd_done(&cmd->scst_cmd, SCST_CONTEXT_TASKLET); + scst_tgt_cmd_done(&cmd->scst_cmd, SCST_CONTEXT_THREAD); /* !! At this point cmd could be already freed !! */ } @@ -3527,10 +3524,7 @@ out_unlock: spin_unlock_irqrestore(&ha->hardware_lock, flags); if (do_tgt_cmd_done) { - if (!ha_locked && !in_interrupt()) - scst_tgt_cmd_done(&cmd->scst_cmd, SCST_CONTEXT_DIRECT); - else - scst_tgt_cmd_done(&cmd->scst_cmd, SCST_CONTEXT_TASKLET); + scst_tgt_cmd_done(&cmd->scst_cmd, SCST_CONTEXT_THREAD); /* !! At this point cmd could be already freed !! */ } @@ -3802,10 +3796,17 @@ static void q2t_do_ctio_completion(scsi_qla_host_t *vha, uint32_t handle, TRACE_ENTRY(); +#if 1 /* + * We can't do anything better, because DLM PR sync code calls + * mutex_lock() on this path + */ + context = SCST_CONTEXT_THREAD; +#else #ifdef CONFIG_QLA_TGT_DEBUG_WORK_IN_THREAD context = SCST_CONTEXT_THREAD; #else context = SCST_CONTEXT_TASKLET; +#endif #endif TRACE(TRACE_DEBUG|TRACE_SCSI, "qla2x00t(%ld): handle(ctio %p "