|
@@ -1640,7 +1640,7 @@ qla2x00_loop_reset(scsi_qla_host_t *vha)
|
|
|
void
|
|
|
qla2x00_abort_all_cmds(scsi_qla_host_t *vha, int res)
|
|
|
{
|
|
|
- int que, cnt;
|
|
|
+ int que, cnt, status;
|
|
|
unsigned long flags;
|
|
|
srb_t *sp;
|
|
|
struct qla_hw_data *ha = vha->hw;
|
|
@@ -1670,8 +1670,12 @@ qla2x00_abort_all_cmds(scsi_qla_host_t *vha, int res)
|
|
|
*/
|
|
|
sp_get(sp);
|
|
|
spin_unlock_irqrestore(&ha->hardware_lock, flags);
|
|
|
- qla2xxx_eh_abort(GET_CMD_SP(sp));
|
|
|
+ status = qla2xxx_eh_abort(GET_CMD_SP(sp));
|
|
|
spin_lock_irqsave(&ha->hardware_lock, flags);
|
|
|
+ /* Get rid of extra reference if immediate exit
|
|
|
+ * from ql2xxx_eh_abort */
|
|
|
+ if (status == FAILED && (qla2x00_isp_reg_stat(ha)))
|
|
|
+ atomic_dec(&sp->ref_count);
|
|
|
}
|
|
|
req->outstanding_cmds[cnt] = NULL;
|
|
|
sp->done(sp, res);
|