From: Bhanu Prakash Gollapudi Date: Tue, 30 Aug 2011 22:54:51 +0000 (-0700) Subject: bnx2fc: Avoid calling bnx2fc_if_destroy with unnecessary locks X-Git-Tag: v2.6.39-400.9.0~423^2~19^2~11^2~427 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=f8d5bbb0bcc5d00249de4c078c9799dbdbb79c96;p=users%2Fjedix%2Flinux-maple.git bnx2fc: Avoid calling bnx2fc_if_destroy with unnecessary locks It is not required to hold rtnl_lock and bnx2fc_dev_lock when calling bnx2fc_if_destroy, as the locking is only required to serialize creation and deletion of fcoe instances. More importantly, this unnecessary locking causes deadlock as bnx2fc_if_destroy calls fc_remove_host holding rtnl_lock. Signed-off-by: Bhanu Prakash Gollapudi Signed-off-by: James Bottomley (cherry picked from commit 0cbf32e1681d870632a1772601cbaadd996dc978) Signed-off-by: Joe Jin --- diff --git a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c index 0a610de546a4..3741dc8f42be 100644 --- a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c +++ b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c @@ -1488,13 +1488,13 @@ static void bnx2fc_if_destroy(struct fc_lport *lport) static void __bnx2fc_destroy(struct bnx2fc_interface *interface) { struct fc_lport *lport = interface->ctlr.lp; + struct fcoe_port *port = lport_priv(lport); bnx2fc_interface_cleanup(interface); bnx2fc_stop(interface); list_del(&interface->list); - lport = interface->ctlr.lp; bnx2fc_interface_put(interface); - bnx2fc_if_destroy(lport); + queue_work(bnx2fc_wq, &port->destroy_work); } /** @@ -1542,11 +1542,7 @@ static void bnx2fc_destroy_work(struct work_struct *work) BNX2FC_HBA_DBG(lport, "Entered bnx2fc_destroy_work\n"); - rtnl_lock(); - mutex_lock(&bnx2fc_dev_lock); bnx2fc_if_destroy(lport); - mutex_unlock(&bnx2fc_dev_lock); - rtnl_unlock(); } static void bnx2fc_unbind_adapter_devices(struct bnx2fc_hba *hba)