diff options
author | Himanshu Madhani <himanshu.madhani@cavium.com> | 2018-09-28 11:02:38 -0700 |
---|---|---|
committer | Martin K. Petersen <martin.petersen@oracle.com> | 2018-09-28 16:05:07 -0400 |
commit | ef801f07e7b3cc1786d8ab1b4fdf069cc2a136d2 (patch) | |
tree | 21462bf51ce497bf088984f927c6309692600421 /drivers/scsi/qla2xxx | |
parent | 6b0e87a6aafe12d75c2bea6fc8e49e88b98b3083 (diff) | |
download | linux-ef801f07e7b3cc1786d8ab1b4fdf069cc2a136d2.tar.bz2 |
scsi: qla2xxx: Return switch command on a timeout
This patch fixes commit bcc71cc3cde1 ("scsi: qla2xxx: Fix for double
free of SRB structure") which placed code in wrong routines.
Also updated the use of WARN_ON() to WARN_ON_ONCE() to prevent
flooding log messages.
Fixes: bcc71cc3cde1 ("scsi: qla2xxx: Fix for double free of SRB structure")
Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Diffstat (limited to 'drivers/scsi/qla2xxx')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_init.c | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index ea7951eb05ce..c72d8012fe2a 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c @@ -54,7 +54,7 @@ qla2x00_sp_timeout(struct timer_list *t) unsigned long flags; struct qla_hw_data *ha = sp->vha->hw; - WARN_ON(irqs_disabled()); + WARN_ON_ONCE(irqs_disabled()); spin_lock_irqsave(&ha->hardware_lock, flags); req = sp->qpair->req; req->outstanding_cmds[sp->handle] = NULL; @@ -792,6 +792,9 @@ qla24xx_async_gnl_sp_done(void *s, int res) sp->name, res, sp->u.iocb_cmd.u.mbx.in_mb[1], sp->u.iocb_cmd.u.mbx.in_mb[2]); + if (res == QLA_FUNCTION_TIMEOUT) + return; + sp->fcport->flags &= ~(FCF_ASYNC_SENT|FCF_ASYNC_ACTIVE); memset(&ea, 0, sizeof(ea)); ea.sp = sp; @@ -974,17 +977,13 @@ void qla24xx_async_gpdb_sp_done(void *s, int res) "Async done-%s res %x, WWPN %8phC mb[1]=%x mb[2]=%x \n", sp->name, res, fcport->port_name, mb[1], mb[2]); - fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE); - - if (res == QLA_FUNCTION_TIMEOUT) - return; - if (res == QLA_FUNCTION_TIMEOUT) { dma_pool_free(sp->vha->hw->s_dma_pool, sp->u.iocb_cmd.u.mbx.in, sp->u.iocb_cmd.u.mbx.in_dma); return; } + fcport->flags &= ~(FCF_ASYNC_SENT | FCF_ASYNC_ACTIVE); memset(&ea, 0, sizeof(ea)); ea.event = FCME_GPDB_DONE; ea.fcport = fcport; |