mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2024-12-29 09:12:07 +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 commit31e6cdbe0e
("scsi: qla2xxx: Implement ref count for SRB") was merged. Link: https://lore.kernel.org/r/20220208093946.4471-1-njavali@marvell.com Fixes:31e6cdbe0e
("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…
Reference in New Issue
Block a user