mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-06 02:50:43 +00:00
[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>
This commit is contained in:
parent
26b2982f78
commit
0cbf32e168
1 changed files with 2 additions and 6 deletions
|
@ -1487,13 +1487,13 @@ static void bnx2fc_if_destroy(struct fc_lport *lport)
|
||||||
static void __bnx2fc_destroy(struct bnx2fc_interface *interface)
|
static void __bnx2fc_destroy(struct bnx2fc_interface *interface)
|
||||||
{
|
{
|
||||||
struct fc_lport *lport = interface->ctlr.lp;
|
struct fc_lport *lport = interface->ctlr.lp;
|
||||||
|
struct fcoe_port *port = lport_priv(lport);
|
||||||
|
|
||||||
bnx2fc_interface_cleanup(interface);
|
bnx2fc_interface_cleanup(interface);
|
||||||
bnx2fc_stop(interface);
|
bnx2fc_stop(interface);
|
||||||
list_del(&interface->list);
|
list_del(&interface->list);
|
||||||
lport = interface->ctlr.lp;
|
|
||||||
bnx2fc_interface_put(interface);
|
bnx2fc_interface_put(interface);
|
||||||
bnx2fc_if_destroy(lport);
|
queue_work(bnx2fc_wq, &port->destroy_work);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1541,11 +1541,7 @@ static void bnx2fc_destroy_work(struct work_struct *work)
|
||||||
|
|
||||||
BNX2FC_HBA_DBG(lport, "Entered bnx2fc_destroy_work\n");
|
BNX2FC_HBA_DBG(lport, "Entered bnx2fc_destroy_work\n");
|
||||||
|
|
||||||
rtnl_lock();
|
|
||||||
mutex_lock(&bnx2fc_dev_lock);
|
|
||||||
bnx2fc_if_destroy(lport);
|
bnx2fc_if_destroy(lport);
|
||||||
mutex_unlock(&bnx2fc_dev_lock);
|
|
||||||
rtnl_unlock();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void bnx2fc_unbind_adapter_devices(struct bnx2fc_hba *hba)
|
static void bnx2fc_unbind_adapter_devices(struct bnx2fc_hba *hba)
|
||||||
|
|
Loading…
Reference in a new issue