@@ -418,6 +418,7 @@ struct ipmi_smi {
418
418
*/
419
419
struct mutex bmc_reg_mutex ;
420
420
421
+ struct bmc_device tmp_bmc ;
421
422
struct bmc_device * bmc ;
422
423
bool bmc_registered ;
423
424
struct list_head bmc_link ;
@@ -2839,7 +2840,7 @@ static void ipmi_bmc_unregister(ipmi_smi_t intf)
2839
2840
mutex_lock (& bmc -> dyn_mutex );
2840
2841
list_del (& intf -> bmc_link );
2841
2842
mutex_unlock (& bmc -> dyn_mutex );
2842
- intf -> bmc = NULL ;
2843
+ intf -> bmc = & intf -> tmp_bmc ;
2843
2844
mutex_lock (& ipmidriver_mutex );
2844
2845
kref_put (& bmc -> usecount , cleanup_bmc_device );
2845
2846
mutex_unlock (& ipmidriver_mutex );
@@ -2872,7 +2873,6 @@ static int ipmi_bmc_register(ipmi_smi_t intf, int ifnum)
2872
2873
* otherwise register the new BMC device
2873
2874
*/
2874
2875
if (old_bmc ) {
2875
- kfree (bmc );
2876
2876
bmc = old_bmc ;
2877
2877
intf -> bmc = old_bmc ;
2878
2878
mutex_lock (& bmc -> dyn_mutex );
@@ -2886,6 +2886,14 @@ static int ipmi_bmc_register(ipmi_smi_t intf, int ifnum)
2886
2886
bmc -> id .product_id ,
2887
2887
bmc -> id .device_id );
2888
2888
} else {
2889
+ bmc = kzalloc (sizeof (* bmc ), GFP_KERNEL );
2890
+ if (!bmc ) {
2891
+ rv = - ENOMEM ;
2892
+ goto out ;
2893
+ }
2894
+ INIT_LIST_HEAD (& bmc -> intfs );
2895
+ mutex_init (& bmc -> dyn_mutex );
2896
+
2889
2897
bmc -> pdev .name = "ipmi_bmc" ;
2890
2898
2891
2899
rv = ida_simple_get (& ipmi_bmc_ida , 0 , 0 , GFP_KERNEL );
@@ -2968,7 +2976,7 @@ static int ipmi_bmc_register(ipmi_smi_t intf, int ifnum)
2968
2976
mutex_lock (& bmc -> dyn_mutex );
2969
2977
list_del (& intf -> bmc_link );
2970
2978
mutex_unlock (& bmc -> dyn_mutex );
2971
- intf -> bmc = NULL ;
2979
+ intf -> bmc = & intf -> tmp_bmc ;
2972
2980
mutex_lock (& ipmidriver_mutex );
2973
2981
kref_put (& bmc -> usecount , cleanup_bmc_device );
2974
2982
mutex_unlock (& ipmidriver_mutex );
@@ -2978,7 +2986,7 @@ static int ipmi_bmc_register(ipmi_smi_t intf, int ifnum)
2978
2986
mutex_lock (& bmc -> dyn_mutex );
2979
2987
list_del (& intf -> bmc_link );
2980
2988
mutex_unlock (& bmc -> dyn_mutex );
2981
- intf -> bmc = NULL ;
2989
+ intf -> bmc = & intf -> tmp_bmc ;
2982
2990
put_device (& bmc -> pdev .dev );
2983
2991
goto out ;
2984
2992
}
@@ -3204,11 +3212,7 @@ int ipmi_register_smi(const struct ipmi_smi_handlers *handlers,
3204
3212
if (!intf )
3205
3213
return - ENOMEM ;
3206
3214
3207
- intf -> bmc = kzalloc (sizeof (* intf -> bmc ), GFP_KERNEL );
3208
- if (!intf -> bmc ) {
3209
- kfree (intf );
3210
- return - ENOMEM ;
3211
- }
3215
+ intf -> bmc = & intf -> tmp_bmc ;
3212
3216
INIT_LIST_HEAD (& intf -> bmc -> intfs );
3213
3217
mutex_init (& intf -> bmc -> dyn_mutex );
3214
3218
INIT_LIST_HEAD (& intf -> bmc_link );
0 commit comments