]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
scsi: fcoe: move fcoe_interface_remove() out of fcoe_interface_cleanup()
authorHannes Reinecke <hare@suse.de>
Fri, 15 Sep 2017 11:12:12 +0000 (13:12 +0200)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 15 Sep 2017 19:43:29 +0000 (15:43 -0400)
This closes a possible race condition in _fcoe_create() where we drop
the rtnl_lock() before calling fcoe_interface_remove().

Signed-off-by: Hannes Reinecke <hare@suse.com>
Reviewed-by: Lee Duncan <lduncan@suse.com>
Acked-by: Johannes Thumshirn <jth@kernel.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/fcoe/fcoe.c

index 85f9a3eba387c47b37e7555d3a183aafa556a742..135bdcfea7eb96685bf3e7d566c1a02511ad5a2b 100644 (file)
@@ -501,11 +501,6 @@ static void fcoe_interface_cleanup(struct fcoe_interface *fcoe)
        struct net_device *netdev = fcoe->netdev;
        struct fcoe_ctlr *fip = fcoe_to_ctlr(fcoe);
 
-       rtnl_lock();
-       if (!fcoe->removed)
-               fcoe_interface_remove(fcoe);
-       rtnl_unlock();
-
        /* Release the self-reference taken during fcoe_interface_create() */
        /* tear-down the FCoE controller */
        fcoe_ctlr_destroy(fip);
@@ -2140,6 +2135,11 @@ static void fcoe_destroy_work(struct work_struct *work)
        cdev = fcoe_ctlr_to_ctlr_dev(ctlr);
 
        fcoe_if_destroy(port->lport);
+
+       rtnl_lock();
+       if (!fcoe->removed)
+               fcoe_interface_remove(fcoe);
+       rtnl_unlock();
        fcoe_interface_cleanup(fcoe);
 
        mutex_unlock(&fcoe_config_mutex);
@@ -2254,6 +2254,8 @@ static int _fcoe_create(struct net_device *netdev, enum fip_mode fip_mode,
                printk(KERN_ERR "fcoe: Failed to create interface (%s)\n",
                       netdev->name);
                rc = -EIO;
+               if (!fcoe->removed)
+                       fcoe_interface_remove(fcoe);
                rtnl_unlock();
                fcoe_interface_cleanup(fcoe);
                mutex_unlock(&fcoe_config_mutex);