diff options
author | Corey Minyard <cminyard@mvista.com> | 2018-04-11 14:53:52 -0400 |
---|---|---|
committer | Corey Minyard <cminyard@mvista.com> | 2018-04-18 11:23:11 -0400 |
commit | 93c303d2045b30572d8d5e74d3ad80692acfebbe (patch) | |
tree | 6d017ff83e07e63f1abb3d4293a0f9bfa0b24dd3 | |
parent | 57bccb4e8755d092f4c3c9e356a18f89a1488490 (diff) |
ipmi_si: Clean up shutdown a bit
Signed-off-by: Corey Minyard <cminyard@mvista.com>
-rw-r--r-- | drivers/char/ipmi/ipmi_si_intf.c | 32 |
1 files changed, 11 insertions, 21 deletions
diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c index 7352d8fe73f8..f2c39bf91bf5 100644 --- a/drivers/char/ipmi/ipmi_si_intf.c +++ b/drivers/char/ipmi/ipmi_si_intf.c | |||
@@ -261,7 +261,6 @@ static int num_max_busy_us; | |||
261 | static bool unload_when_empty = true; | 261 | static bool unload_when_empty = true; |
262 | 262 | ||
263 | static int try_smi_init(struct smi_info *smi); | 263 | static int try_smi_init(struct smi_info *smi); |
264 | static void shutdown_one_si(struct smi_info *smi_info); | ||
265 | static void cleanup_one_si(struct smi_info *smi_info); | 264 | static void cleanup_one_si(struct smi_info *smi_info); |
266 | static void cleanup_ipmi_si(void); | 265 | static void cleanup_ipmi_si(void); |
267 | 266 | ||
@@ -2003,14 +2002,8 @@ int ipmi_si_add_smi(struct si_sm_io *io) | |||
2003 | 2002 | ||
2004 | list_add_tail(&new_smi->link, &smi_infos); | 2003 | list_add_tail(&new_smi->link, &smi_infos); |
2005 | 2004 | ||
2006 | if (initialized) { | 2005 | if (initialized) |
2007 | rv = try_smi_init(new_smi); | 2006 | rv = try_smi_init(new_smi); |
2008 | if (rv) { | ||
2009 | cleanup_one_si(new_smi); | ||
2010 | mutex_unlock(&smi_infos_lock); | ||
2011 | return rv; | ||
2012 | } | ||
2013 | } | ||
2014 | out_err: | 2007 | out_err: |
2015 | mutex_unlock(&smi_infos_lock); | 2008 | mutex_unlock(&smi_infos_lock); |
2016 | return rv; | 2009 | return rv; |
@@ -2220,7 +2213,8 @@ static int try_smi_init(struct smi_info *new_smi) | |||
2220 | return 0; | 2213 | return 0; |
2221 | 2214 | ||
2222 | out_err: | 2215 | out_err: |
2223 | shutdown_one_si(new_smi); | 2216 | ipmi_unregister_smi(new_smi->intf); |
2217 | new_smi->intf = NULL; | ||
2224 | 2218 | ||
2225 | kfree(init_name); | 2219 | kfree(init_name); |
2226 | 2220 | ||
@@ -2358,17 +2352,10 @@ static void shutdown_smi(void *send_info) | |||
2358 | smi_info->si_sm = NULL; | 2352 | smi_info->si_sm = NULL; |
2359 | } | 2353 | } |
2360 | 2354 | ||
2361 | static void shutdown_one_si(struct smi_info *smi_info) | 2355 | /* |
2362 | { | 2356 | * Must be called with smi_infos_lock held, to serialize the |
2363 | ipmi_smi_t intf = smi_info->intf; | 2357 | * smi_info->intf check. |
2364 | 2358 | */ | |
2365 | if (!intf) | ||
2366 | return; | ||
2367 | |||
2368 | smi_info->intf = NULL; | ||
2369 | ipmi_unregister_smi(intf); | ||
2370 | } | ||
2371 | |||
2372 | static void cleanup_one_si(struct smi_info *smi_info) | 2359 | static void cleanup_one_si(struct smi_info *smi_info) |
2373 | { | 2360 | { |
2374 | if (!smi_info) | 2361 | if (!smi_info) |
@@ -2376,7 +2363,10 @@ static void cleanup_one_si(struct smi_info *smi_info) | |||
2376 | 2363 | ||
2377 | list_del(&smi_info->link); | 2364 | list_del(&smi_info->link); |
2378 | 2365 | ||
2379 | shutdown_one_si(smi_info); | 2366 | if (smi_info->intf) { |
2367 | ipmi_unregister_smi(smi_info->intf); | ||
2368 | smi_info->intf = NULL; | ||
2369 | } | ||
2380 | 2370 | ||
2381 | if (smi_info->pdev) { | 2371 | if (smi_info->pdev) { |
2382 | if (smi_info->pdev_registered) | 2372 | if (smi_info->pdev_registered) |