aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
diff options
context:
space:
mode:
authorBhanu Prakash Gollapudi <bprakash@broadcom.com>2011-08-30 18:54:51 -0400
committerJames Bottomley <JBottomley@Parallels.com>2011-09-17 10:04:25 -0400
commit0cbf32e1681d870632a1772601cbaadd996dc978 (patch)
tree80c3b6cc94c1b990e4f27620e006739b21475936 /drivers/scsi/bnx2fc/bnx2fc_fcoe.c
parent26b2982f78c1fc6f486a67271b1d0a0d305dd54b (diff)
[SCSI] 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 <bprakash@broadcom.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi/bnx2fc/bnx2fc_fcoe.c')
-rw-r--r--drivers/scsi/bnx2fc/bnx2fc_fcoe.c8
1 files changed, 2 insertions, 6 deletions
diff --git a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
index 886938d025cd..a5111f365f69 100644
--- a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
+++ b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
@@ -1487,13 +1487,13 @@ static void bnx2fc_if_destroy(struct fc_lport *lport)
1487static void __bnx2fc_destroy(struct bnx2fc_interface *interface) 1487static void __bnx2fc_destroy(struct bnx2fc_interface *interface)
1488{ 1488{
1489 struct fc_lport *lport = interface->ctlr.lp; 1489 struct fc_lport *lport = interface->ctlr.lp;
1490 struct fcoe_port *port = lport_priv(lport);
1490 1491
1491 bnx2fc_interface_cleanup(interface); 1492 bnx2fc_interface_cleanup(interface);
1492 bnx2fc_stop(interface); 1493 bnx2fc_stop(interface);
1493 list_del(&interface->list); 1494 list_del(&interface->list);
1494 lport = interface->ctlr.lp;
1495 bnx2fc_interface_put(interface); 1495 bnx2fc_interface_put(interface);
1496 bnx2fc_if_destroy(lport); 1496 queue_work(bnx2fc_wq, &port->destroy_work);
1497} 1497}
1498 1498
1499/** 1499/**
@@ -1541,11 +1541,7 @@ static void bnx2fc_destroy_work(struct work_struct *work)
1541 1541
1542 BNX2FC_HBA_DBG(lport, "Entered bnx2fc_destroy_work\n"); 1542 BNX2FC_HBA_DBG(lport, "Entered bnx2fc_destroy_work\n");
1543 1543
1544 rtnl_lock();
1545 mutex_lock(&bnx2fc_dev_lock);
1546 bnx2fc_if_destroy(lport); 1544 bnx2fc_if_destroy(lport);
1547 mutex_unlock(&bnx2fc_dev_lock);
1548 rtnl_unlock();
1549} 1545}
1550 1546
1551static void bnx2fc_unbind_adapter_devices(struct bnx2fc_hba *hba) 1547static void bnx2fc_unbind_adapter_devices(struct bnx2fc_hba *hba)