I'd like to keep basic initialization together with allocation, which means
this can't just be a tail-call to scsi_host_alloc.

This is needed to create a generic libfc host allocation routine for NPIV
VN_Ports, which will share the exchange ID space (through sharing exchange
manager structures) with the parent lport.  In order to clone the exchange
manager list when the lport is allocated, the list head must be initialized
earlier.

Signed-off-by: Chris Leech <[email protected]>
---

 drivers/scsi/fcoe/fcoe.c      |    8 +++-----
 drivers/scsi/libfc/fc_lport.c |    1 -
 include/scsi/libfc.h          |   15 ++++++++++++---
 3 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c
index ac481ad..64bdd54 100644
--- a/drivers/scsi/fcoe/fcoe.c
+++ b/drivers/scsi/fcoe/fcoe.c
@@ -490,8 +490,6 @@ static int fcoe_shost_config(struct fc_lport *lp, struct 
Scsi_Host *shost,
        int rc = 0;
 
        /* lport scsi host config */
-       lp->host = shost;
-
        lp->host->max_lun = FCOE_MAX_LUN;
        lp->host->max_id = FCOE_MAX_FCP_TARGET;
        lp->host->max_channel = 0;
@@ -709,14 +707,14 @@ static struct fc_lport *fcoe_if_create(struct 
fcoe_interface *fcoe,
 
        FCOE_NETDEV_DBG(netdev, "Create Interface\n");
 
-       shost = libfc_host_alloc(&fcoe_shost_template,
+       lport = libfc_host_alloc(&fcoe_shost_template,
                                 sizeof(struct fcoe_port));
-       if (!shost) {
+       if (!lport) {
                FCOE_NETDEV_DBG(netdev, "Could not allocate host structure\n");
                rc = -ENOMEM;
                goto out;
        }
-       lport = shost_priv(shost);
+       shost = lport->host;
        port = lport_priv(lport);
        port->lport = lport;
        port->fcoe = fcoe;
diff --git a/drivers/scsi/libfc/fc_lport.c b/drivers/scsi/libfc/fc_lport.c
index ca8ea26..a430335 100644
--- a/drivers/scsi/libfc/fc_lport.c
+++ b/drivers/scsi/libfc/fc_lport.c
@@ -1618,7 +1618,6 @@ int fc_lport_init(struct fc_lport *lport)
        if (lport->link_supported_speeds & FC_PORTSPEED_10GBIT)
                fc_host_supported_speeds(lport->host) |= FC_PORTSPEED_10GBIT;
 
-       INIT_LIST_HEAD(&lport->ema_list);
        return 0;
 }
 EXPORT_SYMBOL(fc_lport_init);
diff --git a/include/scsi/libfc.h b/include/scsi/libfc.h
index 53b3881..949f5d9 100644
--- a/include/scsi/libfc.h
+++ b/include/scsi/libfc.h
@@ -787,12 +787,21 @@ static inline void *lport_priv(const struct fc_lport *lp)
  * @sht: ptr to the scsi host templ
  * @priv_size: size of private data after fc_lport
  *
- * Returns: ptr to Scsi_Host
+ * Returns: libfc lport
  */
-static inline struct Scsi_Host *
+static inline struct fc_lport *
 libfc_host_alloc(struct scsi_host_template *sht, int priv_size)
 {
-       return scsi_host_alloc(sht, sizeof(struct fc_lport) + priv_size);
+       struct fc_lport *lport;
+       struct Scsi_Host *shost;
+
+       shost = scsi_host_alloc(sht, sizeof(*lport) + priv_size);
+       if (!shost)
+               return NULL;
+       lport = shost_priv(shost);
+       lport->host = shost;
+       INIT_LIST_HEAD(&lport->ema_list);
+       return lport;
 }
 
 /*

_______________________________________________
devel mailing list
[email protected]
http://www.open-fcoe.org/mailman/listinfo/devel

Reply via email to