diff options
author | Bhanu Prakash Gollapudi <bprakash@broadcom.com> | 2011-08-30 18:54:51 -0400 |
---|---|---|
committer | James Bottomley <JBottomley@Parallels.com> | 2011-09-17 10:04:25 -0400 |
commit | 0cbf32e1681d870632a1772601cbaadd996dc978 (patch) | |
tree | 80c3b6cc94c1b990e4f27620e006739b21475936 /drivers/scsi/bnx2fc/bnx2fc_fcoe.c | |
parent | 26b2982f78c1fc6f486a67271b1d0a0d305dd54b (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.c | 8 |
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) | |||
1487 | static void __bnx2fc_destroy(struct bnx2fc_interface *interface) | 1487 | static 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 | ||
1551 | static void bnx2fc_unbind_adapter_devices(struct bnx2fc_hba *hba) | 1547 | static void bnx2fc_unbind_adapter_devices(struct bnx2fc_hba *hba) |