]> git.karo-electronics.de Git - mv-sheeva.git/commitdiff
[SCSI] bnx2fc: Avoid calling bnx2fc_if_destroy with unnecessary locks
authorBhanu Prakash Gollapudi <bprakash@broadcom.com>
Tue, 30 Aug 2011 22:54:51 +0000 (15:54 -0700)
committerJames Bottomley <JBottomley@Parallels.com>
Sat, 17 Sep 2011 14:04:25 +0000 (18:04 +0400)
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>
drivers/scsi/bnx2fc/bnx2fc_fcoe.c

index 886938d025cdaa7d903c8f5b2d284387650fa5b0..a5111f365f699163eb02b2845e7da9d1ffa80e89 100644 (file)
@@ -1487,13 +1487,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);
 }
 
 /**
@@ -1541,11 +1541,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)