Commit 977fe773 authored by Lee Duncan's avatar Lee Duncan Committed by Martin K. Petersen

scsi: Revert "scsi: fcoe: Fix potential deadlock on &fip->ctlr_lock"

This reverts commit 1a197555.

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: 1a197555 ("scsi: fcoe: Fix potential deadlock on &fip->ctlr_lock")
Signed-off-by: default avatarLee Duncan <lduncan@suse.com>
Link: https://lore.kernel.org/r/c578cdcd46b60470535c4c4a953e6a1feca0dffd.1707500786.git.lduncan@suse.comReviewed-by: default avatarHannes Reinecke <hare@suse.de>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 4cbec7e8
...@@ -319,17 +319,16 @@ static void fcoe_ctlr_announce(struct fcoe_ctlr *fip) ...@@ -319,17 +319,16 @@ static void fcoe_ctlr_announce(struct fcoe_ctlr *fip)
{ {
struct fcoe_fcf *sel; struct fcoe_fcf *sel;
struct fcoe_fcf *fcf; struct fcoe_fcf *fcf;
unsigned long flags;
mutex_lock(&fip->ctlr_mutex); mutex_lock(&fip->ctlr_mutex);
spin_lock_irqsave(&fip->ctlr_lock, flags); spin_lock_bh(&fip->ctlr_lock);
kfree_skb(fip->flogi_req); kfree_skb(fip->flogi_req);
fip->flogi_req = NULL; fip->flogi_req = NULL;
list_for_each_entry(fcf, &fip->fcfs, list) list_for_each_entry(fcf, &fip->fcfs, list)
fcf->flogi_sent = 0; fcf->flogi_sent = 0;
spin_unlock_irqrestore(&fip->ctlr_lock, flags); spin_unlock_bh(&fip->ctlr_lock);
sel = fip->sel_fcf; sel = fip->sel_fcf;
if (sel && ether_addr_equal(sel->fcf_mac, fip->dest_addr)) if (sel && ether_addr_equal(sel->fcf_mac, fip->dest_addr))
...@@ -700,7 +699,6 @@ int fcoe_ctlr_els_send(struct fcoe_ctlr *fip, struct fc_lport *lport, ...@@ -700,7 +699,6 @@ int fcoe_ctlr_els_send(struct fcoe_ctlr *fip, struct fc_lport *lport,
{ {
struct fc_frame *fp; struct fc_frame *fp;
struct fc_frame_header *fh; struct fc_frame_header *fh;
unsigned long flags;
u16 old_xid; u16 old_xid;
u8 op; u8 op;
u8 mac[ETH_ALEN]; u8 mac[ETH_ALEN];
...@@ -734,11 +732,11 @@ int fcoe_ctlr_els_send(struct fcoe_ctlr *fip, struct fc_lport *lport, ...@@ -734,11 +732,11 @@ int fcoe_ctlr_els_send(struct fcoe_ctlr *fip, struct fc_lport *lport,
op = FIP_DT_FLOGI; op = FIP_DT_FLOGI;
if (fip->mode == FIP_MODE_VN2VN) if (fip->mode == FIP_MODE_VN2VN)
break; break;
spin_lock_irqsave(&fip->ctlr_lock, flags); spin_lock_bh(&fip->ctlr_lock);
kfree_skb(fip->flogi_req); kfree_skb(fip->flogi_req);
fip->flogi_req = skb; fip->flogi_req = skb;
fip->flogi_req_send = 1; fip->flogi_req_send = 1;
spin_unlock_irqrestore(&fip->ctlr_lock, flags); spin_unlock_bh(&fip->ctlr_lock);
schedule_work(&fip->timer_work); schedule_work(&fip->timer_work);
return -EINPROGRESS; return -EINPROGRESS;
case ELS_FDISC: case ELS_FDISC:
...@@ -1707,11 +1705,10 @@ static int fcoe_ctlr_flogi_send_locked(struct fcoe_ctlr *fip) ...@@ -1707,11 +1705,10 @@ static int fcoe_ctlr_flogi_send_locked(struct fcoe_ctlr *fip)
static int fcoe_ctlr_flogi_retry(struct fcoe_ctlr *fip) static int fcoe_ctlr_flogi_retry(struct fcoe_ctlr *fip)
{ {
struct fcoe_fcf *fcf; struct fcoe_fcf *fcf;
unsigned long flags;
int error; int error;
mutex_lock(&fip->ctlr_mutex); 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"); LIBFCOE_FIP_DBG(fip, "re-sending FLOGI - reselect\n");
fcf = fcoe_ctlr_select(fip); fcf = fcoe_ctlr_select(fip);
if (!fcf || fcf->flogi_sent) { if (!fcf || fcf->flogi_sent) {
...@@ -1722,7 +1719,7 @@ static int fcoe_ctlr_flogi_retry(struct fcoe_ctlr *fip) ...@@ -1722,7 +1719,7 @@ static int fcoe_ctlr_flogi_retry(struct fcoe_ctlr *fip)
fcoe_ctlr_solicit(fip, NULL); fcoe_ctlr_solicit(fip, NULL);
error = fcoe_ctlr_flogi_send_locked(fip); 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); mutex_unlock(&fip->ctlr_mutex);
return error; return error;
} }
...@@ -1739,9 +1736,8 @@ static int fcoe_ctlr_flogi_retry(struct fcoe_ctlr *fip) ...@@ -1739,9 +1736,8 @@ static int fcoe_ctlr_flogi_retry(struct fcoe_ctlr *fip)
static void fcoe_ctlr_flogi_send(struct fcoe_ctlr *fip) static void fcoe_ctlr_flogi_send(struct fcoe_ctlr *fip)
{ {
struct fcoe_fcf *fcf; struct fcoe_fcf *fcf;
unsigned long flags;
spin_lock_irqsave(&fip->ctlr_lock, flags); spin_lock_bh(&fip->ctlr_lock);
fcf = fip->sel_fcf; fcf = fip->sel_fcf;
if (!fcf || !fip->flogi_req_send) if (!fcf || !fip->flogi_req_send)
goto unlock; goto unlock;
...@@ -1768,7 +1764,7 @@ static void fcoe_ctlr_flogi_send(struct fcoe_ctlr *fip) ...@@ -1768,7 +1764,7 @@ static void fcoe_ctlr_flogi_send(struct fcoe_ctlr *fip)
} else /* XXX */ } else /* XXX */
LIBFCOE_FIP_DBG(fip, "No FCF selected - defer send\n"); LIBFCOE_FIP_DBG(fip, "No FCF selected - defer send\n");
unlock: unlock:
spin_unlock_irqrestore(&fip->ctlr_lock, flags); spin_unlock_bh(&fip->ctlr_lock);
} }
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment