@@ -228,6 +228,8 @@ static void qla_nvme_abort_work(struct work_struct *work)
228228 fc_port_t * fcport = sp -> fcport ;
229229 struct qla_hw_data * ha = fcport -> vha -> hw ;
230230 int rval , abts_done_called = 1 ;
231+ bool io_wait_for_abort_done ;
232+ uint32_t handle ;
231233
232234 ql_dbg (ql_dbg_io , fcport -> vha , 0xffff ,
233235 "%s called for sp=%p, hndl=%x on fcport=%p desc=%p deleted=%d\n" ,
@@ -244,12 +246,20 @@ static void qla_nvme_abort_work(struct work_struct *work)
244246 goto out ;
245247 }
246248
249+ /*
250+ * sp may not be valid after abort_command if return code is either
251+ * SUCCESS or ERR_FROM_FW codes, so cache the value here.
252+ */
253+ io_wait_for_abort_done = ql2xabts_wait_nvme &&
254+ QLA_ABTS_WAIT_ENABLED (sp );
255+ handle = sp -> handle ;
256+
247257 rval = ha -> isp_ops -> abort_command (sp );
248258
249259 ql_dbg (ql_dbg_io , fcport -> vha , 0x212b ,
250260 "%s: %s command for sp=%p, handle=%x on fcport=%p rval=%x\n" ,
251261 __func__ , (rval != QLA_SUCCESS ) ? "Failed to abort" : "Aborted" ,
252- sp , sp -> handle , fcport , rval );
262+ sp , handle , fcport , rval );
253263
254264 /*
255265 * If async tmf is enabled, the abort callback is called only on
@@ -264,7 +274,7 @@ static void qla_nvme_abort_work(struct work_struct *work)
264274 * are waited until ABTS complete. This kref is decreased
265275 * at qla24xx_abort_sp_done function.
266276 */
267- if (abts_done_called && ql2xabts_wait_nvme && QLA_ABTS_WAIT_ENABLED ( sp ) )
277+ if (abts_done_called && io_wait_for_abort_done )
268278 return ;
269279out :
270280 /* kref_get was done before work was schedule. */
0 commit comments