mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-16 18:26:42 +00:00
scsi: qla2xxx: Add qla2x00_async_done() for async routines
This done routine will delete the timer and check for its return value and decrease the reference count accordingly. This prevents boot hangs reported after commit 31e6cdbe0eae ("scsi: qla2xxx: Implement ref count for SRB") was merged. Link: https://lore.kernel.org/r/20220208093946.4471-1-njavali@marvell.com Fixes: 31e6cdbe0eae ("scsi: qla2xxx: Implement ref count for SRB") Reported-by: Ewan Milne <emilne@redhat.com> Tested-by: Ewan D. Milne <emilne@redhat.com> Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com> Signed-off-by: Saurav Kashyap <skashyap@marvell.com> Signed-off-by: Nilesh Javali <njavali@marvell.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
62ed6622aa
commit
49b729f58e
@ -2560,6 +2560,20 @@ qla24xx_tm_iocb(srb_t *sp, struct tsk_mgmt_entry *tsk)
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
qla2x00_async_done(struct srb *sp, int res)
|
||||
{
|
||||
if (del_timer(&sp->u.iocb_cmd.timer)) {
|
||||
/*
|
||||
* Successfully cancelled the timeout handler
|
||||
* ref: TMR
|
||||
*/
|
||||
if (kref_put(&sp->cmd_kref, qla2x00_sp_release))
|
||||
return;
|
||||
}
|
||||
sp->async_done(sp, res);
|
||||
}
|
||||
|
||||
void
|
||||
qla2x00_sp_release(struct kref *kref)
|
||||
{
|
||||
@ -2573,7 +2587,8 @@ qla2x00_init_async_sp(srb_t *sp, unsigned long tmo,
|
||||
void (*done)(struct srb *sp, int res))
|
||||
{
|
||||
timer_setup(&sp->u.iocb_cmd.timer, qla2x00_sp_timeout, 0);
|
||||
sp->done = done;
|
||||
sp->done = qla2x00_async_done;
|
||||
sp->async_done = done;
|
||||
sp->free = qla2x00_sp_free;
|
||||
sp->u.iocb_cmd.timeout = qla2x00_async_iocb_timeout;
|
||||
sp->u.iocb_cmd.timer.expires = jiffies + tmo * HZ;
|
||||
|
Loading…
x
Reference in New Issue
Block a user