lkml.org 
[lkml]   [2007]   [Jul]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] [DLM] fix new_lockspace error exit [5/6]
    Date
    From: David Teigland <teigland@redhat.com>

    Fix the error path when exiting new_lockspace(). It was kfree'ing the
    lockspace struct at the end, but that's only valid if it exits before
    kobject_register occured. After kobject_register we have to let the
    kobject do the freeing.

    Signed-off-by: David Teigland <teigland@redhat.com>
    Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>

    diff --git a/fs/dlm/lockspace.c b/fs/dlm/lockspace.c
    index 339a204..a3a50e6 100644
    --- a/fs/dlm/lockspace.c
    +++ b/fs/dlm/lockspace.c
    @@ -400,6 +400,7 @@ static int new_lockspace(char *name, int namelen, void **lockspace,
    {
    struct dlm_ls *ls;
    int i, size, error = -ENOMEM;
    + int do_unreg = 0;

    if (namelen > DLM_LOCKSPACE_LEN)
    return -EINVAL;
    @@ -525,32 +526,34 @@ static int new_lockspace(char *name, int namelen, void **lockspace,
    error = dlm_recoverd_start(ls);
    if (error) {
    log_error(ls, "can't start dlm_recoverd %d", error);
    - goto out_rcomfree;
    + goto out_delist;
    }

    - dlm_create_debug_file(ls);
    -
    error = kobject_setup(ls);
    if (error)
    - goto out_del;
    + goto out_stop;

    error = kobject_register(&ls->ls_kobj);
    if (error)
    - goto out_del;
    + goto out_stop;
    +
    + /* let kobject handle freeing of ls if there's an error */
    + do_unreg = 1;

    error = do_uevent(ls, 1);
    if (error)
    - goto out_unreg;
    + goto out_stop;
    +
    + dlm_create_debug_file(ls);
    +
    + log_debug(ls, "join complete");

    *lockspace = ls;
    return 0;

    - out_unreg:
    - kobject_unregister(&ls->ls_kobj);
    - out_del:
    - dlm_delete_debug_file(ls);
    + out_stop:
    dlm_recoverd_stop(ls);
    - out_rcomfree:
    + out_delist:
    spin_lock(&lslist_lock);
    list_del(&ls->ls_list);
    spin_unlock(&lslist_lock);
    @@ -562,7 +565,10 @@ static int new_lockspace(char *name, int namelen, void **lockspace,
    out_rsbfree:
    kfree(ls->ls_rsbtbl);
    out_lsfree:
    - kfree(ls);
    + if (do_unreg)
    + kobject_unregister(&ls->ls_kobj);
    + else
    + kfree(ls);
    out:
    module_put(THIS_MODULE);
    return error;
    @@ -708,7 +714,7 @@ static int release_lockspace(struct dlm_ls *ls, int force)
    dlm_clear_members_gone(ls);
    kfree(ls->ls_node_array);
    kobject_unregister(&ls->ls_kobj);
    - /* The ls structure will be freed when the kobject is done with */
    + /* The ls structure will be freed when the kobject is done with */

    mutex_lock(&ls_lock);
    ls_count--;
    --
    1.5.1.2
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2007-07-09 18:31    [W:2.400 / U:0.300 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site