Skip to content

Commit

Permalink
[DLM] add new lockspace to list ealier
Browse files Browse the repository at this point in the history
When a new lockspace was being created, the recoverd thread was being
started for it before the lockspace was added to the global list of
lockspaces.  The new thread was looking up the lockspace in the global
list and sometimes not finding it due to the race with the original thread
adding it to the list.  We need to add the lockspace to the global list
before starting the thread instead of after, and if the new thread can't
find the lockspace for some reason, it should return an error.

Signed-off-by: David Teigland <teigland@redhat.com>
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
  • Loading branch information
David Teigland authored and Steven Whitehouse committed Aug 25, 2006
1 parent 5dc39fe commit 5f88f1e
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 6 deletions.
13 changes: 7 additions & 6 deletions fs/dlm/lockspace.c
Original file line number Diff line number Diff line change
Expand Up @@ -488,16 +488,17 @@ static int new_lockspace(char *name, int namelen, void **lockspace,

down_write(&ls->ls_in_recovery);

spin_lock(&lslist_lock);
list_add(&ls->ls_list, &lslist);
spin_unlock(&lslist_lock);

/* needs to find ls in lslist */
error = dlm_recoverd_start(ls);
if (error) {
log_error(ls, "can't start dlm_recoverd %d", error);
goto out_rcomfree;
}

spin_lock(&lslist_lock);
list_add(&ls->ls_list, &lslist);
spin_unlock(&lslist_lock);

dlm_create_debug_file(ls);

error = kobject_setup(ls);
Expand All @@ -519,11 +520,11 @@ static int new_lockspace(char *name, int namelen, void **lockspace,
kobject_unregister(&ls->ls_kobj);
out_del:
dlm_delete_debug_file(ls);
dlm_recoverd_stop(ls);
out_rcomfree:
spin_lock(&lslist_lock);
list_del(&ls->ls_list);
spin_unlock(&lslist_lock);
dlm_recoverd_stop(ls);
out_rcomfree:
kfree(ls->ls_recover_buf);
out_dirfree:
kfree(ls->ls_dirtbl);
Expand Down
4 changes: 4 additions & 0 deletions fs/dlm/recoverd.c
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,10 @@ static int dlm_recoverd(void *arg)
struct dlm_ls *ls;

ls = dlm_find_lockspace_local(arg);
if (!ls) {
log_print("dlm_recoverd: no lockspace %p", arg);
return -1;
}

while (!kthread_should_stop()) {
set_current_state(TASK_INTERRUPTIBLE);
Expand Down

0 comments on commit 5f88f1e

Please sign in to comment.