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

[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
Loading
Loading
Loading
Loading
+19 −13
Original line number Diff line number Diff line
@@ -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,6 +565,9 @@ static int new_lockspace(char *name, int namelen, void **lockspace,
 out_rsbfree:
	kfree(ls->ls_rsbtbl);
 out_lsfree:
	if (do_unreg)
		kobject_unregister(&ls->ls_kobj);
	else
		kfree(ls);
 out:
	module_put(THIS_MODULE);