Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d1b3f51e authored by Satish Kharat's avatar Satish Kharat Committed by Martin K. Petersen
Browse files

scsi: libfc: fix a deadlock in fc_rport_work



In places like fc_rport_recv_plogi_req and fcoe_ctlr_vn_add we always
take the lport disc_mutex lock before the rports mutex
(rp_mutex) lock. Gaurding list_del_rcu(&rdata->peers) with
disc.disc_mutex in fc_rport_work is correct but the rp_mutex lock
can and should to be dropped before taking that lock else results
in a deadlock.

Signed-off-by: default avatarSatish Kharat <satishkh@cisco.com>
Reviewed-by: default avatarJohannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent fbce4d97
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -383,11 +383,11 @@ static void fc_rport_work(struct work_struct *work)
				fc_rport_enter_flogi(rdata);
				mutex_unlock(&rdata->rp_mutex);
			} else {
				mutex_unlock(&rdata->rp_mutex);
				FC_RPORT_DBG(rdata, "work delete\n");
				mutex_lock(&lport->disc.disc_mutex);
				list_del_rcu(&rdata->peers);
				mutex_unlock(&lport->disc.disc_mutex);
				mutex_unlock(&rdata->rp_mutex);
				kref_put(&rdata->kref, fc_rport_destroy);
			}
		} else {