Rather than rely on the hostlist_lock to be held while creating exchange
managers, serialize fcoe instance creation and destruction with a mutex.
This will allow the hostlist addition to be moved out of fcoe_if_create(),
which will simplify NPIV support.

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

 drivers/scsi/fcoe/fcoe.c |   41 ++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 40 insertions(+), 1 deletions(-)

diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c
index 28bea36..2f665aa 100644
--- a/drivers/scsi/fcoe/fcoe.c
+++ b/drivers/scsi/fcoe/fcoe.c
@@ -55,6 +55,8 @@ module_param(fcoe_ddp_min, uint, S_IRUGO | S_IWUSR);
 MODULE_PARM_DESC(fcoe_ddp_min, "Minimum I/O size in bytes for "        \
                 "Direct Data Placement (DDP).");
 
+DEFINE_MUTEX(fcoe_config_mutex);
+
 /* fcoe host list */
 LIST_HEAD(fcoe_hostlist);
 DEFINE_RWLOCK(fcoe_hostlist_lock);
@@ -812,6 +814,7 @@ static int __init fcoe_if_init(void)
 int __exit fcoe_if_exit(void)
 {
        fc_release_transport(scsi_transport_fcoe_sw);
+       scsi_transport_fcoe_sw = NULL;
        return 0;
 }
 
@@ -1688,6 +1691,19 @@ static int fcoe_destroy(const char *buffer, struct 
kernel_param *kp)
        struct fc_lport *lport;
        int rc;
 
+       mutex_lock(&fcoe_config_mutex);
+#ifdef CONFIG_FCOE_MODULE
+       /*
+        * Make sure the module has been initialized, and is not about to be
+        * removed.  Module paramter sysfs files are writable before the
+        * module_init function is called and after module_exit.
+        */
+       if (THIS_MODULE->state != MODULE_STATE_LIVE) {
+               rc = -ENODEV;
+               goto out_nodev;
+       }
+#endif
+
        netdev = fcoe_if_to_netdev(buffer);
        if (!netdev) {
                rc = -ENODEV;
@@ -1707,6 +1723,7 @@ static int fcoe_destroy(const char *buffer, struct 
kernel_param *kp)
 out_putdev:
        dev_put(netdev);
 out_nodev:
+       mutex_unlock(&fcoe_config_mutex);
        return rc;
 }
 
@@ -1724,6 +1741,19 @@ static int fcoe_create(const char *buffer, struct 
kernel_param *kp)
        struct fc_lport *lport;
        struct net_device *netdev;
 
+       mutex_lock(&fcoe_config_mutex);
+#ifdef CONFIG_FCOE_MODULE
+       /*
+        * Make sure the module has been initialized, and is not about to be
+        * removed.  Module paramter sysfs files are writable before the
+        * module_init function is called and after module_exit.
+        */
+       if (THIS_MODULE->state != MODULE_STATE_LIVE) {
+               rc = -ENODEV;
+               goto out_nodev;
+       }
+#endif
+
        netdev = fcoe_if_to_netdev(buffer);
        if (!netdev) {
                rc = -ENODEV;
@@ -1761,6 +1791,7 @@ static int fcoe_create(const char *buffer, struct 
kernel_param *kp)
                fcoe_ctlr_link_up(&fcoe->ctlr);
 
        dev_put(netdev);
+       mutex_unlock(&fcoe_config_mutex);
        return 0;
 
 out_free:
@@ -1768,6 +1799,7 @@ out_free:
 out_putdev:
        dev_put(netdev);
 out_nodev:
+       mutex_unlock(&fcoe_config_mutex);
        return rc;
 }
 
@@ -1971,6 +2003,8 @@ static int __init fcoe_init(void)
        int rc = 0;
        struct fcoe_percpu_s *p;
 
+       mutex_lock(&fcoe_config_mutex);
+
        for_each_possible_cpu(cpu) {
                p = &per_cpu(fcoe_percpu, cpu);
                skb_queue_head_init(&p->fcoe_rx_list);
@@ -1991,13 +2025,14 @@ static int __init fcoe_init(void)
        if (rc)
                goto out_free;
 
+       mutex_unlock(&fcoe_config_mutex);
        return 0;
 
 out_free:
        for_each_online_cpu(cpu) {
                fcoe_percpu_thread_destroy(cpu);
        }
-
+       mutex_unlock(&fcoe_config_mutex);
        return rc;
 }
 module_init(fcoe_init);
@@ -2012,6 +2047,8 @@ static void __exit fcoe_exit(void)
        unsigned int cpu;
        struct fcoe_interface *fcoe, *tmp;
 
+       mutex_lock(&fcoe_config_mutex);
+
        fcoe_dev_cleanup();
 
        /* releases the associated fcoe hosts */
@@ -2025,5 +2062,7 @@ static void __exit fcoe_exit(void)
 
        /* detach from scsi transport */
        fcoe_if_exit();
+
+       mutex_unlock(&fcoe_config_mutex);
 }
 module_exit(fcoe_exit);

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

Reply via email to