lkml.org 
[lkml]   [2018]   [Apr]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.15 14/53] ipmi: Fix some error cleanup issues
    Date
    4.15-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Corey Minyard <cminyard@mvista.com>

    commit cc095f0ac1f7c200e51a5c2a78a43c9f42049dbb upstream.

    device_remove_group() was called on any cleanup, even if the
    device attrs had not been added yet. That can occur in certain
    error scenarios, so add a flag to know if it has been added.

    Also make sure we remove the dev if we added it ourselves.

    Signed-off-by: Corey Minyard <cminyard@mvista.com>
    Cc: stable@vger.kernel.org # 4.15
    Cc: Laura Abbott <labbott@redhat.com>
    Tested-by: Bill Perkins <wmp@grnwood.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/char/ipmi/ipmi_si_intf.c | 18 ++++++++++++++----
    1 file changed, 14 insertions(+), 4 deletions(-)

    --- a/drivers/char/ipmi/ipmi_si_intf.c
    +++ b/drivers/char/ipmi/ipmi_si_intf.c
    @@ -252,6 +252,9 @@ struct smi_info {
    /* Default driver model device. */
    struct platform_device *pdev;

    + /* Have we added the device group to the device? */
    + bool dev_group_added;
    +
    /* Counters and things for the proc filesystem. */
    atomic_t stats[SI_NUM_STATS];

    @@ -2025,8 +2028,8 @@ int ipmi_si_add_smi(struct si_sm_io *io)
    if (initialized) {
    rv = try_smi_init(new_smi);
    if (rv) {
    - mutex_unlock(&smi_infos_lock);
    cleanup_one_si(new_smi);
    + mutex_unlock(&smi_infos_lock);
    return rv;
    }
    }
    @@ -2185,6 +2188,7 @@ static int try_smi_init(struct smi_info
    rv);
    goto out_err_stop_timer;
    }
    + new_smi->dev_group_added = true;

    rv = ipmi_register_smi(&handlers,
    new_smi,
    @@ -2238,7 +2242,10 @@ static int try_smi_init(struct smi_info
    return 0;

    out_err_remove_attrs:
    - device_remove_group(new_smi->io.dev, &ipmi_si_dev_attr_group);
    + if (new_smi->dev_group_added) {
    + device_remove_group(new_smi->io.dev, &ipmi_si_dev_attr_group);
    + new_smi->dev_group_added = false;
    + }
    dev_set_drvdata(new_smi->io.dev, NULL);

    out_err_stop_timer:
    @@ -2286,6 +2293,7 @@ out_err:
    else
    platform_device_put(new_smi->pdev);
    new_smi->pdev = NULL;
    + new_smi->io.dev = NULL;
    }

    kfree(init_name);
    @@ -2382,8 +2390,10 @@ static void cleanup_one_si(struct smi_in
    }
    }

    - device_remove_group(to_clean->io.dev, &ipmi_si_dev_attr_group);
    - dev_set_drvdata(to_clean->io.dev, NULL);
    + if (to_clean->dev_group_added)
    + device_remove_group(to_clean->io.dev, &ipmi_si_dev_attr_group);
    + if (to_clean->io.dev)
    + dev_set_drvdata(to_clean->io.dev, NULL);

    list_del(&to_clean->link);


    \
     
     \ /
      Last update: 2018-04-17 18:55    [W:5.609 / U:0.284 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site