@@ -261,7 +261,6 @@ static int num_max_busy_us;
261
261
static bool unload_when_empty = true;
262
262
263
263
static int try_smi_init (struct smi_info * smi );
264
- static void shutdown_one_si (struct smi_info * smi_info );
265
264
static void cleanup_one_si (struct smi_info * smi_info );
266
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
2003
list_add_tail (& new_smi -> link , & smi_infos );
2005
2004
2006
- if (initialized ) {
2005
+ if (initialized )
2007
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
2007
out_err :
2015
2008
mutex_unlock (& smi_infos_lock );
2016
2009
return rv ;
@@ -2220,7 +2213,8 @@ static int try_smi_init(struct smi_info *new_smi)
2220
2213
return 0 ;
2221
2214
2222
2215
out_err :
2223
- shutdown_one_si (new_smi );
2216
+ ipmi_unregister_smi (new_smi -> intf );
2217
+ new_smi -> intf = NULL ;
2224
2218
2225
2219
kfree (init_name );
2226
2220
@@ -2358,25 +2352,21 @@ static void shutdown_smi(void *send_info)
2358
2352
smi_info -> si_sm = NULL ;
2359
2353
}
2360
2354
2361
- static void shutdown_one_si (struct smi_info * smi_info )
2362
- {
2363
- ipmi_smi_t intf = smi_info -> intf ;
2364
-
2365
- if (!intf )
2366
- return ;
2367
-
2368
- smi_info -> intf = NULL ;
2369
- ipmi_unregister_smi (intf );
2370
- }
2371
-
2355
+ /*
2356
+ * Must be called with smi_infos_lock held, to serialize the
2357
+ * smi_info->intf check.
2358
+ */
2372
2359
static void cleanup_one_si (struct smi_info * smi_info )
2373
2360
{
2374
2361
if (!smi_info )
2375
2362
return ;
2376
2363
2377
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
2371
if (smi_info -> pdev ) {
2382
2372
if (smi_info -> pdev_registered )
0 commit comments