| From d9950a32bf7bea929fc3b46f172b82e20d06d86a Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sat, 19 Oct 2019 11:59:13 +0300 |
| Subject: scsi: csiostor: Don't enable IRQs too early |
| |
| From: Dan Carpenter <dan.carpenter@oracle.com> |
| |
| [ Upstream commit d6c9b31ac3064fbedf8961f120a4c117daa59932 ] |
| |
| These are called with IRQs disabled from csio_mgmt_tmo_handler() so we |
| can't call spin_unlock_irq() or it will enable IRQs prematurely. |
| |
| Fixes: a3667aaed569 ("[SCSI] csiostor: Chelsio FCoE offload driver") |
| Link: https://lore.kernel.org/r/20191019085913.GA14245@mwanda |
| Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> |
| Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/scsi/csiostor/csio_lnode.c | 15 +++++++++------ |
| 1 file changed, 9 insertions(+), 6 deletions(-) |
| |
| diff --git a/drivers/scsi/csiostor/csio_lnode.c b/drivers/scsi/csiostor/csio_lnode.c |
| index cc5611efc7a9..a8e29e3d3572 100644 |
| --- a/drivers/scsi/csiostor/csio_lnode.c |
| +++ b/drivers/scsi/csiostor/csio_lnode.c |
| @@ -301,6 +301,7 @@ csio_ln_fdmi_rhba_cbfn(struct csio_hw *hw, struct csio_ioreq *fdmi_req) |
| struct fc_fdmi_port_name *port_name; |
| uint8_t buf[64]; |
| uint8_t *fc4_type; |
| + unsigned long flags; |
| |
| if (fdmi_req->wr_status != FW_SUCCESS) { |
| csio_ln_dbg(ln, "WR error:%x in processing fdmi rhba cmd\n", |
| @@ -385,13 +386,13 @@ csio_ln_fdmi_rhba_cbfn(struct csio_hw *hw, struct csio_ioreq *fdmi_req) |
| len = (uint32_t)(pld - (uint8_t *)cmd); |
| |
| /* Submit FDMI RPA request */ |
| - spin_lock_irq(&hw->lock); |
| + spin_lock_irqsave(&hw->lock, flags); |
| if (csio_ln_mgmt_submit_req(fdmi_req, csio_ln_fdmi_done, |
| FCOE_CT, &fdmi_req->dma_buf, len)) { |
| CSIO_INC_STATS(ln, n_fdmi_err); |
| csio_ln_dbg(ln, "Failed to issue fdmi rpa req\n"); |
| } |
| - spin_unlock_irq(&hw->lock); |
| + spin_unlock_irqrestore(&hw->lock, flags); |
| } |
| |
| /* |
| @@ -412,6 +413,7 @@ csio_ln_fdmi_dprt_cbfn(struct csio_hw *hw, struct csio_ioreq *fdmi_req) |
| struct fc_fdmi_rpl *reg_pl; |
| struct fs_fdmi_attrs *attrib_blk; |
| uint8_t buf[64]; |
| + unsigned long flags; |
| |
| if (fdmi_req->wr_status != FW_SUCCESS) { |
| csio_ln_dbg(ln, "WR error:%x in processing fdmi dprt cmd\n", |
| @@ -491,13 +493,13 @@ csio_ln_fdmi_dprt_cbfn(struct csio_hw *hw, struct csio_ioreq *fdmi_req) |
| attrib_blk->numattrs = htonl(numattrs); |
| |
| /* Submit FDMI RHBA request */ |
| - spin_lock_irq(&hw->lock); |
| + spin_lock_irqsave(&hw->lock, flags); |
| if (csio_ln_mgmt_submit_req(fdmi_req, csio_ln_fdmi_rhba_cbfn, |
| FCOE_CT, &fdmi_req->dma_buf, len)) { |
| CSIO_INC_STATS(ln, n_fdmi_err); |
| csio_ln_dbg(ln, "Failed to issue fdmi rhba req\n"); |
| } |
| - spin_unlock_irq(&hw->lock); |
| + spin_unlock_irqrestore(&hw->lock, flags); |
| } |
| |
| /* |
| @@ -512,6 +514,7 @@ csio_ln_fdmi_dhba_cbfn(struct csio_hw *hw, struct csio_ioreq *fdmi_req) |
| void *cmd; |
| struct fc_fdmi_port_name *port_name; |
| uint32_t len; |
| + unsigned long flags; |
| |
| if (fdmi_req->wr_status != FW_SUCCESS) { |
| csio_ln_dbg(ln, "WR error:%x in processing fdmi dhba cmd\n", |
| @@ -542,13 +545,13 @@ csio_ln_fdmi_dhba_cbfn(struct csio_hw *hw, struct csio_ioreq *fdmi_req) |
| len += sizeof(*port_name); |
| |
| /* Submit FDMI request */ |
| - spin_lock_irq(&hw->lock); |
| + spin_lock_irqsave(&hw->lock, flags); |
| if (csio_ln_mgmt_submit_req(fdmi_req, csio_ln_fdmi_dprt_cbfn, |
| FCOE_CT, &fdmi_req->dma_buf, len)) { |
| CSIO_INC_STATS(ln, n_fdmi_err); |
| csio_ln_dbg(ln, "Failed to issue fdmi dprt req\n"); |
| } |
| - spin_unlock_irq(&hw->lock); |
| + spin_unlock_irqrestore(&hw->lock, flags); |
| } |
| |
| /** |
| -- |
| 2.20.1 |
| |