[SCSI] libfc: defer releasing master lport until complete fcoe interface cleanuped up
authorVasu Dev <vasu.dev@intel.com>
Fri, 20 Apr 2012 19:16:38 +0000 (12:16 -0700)
committerJames Bottomley <JBottomley@Parallels.com>
Thu, 10 May 2012 07:59:25 +0000 (08:59 +0100)
The fcoe controller has back references, therefore defer
releasing master lport which gets freed along scsi_host_put
and then free it once fcoe interface is fully cleaned.

Signed-off-by: Vasu Dev <vasu.dev@intel.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Tested-by: Ross Brattain <ross.b.brattain@intel.com>
Signed-off-by: Robert Love <robert.w.love@intel.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/fcoe/fcoe.c

index 09a6a26..481ba6f 100644 (file)
@@ -472,6 +472,7 @@ static void fcoe_interface_cleanup(struct fcoe_interface *fcoe)
        /* Release the self-reference taken during fcoe_interface_create() */
        /* tear-down the FCoE controller */
        fcoe_ctlr_destroy(fip);
+       scsi_host_put(fcoe->ctlr.lp->host);
        kfree(fcoe);
        dev_put(netdev);
        module_put(THIS_MODULE);
@@ -976,8 +977,12 @@ static void fcoe_if_destroy(struct fc_lport *lport)
        /* Free memory used by statistical counters */
        fc_lport_free_stats(lport);
 
-       /* Release the Scsi_Host */
-       scsi_host_put(lport->host);
+       /*
+        * Release the Scsi_Host for vport but hold on to
+        * master lport until it fcoe interface fully cleaned-up.
+        */
+       if (lport->vport)
+               scsi_host_put(lport->host);
 }
 
 /**