mirror of
https://github.com/SCST-project/scst.git
synced 2026-05-19 19:51:27 +00:00
that accepts FCP requests from libfc HBAs running Fibre Channel over Ethernet (FCoE) and passes them to SCST. Signed-off-by: Joe Eykholt <jeykholt@cisco.com> git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@1514 d57e44dd-8a1f-0410-8b47-8ef2f437770f
50 lines
1.6 KiB
Plaintext
50 lines
1.6 KiB
Plaintext
libfc: fix oops in point-to-point mode
|
|
|
|
In point-to-point mode, if the PLOGI to the remote port times
|
|
out, it can get deleted by the remote port module. Since there's
|
|
no reference by the local port, lport->ptp_data points to a freed
|
|
rport, and when the local port is reset and tries to logout again,
|
|
an oops occurs in mutex_lock_nested().
|
|
|
|
Hold a reference count on the point-to-point rdata.
|
|
|
|
Signed-off-by: Joe Eykholt <jeykholt@cisco.com>
|
|
|
|
---
|
|
drivers/scsi/libfc/fc_lport.c | 11 +++++++++--
|
|
1 files changed, 9 insertions(+), 2 deletions(-)
|
|
|
|
|
|
---
|
|
diff --git a/drivers/scsi/libfc/fc_lport.c b/drivers/scsi/libfc/fc_lport.c
|
|
index 507b6c5..a728e99 100644
|
|
--- a/drivers/scsi/libfc/fc_lport.c
|
|
+++ b/drivers/scsi/libfc/fc_lport.c
|
|
@@ -227,9 +227,12 @@ static void fc_lport_ptp_setup(struct fc_lport *lport,
|
|
u64 remote_wwnn)
|
|
{
|
|
mutex_lock(&lport->disc.disc_mutex);
|
|
- if (lport->ptp_rdata)
|
|
+ if (lport->ptp_rdata) {
|
|
lport->tt.rport_logoff(lport->ptp_rdata);
|
|
+ kref_put(&lport->ptp_rdata->kref, lport->tt.rport_destroy);
|
|
+ }
|
|
lport->ptp_rdata = lport->tt.rport_create(lport, remote_fid);
|
|
+ kref_get(&lport->ptp_rdata->kref);
|
|
lport->ptp_rdata->ids.port_name = remote_wwpn;
|
|
lport->ptp_rdata->ids.node_name = remote_wwnn;
|
|
mutex_unlock(&lport->disc.disc_mutex);
|
|
@@ -988,7 +991,11 @@ static void fc_lport_reset_locked(struct fc_lport *lport)
|
|
if (lport->dns_rdata)
|
|
lport->tt.rport_logoff(lport->dns_rdata);
|
|
|
|
- lport->ptp_rdata = NULL;
|
|
+ if (lport->ptp_rdata) {
|
|
+ lport->tt.rport_logoff(lport->ptp_rdata);
|
|
+ kref_put(&lport->ptp_rdata->kref, lport->tt.rport_destroy);
|
|
+ lport->ptp_rdata = NULL;
|
|
+ }
|
|
|
|
lport->tt.disc_stop(lport);
|
|
|