diff options
| -rw-r--r-- | drivers/scsi/fcoe/fcoe.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c index 10be9f36a4cc..2f47ae7cce91 100644 --- a/drivers/scsi/fcoe/fcoe.c +++ b/drivers/scsi/fcoe/fcoe.c | |||
| @@ -2009,6 +2009,8 @@ static int fcoe_destroy(const char *buffer, struct kernel_param *kp) | |||
| 2009 | fcoe_interface_cleanup(fcoe); | 2009 | fcoe_interface_cleanup(fcoe); |
| 2010 | rtnl_unlock(); | 2010 | rtnl_unlock(); |
| 2011 | fcoe_if_destroy(fcoe->ctlr.lp); | 2011 | fcoe_if_destroy(fcoe->ctlr.lp); |
| 2012 | module_put(THIS_MODULE); | ||
| 2013 | |||
| 2012 | out_putdev: | 2014 | out_putdev: |
| 2013 | dev_put(netdev); | 2015 | dev_put(netdev); |
| 2014 | out_nodev: | 2016 | out_nodev: |
| @@ -2059,6 +2061,11 @@ static int fcoe_create(const char *buffer, struct kernel_param *kp) | |||
| 2059 | } | 2061 | } |
| 2060 | #endif | 2062 | #endif |
| 2061 | 2063 | ||
| 2064 | if (!try_module_get(THIS_MODULE)) { | ||
| 2065 | rc = -EINVAL; | ||
| 2066 | goto out_nomod; | ||
| 2067 | } | ||
| 2068 | |||
| 2062 | rtnl_lock(); | 2069 | rtnl_lock(); |
| 2063 | netdev = fcoe_if_to_netdev(buffer); | 2070 | netdev = fcoe_if_to_netdev(buffer); |
| 2064 | if (!netdev) { | 2071 | if (!netdev) { |
| @@ -2099,17 +2106,24 @@ static int fcoe_create(const char *buffer, struct kernel_param *kp) | |||
| 2099 | if (!fcoe_link_ok(lport)) | 2106 | if (!fcoe_link_ok(lport)) |
| 2100 | fcoe_ctlr_link_up(&fcoe->ctlr); | 2107 | fcoe_ctlr_link_up(&fcoe->ctlr); |
| 2101 | 2108 | ||
| 2102 | rc = 0; | ||
| 2103 | out_free: | ||
| 2104 | /* | 2109 | /* |
| 2105 | * Release from init in fcoe_interface_create(), on success lport | 2110 | * Release from init in fcoe_interface_create(), on success lport |
| 2106 | * should be holding a reference taken in fcoe_if_create(). | 2111 | * should be holding a reference taken in fcoe_if_create(). |
| 2107 | */ | 2112 | */ |
| 2108 | fcoe_interface_put(fcoe); | 2113 | fcoe_interface_put(fcoe); |
| 2114 | dev_put(netdev); | ||
| 2115 | rtnl_unlock(); | ||
| 2116 | mutex_unlock(&fcoe_config_mutex); | ||
| 2117 | |||
| 2118 | return 0; | ||
| 2119 | out_free: | ||
| 2120 | fcoe_interface_put(fcoe); | ||
| 2109 | out_putdev: | 2121 | out_putdev: |
| 2110 | dev_put(netdev); | 2122 | dev_put(netdev); |
| 2111 | out_nodev: | 2123 | out_nodev: |
| 2112 | rtnl_unlock(); | 2124 | rtnl_unlock(); |
| 2125 | module_put(THIS_MODULE); | ||
| 2126 | out_nomod: | ||
| 2113 | mutex_unlock(&fcoe_config_mutex); | 2127 | mutex_unlock(&fcoe_config_mutex); |
| 2114 | return rc; | 2128 | return rc; |
| 2115 | } | 2129 | } |
