From: Corey Minyard <cminy...@mvista.com> This is getting ready for the ability to redo the BMC if it's information changes, we need a fallback mechanism.
Signed-off-by: Corey Minyard <cminy...@mvista.com> --- drivers/char/ipmi/ipmi_msghandler.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c index c486ea8..249ca56 100644 --- a/drivers/char/ipmi/ipmi_msghandler.c +++ b/drivers/char/ipmi/ipmi_msghandler.c @@ -412,6 +412,7 @@ struct ipmi_smi { /* Used for wake ups at startup. */ wait_queue_head_t waitq; + struct bmc_device tmp_bmc; struct bmc_device *bmc; struct mutex bmc_reg_mutex; bool bmc_registered; @@ -2827,7 +2828,7 @@ static void ipmi_bmc_unregister(ipmi_smi_t intf) mutex_lock(&bmc->dyn_mutex); list_del(&intf->bmc_link); mutex_unlock(&bmc->dyn_mutex); - intf->bmc = NULL; + intf->bmc = &intf->tmp_bmc; mutex_lock(&ipmidriver_mutex); kref_put(&bmc->usecount, cleanup_bmc_device); mutex_unlock(&ipmidriver_mutex); @@ -2866,7 +2867,6 @@ static int ipmi_bmc_register(ipmi_smi_t intf, int ifnum) * otherwise register the new BMC device */ if (old_bmc) { - kfree(bmc); intf->bmc = old_bmc; mutex_lock(&bmc->dyn_mutex); list_add_tail(&intf->bmc_link, &bmc->intfs); @@ -2884,6 +2884,14 @@ static int ipmi_bmc_register(ipmi_smi_t intf, int ifnum) int warn_printed = 0; struct bmc_device *tmp_bmc; + bmc = kzalloc(sizeof(*bmc), GFP_KERNEL); + if (!bmc) { + rv = -ENOMEM; + goto out; + } + INIT_LIST_HEAD(&bmc->intfs); + mutex_init(&bmc->dyn_mutex); + snprintf(bmc->name, sizeof(bmc->name), "ipmi_bmc.%4.4x", bmc->id.product_id); bmc->pdev.name = bmc->name; @@ -2908,6 +2916,7 @@ static int ipmi_bmc_register(ipmi_smi_t intf, int ifnum) if (bmc->id.device_id == orig_dev_id) { printk(KERN_ERR PFX "Out of device ids!\n"); + kfree(bmc); mutex_unlock(&ipmidriver_mutex); rv = -EAGAIN; goto out; @@ -2999,7 +3008,7 @@ static int ipmi_bmc_register(ipmi_smi_t intf, int ifnum) mutex_lock(&bmc->dyn_mutex); list_del(&intf->bmc_link); mutex_unlock(&bmc->dyn_mutex); - intf->bmc = NULL; + intf->bmc = &intf->tmp_bmc; mutex_lock(&ipmidriver_mutex); kref_put(&bmc->usecount, cleanup_bmc_device); mutex_unlock(&ipmidriver_mutex); @@ -3009,7 +3018,7 @@ static int ipmi_bmc_register(ipmi_smi_t intf, int ifnum) mutex_lock(&bmc->dyn_mutex); list_del(&intf->bmc_link); mutex_unlock(&bmc->dyn_mutex); - intf->bmc = NULL; + intf->bmc = &intf->tmp_bmc; put_device(&bmc->pdev.dev); goto out; } @@ -3235,11 +3244,7 @@ int ipmi_register_smi(const struct ipmi_smi_handlers *handlers, if (!intf) return -ENOMEM; - intf->bmc = kzalloc(sizeof(*intf->bmc), GFP_KERNEL); - if (!intf->bmc) { - kfree(intf); - return -ENOMEM; - } + intf->bmc = &intf->tmp_bmc; INIT_LIST_HEAD(&intf->bmc->intfs); mutex_init(&intf->bmc->dyn_mutex); INIT_LIST_HEAD(&intf->bmc_link); -- 2.7.4 ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Openipmi-developer mailing list Openipmi-developer@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openipmi-developer