Commit 79d72b54 authored by David Teigland's avatar David Teigland Committed by Steven Whitehouse

[DLM] fix new_lockspace error exit [5/6]

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: default avatarDavid Teigland <teigland@redhat.com>
Signed-off-by: default avatarSteven Whitehouse <swhiteho@redhat.com>
parent c85d65e9
...@@ -400,6 +400,7 @@ static int new_lockspace(char *name, int namelen, void **lockspace, ...@@ -400,6 +400,7 @@ static int new_lockspace(char *name, int namelen, void **lockspace,
{ {
struct dlm_ls *ls; struct dlm_ls *ls;
int i, size, error = -ENOMEM; int i, size, error = -ENOMEM;
int do_unreg = 0;
if (namelen > DLM_LOCKSPACE_LEN) if (namelen > DLM_LOCKSPACE_LEN)
return -EINVAL; return -EINVAL;
...@@ -525,32 +526,34 @@ static int new_lockspace(char *name, int namelen, void **lockspace, ...@@ -525,32 +526,34 @@ static int new_lockspace(char *name, int namelen, void **lockspace,
error = dlm_recoverd_start(ls); error = dlm_recoverd_start(ls);
if (error) { if (error) {
log_error(ls, "can't start dlm_recoverd %d", 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); error = kobject_setup(ls);
if (error) if (error)
goto out_del; goto out_stop;
error = kobject_register(&ls->ls_kobj); error = kobject_register(&ls->ls_kobj);
if (error) 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); error = do_uevent(ls, 1);
if (error) if (error)
goto out_unreg; goto out_stop;
dlm_create_debug_file(ls);
log_debug(ls, "join complete");
*lockspace = ls; *lockspace = ls;
return 0; return 0;
out_unreg: out_stop:
kobject_unregister(&ls->ls_kobj);
out_del:
dlm_delete_debug_file(ls);
dlm_recoverd_stop(ls); dlm_recoverd_stop(ls);
out_rcomfree: out_delist:
spin_lock(&lslist_lock); spin_lock(&lslist_lock);
list_del(&ls->ls_list); list_del(&ls->ls_list);
spin_unlock(&lslist_lock); spin_unlock(&lslist_lock);
...@@ -562,7 +565,10 @@ static int new_lockspace(char *name, int namelen, void **lockspace, ...@@ -562,7 +565,10 @@ static int new_lockspace(char *name, int namelen, void **lockspace,
out_rsbfree: out_rsbfree:
kfree(ls->ls_rsbtbl); kfree(ls->ls_rsbtbl);
out_lsfree: out_lsfree:
kfree(ls); if (do_unreg)
kobject_unregister(&ls->ls_kobj);
else
kfree(ls);
out: out:
module_put(THIS_MODULE); module_put(THIS_MODULE);
return error; return error;
...@@ -708,7 +714,7 @@ static int release_lockspace(struct dlm_ls *ls, int force) ...@@ -708,7 +714,7 @@ static int release_lockspace(struct dlm_ls *ls, int force)
dlm_clear_members_gone(ls); dlm_clear_members_gone(ls);
kfree(ls->ls_node_array); kfree(ls->ls_node_array);
kobject_unregister(&ls->ls_kobj); 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); mutex_lock(&ls_lock);
ls_count--; ls_count--;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment