From acf4436aa0da548bb12edfd5c64136c1590cfe07 Mon Sep 17 00:00:00 2001 From: David Teigland Date: Mon, 27 Nov 2006 11:31:22 -0600 Subject: [PATCH] --- yaml --- r: 43305 b: refs/heads/master c: 2896ee37ccc1f9acb244c9b02becb74a43661009 h: refs/heads/master i: 43303: 0b17ca15c0e2153810f359b21ff6b6c721f9b120 v: v3 --- [refs] | 2 +- trunk/fs/dlm/lockspace.c | 2 ++ trunk/fs/dlm/recoverd.c | 16 ++++++++-------- trunk/fs/dlm/requestqueue.c | 7 ++++--- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/[refs] b/[refs] index 6f70f86b554a..07958ce08056 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: dcf3dd852f554bb0016aa23892596717cc123a26 +refs/heads/master: 2896ee37ccc1f9acb244c9b02becb74a43661009 diff --git a/trunk/fs/dlm/lockspace.c b/trunk/fs/dlm/lockspace.c index f8842ca443c2..791388b25c35 100644 --- a/trunk/fs/dlm/lockspace.c +++ b/trunk/fs/dlm/lockspace.c @@ -22,6 +22,7 @@ #include "memory.h" #include "lock.h" #include "recover.h" +#include "requestqueue.h" #ifdef CONFIG_DLM_DEBUG int dlm_create_debug_file(struct dlm_ls *ls); @@ -684,6 +685,7 @@ static int release_lockspace(struct dlm_ls *ls, int force) * Free structures on any other lists */ + dlm_purge_requestqueue(ls); kfree(ls->ls_recover_args); dlm_clear_free_entries(ls); dlm_clear_members(ls); diff --git a/trunk/fs/dlm/recoverd.c b/trunk/fs/dlm/recoverd.c index 8bb895ffd90e..9dc2f9156f15 100644 --- a/trunk/fs/dlm/recoverd.c +++ b/trunk/fs/dlm/recoverd.c @@ -93,14 +93,6 @@ static int ls_recover(struct dlm_ls *ls, struct dlm_recover *rv) goto fail; } - /* - * Purge directory-related requests that are saved in requestqueue. - * All dir requests from before recovery are invalid now due to the dir - * rebuild and will be resent by the requesting nodes. - */ - - dlm_purge_requestqueue(ls); - /* * Wait for all nodes to complete directory rebuild. */ @@ -181,6 +173,14 @@ static int ls_recover(struct dlm_ls *ls, struct dlm_recover *rv) dlm_release_root_list(ls); + /* + * Purge directory-related requests that are saved in requestqueue. + * All dir requests from before recovery are invalid now due to the dir + * rebuild and will be resent by the requesting nodes. + */ + + dlm_purge_requestqueue(ls); + dlm_set_recover_status(ls, DLM_RS_DONE); error = dlm_recover_done_wait(ls); if (error) { diff --git a/trunk/fs/dlm/requestqueue.c b/trunk/fs/dlm/requestqueue.c index 0226d2a0a0fa..65008d79c96d 100644 --- a/trunk/fs/dlm/requestqueue.c +++ b/trunk/fs/dlm/requestqueue.c @@ -36,9 +36,6 @@ int dlm_add_requestqueue(struct dlm_ls *ls, int nodeid, struct dlm_header *hd) int length = hd->h_length; int rv = 0; - if (dlm_is_removed(ls, nodeid)) - return 0; - e = kmalloc(sizeof(struct rq_entry) + length, GFP_KERNEL); if (!e) { log_print("dlm_add_requestqueue: out of memory\n"); @@ -133,6 +130,10 @@ static int purge_request(struct dlm_ls *ls, struct dlm_message *ms, int nodeid) { uint32_t type = ms->m_type; + /* the ls is being cleaned up and freed by release_lockspace */ + if (!ls->ls_count) + return 1; + if (dlm_is_removed(ls, nodeid)) return 1;