aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCorey Minyard <cminyard@mvista.com>2018-04-11 14:53:52 -0400
committerCorey Minyard <cminyard@mvista.com>2018-04-18 11:23:11 -0400
commit93c303d2045b30572d8d5e74d3ad80692acfebbe (patch)
tree6d017ff83e07e63f1abb3d4293a0f9bfa0b24dd3
parent57bccb4e8755d092f4c3c9e356a18f89a1488490 (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.c32
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;
261static bool unload_when_empty = true; 261static bool unload_when_empty = true;
262 262
263static int try_smi_init(struct smi_info *smi); 263static int try_smi_init(struct smi_info *smi);
264static void shutdown_one_si(struct smi_info *smi_info);
265static void cleanup_one_si(struct smi_info *smi_info); 264static void cleanup_one_si(struct smi_info *smi_info);
266static void cleanup_ipmi_si(void); 265static 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 }
2014out_err: 2007out_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
2222out_err: 2215out_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
2361static 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
2372static void cleanup_one_si(struct smi_info *smi_info) 2359static 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)