| From 977fe773dcc7098d8eaf4ee6382cb51e13e784cb Mon Sep 17 00:00:00 2001 |
| From: Lee Duncan <lduncan@suse.com> |
| Date: Fri, 9 Feb 2024 10:07:34 -0800 |
| Subject: scsi: Revert "scsi: fcoe: Fix potential deadlock on &fip->ctlr_lock" |
| |
| From: Lee Duncan <lduncan@suse.com> |
| |
| commit 977fe773dcc7098d8eaf4ee6382cb51e13e784cb upstream. |
| |
| This reverts commit 1a1975551943f681772720f639ff42fbaa746212. |
| |
| This commit causes interrupts to be lost for FCoE devices, since it changed |
| sping locks from "bh" to "irqsave". |
| |
| Instead, a work queue should be used, and will be addressed in a separate |
| commit. |
| |
| Fixes: 1a1975551943 ("scsi: fcoe: Fix potential deadlock on &fip->ctlr_lock") |
| Signed-off-by: Lee Duncan <lduncan@suse.com> |
| Link: https://lore.kernel.org/r/c578cdcd46b60470535c4c4a953e6a1feca0dffd.1707500786.git.lduncan@suse.com |
| Reviewed-by: Hannes Reinecke <hare@suse.de> |
| Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/scsi/fcoe/fcoe_ctlr.c | 20 ++++++++------------ |
| 1 file changed, 8 insertions(+), 12 deletions(-) |
| |
| --- a/drivers/scsi/fcoe/fcoe_ctlr.c |
| +++ b/drivers/scsi/fcoe/fcoe_ctlr.c |
| @@ -318,17 +318,16 @@ static void fcoe_ctlr_announce(struct fc |
| { |
| struct fcoe_fcf *sel; |
| struct fcoe_fcf *fcf; |
| - unsigned long flags; |
| |
| mutex_lock(&fip->ctlr_mutex); |
| - spin_lock_irqsave(&fip->ctlr_lock, flags); |
| + spin_lock_bh(&fip->ctlr_lock); |
| |
| kfree_skb(fip->flogi_req); |
| fip->flogi_req = NULL; |
| list_for_each_entry(fcf, &fip->fcfs, list) |
| fcf->flogi_sent = 0; |
| |
| - spin_unlock_irqrestore(&fip->ctlr_lock, flags); |
| + spin_unlock_bh(&fip->ctlr_lock); |
| sel = fip->sel_fcf; |
| |
| if (sel && ether_addr_equal(sel->fcf_mac, fip->dest_addr)) |
| @@ -698,7 +697,6 @@ int fcoe_ctlr_els_send(struct fcoe_ctlr |
| { |
| struct fc_frame *fp; |
| struct fc_frame_header *fh; |
| - unsigned long flags; |
| u16 old_xid; |
| u8 op; |
| u8 mac[ETH_ALEN]; |
| @@ -732,11 +730,11 @@ int fcoe_ctlr_els_send(struct fcoe_ctlr |
| op = FIP_DT_FLOGI; |
| if (fip->mode == FIP_MODE_VN2VN) |
| break; |
| - spin_lock_irqsave(&fip->ctlr_lock, flags); |
| + spin_lock_bh(&fip->ctlr_lock); |
| kfree_skb(fip->flogi_req); |
| fip->flogi_req = skb; |
| fip->flogi_req_send = 1; |
| - spin_unlock_irqrestore(&fip->ctlr_lock, flags); |
| + spin_unlock_bh(&fip->ctlr_lock); |
| schedule_work(&fip->timer_work); |
| return -EINPROGRESS; |
| case ELS_FDISC: |
| @@ -1713,11 +1711,10 @@ static int fcoe_ctlr_flogi_send_locked(s |
| static int fcoe_ctlr_flogi_retry(struct fcoe_ctlr *fip) |
| { |
| struct fcoe_fcf *fcf; |
| - unsigned long flags; |
| int error; |
| |
| mutex_lock(&fip->ctlr_mutex); |
| - spin_lock_irqsave(&fip->ctlr_lock, flags); |
| + spin_lock_bh(&fip->ctlr_lock); |
| LIBFCOE_FIP_DBG(fip, "re-sending FLOGI - reselect\n"); |
| fcf = fcoe_ctlr_select(fip); |
| if (!fcf || fcf->flogi_sent) { |
| @@ -1728,7 +1725,7 @@ static int fcoe_ctlr_flogi_retry(struct |
| fcoe_ctlr_solicit(fip, NULL); |
| error = fcoe_ctlr_flogi_send_locked(fip); |
| } |
| - spin_unlock_irqrestore(&fip->ctlr_lock, flags); |
| + spin_unlock_bh(&fip->ctlr_lock); |
| mutex_unlock(&fip->ctlr_mutex); |
| return error; |
| } |
| @@ -1745,9 +1742,8 @@ static int fcoe_ctlr_flogi_retry(struct |
| static void fcoe_ctlr_flogi_send(struct fcoe_ctlr *fip) |
| { |
| struct fcoe_fcf *fcf; |
| - unsigned long flags; |
| |
| - spin_lock_irqsave(&fip->ctlr_lock, flags); |
| + spin_lock_bh(&fip->ctlr_lock); |
| fcf = fip->sel_fcf; |
| if (!fcf || !fip->flogi_req_send) |
| goto unlock; |
| @@ -1774,7 +1770,7 @@ static void fcoe_ctlr_flogi_send(struct |
| } else /* XXX */ |
| LIBFCOE_FIP_DBG(fip, "No FCF selected - defer send\n"); |
| unlock: |
| - spin_unlock_irqrestore(&fip->ctlr_lock, flags); |
| + spin_unlock_bh(&fip->ctlr_lock); |
| } |
| |
| /** |