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....@intel.com>
Acked-by: Neil Horman <nhor...@tuxdriver.com>
Tested-by: Ross Brattain <ross.b.bratt...@intel.com>
---

 drivers/scsi/fcoe/fcoe.c |    9 +++++++--
 1 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c
index 7a58ece..7f0afe8 100644
--- a/drivers/scsi/fcoe/fcoe.c
+++ b/drivers/scsi/fcoe/fcoe.c
@@ -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);
 }
 
 /**

_______________________________________________
devel mailing list
devel@open-fcoe.org
https://lists.open-fcoe.org/mailman/listinfo/devel

Reply via email to