dlm: fix new_lockspace error exit
David Teigland
maintainerPATCH 5/6 dlm: fix new_lockspace error exit
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 <[email protected]>
fs/dlm/lockspace.c +19 -13
@@ -400,6 +400,7 @@ {struct dlm_ls *ls;int i, size, error = -ENOMEM ; +int do_unreg =0 ;if (namelen >DLM_LOCKSPACE_LEN )return -EINVAL ;
@@ -525,32 +526,34 @@ 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 @@ 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 @@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--;