mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 11:26:02 +09:00
scsi: qla2xxx: Fix extraneous ref on sp's after adapter break
commit4cd3b6ebffupstream. Hung task timeouts can result if a qlogic board breaks unexpectedly while running I/O. These tasks become hung because command srb reference counts are not going to zero, hence the affected srbs and commands do not get freed. This fix accounts for this extra reference in the srbs in the case of a board failure. Fixes:a465537ad1("qla2xxx: Disable the adapter and skip error recovery in case of register disconnect") Signed-off-by: Bill Kuzeja <william.kuzeja@stratus.com> Acked-by: Himanshu Madhani <himanshu.madhani@cavium.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
8ae7720cf9
commit
9f4a71db14
@@ -1443,7 +1443,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;
|
||||
@@ -1473,8 +1473,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(vha, sp, res);
|
||||
|
||||
Reference in New Issue
Block a user